Commit b3f3c48e b3f3c48e6e0c075c9e976a73b159ecd420af8e8f by xianghan

Merge branch '2.0.0-develop'

# Conflicts:
#	member-service-impl/src/main/java/com/topdraw/business/module/member/address/domain/MemberAddress.java
#	member-service-impl/src/main/java/com/topdraw/business/module/member/profile/domain/MemberProfileBuild.java
#	member-service-impl/src/main/java/com/topdraw/business/module/member/profile/service/dto/MemberProfileDTO.java
#	member-service-impl/src/main/java/com/topdraw/business/module/member/profile/service/impl/MemberProfileServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/module/member/rest/MemberController.java
#	member-service-impl/src/main/java/com/topdraw/business/module/member/service/MemberService.java
#	member-service-impl/src/main/java/com/topdraw/business/module/member/service/impl/MemberServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/module/member/viphistory/service/impl/MemberVipHistoryServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/module/user/iptv/domain/UserTv.java
#	member-service-impl/src/main/java/com/topdraw/business/module/user/iptv/service/dto/UserTvDTO.java
#	member-service-impl/src/main/java/com/topdraw/business/module/user/weixin/service/dto/UserWeixinDTO.java
#	member-service-impl/src/main/java/com/topdraw/business/process/domian/TempIptvUser.java
#	member-service-impl/src/main/java/com/topdraw/business/process/rest/MemberOperationController.java
#	member-service-impl/src/main/java/com/topdraw/business/process/rest/UserOperationController.java
#	member-service-impl/src/main/java/com/topdraw/business/process/service/UserOperationService.java
#	member-service-impl/src/main/java/com/topdraw/business/process/service/impl/UserOperationServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/process/service/impl/member/MemberOperationServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/resttemplate/RestTemplateClient.java
#	member-service-impl/src/main/resources/config/application-dev.yml
#	member-service-impl/src/test/java/com/topdraw/test/business/basicdata/member/profile/MemberProfileServiceTest.java
#	member-service-impl/src/test/java/com/topdraw/test/business/basicdata/member/rest/MemberControllerTest.java
#	member-service-impl/src/test/java/com/topdraw/test/business/basicdata/member/rest/MemberProfileControllerTest.java
#	member-service-impl/src/test/java/com/topdraw/test/business/process/rest/UserOperationControllerTest.java
2 parents 2fac68f8 71ce5729
Showing 333 changed files with 8344 additions and 8228 deletions
ALTER TABLE `uc_user_tv`
MODIFY COLUMN `platform_account` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '运营商平台账号' AFTER `id`,
MODIFY COLUMN `member_id` bigint(20) NULL DEFAULT NULL COMMENT '会员id' AFTER `platform_account`,
ADD COLUMN `vis_user_id` bigint(0) UNSIGNED NULL COMMENT 'vis_user表主键' AFTER `member_id`,
MODIFY COLUMN `priority_member_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主会员编码' AFTER `member_id`,
MODIFY COLUMN `platform` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '运营商平台' AFTER `image`,
MODIFY COLUMN `person_id` bigint(20) NULL DEFAULT NULL COMMENT '人ID' AFTER `update_time`,
ADD UNIQUE INDEX `unique_vis_user_id`(`vis_user_id`) USING BTREE;
\ No newline at end of file
......@@ -17,17 +17,18 @@
<dependencies>
<!--系统-->
<dependency>
<!--<dependency>
<groupId>com.topdraw</groupId>
<artifactId>cronos-system</artifactId>
<version>${cronos.version}</version>
</dependency>
</dependency>-->
<!--代码生成器-->
<dependency>
<!--<dependency>
<groupId>com.topdraw</groupId>
<artifactId>cronos-generator</artifactId>
<version>${cronos.version}</version>
</dependency>
</dependency>-->
</dependencies>
</project>
\ No newline at end of file
......
......@@ -15,16 +15,27 @@
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<jjwt.version>0.9.1</jjwt.version>
<cronos.version>1.1.0</cronos.version>
</properties>
<dependencies>
<!--redisson-->
<!--<dependency>
<groupId>com.topdraw</groupId>
<artifactId>cronos-system</artifactId>
<version>${cronos.version}</version>
</dependency>-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.16.3</version>
<groupId>com.topdraw</groupId>
<artifactId>code-generator</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--api-->
......
......@@ -9,6 +9,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.scheduling.annotation.EnableAsync;
......@@ -24,6 +25,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableRetry
@EnableCaching
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class MemberServiceApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
......
......@@ -2,6 +2,8 @@ package com.topdraw.aspect;
import com.alibaba.fastjson.JSON;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.mq.domain.TableOperationMsg;
import com.topdraw.mq.producer.MessageProducer;
import lombok.extern.slf4j.Slf4j;
......
......@@ -2,12 +2,8 @@ package com.topdraw.business.module.common.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Transient;
import java.io.Serializable;
/**
* @author :
......@@ -20,9 +16,12 @@ import java.io.Serializable;
*/
@Data
@Accessors(chain = true)
public class DefaultAsyncMqModule {
public class AsyncMqModule {
@Transient
private String memberCode;
/** 运营商平台账号 */
@Transient
private String platformAccount;
}
......
package com.topdraw.business.module.common.validated;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/7 21:20
* @version: :
* @modified By:
* @since : modified in 2022/3/7 21:20
*/
public interface CreateGroup {
}
package com.topdraw.business.module.common.validated;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/7 21:20
* @version: :
* @modified By:
* @since : modified in 2022/3/7 21:20
*/
public interface UpdateGroup {
}
package com.topdraw.business.module.points.standingbook.domain;
package com.topdraw.business.module.contact.vis.domain;
import lombok.Data;
import lombok.experimental.Accessors;
......@@ -14,52 +14,60 @@ import java.io.Serializable;
/**
* @author XiangHan
* @date 2021-10-29
* @date 2022-04-24
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_points_standing_book")
public class PointsStandingBook implements Serializable {
@Table(name="x_activity_address")
public class ActivityAddress implements Serializable {
// 主键
// id
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 积分生产
@Column(name = "points_produce", nullable = false)
private Long pointsProduce;
// vis的用户id
@Column(name = "user_id", nullable = false)
private Long userId;
// 积分消耗
@Column(name = "points_consume", nullable = false)
private Long pointsConsume;
// 大屏账号
@Column(name = "platform_account")
private String platformAccount;
// 可用总积分
@Column(name = "points_available", nullable = false)
private Long pointsAvailable;
// 活动id
@Column(name = "activity_id", nullable = false)
private Long activityId;
// 积分过期
@Column(name = "points_expire", nullable = false)
private Long pointsExpire;
// 应用id
@Column(name = "app_id")
private Long appId;
// 日期
@Column(name = "day")
private String day;
// 收货人名称
@Column(name = "name")
private String name;
// 收货人地址
@Column(name = "address")
private String address;
// 收获人手机号
@Column(name = "cellphone")
private String cellphone;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 创建时间
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(PointsStandingBook source){
public void copy(ActivityAddress source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
......
package com.topdraw.business.module.contact.vis.repository;
import com.topdraw.business.module.contact.vis.domain.ActivityAddress;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
import java.util.Optional;
/**
* @author XiangHan
* @date 2022-04-24
*/
public interface ActivityAddressRepository extends JpaRepository<ActivityAddress, Long>, JpaSpecificationExecutor<ActivityAddress> {
List<ActivityAddress> findByPlatformAccount(String platformAccount);
Optional<ActivityAddress> findByPlatformAccountAndActivityId(String platformAccount, Long activityId);
}
package com.topdraw.business.module.contact.vis.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.contact.vis.service.dto.ActivityAddressDTO;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.contact.vis.domain.ActivityAddress;
import com.topdraw.business.module.contact.vis.service.ActivityAddressService;
import com.topdraw.exception.BadRequestException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.util.List;
import java.util.Objects;
/**
* @author XiangHan
* @date 2022-04-24
*/
@Api(tags = "中奖人联系方式管理")
@RestController
@RequestMapping("/uce/activityAddress")
@Slf4j
public class ActivityAddressController {
@Autowired
private ActivityAddressService activityAddressService;
@GetMapping(value = "/findByPlatformAccountAndActivityId")
@ApiOperation("查询指定活动事件的中奖人联系方式")
@AnonymousAccess
public ResultInfo findByPlatformAccountAndActivityId(@RequestParam(value = "platformAccount") String platformAccount,
@RequestParam(value = "activityId") Long activityId) {
log.info("activityAddress ==>> findByPlatformAccountAndActivityId ==>> platformAccount ==>> {}", platformAccount);
log.info("activityAddress ==>> findByPlatformAccountAndActivityId ==>> activityId ==>> {}", activityId);
if (StringUtils.isBlank(platformAccount)) {
throw new BadRequestException("platformAccount is nul");
}
if (Objects.isNull(activityId)) {
throw new BadRequestException("activityId is nul");
}
ActivityAddress activityAddress = new ActivityAddress();
activityAddress.setPlatformAccount(platformAccount);
activityAddress.setActivityId(activityId);
ActivityAddressDTO activityAddressDTO = this.activityAddressService.findByPlatformAccountAndActivityId(activityAddress);
return ResultInfo.success(activityAddressDTO);
}
@GetMapping(value = "/findByPlatformAccount")
@ApiOperation("查询所有ActivityAddress")
@AnonymousAccess
public ResultInfo findByPlatformAccount(@RequestParam(value = "platformAccount") String platformAccount) {
log.info("activityAddress ==>> findByPlatformAccount ==>> platformAccount ==>> {}", platformAccount);
List<ActivityAddressDTO> activityAddressDTO = this.activityAddressService.findByPlatformAccount(platformAccount);
return ResultInfo.success(activityAddressDTO);
}
@PostMapping(value = "/createOrUpdateActivityAddress")
@ApiOperation("新增ActivityAddress")
@AnonymousAccess
public ResultInfo createOrUpdateActivityAddress(@Validated @RequestBody ActivityAddress resources) {
log.info("activityAddress ==>> createOrUpdateActivityAddress ==>> params ==>> {}", resources);
String platformAccount = resources.getPlatformAccount();
if (StringUtils.isBlank(platformAccount)) {
throw new BadRequestException("platformAccount is null");
}
Long appId = resources.getAppId();
if (Objects.isNull(appId)) {
throw new BadRequestException("appId is null");
}
Long activityId = resources.getActivityId();
if (Objects.isNull(activityId)) {
throw new BadRequestException("activityId is null");
}
Long userId = resources.getUserId();
if (Objects.isNull(userId)) {
throw new BadRequestException("visUserId is null");
}
String name = resources.getName();
if (StringUtils.isBlank(name)) {
throw new BadRequestException("name is null");
}
String cellphone = resources.getCellphone();
if (StringUtils.isBlank(cellphone)) {
throw new BadRequestException("cellphone is null");
}
String address = resources.getAddress();
if (StringUtils.isBlank(address)) {
throw new BadRequestException( "address is null");
}
ActivityAddressDTO activityAddressDTO = this.activityAddressService.createOrUpdateActivityAddress(resources);
return ResultInfo.success(activityAddressDTO);
}
// @Log
@PostMapping(value = "/create")
@ApiOperation("新增ActivityAddress")
@AnonymousAccess
public ResultInfo create(@Validated @RequestBody ActivityAddress resources) {
this.activityAddressService.create(resources);
return ResultInfo.success();
}
// @Log
@PutMapping(value = "/update")
@ApiOperation("修改ActivityAddress")
@AnonymousAccess
public ResultInfo update(@Validated @RequestBody ActivityAddress resources) {
this.activityAddressService.update(resources);
return ResultInfo.success();
}
// @Log
@DeleteMapping(value = "/{id}")
@ApiOperation("删除ActivityAddress")
public ResultInfo delete(@PathVariable Long id) {
this.activityAddressService.delete(id);
return ResultInfo.success();
}
}
package com.topdraw.business.module.contact.vis.service;
import com.topdraw.business.module.contact.vis.domain.ActivityAddress;
import com.topdraw.business.module.contact.vis.service.dto.ActivityAddressDTO;
import java.util.List;
/**
* @author XiangHan
* @date 2022-04-24
*/
public interface ActivityAddressService {
/**
* 根据ID查询
* @param id ID
* @return ActivityAddressDTO
*/
ActivityAddressDTO findById(Long id);
/**
*
* @param resources
*/
ActivityAddressDTO create(ActivityAddress resources);
/**
*
* @param resources
*/
ActivityAddressDTO update(ActivityAddress resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param platformAccount
* @return
*/
List<ActivityAddressDTO> findByPlatformAccount(String platformAccount);
/**
*
* @param resources
* @return
*/
ActivityAddressDTO createOrUpdateActivityAddress(ActivityAddress resources);
/**
*
* @param resources
* @return
*/
ActivityAddressDTO findByPlatformAccountAndActivityId(ActivityAddress resources);
}
package com.topdraw.business.module.contact.vis.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-04-24
*/
@Data
public class ActivityAddressDTO implements Serializable {
// id
private Long id;
// vis的用户id
private Long userId;
// 大屏账号
private String platformAccount;
// 活动id
private Long activityId;
// 应用id
private Long appId;
// 收货人名称
private String name;
// 收货人地址
private String address;
// 收获人手机号
private String cellphone;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.contact.vis.service.impl;
import com.topdraw.business.module.contact.vis.domain.ActivityAddress;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.contact.vis.repository.ActivityAddressRepository;
import com.topdraw.business.module.contact.vis.service.ActivityAddressService;
import com.topdraw.business.module.contact.vis.service.dto.ActivityAddressDTO;
import com.topdraw.business.module.contact.vis.service.mapper.ActivityAddressMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Objects;
/**
* @author XiangHan
* @date 2022-04-24
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class ActivityAddressServiceImpl implements ActivityAddressService {
@Autowired
private ActivityAddressRepository activityAddressRepository;
@Autowired
private ActivityAddressMapper activityAddressMapper;
@Override
// @Cacheable(cacheNames = "uce::activityAddress::platformAccount", key = "#platformAccount")
public List<ActivityAddressDTO> findByPlatformAccount(String platformAccount) {
List<ActivityAddress> activityAddress = activityAddressRepository.findByPlatformAccount(platformAccount);
return this.activityAddressMapper.toDto(activityAddress);
}
@Override
public ActivityAddressDTO createOrUpdateActivityAddress(ActivityAddress resources) {
ActivityAddressDTO activityAddressDTO = this.findByPlatformAccountAndActivityId(resources);
if (Objects.isNull(activityAddressDTO.getId())) {
activityAddressDTO = this.create(resources);
} else {
resources.setId(activityAddressDTO.getId());
resources.setUpdateTime(TimestampUtil.now());
activityAddressDTO = this.update(resources);
}
return activityAddressDTO;
}
@Override
public ActivityAddressDTO findByPlatformAccountAndActivityId(ActivityAddress resources) {
String platformAccount = resources.getPlatformAccount();
Long activityId = resources.getActivityId();
ActivityAddress activityAddress = activityAddressRepository.findByPlatformAccountAndActivityId(platformAccount, activityId).orElseGet(ActivityAddress::new);
return this.activityAddressMapper.toDto(activityAddress);
}
@Override
public ActivityAddressDTO findById(Long id) {
ActivityAddress ActivityAddress = activityAddressRepository.findById(id).orElseGet(ActivityAddress::new);
ValidationUtil.isNull(ActivityAddress.getId(),"ActivityAddress","id",id);
return this.activityAddressMapper.toDto(ActivityAddress);
}
@Override
@Transactional(rollbackFor = Exception.class)
// @CachePut(cacheNames = "uce::activityAddress::platformAccount", key = "#resources.platformAccount")
public ActivityAddressDTO create(ActivityAddress resources) {
ActivityAddress activityAddress = activityAddressRepository.save(resources);
return this.activityAddressMapper.toDto(activityAddress);
}
@Override
@Transactional(rollbackFor = Exception.class)
// @CachePut(cacheNames = "uce::activityAddress::platformAccount", key = "#resources.platformAccount")
public ActivityAddressDTO update(ActivityAddress resources) {
ActivityAddress activityAddress = activityAddressRepository.findById(resources.getId()).orElseGet(ActivityAddress::new);
ValidationUtil.isNull( activityAddress.getId(),"ActivityAddress","id",resources.getId());
activityAddress.copy(resources);
ActivityAddress save = activityAddressRepository.save(activityAddress);
return this.activityAddressMapper.toDto(save);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
ActivityAddress ActivityAddress = activityAddressRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", ActivityAddress.class, id), 1));
activityAddressRepository.delete(ActivityAddress);
}
}
package com.topdraw.business.module.points.standingbook.service.mapper;
package com.topdraw.business.module.contact.vis.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.points.standingbook.domain.PointsStandingBook;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookDTO;
import com.topdraw.business.module.contact.vis.domain.ActivityAddress;
import com.topdraw.business.module.contact.vis.service.dto.ActivityAddressDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2021-10-29
* @date 2022-04-24
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface PointsStandingBookMapper extends BaseMapper<PointsStandingBookDTO, PointsStandingBook> {
public interface ActivityAddressMapper extends BaseMapper<ActivityAddressDTO, ActivityAddress> {
}
......
......@@ -12,7 +12,6 @@ import java.sql.Timestamp;
import java.math.BigDecimal;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -25,94 +24,94 @@ import java.time.LocalDateTime;
@Table(name="m_coupon")
public class Coupon implements Serializable {
// id
/** id */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 名称
/** 名称 */
@Column(name = "title", nullable = false)
private String title;
// 图片
/** 图片 */
@Column(name = "images")
private String images;
// 发行量,-1代表不限量
/** 发行量,-1代表不限量 */
@Column(name = "stock")
private Integer stock;
// 剩余量,-1代表不限量
/** 剩余量,-1代表不限量 */
@Column(name = "remain_stock")
private Integer remainStock;
// 优惠形式:1:现金;2:折扣
/** 优惠形式:1:现金;2:折扣 */
@Column(name = "use_type")
private Integer useType;
// 面额
/** 面额 */
@Column(name = "denomination")
private BigDecimal denomination;
// 折扣
/** 折扣 */
@Column(name = "discount")
private BigDecimal discount;
// 适用用户范围:1:新用户;2:全体用户
/** 适用用户范围:1:新用户;2:全体用户 */
@Column(name = "user_range")
private Integer userRange;
// 限领次数 -1:无限次; >0:具体次数
/** 限领次数 -1:无限次; >0:具体次数 */
@Column(name = "collect_limit")
private Integer collectLimit;
// 适用门槛:1:无门槛;2:满减形式
/** 适用门槛:1:无门槛;2:满减形式 */
@Column(name = "threshold_type")
private Integer thresholdType;
// 满减门槛
/** 满减门槛 */
@Column(name = "amount_threshold")
private BigDecimal amountThreshold;
// 产品范围:1:全部商品;2:指定商品
/** 产品范围:1:全部商品;2:指定商品 */
@Column(name = "item_range")
private Integer itemRange;
// 生效形式:1:固定日期;2:相对日期
/** 生效形式:1:固定日期;2:相对日期 */
@Column(name = "effect_type")
private Integer effectType;
// 生效时间
/** 生效时间 */
@Column(name = "start_time")
private Timestamp startTime;
// 过期时间
/** 过期时间 */
@Column(name = "expire_time")
private LocalDateTime expireTime;
private Timestamp expireTime;
// 自领取当日,几天内有效
/** 自领取当日,几天内有效 */
@Column(name = "valid_days")
private Integer validDays;
// 使用说明
/** 使用说明 */
@Column(name = "description")
private String description;
// 状态0:未开始,1:启用;2:停用
/** 状态0:未开始,1:启用;2:停用 */
@Column(name = "status")
private Integer status;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.coupon.domain;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.util.IdWorker;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Objects;
/**
* 优惠券
*/
public class CouponBuilder {
public static Coupon build(CouponDTO couponDTO){
Coupon coupon = new Coupon();
BeanUtils.copyProperties(couponDTO,coupon);
return build(coupon.getId(),
coupon.getCode(),
coupon.getTitle(),coupon.getImages(),coupon.getStock(),coupon.getRemainStock(),coupon.getUseType(),
coupon.getDenomination(),coupon.getDiscount(),coupon.getUserRange(),coupon.getCollectLimit(),
coupon.getThresholdType(),coupon.getAmountThreshold(),coupon.getItemRange(),coupon.getEffectType(),
coupon.getStartTime(),coupon.getExpireTime(),coupon.getValidDays(),coupon.getDescription(),coupon.getStatus());
}
public static Coupon build(Coupon coupon){
return build(coupon.getId(),
coupon.getCode(),
coupon.getTitle(),coupon.getImages(),coupon.getStock(),coupon.getRemainStock(),coupon.getUseType(),
coupon.getDenomination(),coupon.getDiscount(),coupon.getUserRange(),coupon.getCollectLimit(),
coupon.getThresholdType(),coupon.getAmountThreshold(),coupon.getItemRange(),coupon.getEffectType(),
coupon.getStartTime(),coupon.getExpireTime(),coupon.getValidDays(),coupon.getDescription(),coupon.getStatus());
}
public static Coupon build(Long id , String code , String title,
String images,
Integer stock,
Integer remainStock,
Integer useType,
BigDecimal denomination,
BigDecimal discount,
Integer userRange,
Integer collectLimit,
Integer thresholdType,
BigDecimal amountThreshold,
Integer itemRange,
Integer effectType,
Timestamp startTime,
Timestamp expireTime,
Integer validDays,String description , Integer status){
Coupon coupon = new Coupon();
coupon.setId(id);
coupon.setCode(StringUtils.isBlank(code)? IdWorker.generatorCode("coupon"):code);
coupon.setTitle(StringUtils.isBlank(title)?null:title);
coupon.setImages(StringUtils.isBlank(images)?null:images);
coupon.setStock(Objects.isNull(stock)?null:stock);
coupon.setRemainStock(Objects.isNull(remainStock)?null:remainStock);
coupon.setUseType(Objects.isNull(useType)?null:useType);
coupon.setDenomination(Objects.isNull(denomination)?null:denomination);
coupon.setDiscount(Objects.isNull(discount)?null:discount);
coupon.setUserRange(Objects.isNull(userRange)?null:userRange);
coupon.setCollectLimit(collectLimit);
coupon.setThresholdType(Objects.isNull(thresholdType)?null:thresholdType);
coupon.setAmountThreshold(Objects.isNull(amountThreshold)?null:amountThreshold);
coupon.setItemRange(Objects.isNull(itemRange)?null:itemRange);
coupon.setEffectType(Objects.isNull(effectType)?null:effectType);
coupon.setStartTime(Objects.isNull(startTime)?null: startTime);
coupon.setExpireTime(Objects.isNull(expireTime)?null:expireTime);
coupon.setValidDays(validDays);
coupon.setDescription(StringUtils.isBlank(description)?"":description);
coupon.setStatus(Objects.nonNull(status)?status:0);
return coupon;
}
}
......@@ -11,7 +11,6 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -24,57 +23,60 @@ import java.time.LocalDateTime;
@Table(name="m_coupon_history")
public class CouponHistory implements Serializable {
// 主键
@Transient
private String memberCode;
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 优惠券id
/** 优惠券id */
@Column(name = "coupon_id")
private Long couponId;
// 领券用户id(对应账号)
/** 领券用户id(对应账号) */
@Column(name = "user_id")
private Long userId;
// 优惠券code
/** 优惠券code */
@Column(name = "coupon_code")
private String couponCode;
// 领取人昵称
/** 领取人昵称 */
@Column(name = "user_nickname")
private String userNickname;
// 领取时间
/** 领取时间 */
@Column(name = "receive_time")
private LocalDateTime receiveTime;
private Timestamp receiveTime;
// 失效时间
/** 失效时间 */
@Column(name = "expire_time")
private LocalDateTime expireTime;
private Timestamp expireTime;
// 使用状态 0:未使用;1:已使用;-1:已过期
/** 使用状态 0:未使用;1:已使用;-1:已过期 */
@Column(name = "use_status")
private Integer useStatus;
// 使用时间
/** 使用时间 */
@Column(name = "use_time")
private LocalDateTime useTime;
private Timestamp useTime;
// 订单详情id
/** 订单详情id */
@Column(name = "order_detail_id")
private Long orderDetailId;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private LocalDateTime createTime;
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private LocalDateTime updateTime;
private Timestamp updateTime;
public void copy(CouponHistory source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
......
package com.topdraw.business.module.coupon.history.domain;
import com.topdraw.business.module.coupon.domain.Coupon;
import com.topdraw.util.TimestampUtil;
import org.apache.commons.lang3.StringUtils;
import java.sql.Timestamp;
import java.util.Objects;
/**
* 优惠券
*/
public class CouponHistoryBuilder {
public static CouponHistory build(CouponHistory couponHistory){
return build(couponHistory.getId(),
couponHistory.getCouponId(),
couponHistory.getUserId(),
couponHistory.getCouponCode(),
couponHistory.getUserNickname(),
couponHistory.getReceiveTime(),
couponHistory.getExpireTime(),
couponHistory.getUseStatus(),
couponHistory.getUseTime(),
couponHistory.getOrderDetailId());
}
public static CouponHistory build(Coupon coupon,Long userId,String userNickname){
return build(coupon,userId,userNickname,null);
}
public static CouponHistory build(Coupon coupon,Long userId,String userNickname,Long orderDetailId){
return build(null,
coupon.getId(),userId,coupon.getCode(),userNickname, TimestampUtil.now(),
coupon.getExpireTime(),coupon.getStatus(),null,orderDetailId);
}
public static CouponHistory build(Long id , Long couponId , Long userId, String couponCode, String userNickname, Timestamp receiveTime,
Timestamp expireTime, Integer useStatus, Timestamp useTime,
Long orderDetailId) {
CouponHistory couponHistory = new CouponHistory();
couponHistory.setId(id);
couponHistory.setCouponId(Objects.isNull(couponId)?null:couponId);
couponHistory.setUserId(Objects.isNull(userId)?null:userId);
couponHistory.setCouponCode(StringUtils.isBlank(couponCode)?null:couponCode);
couponHistory.setUserNickname(StringUtils.isBlank(userNickname)?null:userNickname);
couponHistory.setReceiveTime(Objects.isNull(receiveTime)?null:receiveTime);
couponHistory.setExpireTime(Objects.isNull(expireTime)?null:expireTime);
couponHistory.setUseStatus(Objects.isNull(useStatus)?0:useStatus);
couponHistory.setUseTime(Objects.isNull(useTime)?null:useTime);
couponHistory.setOrderDetailId(Objects.isNull(orderDetailId)?null:orderDetailId);
return couponHistory;
}
}
package com.topdraw.business.module.coupon.history.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.coupon.history.domain.CouponHistory;
import com.topdraw.business.module.coupon.history.service.CouponHistoryService;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryQueryCriteria;
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-10-23
*/
@Api(tags = "CouponHistory管理")
@RestController
@RequestMapping("/api/CouponHistory")
public class CouponHistoryController {
@Autowired
private CouponHistoryService CouponHistoryService;
@GetMapping
@ApiOperation("查询CouponHistory")
public ResultInfo getCouponHistorys(CouponHistoryQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(CouponHistoryService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有CouponHistory")
public ResultInfo getCouponHistorys(CouponHistoryQueryCriteria criteria) {
return ResultInfo.success(CouponHistoryService.queryAll(criteria));
}
@PostMapping(value = "/create")
@ApiOperation("新增CouponHistory")
public ResultInfo create(@Validated @RequestBody CouponHistory resources) {
CouponHistoryService.create(resources);
return ResultInfo.success();
}
@PutMapping(value = "/update")
@ApiOperation("修改CouponHistory")
public ResultInfo update(@Validated @RequestBody CouponHistory resources) {
CouponHistoryService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/delete/{id}")
@ApiOperation("删除CouponHistory")
public ResultInfo delete(@PathVariable Long id) {
CouponHistoryService.delete(id);
return ResultInfo.success();
}
}
......@@ -2,13 +2,8 @@ package com.topdraw.business.module.coupon.history.service;
import com.topdraw.business.module.coupon.history.domain.CouponHistory;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryDTO;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -16,20 +11,6 @@ import java.util.List;
*/
public interface CouponHistoryService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(CouponHistoryQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<CouponHistoryDTO>
*/
List<CouponHistoryDTO> queryAll(CouponHistoryQueryCriteria criteria);
/**
* 根据ID查询
......@@ -38,15 +19,33 @@ public interface CouponHistoryService {
*/
CouponHistoryDTO findById(Long id);
/**
*
* @param resources
*/
void create(CouponHistory resources);
void update(CouponHistory resources);
void delete(Long id);
/**
*
* @param userId
* @return
*/
Long countByUserId(Long userId);
/**
*
* @param userId
* @param now
* @return
*/
Long countByUserIdAndExpireTimeBefore(Long userId, LocalDateTime now);
/**
*
* @param userId
* @param now
* @param expireTime
* @return
*/
Long countByUserIdAndExpireTimeBetween(Long userId, LocalDateTime now, LocalDateTime expireTime);
}
......
......@@ -2,7 +2,7 @@ package com.topdraw.business.module.coupon.history.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.sql.Timestamp;
/**
......@@ -12,39 +12,39 @@ import java.time.LocalDateTime;
@Data
public class CouponHistoryDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 优惠券id
/** 优惠券id */
private Long couponId;
// 领券用户id(对应账号)
/** 领券用户id(对应账号) */
private Long userId;
// 优惠券code
/** 优惠券code */
private String couponCode;
// 领取人昵称
/** 领取人昵称 */
private String userNickname;
// 领取时间
private LocalDateTime receiveTime;
/** 领取时间 */
private Timestamp receiveTime;
// 失效时间
private LocalDateTime expireTime;
/** 失效时间 */
private Timestamp expireTime;
// 使用状态 0:未使用;1:已使用;-1:已过期
/** 使用状态 0:未使用;1:已使用;-1:已过期 */
private Integer useStatus;
// 使用时间
private LocalDateTime useTime;
/** 使用时间 */
private Timestamp useTime;
// 订单详情id
/** 订单详情id */
private Long orderDetailId;
// 创建时间
private LocalDateTime createTime;
/** 创建时间 */
private Timestamp createTime;
// 更新时间
private LocalDateTime updateTime;
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.coupon.history.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-23
*/
@Data
public class CouponHistoryQueryCriteria{
}
package com.topdraw.business.module.coupon.history.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.coupon.history.domain.CouponHistory;
import com.topdraw.business.module.coupon.history.domain.CouponHistoryBuilder;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.coupon.history.repository.CouponHistoryRepository;
import com.topdraw.business.module.coupon.history.service.CouponHistoryService;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryDTO;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryQueryCriteria;
import com.topdraw.business.module.coupon.history.service.mapper.CouponHistoryMapper;
import 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.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -33,69 +23,38 @@ import java.util.Map;
public class CouponHistoryServiceImpl implements CouponHistoryService {
@Autowired
private CouponHistoryRepository CouponHistoryRepository;
private CouponHistoryMapper couponHistoryMapper;
@Autowired
private CouponHistoryMapper CouponHistoryMapper;
@Override
public Map<String, Object> queryAll(CouponHistoryQueryCriteria criteria, Pageable pageable) {
Page<CouponHistory> page = CouponHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(CouponHistoryMapper::toDto));
}
private CouponHistoryRepository couponHistoryRepository;
@Override
public List<CouponHistoryDTO> queryAll(CouponHistoryQueryCriteria criteria) {
return CouponHistoryMapper.toDto(CouponHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public CouponHistoryDTO findById(Long id) {
CouponHistory CouponHistory = CouponHistoryRepository.findById(id).orElseGet(CouponHistory::new);
ValidationUtil.isNull(CouponHistory.getId(),"CouponHistory","id",id);
return CouponHistoryMapper.toDto(CouponHistory);
CouponHistory couponHistory = this.couponHistoryRepository.findById(id).orElseGet(CouponHistory::new);
ValidationUtil.isNull(couponHistory.getId(),"CouponHistory","id",id);
return this.couponHistoryMapper.toDto(couponHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(CouponHistory resources) {
CouponHistoryRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(CouponHistory resources) {
CouponHistory CouponHistory = CouponHistoryRepository.findById(resources.getId()).orElseGet(CouponHistory::new);
ValidationUtil.isNull( CouponHistory.getId(),"CouponHistory","id",resources.getId());
CouponHistory.copy(resources);
CouponHistoryRepository.save(CouponHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
CouponHistory CouponHistory = CouponHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", CouponHistory.class, id), 1));
CouponHistoryRepository.delete(CouponHistory);
CouponHistory couponHistory = CouponHistoryBuilder.build(resources);
this.couponHistoryRepository.save(couponHistory);
}
@Override
public Long countByUserId(Long userId) {
return this.CouponHistoryRepository.countByUserId(userId);
return this.couponHistoryRepository.countByUserId(userId);
}
@Override
public Long countByUserIdAndExpireTimeBefore(Long userId, LocalDateTime now) {
return this.CouponHistoryRepository.countByUserIdAndExpireTimeBefore(userId,now);
return this.couponHistoryRepository.countByUserIdAndExpireTimeBefore(userId,now);
}
@Override
public Long countByUserIdAndExpireTimeBetween(Long userId, LocalDateTime now, LocalDateTime expireTime) {
return this.CouponHistoryRepository.countByUserIdAndExpireTimeBetween(userId,now,expireTime);
return this.couponHistoryRepository.countByUserIdAndExpireTimeBetween(userId,now,expireTime);
}
}
......
package com.topdraw.business.module.coupon.repository;
import com.topdraw.business.module.coupon.domain.Coupon;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
import java.util.Optional;
/**
......@@ -13,4 +15,5 @@ import java.util.Optional;
public interface CouponRepository extends JpaRepository<Coupon, Long>, JpaSpecificationExecutor<Coupon> {
Optional<Coupon> findFirstByCode(String code);
}
......
package com.topdraw.business.module.coupon.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.coupon.domain.Coupon;
import com.topdraw.business.module.coupon.service.CouponService;
import com.topdraw.business.module.coupon.service.dto.CouponQueryCriteria;
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-10-22
*/
@Api(tags = "Coupon管理")
@RestController
@RequestMapping("/api/Coupon")
public class CouponController {
@Autowired
private CouponService CouponService;
@GetMapping
@ApiOperation("查询Coupon")
public ResultInfo getCoupons(CouponQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(CouponService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有Coupon")
public ResultInfo getCoupons(CouponQueryCriteria criteria) {
return ResultInfo.success(CouponService.queryAll(criteria));
}
@PostMapping(value = "/create")
@ApiOperation("新增Coupon")
public ResultInfo create(@Validated @RequestBody Coupon resources) {
CouponService.create(resources);
return ResultInfo.success();
}
@PutMapping(value = "/update")
@ApiOperation("修改Coupon")
public ResultInfo update(@Validated @RequestBody Coupon resources) {
CouponService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/delete/{id}")
@ApiOperation("删除Coupon")
public ResultInfo delete(@PathVariable Long id) {
CouponService.delete(id);
return ResultInfo.success();
}
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(CouponService.getByCode(code));
}
}
package com.topdraw.business.module.coupon.service;
import com.topdraw.business.module.coupon.domain.Coupon;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.business.module.coupon.service.dto.CouponQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -14,37 +9,18 @@ import java.util.List;
public interface CouponService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(CouponQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<CouponDTO>
*/
List<CouponDTO> queryAll(CouponQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return CouponDTO
*/
CouponDTO findById(Long id);
void create(Coupon resources);
void update(Coupon resources);
void delete(Long id);
/**
* Code校验
* @param code
* @return CouponDTO
*/
CouponDTO getByCode(String code);
}
......
......@@ -4,7 +4,6 @@ import lombok.Data;
import java.sql.Timestamp;
import java.math.BigDecimal;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
......@@ -14,69 +13,69 @@ import java.time.LocalDateTime;
@Data
public class CouponDTO implements Serializable {
// id
/** id */
private Long id;
// 标识
/** 标识 */
private String code;
// 名称
/** 名称 */
private String title;
// 图片
/** 图片 */
private String images;
// 发行量,-1代表不限量
/** 发行量,-1代表不限量 */
private Integer stock;
// 剩余量,-1代表不限量
/** 剩余量,-1代表不限量 */
private Integer remainStock;
// 优惠形式:1:现金;2:折扣
/** 优惠形式:1:现金;2:折扣 */
private Integer useType;
// 面额
/** 面额 */
private BigDecimal denomination;
// 折扣
/** 折扣 */
private BigDecimal discount;
// 适用用户范围:1:新用户;2:全体用户
/** 适用用户范围:1:新用户;2:全体用户 */
private Integer userRange;
// 限领次数 -1:无限次; >0:具体次数
/** 限领次数 -1:无限次; >0:具体次数 */
private Integer collectLimit;
// 适用门槛:1:无门槛;2:满减形式
/** 适用门槛:1:无门槛;2:满减形式 */
private Integer thresholdType;
// 满减门槛
/** 满减门槛 */
private BigDecimal amountThreshold;
// 产品范围:1:全部商品;2:指定商品
/** 产品范围:1:全部商品;2:指定商品 */
private Integer itemRange;
// 生效形式:1:固定日期;2:相对日期
/** 生效形式:1:固定日期;2:相对日期 */
private Integer effectType;
// 生效时间
/** 生效时间 */
private Timestamp startTime;
// 过期时间
private LocalDateTime expireTime;
/** 过期时间 */
private Timestamp expireTime;
// 自领取当日,几天内有效
/** 自领取当日,几天内有效 */
private Integer validDays;
// 使用说明
/** 使用说明 */
private String description;
// 状态0:未开始,1:启用;2:停用
/** 状态0:未开始,1:启用;2:停用 */
private Integer status;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.coupon.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class CouponQueryCriteria{
}
package com.topdraw.business.module.coupon.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.coupon.domain.Coupon;
import com.topdraw.util.RedissonUtil;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.coupon.repository.CouponRepository;
import com.topdraw.business.module.coupon.service.CouponService;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.business.module.coupon.service.dto.CouponQueryCriteria;
import com.topdraw.business.module.coupon.service.mapper.CouponMapper;
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 com.topdraw.utils.StringUtils;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -34,73 +23,24 @@ import java.util.Map;
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class CouponServiceImpl implements CouponService {
@Autowired
private CouponRepository CouponRepository;
@Autowired
private CouponMapper CouponMapper;
private CouponMapper couponMapper;
@Autowired
private RedissonClient redissonClient;
@Override
public Map<String, Object> queryAll(CouponQueryCriteria criteria, Pageable pageable) {
Page<Coupon> page = CouponRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(CouponMapper::toDto));
}
@Override
public List<CouponDTO> queryAll(CouponQueryCriteria criteria) {
return CouponMapper.toDto(CouponRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private CouponRepository couponRepository;
@Override
public CouponDTO findById(Long id) {
Coupon Coupon = CouponRepository.findById(id).orElseGet(Coupon::new);
ValidationUtil.isNull(Coupon.getId(),"Coupon","id",id);
return CouponMapper.toDto(Coupon);
}
Assert.notNull(id, GlobeExceptionMsg.COUPON_ID_IS_NULL);
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(Coupon resources) {
CouponRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(Coupon resources) {
RLock rLock = this.redissonClient.getLock(resources.getId().toString());
try {
RedissonUtil.lock(rLock);
Coupon Coupon = CouponRepository.findById(resources.getId()).orElseGet(Coupon::new);
ValidationUtil.isNull( Coupon.getId(),"Coupon","id",resources.getId());
Coupon.copy(resources);
CouponRepository.save(Coupon);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
Coupon coupon = this.couponRepository.findById(id).orElseGet(Coupon::new);
ValidationUtil.isNull(coupon.getId(),"Coupon","id",id);
return this.couponMapper.toDto(coupon);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
Coupon Coupon = CouponRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Coupon.class, id), 1));
CouponRepository.delete(Coupon);
}
@Override
public CouponDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? CouponMapper.toDto(CouponRepository.findFirstByCode(code).orElseGet(Coupon::new))
return StringUtils.isNotEmpty(code) ? this.couponMapper.toDto(this.couponRepository.findFirstByCode(code).orElseGet(Coupon::new))
: new CouponDTO();
}
}
......
......@@ -23,70 +23,73 @@ import java.io.Serializable;
@Table(name="uc_exp_detail")
public class ExpDetail implements Serializable {
// 主键
@Transient
private String memberCode;
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 应用code
/** 应用code */
@Column(name = "app_code")
private String appCode;
// 会员id
/** 会员id */
@Column(name = "member_id", nullable = false)
private Long memberId;
// 账号id
/** 账号id */
@Column(name = "account_id")
private Long accountId;
// 原始成长值
/** 原始成长值 */
@Column(name = "original_exp", nullable = false)
private Long originalExp;
// 结果成长值
/** 结果成长值 */
@Column(name = "result_exp", nullable = false)
private Long resultExp;
// 成长值变化,一般为正数
/** 成长值变化,一般为正数 */
@Column(name = "exp", nullable = false)
private Long exp;
// 设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
@Column(name = "device_type", nullable = false)
private Integer deviceType;
// 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;98:系统操作;99:其他
/** 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;98:系统操作;99:其他 */
@Column(name = "evt_type", nullable = false)
private Integer evtType;
// 订单id(针对订购操作)
/** 订单id(针对订购操作) */
@Column(name = "order_id")
private Long orderId;
// 节目id(针对观影操作)
/** 节目id(针对观影操作) */
@Column(name = "media_id")
private Long mediaId;
// 活动id(针对参与活动)
/** 活动id(针对参与活动) */
@Column(name = "activity_id")
private Long activityId;
// 成长值变化描述,用于管理侧显示
/** 成长值变化描述,用于管理侧显示 */
@Column(name = "description", nullable = false)
private String description;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.exp.detail.domain;
import com.topdraw.exception.GlobeExceptionMsg;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.util.Objects;
public class ExpDetailBuilder {
public static ExpDetail build(Long memberId, Long originalExp, Long resultExp,
Integer deviceType, Integer evtType){
ExpDetail expDetail = new ExpDetail();
expDetail.setMemberId(memberId);
expDetail.setOriginalExp(originalExp);
expDetail.setResultExp(resultExp);
expDetail.setDeviceType(deviceType);
expDetail.setEvtType(evtType);
return build(expDetail);
}
public static ExpDetail build(ExpDetail expDetail){
return build(expDetail.getId(),
expDetail.getCode(),
expDetail.getAppCode(),
expDetail.getMemberId(),
expDetail.getAccountId(),
expDetail.getOriginalExp(),expDetail.getResultExp(),
expDetail.getExp(),expDetail.getDeviceType(),
expDetail.getEvtType(), expDetail.getOrderId(), expDetail.getMediaId(),
expDetail.getActivityId(),expDetail.getDescription());
}
public static ExpDetail build(Long id, String code,
String appCode, Long memberId, Long accountId,
Long originalExp, Long resultExp, Long exp,
Integer deviceType, Integer evtType, Long orderId,
Long mediaId, Long activityId, String description){
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
ExpDetail expDetail = new ExpDetail();
expDetail.setId(Objects.isNull(id)?null:id);
expDetail.setCode(StringUtils.isBlank(code)?null:code);
expDetail.setAppCode(StringUtils.isBlank(appCode)?null:appCode);
expDetail.setMemberId(Objects.isNull(memberId)?null:memberId);
expDetail.setAccountId(Objects.isNull(accountId)?null:accountId);
expDetail.setOriginalExp(Objects.isNull(originalExp)?0:originalExp);
expDetail.setResultExp(Objects.isNull(resultExp)?0:resultExp);
expDetail.setExp(Objects.isNull(exp)?0:exp);
expDetail.setDeviceType(Objects.isNull(deviceType)?null:deviceType);
expDetail.setEvtType(Objects.isNull(evtType)?null:evtType);
expDetail.setOrderId(Objects.isNull(orderId)?null:orderId);
expDetail.setMediaId(Objects.isNull(mediaId)?null:mediaId);
expDetail.setActivityId(Objects.isNull(activityId)?null:activityId);
expDetail.setDescription(StringUtils.isBlank(description)?null:description);
return expDetail;
}
}
package com.topdraw.business.module.exp.detail.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import com.topdraw.business.module.exp.detail.service.ExpDetailService;
import com.topdraw.business.module.exp.detail.service.dto.ExpDetailQueryCriteria;
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-10-22
*/
@Api(tags = "ExpDetail管理")
@RestController
@RequestMapping("/api/ExpDetail")
public class ExpDetailController {
@Autowired
private ExpDetailService ExpDetailService;
@GetMapping
@ApiOperation("查询ExpDetail")
public ResultInfo getExpDetails(ExpDetailQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(ExpDetailService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有ExpDetail")
public ResultInfo getExpDetails(ExpDetailQueryCriteria criteria) {
return ResultInfo.success(ExpDetailService.queryAll(criteria));
}
@PostMapping(value = "/create")
@ApiOperation("新增ExpDetail")
public ResultInfo create(@Validated @RequestBody ExpDetail resources) {
ExpDetailService.create(resources);
return ResultInfo.success();
}
@PutMapping(value = "/update")
@ApiOperation("修改ExpDetail")
public ResultInfo update(@Validated @RequestBody ExpDetail resources) {
ExpDetailService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/delete/{id}")
@ApiOperation("删除ExpDetail")
public ResultInfo delete(@PathVariable Long id) {
ExpDetailService.delete(id);
return ResultInfo.success();
}
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(ExpDetailService.getByCode(code));
}
}
......@@ -2,10 +2,6 @@ package com.topdraw.business.module.exp.detail.service;
import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import com.topdraw.business.module.exp.detail.service.dto.ExpDetailDTO;
import com.topdraw.business.module.exp.detail.service.dto.ExpDetailQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -14,31 +10,28 @@ import java.util.List;
public interface ExpDetailService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(ExpDetailQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<ExpDetailDTO>
*/
List<ExpDetailDTO> queryAll(ExpDetailQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return ExpDetailDTO
*/
ExpDetailDTO findById(Long id);
/**
*
* @param resources
*/
void create(ExpDetail resources);
/**
*
* @param resources
*/
void update(ExpDetail resources);
/**
*
* @param id
*/
void delete(Long id);
/**
......
......@@ -12,51 +12,51 @@ import java.io.Serializable;
@Data
public class ExpDetailDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 标识
/** 标识 */
private String code;
// 应用code
/** 应用code */
private String appCode;
// 会员id
/** 会员id */
private Long memberId;
// 账号id
/** 账号id */
private Long accountId;
// 原始成长值
/** 原始成长值 */
private Long originalExp;
// 结果成长值
/** 结果成长值 */
private Long resultExp;
// 成长值变化,一般为正数
/** 成长值变化,一般为正数 */
private Long exp;
// 设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
private Integer deviceType;
// 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;98:系统操作;99:其他
/** 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;98:系统操作;99:其他 */
private Integer evtType;
// 订单id(针对订购操作)
/** 订单id(针对订购操作) */
private Long orderId;
// 节目id(针对观影操作)
/** 节目id(针对观影操作) */
private Long mediaId;
// 活动id(针对参与活动)
/** 活动id(针对参与活动) */
private Long activityId;
// 成长值变化描述,用于管理侧显示
/** 成长值变化描述,用于管理侧显示 */
private String description;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.exp.detail.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class ExpDetailQueryCriteria{
}
package com.topdraw.business.module.exp.detail.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import com.topdraw.business.module.exp.detail.domain.ExpDetailBuilder;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.exp.detail.repository.ExpDetailRepository;
import com.topdraw.business.module.exp.detail.service.ExpDetailService;
import com.topdraw.business.module.exp.detail.service.dto.ExpDetailDTO;
import com.topdraw.business.module.exp.detail.service.dto.ExpDetailQueryCriteria;
import com.topdraw.business.module.exp.detail.service.mapper.ExpDetailMapper;
import 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 com.topdraw.utils.StringUtils;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -34,71 +26,56 @@ import java.util.Map;
public class ExpDetailServiceImpl implements ExpDetailService {
@Autowired
private ExpDetailRepository ExpDetailRepository;
private ExpDetailRepository expDetailRepository;
@Autowired
private ExpDetailMapper ExpDetailMapper;
private ExpDetailMapper expDetailMapper;
@Autowired
private RedissonClient redissonClient;
@Override
public Map<String, Object> queryAll(ExpDetailQueryCriteria criteria, Pageable pageable) {
Page<ExpDetail> page = ExpDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(ExpDetailMapper::toDto));
}
@Override
public List<ExpDetailDTO> queryAll(ExpDetailQueryCriteria criteria) {
return ExpDetailMapper.toDto(ExpDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private RedisUtils redisUtils;
@Override
public ExpDetailDTO findById(Long id) {
ExpDetail ExpDetail = ExpDetailRepository.findById(id).orElseGet(ExpDetail::new);
ExpDetail ExpDetail = this.expDetailRepository.findById(id).orElseGet(ExpDetail::new);
ValidationUtil.isNull(ExpDetail.getId(),"ExpDetail","id",id);
return ExpDetailMapper.toDto(ExpDetail);
return this.expDetailMapper.toDto(ExpDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(ExpDetail resources) {
ExpDetailRepository.save(resources);
ExpDetail expDetail = ExpDetailBuilder.build(resources);
this.expDetailRepository.save(expDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(ExpDetail resources) {
RLock rLock = this.redissonClient.getLock(resources.getId().toString());
this.redisUtils.doLock("expDetail::memberId::" + resources.getMemberId());
try {
ExpDetail ExpDetail = ExpDetailRepository.findById(resources.getId()).orElseGet(ExpDetail::new);
ExpDetail ExpDetail = this.expDetailRepository.findById(resources.getId()).orElseGet(ExpDetail::new);
ValidationUtil.isNull( ExpDetail.getId(),"ExpDetail","id",resources.getId());
ExpDetail.copy(resources);
ExpDetailRepository.save(ExpDetail);
this.expDetailRepository.save(ExpDetail);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
rLock.unlock();
this.redisUtils.doUnLock("expDetail::memberId::" + resources.getMemberId());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
ExpDetail ExpDetail = ExpDetailRepository.findById(id).orElseThrow(
ExpDetail ExpDetail = this.expDetailRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", ExpDetail.class, id), 1));
ExpDetailRepository.delete(ExpDetail);
this.expDetailRepository.delete(ExpDetail);
}
@Override
public ExpDetailDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? ExpDetailMapper.toDto(ExpDetailRepository.findFirstByCode(code).orElseGet(ExpDetail::new))
return StringUtils.isNotEmpty(code) ? this.expDetailMapper.toDto(this.expDetailRepository.findFirstByCode(code).orElseGet(ExpDetail::new))
: new ExpDetailDTO();
}
}
......
package com.topdraw.business.module.exp.history.domain;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.IdWorker;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.util.Objects;
public class ExpHistoryBuilder {
public ExpHistory build(Long memberId, Long originalExp, Long resultExp, Long exp,Integer deviceType , Integer evtType) {
ExpHistory expHistory = new ExpHistory();
expHistory.setMemberId(memberId);
expHistory.setOriginalExp(originalExp);
expHistory.setResultExp(resultExp);
expHistory.setDeviceType(deviceType);
expHistory.setEvtType(evtType);
expHistory.setExp(exp);
return build(expHistory);
}
public ExpHistory build(ExpHistory expHistory) {
return build(expHistory.getId(),expHistory.getCode(),
expHistory.getMemberId(),expHistory.getAccountId(),
expHistory.getOriginalExp(),expHistory.getResultExp(),expHistory.getExp(),
expHistory.getDeviceType(),expHistory.getEvtType(),expHistory.getOrderId(),
expHistory.getMediaId(),expHistory.getActivityId(),expHistory.getDescription());
}
public ExpHistory build(Long id,String code,Long memberId,Long accountId,
Long originalExp,Long resultExp,Long exp,
Integer deviceType,Integer evtType,Long orderId,
Long mediaId,Long activityId,String description) {
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
ExpHistory expHistory = new ExpHistory();
expHistory.setId(Objects.isNull(id)?null:id);
expHistory.setCode(StringUtils.isBlank(code)? IdWorker.generatorCode("exp") :code);
expHistory.setMemberId(memberId);
expHistory.setAccountId(Objects.isNull(accountId)?null:accountId);
expHistory.setOriginalExp(Objects.isNull(originalExp)?0L:originalExp);
expHistory.setResultExp(Objects.isNull(resultExp)?0L:resultExp);
expHistory.setExp(Objects.isNull(exp)?0L:exp);
expHistory.setDeviceType(Objects.isNull(deviceType)?4:deviceType);
expHistory.setEvtType(Objects.isNull(evtType)?98:evtType);
expHistory.setOrderId(Objects.isNull(orderId)?null:orderId);
expHistory.setMediaId(Objects.isNull(mediaId)?null:mediaId);
expHistory.setActivityId(Objects.isNull(activityId)?null:activityId);
expHistory.setDescription(StringUtils.isBlank(description)?null:description);
return expHistory;
}
}
package com.topdraw.business.module.exp.history.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.exp.history.service.ExpHistoryService;
import com.topdraw.business.module.exp.history.service.dto.ExpHistoryQueryCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "ExpHistory管理")
@RestController
@RequestMapping("/api/ExpHistory")
public class ExpHistoryController {
@Autowired
private ExpHistoryService ExpHistoryService;
@GetMapping
@ApiOperation("查询ExpHistory")
public ResultInfo getExpHistorys(ExpHistoryQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(ExpHistoryService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有ExpHistory")
public ResultInfo getExpHistorys(ExpHistoryQueryCriteria criteria) {
return ResultInfo.success(ExpHistoryService.queryAll(criteria));
}
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(ExpHistoryService.getByCode(code));
}
}
......@@ -2,10 +2,6 @@ package com.topdraw.business.module.exp.history.service;
import com.topdraw.business.module.exp.history.domain.ExpHistory;
import com.topdraw.business.module.exp.history.service.dto.ExpHistoryDTO;
import com.topdraw.business.module.exp.history.service.dto.ExpHistoryQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -14,33 +10,18 @@ import java.util.List;
public interface ExpHistoryService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(ExpHistoryQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<ExpHistoryDTO>
*/
List<ExpHistoryDTO> queryAll(ExpHistoryQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return ExpHistoryDTO
*/
ExpHistoryDTO findById(Long id);
/**
*
* @param resources
*/
void create(ExpHistory resources);
void update(ExpHistory resources);
void delete(Long id);
/**
* Code校验
* @param code
......
package com.topdraw.business.module.exp.history.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class ExpHistoryQueryCriteria{
}
package com.topdraw.business.module.exp.history.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.exp.history.domain.ExpHistory;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.exp.history.repository.ExpHistoryRepository;
import com.topdraw.business.module.exp.history.service.ExpHistoryService;
import com.topdraw.business.module.exp.history.service.dto.ExpHistoryDTO;
import com.topdraw.business.module.exp.history.service.dto.ExpHistoryQueryCriteria;
import com.topdraw.business.module.exp.history.service.mapper.ExpHistoryMapper;
import 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,60 +22,28 @@ import java.util.Map;
public class ExpHistoryServiceImpl implements ExpHistoryService {
@Autowired
private ExpHistoryRepository ExpHistoryRepository;
private ExpHistoryMapper expHistoryMapper;
@Autowired
private ExpHistoryMapper ExpHistoryMapper;
private ExpHistoryRepository expHistoryRepository;
@Override
public Map<String, Object> queryAll(ExpHistoryQueryCriteria criteria, Pageable pageable) {
Page<ExpHistory> page = ExpHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(ExpHistoryMapper::toDto));
}
@Override
public List<ExpHistoryDTO> queryAll(ExpHistoryQueryCriteria criteria) {
return ExpHistoryMapper.toDto(ExpHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public ExpHistoryDTO findById(Long id) {
ExpHistory ExpHistory = ExpHistoryRepository.findById(id).orElseGet(ExpHistory::new);
ExpHistory ExpHistory = this.expHistoryRepository.findById(id).orElseGet(ExpHistory::new);
ValidationUtil.isNull(ExpHistory.getId(),"ExpHistory","id",id);
return ExpHistoryMapper.toDto(ExpHistory);
return this.expHistoryMapper.toDto(ExpHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(ExpHistory resources) {
ExpHistoryRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(ExpHistory resources) {
ExpHistory ExpHistory = ExpHistoryRepository.findById(resources.getId()).orElseGet(ExpHistory::new);
ValidationUtil.isNull( ExpHistory.getId(),"ExpHistory","id",resources.getId());
ExpHistory.copy(resources);
ExpHistoryRepository.save(ExpHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
ExpHistory ExpHistory = ExpHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", ExpHistory.class, id), 1));
ExpHistoryRepository.delete(ExpHistory);
this.expHistoryRepository.save(resources);
}
@Override
public ExpHistoryDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? ExpHistoryMapper.toDto(ExpHistoryRepository.findFirstByCode(code).orElseGet(ExpHistory::new))
return StringUtils.isNotEmpty(code) ? this.expHistoryMapper.toDto(this.expHistoryRepository.findFirstByCode(code).orElseGet(ExpHistory::new))
: new ExpHistoryDTO();
}
}
......
package com.topdraw.business.module.member.address.domain;
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 org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.sql.Timestamp;
/**
* @author XiangHan
......@@ -22,81 +23,79 @@ 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 {
@Transient
private String platformAccount;
// 主键
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 会员id
/** 会员id */
@Column(name = "member_id", nullable = false)
private Long memberId;
@Transient
private String memberCode;
// 类型 1:家;2:公司;3:学校
/** 类型 1:家;2:公司;3:学校 */
@Column(name = "type", nullable = false)
private Integer type;
// 是否默认地址
/** 是否默认地址 */
@Column(name = "is_default", nullable = false)
private Integer isDefault;
// 显示顺序
/** 显示顺序 */
@Column(name = "sequence")
private Integer sequence;
// 状态 0:不可用;1-可用
/** 状态 0:不可用;1-可用 */
@Column(name = "status", nullable = false)
private Integer status;
// 联系人姓名
/** 联系人姓名 */
@Column(name = "contactor", nullable = false)
private String contactor;
// 联系人电话
/** 联系人电话 */
@Column(name = "cellphone", nullable = false)
private String cellphone;
// 国家
/** 国家 */
@Column(name = "country", nullable = false)
private String country;
// 省份
/** 省份 */
@Column(name = "province", nullable = false)
private String province;
// 城市
/** 城市 */
@Column(name = "city", nullable = false)
private String city;
// 区县
/** 区县 */
@Column(name = "district", nullable = false)
private String district;
// 地址
/** 地址 */
@Column(name = "address", nullable = false)
private String address;
// 邮编
/** 邮编 */
@Column(name = "zip_code")
private String zipCode;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private LocalDateTime createTime;
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private LocalDateTime updateTime;
private Timestamp updateTime;
public void copy(MemberAddress source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
......
package com.topdraw.business.module.member.address.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.GlobeExceptionMsg;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/11 11:08
* @version: :
* @modified By:
* @since : modified in 2022/3/11 11:08
*/
public class MemberAddressBuilder {
private static final Integer DEFAULT_VALUE_0 = 0;
private static final Integer DEFAULT_VALUE_1 = 1;
public static MemberAddress build(MemberAddress memberAddress, Long memberId,String memberCode){
Long id = memberAddress.getId();
Integer type = memberAddress.getType();
Integer isDefault = memberAddress.getIsDefault();
Integer sequence = memberAddress.getSequence();
Integer status= memberAddress.getStatus();
String contactor = memberAddress.getContactor();
String cellphone = memberAddress.getCellphone();
String country = memberAddress.getCountry();
String province = memberAddress.getProvince();
String city = memberAddress.getCity();
String district = memberAddress.getDistrict();
String address = memberAddress.getAddress();
String zipCode = memberAddress.getZipCode();
return build(id,memberId,memberCode,type,isDefault,sequence,status,
contactor,cellphone,country,province,city,district,address,zipCode);
}
public static MemberAddress build(MemberAddress memberAddress, Member member){
Long id = memberAddress.getId();
Long memberId = member.getId();
String memberCode = member.getCode();
Integer type = memberAddress.getType();
Integer isDefault = memberAddress.getIsDefault();
Integer sequence = memberAddress.getSequence();
Integer status= memberAddress.getStatus();
String contactor = memberAddress.getContactor();
String cellphone = memberAddress.getCellphone();
String country = memberAddress.getCountry();
String province = memberAddress.getProvince();
String city = memberAddress.getCity();
String district = memberAddress.getDistrict();
String address = memberAddress.getAddress();
String zipCode = memberAddress.getZipCode();
return build(id, memberId, memberCode, type, isDefault, sequence, status,
contactor, cellphone, country, province, city, district, address, zipCode);
}
public static MemberAddress build(MemberAddress memberAddress){
Long id = memberAddress.getId();
Long memberId = memberAddress.getMemberId();
String memberCode = memberAddress.getMemberCode();
Integer type = memberAddress.getType();
Integer isDefault = memberAddress.getIsDefault();
Integer sequence = memberAddress.getSequence();
Integer status= memberAddress.getStatus();
String contactor = memberAddress.getContactor();
String cellphone = memberAddress.getCellphone();
String country = memberAddress.getCountry();
String province = memberAddress.getProvince();
String city = memberAddress.getCity();
String district = memberAddress.getDistrict();
String address = memberAddress.getAddress();
String zipCode = memberAddress.getZipCode();
return build(id, memberId, memberCode, type, isDefault, sequence, status,
contactor, cellphone, country, province, city, district, address, zipCode);
}
public static MemberAddress build(Long id , Long memberId,String memberCode,
Integer type ,Integer isDefault, Integer sequence, Integer status,
String contactor, String cellphone,
String country, String province, String city,
String district, String address, String zipCode){
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
MemberAddress memberAddress = new MemberAddress();
memberAddress.setId(Objects.isNull(id)?null:id);
memberAddress.setMemberId(Objects.isNull(memberId)?null:memberId);
memberAddress.setMemberCode(stringIsNull(memberCode));
memberAddress.setSequence(Objects.isNull(sequence)?DEFAULT_VALUE_1:sequence);
memberAddress.setType(Objects.isNull(type)?DEFAULT_VALUE_0:type);
memberAddress.setIsDefault(Objects.isNull(isDefault)?DEFAULT_VALUE_0:isDefault);
memberAddress.setStatus(Objects.isNull(status)?DEFAULT_VALUE_1:status);
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;
}
}
......@@ -3,6 +3,7 @@ package com.topdraw.business.module.member.address.repository;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
/**
* @author XiangHan
......@@ -10,4 +11,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
*/
public interface MemberAddressRepository extends JpaRepository<MemberAddress, Long>, JpaSpecificationExecutor<MemberAddress> {
@Query(value = "select IFNULL(max(sequence),0) from uc_member_address where member_id = ?1" , nativeQuery = true)
int findMaxSequenceByMemberId(Long memberId);
}
......
package com.topdraw.business.module.member.address.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.address.service.dto.BasicMemberAddressDTO;
import com.topdraw.business.module.member.address.service.dto.MemberAddressDTO;
import com.topdraw.business.process.service.member.MemberAddressOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.service.MemberAddressService;
import com.topdraw.business.module.member.address.service.dto.MemberAddressQueryCriteria;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "MemberAddress管理")
@Api(tags = "会员地址管理")
@RestController
@RequestMapping("/ucEngine/api/memberAddress")
@RequestMapping("/uce/memberAddress")
@CrossOrigin
@Slf4j
public class MemberAddressController {
@Autowired
private MemberAddressService MemberAddressService;
@Autowired
private MemberService memberService;
@GetMapping(value = "/pageMemberAddress")
@ApiOperation("查询MemberAddress")
public ResultInfo pageMemberAddress(MemberAddressQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(MemberAddressService.queryAll(criteria,pageable));
}
@GetMapping(value = "/findById/{id}")
@ApiOperation("查询指定MemberAddress")
public ResultInfo findById(@PathVariable(value = "id") Long id) {
return ResultInfo.success(MemberAddressService.findById(id));
}
private MemberAddressOperationService memberAddressOperationService;
@PostMapping(value = "/create")
@ApiOperation("新增MemberAddress")
@RequestMapping(value = "/create")
@ApiOperation("新增会员地址")
@AnonymousAccess
public ResultInfo create(@Validated @RequestBody MemberAddress resources) {
log.info("MemberAddressController ==>> create ===>>[{}]",resources);
Long memberId = resources.getMemberId();
MemberDTO memberDTO = this.memberService.findById(memberId);
String code = memberDTO.getCode();
resources.setMemberCode(code);
MemberAddressService.create(resources);
return ResultInfo.success();
public ResultInfo create(@Validated(value = {CreateGroup.class}) @RequestBody MemberAddress resources) {
log.info("memberAddress ==>> create ==> param ==>> [{}]",resources);
BasicMemberAddressDTO memberAddressDTO = this.memberAddressOperationService.create(resources);
log.info("memberAddress ==>> create ==> result ==>> [{}]",resources);
return ResultInfo.success(memberAddressDTO);
}
@PutMapping(value = "/update")
@ApiOperation("修改MemberAddress")
@RequestMapping(value = "/update")
@ApiOperation("修改会员地址")
@AnonymousAccess
public ResultInfo update(@Validated @RequestBody MemberAddress resources) {
log.info("MemberAddressController ==>> update ===>>[{}]",resources);
Long memberId = resources.getMemberId();
Integer sequence = resources.getSequence();
Assert.notNull(memberId,"memberId can't be null");
Assert.notNull(sequence,"sequence can't be null");
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
Assert.notNull(code,"code can't be null");
resources.setMemberCode(code);
MemberAddressService.update(resources);
}
return ResultInfo.success();
public ResultInfo update(@Validated(value = {UpdateGroup.class}) @RequestBody MemberAddress resources) {
log.info("memberAddress ==>> update ==> param ==>> [{}]",resources);
BasicMemberAddressDTO memberAddressDTO = this.memberAddressOperationService.update(resources);
log.info("memberAddress ==>> update ==> result ==>> [{}]",resources);
return ResultInfo.success(memberAddressDTO);
}
@DeleteMapping(value = "/delete/{id}")
@ApiOperation("删除MemberAddress")
@RequestMapping(value = "/delete")
@ApiOperation("删除会员地址")
@AnonymousAccess
public ResultInfo delete(@PathVariable Long id) {
MemberAddressService.delete(id);
public ResultInfo delete(@RequestParam(value = "id") Long resources) {
log.info("memberAddress ==>> delete ==> param ==>> [{}]",resources);
this.memberAddressOperationService.delete(resources);
return ResultInfo.success();
}
......
......@@ -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
......@@ -14,30 +10,34 @@ import java.util.List;
public interface MemberAddressService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
* 根据ID查询
* @param resources ID
* @return MemberAddressDTO
*/
Map<String,Object> queryAll(MemberAddressQueryCriteria criteria, Pageable pageable);
MemberAddressDTO findById(Long resources);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberAddressDTO>
* 保存会员地址
* @param resources
*/
List<MemberAddressDTO> queryAll(MemberAddressQueryCriteria criteria);
MemberAddressDTO create(MemberAddress resources);
/**
* 根据ID查询
* @param id ID
* @return MemberAddressDTO
* 修改会员地址
* @param resources
*/
MemberAddressDTO findById(Long id);
void create(MemberAddress resources);
MemberAddressDTO update(MemberAddress resources);
void update(MemberAddress resources);
/**
* 通过id删除
* @param resources
*/
void delete(Long resources);
void delete(Long id);
/**
* 地址最大序列号
* @param memberId
* @return
*/
int findMaxSequenceByMemberId(Long memberId);
}
......
package com.topdraw.business.module.member.address.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class BasicMemberAddressDTO implements Serializable {
/** 主键 */
private Long id;
/** 会员id */
private Long memberId;
/** 类型 1:家;2:公司;3:学校 */
private Integer type;
/** 是否默认地址 */
private Integer isDefault;
/** 显示顺序 */
private Integer sequence;
/** 状态 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;
}
package com.topdraw.business.module.member.address.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
......@@ -13,51 +13,54 @@ import java.time.LocalDateTime;
@Data
public class MemberAddressDTO implements Serializable {
// 主键
/** 会员code */
private String memberCode;
/** 主键 */
private Long id;
// 会员id
/** 会员id */
private Long memberId;
// 类型 1:家;2:公司;3:学校
/** 类型 1:家;2:公司;3:学校 */
private Integer type;
// 是否默认地址
/** 是否默认地址 */
private Integer isDefault;
// 显示顺序
/** 显示顺序 */
private Integer sequence;
// 状态 0:不可用;1-可用
/** 状态 0:不可用;1-可用 */
private Integer status;
// 联系人姓名
/** 联系人姓名 */
private String contactor;
// 联系人电话
/** 联系人电话 */
private String cellphone;
// 国家
/** 国家 */
private String country;
// 省份
/** 省份 */
private String province;
// 城市
/** 城市 */
private String city;
// 区县
/** 区县 */
private String district;
// 地址
/** 地址 */
private String address;
// 邮编
/** 邮编 */
private String zipCode;
// 创建时间
private LocalDateTime createTime;
/** 创建时间 */
private Timestamp createTime;
// 更新时间
private LocalDateTime updateTime;
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.member.address.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberAddressQueryCriteria{
@Query
private Long memberId;
}
package com.topdraw.business.module.member.address.service.impl;
import com.topdraw.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.utils.RedisUtils;
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.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -29,58 +25,105 @@ import java.util.Map;
*/
@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;
@Override
public Map<String, Object> queryAll(MemberAddressQueryCriteria criteria, Pageable pageable) {
Page<MemberAddress> page = MemberAddressRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(MemberAddressMapper::toDto));
}
private MemberAddressMapper memberAddressMapper;
@Autowired
private MemberAddressRepository memberAddressRepository;
@Override
public List<MemberAddressDTO> queryAll(MemberAddressQueryCriteria criteria) {
return MemberAddressMapper.toDto(MemberAddressRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Autowired
private RedisUtils redisUtils;
@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) {
MemberAddressRepository.save(resources);
public MemberAddressDTO create(MemberAddress resources) {
log.info("MemberAddressServiceImpl ==>> create ==>> param ==>> [{}]",resources);
MemberDTO memberDTO = this.checkMember(resources);
MemberAddress _memberAddress = MemberAddressBuilder.build(resources, memberDTO.getId(), memberDTO.getCode());
MemberAddress memberAddress = this.memberAddressRepository.save(_memberAddress);
log.info("MemberAddressServiceImpl ==>> create ==>> result ==>> [{}]",resources);
MemberAddressDTO memberAddressDTO = new MemberAddressDTO();
BeanUtils.copyProperties(memberAddress, memberAddressDTO);
return memberAddressDTO;
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(MemberAddress resources) {
MemberAddress MemberAddress = MemberAddressRepository.findById(resources.getId()).orElseGet(MemberAddress::new);
ValidationUtil.isNull( MemberAddress.getId(),"MemberAddress","id",resources.getId());
MemberAddress.copy(resources);
MemberAddressRepository.save(MemberAddress);
public MemberAddressDTO update(MemberAddress resources) {
log.info("MemberAddressServiceImpl ==>> update ==>> param ==>> [{}]",resources);
Assert.notNull(resources.getId(),"id can't be null");
try {
this.redisUtils.doLock("memberAddress::memberId::" + resources.getMemberId());
MemberAddress _memberAddress = this.memberAddressRepository.findById(resources.getId()).orElseGet(MemberAddress::new);
ValidationUtil.isNull( _memberAddress.getId(),"MemberAddress","id",resources.getId());
resources.setMemberId(_memberAddress.getMemberId());
MemberDTO memberDTO = this.checkMember(resources);
resources.setMemberCode(memberDTO.getCode());
_memberAddress.copy(resources);
MemberAddress memberAddress = this.memberAddressRepository.save(_memberAddress);
MemberAddressDTO memberAddressDTO = new MemberAddressDTO();
BeanUtils.copyProperties(memberAddress, memberAddressDTO);
return memberAddressDTO;
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("memberAddress::memberId::" + resources.getMemberId());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
@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);
}
@Override
public int findMaxSequenceByMemberId(Long memberId) {
return this.memberAddressRepository.findMaxSequenceByMemberId(memberId);
}
/**
* 检查会员
* @param memberAddress
* @return
*/
private MemberDTO checkMember(MemberAddress memberAddress){
Long memberId = memberAddress.getMemberId();
String memberCode = memberAddress.getMemberCode();
return this.checkMember(memberId,memberCode);
}
/**
* 检查会员
* @param memberId 会员id
* @param memberCode 会员code
* @return
*/
private MemberDTO checkMember(Long memberId, String memberCode) {
return this.memberService.checkMember(memberId, memberCode);
}
}
......
......@@ -2,6 +2,7 @@ package com.topdraw.business.module.member.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.module.common.validated.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -9,9 +10,9 @@ import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -30,12 +31,13 @@ public class Member implements Serializable {
/** 会员过期时间 */
@Column(name = "vip_expire_time", nullable = false)
private LocalDateTime vipExpireTime;
private Timestamp vipExpireTime;
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(message = "id can't be null!!",groups = {UpdateGroup.class})
private Long id;
/** 标识 */
......@@ -116,17 +118,17 @@ public class Member implements Serializable {
/** iptv账号绑定时间 */
@Column(name = "bind_iptv_time")
private LocalDateTime bindIptvTime;
private Timestamp bindIptvTime;
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private LocalDateTime createTime;
private Timestamp createTime;
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private LocalDateTime updateTime;
private Timestamp updateTime;
/** 是否在黑名单 1:是;0否 */
@Column(name = "black_status")
......
package com.topdraw.business.module.member.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.util.IdWorker;
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 org.apache.commons.lang3.StringUtils;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* @author XiangHan
......@@ -20,22 +11,63 @@ import java.time.LocalDateTime;
*/
public class MemberBuilder {
public static Member build(Integer type,String avatarUrl,String nickname,Integer vip){
private static final Long DEFAULT_VALUE = 0L;
private static final Integer DEFAULT_VALUE_1 = 1;
private static final Integer DEFAULT_VALUE_ = -1;
public static Member build(Member member){
Member _member = checkMemberData(member);
return _member;
}
private static Member checkMemberData(Member member) {
String code = member.getCode();
member.setCode(StringUtils.isEmpty(code)?String.valueOf(IdWorker.generator()):code);
Integer gender = member.getGender();
member.setGender(Objects.nonNull(gender) ? gender : DEFAULT_VALUE_);
Integer type = member.getType();
member.setType(Objects.nonNull(type) ? type:DEFAULT_VALUE_);
Integer status = member.getStatus();
member.setStatus(Objects.nonNull(status) ? status:DEFAULT_VALUE_1);
Integer vip = member.getVip();
member.setVip(Objects.nonNull(vip) ? vip:0);
Integer level = member.getLevel();
member.setLevel(Objects.nonNull(level) ? level:DEFAULT_VALUE_1);
member.setExp(DEFAULT_VALUE);
member.setPoints(DEFAULT_VALUE);
member.setDuePoints(DEFAULT_VALUE);
member.setCouponAmount(DEFAULT_VALUE);
member.setDueCouponAmount(DEFAULT_VALUE);
member.setBlackStatus(DEFAULT_VALUE);
member.setBirthday(StringUtils.isBlank(member.getBirthday())?"1900-01-01":member.getBirthday());
/*String nickname = member.getNickname();
if (StringUtils.isNotEmpty(nickname)) {
String base64Nickname = new String(Base64.getEncoder().encode(nickname.getBytes(StandardCharsets.UTF_8)));
member.setNickname(base64Nickname);
}*/
return member;
}
public static Member build(Integer type, String avatarUrl, String nickname, int vip){
// todo 原型模式
Member member = new Member();
member.setType(type);
member.setBlackStatus(0L);
member.setGender(-1);
member.setVip(vip==null?0:vip);
member.setLevel(1);
member.setStatus(1);
member.setPoints(0L);
member.setDuePoints(0L);
member.setExp(0L);
member.setCouponAmount(0L);
member.setDueCouponAmount(0L);
member.setAvatarUrl(avatarUrl);
member.setCode(IdWorker.generator() + "");
member.setNickname(nickname);
return member;
member.setVip(vip);
Member _member = checkMemberData(member);
return _member;
}
public static Member build(Integer type, String avatarUrl, String nickname, int vip, Integer sex){
// todo 原型模式
Member member = new Member();
member.setType(type);
member.setAvatarUrl(avatarUrl);
member.setNickname(nickname);
member.setVip(vip);
member.setGender(Objects.isNull(sex) == true ? -1:sex);
Member _member = checkMemberData(member);
return _member;
}
}
......
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.repository;
import com.topdraw.business.module.member.group.domain.MemberGroup;
import com.topdraw.business.module.member.group.service.dto.MemberGroupDTO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
/**
* @author XiangHan
* @date 2021-11-17
*/
public interface MemberGroupRepository extends JpaRepository<MemberGroup, Long>, JpaSpecificationExecutor<MemberGroup> {
List<MemberGroupDTO> findByMemberId(Long memberId);
}
......
package com.topdraw.business.module.member.group.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.member.group.domain.MemberGroup;
import com.topdraw.business.module.member.group.service.MemberGroupService;
import com.topdraw.business.module.member.group.service.dto.MemberGroupQueryCriteria;
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-11-17
*/
@Api(tags = "MemberGroup管理")
@RestController
@RequestMapping("/api/MemberGroup")
public class MemberGroupController {
@Autowired
private MemberGroupService MemberGroupService;
@GetMapping
@ApiOperation("查询MemberGroup")
public ResultInfo getMemberGroups(MemberGroupQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(MemberGroupService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有MemberGroup")
public ResultInfo getMemberGroups(MemberGroupQueryCriteria criteria) {
return ResultInfo.success(MemberGroupService.queryAll(criteria));
}
@PostMapping
@ApiOperation("新增MemberGroup")
public ResultInfo create(@Validated @RequestBody MemberGroup resources) {
MemberGroupService.create(resources);
return ResultInfo.success();
}
@PutMapping
@ApiOperation("修改MemberGroup")
public ResultInfo update(@Validated @RequestBody MemberGroup resources) {
MemberGroupService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/{id}")
@ApiOperation("删除MemberGroup")
public ResultInfo delete(@PathVariable Long id) {
MemberGroupService.delete(id);
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);
}
......@@ -2,9 +2,7 @@ package com.topdraw.business.module.member.group.service;
import com.topdraw.business.module.member.group.domain.MemberGroup;
import com.topdraw.business.module.member.group.service.dto.MemberGroupDTO;
import com.topdraw.business.module.member.group.service.dto.MemberGroupQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
......@@ -14,19 +12,11 @@ import java.util.List;
public interface MemberGroupService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberGroupQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberGroupDTO>
* 通过会员id获取会员分组列表
* @param memberId
* @return
*/
List<MemberGroupDTO> queryAll(MemberGroupQueryCriteria criteria);
List<MemberGroupDTO> findByMemberId(Long memberId);
/**
* 根据ID查询
......@@ -35,10 +25,4 @@ public interface MemberGroupService {
*/
MemberGroupDTO findById(Long id);
void create(MemberGroup resources);
void update(MemberGroup resources);
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;
}
......@@ -12,42 +12,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();
}
}
......@@ -5,21 +5,13 @@ import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.member.group.repository.MemberGroupRepository;
import com.topdraw.business.module.member.group.service.MemberGroupService;
import com.topdraw.business.module.member.group.service.dto.MemberGroupDTO;
import com.topdraw.business.module.member.group.service.dto.MemberGroupQueryCriteria;
import com.topdraw.business.module.member.group.service.mapper.MemberGroupMapper;
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
......@@ -30,52 +22,20 @@ import java.util.Map;
public class MemberGroupServiceImpl implements MemberGroupService {
@Autowired
private MemberGroupRepository MemberGroupRepository;
private MemberGroupRepository memberGroupRepository;
@Autowired
private MemberGroupMapper MemberGroupMapper;
@Override
public Map<String, Object> queryAll(MemberGroupQueryCriteria criteria, Pageable pageable) {
Page<MemberGroup> page = MemberGroupRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(MemberGroupMapper::toDto));
}
private MemberGroupMapper memberGroupMapper;
@Override
public List<MemberGroupDTO> queryAll(MemberGroupQueryCriteria criteria) {
return MemberGroupMapper.toDto(MemberGroupRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public List<MemberGroupDTO> findByMemberId(Long memberId) {
return this.memberGroupRepository.findByMemberId(memberId);
}
@Override
public MemberGroupDTO findById(Long id) {
MemberGroup MemberGroup = MemberGroupRepository.findById(id).orElseGet(MemberGroup::new);
ValidationUtil.isNull(MemberGroup.getId(),"MemberGroup","id",id);
return MemberGroupMapper.toDto(MemberGroup);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(MemberGroup resources) {
MemberGroupRepository.save(resources);
MemberGroup memberGroup = this.memberGroupRepository.findById(id).orElseGet(MemberGroup::new);
ValidationUtil.isNull(memberGroup.getId(),"MemberGroup","id",id);
return this.memberGroupMapper.toDto(memberGroup);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(MemberGroup resources) {
MemberGroup MemberGroup = MemberGroupRepository.findById(resources.getId()).orElseGet(MemberGroup::new);
ValidationUtil.isNull( MemberGroup.getId(),"MemberGroup","id",resources.getId());
MemberGroup.copy(resources);
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 = MemberGroupRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberGroup.class, id), 1));
MemberGroupRepository.delete(MemberGroup);
}
}
......
package com.topdraw.business.module.member.group.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.member.group.domain.Group;
import com.topdraw.business.module.member.group.service.dto.GroupDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author luerlong
* @date 2021-09-27
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface GroupMapper extends BaseMapper<GroupDTO, Group> {
}
package com.topdraw.business.module.member.level.domain;
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;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import javax.validation.constraints.Min;
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;
......@@ -23,50 +28,53 @@ import java.io.Serializable;
@Table(name="uc_member_level")
public class MemberLevel implements Serializable {
// 主键
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(message = "id can't be null !!" , groups = {UpdateGroup.class})
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 名称
/** 名称 */
@Column(name = "name", nullable = false)
private String name;
// 状态 0:未启用;1:启用
/** 状态 0:未启用;1:启用 */
@Column(name = "status", nullable = false)
private Integer status;
// 对应成长值
/** 对应成长值 */
@Column(name = "exp_value", nullable = false)
private Long expValue;
// 等级(不可重复,数字越大等级越高)
/** 等级(不可重复,数字越大等级越高) */
@Column(name = "level", nullable = false)
@Min(message = "level can't less then 1" , value = 1)
@NotNull(message = "level can't be null" , groups = {CreateGroup.class,UpdateGroup.class})
private Integer level;
// 会员徽标
/** 会员徽标 */
@Column(name = "icon_url")
private String iconUrl;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 对应任务id,通过此字段可获得该等级所对应的权益
/** 对应任务id,通过此字段可获得该等级所对应的权益 */
@Column(name = "task_id")
private Long taskId;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.member.level.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.member.level.service.MemberLevelService;
import com.topdraw.business.module.member.level.service.dto.MemberLevelQueryCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "MemberLevel管理")
@RestController
@RequestMapping("/api/MemberLevel")
public class MemberLevelController {
@Autowired
private MemberLevelService MemberLevelService;
@GetMapping
@ApiOperation("查询MemberLevel")
public ResultInfo getMemberLevels(MemberLevelQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(MemberLevelService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有MemberLevel")
public ResultInfo getMemberLevels(MemberLevelQueryCriteria criteria) {
return ResultInfo.success(MemberLevelService.queryAll(criteria));
}
/*@Log
@PostMapping(value = "/create")
@ApiOperation("新增MemberLevel")
public ResultInfo create(@Validated @RequestBody MemberLevel resources) {
MemberLevelService.create(resources);
return ResultInfo.success();
}
@Log
@PutMapping(value = "/update")
@ApiOperation("修改MemberLevel")
public ResultInfo update(@Validated @RequestBody MemberLevel resources) {
MemberLevelService.update(resources);
return ResultInfo.success();
}
@Log
@DeleteMapping(value = "/delete/{id}")
@ApiOperation("删除MemberLevel")
public ResultInfo delete(@PathVariable Long id) {
MemberLevelService.delete(id);
return ResultInfo.success();
}*/
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(MemberLevelService.getByCode(code));
}
}
package com.topdraw.business.module.member.level.service;
import com.topdraw.business.module.member.level.domain.MemberLevel;
import com.topdraw.business.module.member.level.service.dto.MemberLevelDTO;
import com.topdraw.business.module.member.level.service.dto.MemberLevelQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
......@@ -14,33 +11,12 @@ import java.util.List;
public interface MemberLevelService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberLevelQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberLevelDTO>
*/
List<MemberLevelDTO> queryAll(MemberLevelQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return MemberLevelDTO
*/
MemberLevelDTO findById(Long id);
void create(MemberLevel resources);
void update(MemberLevel resources);
void delete(Long id);
/**
* Code校验
* @param code
......@@ -48,5 +24,13 @@ public interface MemberLevelService {
*/
MemberLevelDTO getByCode(String code);
/**
* 通过等级和状态检索
* @param i
* @param status
* @return
*/
List<MemberLevelDTO> findLevelAndStatus(Integer i, Integer status);
}
......
......@@ -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,65 +23,27 @@ import java.util.Map;
public class MemberLevelServiceImpl implements MemberLevelService {
@Autowired
private MemberLevelRepository MemberLevelRepository;
private MemberLevelRepository memberLevelRepository;
@Autowired
private MemberLevelMapper MemberLevelMapper;
@Override
public Map<String, Object> queryAll(MemberLevelQueryCriteria criteria, Pageable pageable) {
Page<MemberLevel> page = MemberLevelRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(MemberLevelMapper::toDto));
}
@Override
public List<MemberLevelDTO> queryAll(MemberLevelQueryCriteria criteria) {
return MemberLevelMapper.toDto(MemberLevelRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private MemberLevelMapper memberLevelMapper;
@Override
public MemberLevelDTO findById(Long id) {
MemberLevel MemberLevel = MemberLevelRepository.findById(id).orElseGet(MemberLevel::new);
MemberLevel MemberLevel = this.memberLevelRepository.findById(id).orElseGet(MemberLevel::new);
ValidationUtil.isNull(MemberLevel.getId(),"MemberLevel","id",id);
return MemberLevelMapper.toDto(MemberLevel);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(MemberLevel resources) {
MemberLevelRepository.save(resources);
return this.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);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberLevel MemberLevel = MemberLevelRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberLevel.class, id), 1));
MemberLevelRepository.delete(MemberLevel);
}
@Override
public MemberLevelDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? MemberLevelMapper.toDto(MemberLevelRepository.findFirstByCode(code).orElseGet(MemberLevel::new))
return StringUtils.isNotEmpty(code) ? this.memberLevelMapper.toDto(this.memberLevelRepository.findFirstByCode(code).orElseGet(MemberLevel::new))
: new MemberLevelDTO();
}
@Override
public List<MemberLevelDTO> findLevelAndStatus(Integer level, Integer status) {
return MemberLevelMapper.toDto(MemberLevelRepository.findByLevelAndStatus(level,status));
return this.memberLevelMapper.toDto(this.memberLevelRepository.findByLevelAndStatus(level,status));
}
}
......
package com.topdraw.business.module.member.profile;
public interface DoSaveMemberProfileGroup {
}
package com.topdraw.business.module.member.profile;
public interface DoUpdateMemberProfileGroup {
}
package com.topdraw.business.module.member.profile.domain;
import com.topdraw.business.module.member.profile.DoSaveMemberProfileGroup;
import com.topdraw.business.module.member.profile.DoUpdateMemberProfileGroup;
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;
......@@ -27,82 +27,81 @@ import java.io.Serializable;
@Table(name="uc_member_profile")
public class MemberProfile implements Serializable {
/** 会员code */
@Transient
// @NotNull(message = "memberCode not be null!!" , groups = {CreateGroup.class,UpdateGroup.class})
private String memberCode;
// 主键
/** 头像 */
@Transient
private String avatarUrl;
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(message = "【id】 not be null!!" , groups = DoUpdateMemberProfileGroup.class)
@NotNull(message = "id not be null!!" , groups = UpdateGroup.class)
private Long id;
// 会员id
@NotNull(message = "【memberId】 not be null!!" , groups = DoSaveMemberProfileGroup.class)
/** 会员id */
@Column(name = "member_id", nullable = false)
@NotNull(message = "memberId not be null!!" , groups = {CreateGroup.class})
private Long memberId;
// 姓名
/** 姓名 */
@Column(name = "realname")
private String realname;
// 性别 0:女; 1:男 -1:未知
/** 性别 0:女; 1:男 -1:未知 */
@Column(name = "gender", nullable = false)
@NotNull(message = "【gender】 not be null!!" , groups = {DoSaveMemberProfileGroup.class})
private Integer gender;
// 生日
@NotNull(message = "【memberId】 not be null!!" , groups = DoSaveMemberProfileGroup.class)
/** 生日 */
@Column(name = "birthday", nullable = false)
private String birthday;
// 手机号
/** 手机号 */
@Column(name = "phone")
private String phone;
// 星座
/** 星座 */
@Column(name = "constellation")
private String constellation;
// 身份证
@NotNull(message = "【idCard】 not be null!!" , groups = DoSaveMemberProfileGroup.class)
/** 身份证 */
@Column(name = "id_card", nullable = false)
private String idCard;
// 电子邮件
/** 电子邮件 */
@Column(name = "email")
private String email;
// 国家
/** 国家 */
@Column(name = "country")
private String country;
// 省份
/** 省份 */
@Column(name = "province")
private String province;
// 城市
/** 城市 */
@Column(name = "city")
private String city;
// 区县
/** 区县 */
@Column(name = "district")
private String district;
//头像
@Transient
private String avatarUrl;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.member.profile.domain;
import com.topdraw.utils.StringUtils;
import java.sql.Timestamp;
import java.util.Objects;
public class MemberProfileBuild {
public static MemberProfile build(Long memberId , String realname , Integer gender, String birthday){
MemberProfile memberProfile = build(memberId,realname,gender,"","","","","","",
"","","",birthday);
return memberProfile;
}
public static MemberProfile build(){
MemberProfile memberProfile = build(null,"",null,"","","","","","",
"","","",null);
return memberProfile;
}
public static MemberProfile build(Long memberId, String realName, Integer sex,
String contry, String district, String city, String idCard, String province,
String email, String description, String phone, String constellation,
String timestamp) {
if (memberId == null)
throw new NullPointerException("memberId is null");
MemberProfile memberProfile = new MemberProfile();
memberProfile.setMemberId(memberId);
memberProfile.setRealname(stringIsNull(realName));
memberProfile.setGender(sex == null ? 0 : sex);
memberProfile.setCountry(stringIsNull(contry));
memberProfile.setDistrict(stringIsNull(district));
memberProfile.setCity(stringIsNull(city));
memberProfile.setIdCard(stringIsNull(idCard));
memberProfile.setProvince(stringIsNull(province));
memberProfile.setEmail(stringIsNull(email));
memberProfile.setDescription(stringIsNull(description));
memberProfile.setPhone(stringIsNull(phone));
memberProfile.setConstellation(stringIsNull(constellation));
memberProfile.setBirthday(StringUtils.isNotBlank(timestamp) ? timestamp : "1900-01-01");
return memberProfile;
}
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.profile.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.GlobeExceptionMsg;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.util.Objects;
public class MemberProfileBuilder {
public static MemberProfile build(Member member){
MemberProfile memberProfile = build(member.getId(),member.getCode(),member.getNickname(),member.getGender(),"","","","","","",
"","","",member.getBirthday());
return memberProfile;
}
public static MemberProfile build(Long memberId){
MemberProfile memberProfile = build(memberId,"","",-1,"","","","","","",
"","","","");
return memberProfile;
}
public static MemberProfile build(Long memberId ,String memberCode, String realname , Integer gender, String birthday){
MemberProfile memberProfile = build(memberId,memberCode,realname,gender,"","","","","","",
"","","",birthday);
return memberProfile;
}
public static MemberProfile build(Long memberId,String memberCode, String realName, Integer sex,
String country, String district, String city, String idCard, String province,
String email, String description, String phone, String constellation,
String birthday) {
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
MemberProfile memberProfile = new MemberProfile();
memberProfile.setMemberId(memberId);
memberProfile.setMemberCode(memberCode);
memberProfile.setRealname(stringIsNull(realName));
memberProfile.setGender(sex == null ? 0 : sex);
memberProfile.setCountry(StringUtils.isBlank(country)?"中国":birthday);
memberProfile.setDistrict(stringIsNull(district));
memberProfile.setCity(stringIsNull(city));
memberProfile.setIdCard(StringUtils.isBlank(idCard)?"000000000000000000":idCard);
memberProfile.setProvince(stringIsNull(province));
memberProfile.setEmail(stringIsNull(email));
memberProfile.setDescription(stringIsNull(description));
memberProfile.setPhone(stringIsNull(phone));
memberProfile.setConstellation(stringIsNull(constellation));
memberProfile.setBirthday(StringUtils.isBlank(birthday)?"1900-01-01":birthday);
return memberProfile;
}
private static String stringIsNull(String s){
return StringUtils.isBlank(s)?"":s;
}
public static MemberProfile build(MemberProfile resources) {
if (resources.getMemberId() == null)
throw new NullPointerException("memberId is null");
MemberProfile memberProfile = new MemberProfile();
memberProfile.setId(resources.getId());
memberProfile.setMemberId(resources.getMemberId());
memberProfile.setRealname(stringIsNull(resources.getRealname()));
memberProfile.setGender(resources.getGender() == null ? -1 : resources.getGender());
memberProfile.setCountry(stringIsNull(resources.getCountry()));
memberProfile.setDistrict(stringIsNull(resources.getDistrict()));
memberProfile.setCity(stringIsNull(resources.getCity()));
memberProfile.setIdCard(StringUtils.isBlank(resources.getIdCard()) ? "000000000000000000":resources.getIdCard());
memberProfile.setProvince(stringIsNull(resources.getProvince()));
memberProfile.setEmail(stringIsNull(resources.getEmail()));
memberProfile.setDescription(stringIsNull(resources.getDescription()));
memberProfile.setPhone(stringIsNull(resources.getPhone()));
memberProfile.setConstellation(stringIsNull(resources.getConstellation()));
memberProfile.setBirthday(Objects.isNull(resources.getBirthday()) ? "1900-01-01" : resources.getBirthday());
return memberProfile;
}
}
package com.topdraw.business.module.member.profile.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.process.service.member.MemberProfileOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.profile.service.MemberProfileService;
import com.topdraw.util.Base64Util;
import com.topdraw.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "MemberProfile管理")
@Api(tags = "会员属性管理")
@RestController
@RequestMapping("/ucEngine/api/memberProfile")
@RequestMapping("/uce/memberProfile")
@CrossOrigin
@Slf4j
public class MemberProfileController {
@Autowired
private MemberProfileService MemberProfileService;
@Autowired
private MemberService memberService;
/*@GetMapping
@ApiOperation("查询MemberProfile")
public ResultInfo getMemberProfiles(MemberProfileQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(MemberProfileService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有MemberProfile")
public ResultInfo getMemberProfiles(MemberProfileQueryCriteria criteria) {
return ResultInfo.success(MemberProfileService.queryAll(criteria));
}*/
private MemberProfileOperationService memberProfileOperationService;
@PostMapping(value = "/create")
@ApiOperation("新增MemberProfile")
@RequestMapping(value = "/update")
@ApiOperation("修改会员属性")
@AnonymousAccess
public ResultInfo create(@Validated @RequestBody MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> create ==>> resources ===>> [{}]",resources);
String realname = resources.getRealname();
MemberProfileService.create(resources);
return ResultInfo.success();
@Deprecated
public ResultInfo update(@Validated(value = {UpdateGroup.class}) @RequestBody MemberProfile resources) {
log.info("memberProfile ==>> update ==>> resources ===>> [{}]",resources);
MemberProfileDTO memberProfileDTO = this.memberProfileOperationService.updateMemberProfileAndMember(resources);
return ResultInfo.success(memberProfileDTO);
}
@PutMapping(value = "/update")
@ApiOperation("修改MemberProfile")
@PutMapping(value = "/updateMemberProfileAndMember")
@ApiOperation("修改会员属性并同步会员信息")
@AnonymousAccess
public ResultInfo update(@Validated @RequestBody MemberProfile resources) {
public ResultInfo updateMemberProfileAndMember(@Validated @RequestBody 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)) {
String code = memberDTO.getCode();
if (StringUtils.isNotEmpty(code)) {
resources.setMemberCode(code);
MemberProfileDTO memberProfile = this.MemberProfileService.findByMemberId(memberId);
if (Objects.nonNull(memberProfile)) {
resources.setId(memberProfile.getId());
MemberProfileService.update(resources);
} else {
resources.setId(null);
this.create(resources);
}
}
}
return ResultInfo.success();
MemberProfileDTO memberProfileDTO = this.memberProfileOperationService.updateMemberProfileAndMember(resources);
return ResultInfo.success(memberProfileDTO);
}
@PutMapping
@ApiOperation("修改MemberProfile")
@RequestMapping(value = "/create")
@ApiOperation("新增会员属性")
@AnonymousAccess
public ResultInfo updateMemberProfileAndMember(@Validated @RequestBody MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> [{}]",resources);
this.MemberProfileService.updateMemberProfileAndMember(resources);
return ResultInfo.success();
}
@Deprecated
public ResultInfo create(@Validated(value = {CreateGroup.class}) @RequestBody MemberProfile resources) {
@DeleteMapping(value = "/delete/{id}")
@ApiOperation("删除MemberProfile")
public ResultInfo delete(@PathVariable Long id) {
MemberProfileService.delete(id);
return ResultInfo.success();
}
log.info("memberProfile ==>> update ==>> resources ===>> [{}]",resources);
MemberProfileDTO memberProfileDTO = this.memberProfileOperationService.createMemberProfileAndSyncMember(resources);
return ResultInfo.success(memberProfileDTO);
}
}
......
package com.topdraw.business.module.member.profile.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
import com.topdraw.business.module.member.service.dto.MemberDTO;
/**
* @author XiangHan
......@@ -14,36 +12,69 @@ import java.util.List;
public interface MemberProfileService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
* 根据ID查询
* @param id ID
* @return MemberProfileDTO
*/
Map<String,Object> queryAll(MemberProfileQueryCriteria criteria, Pageable pageable);
MemberProfileDTO findById(Long id);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberProfileDTO>
* 保存
* @param resources 会员基本信息
* @return
*/
List<MemberProfileDTO> queryAll(MemberProfileQueryCriteria criteria);
MemberProfileDTO create(MemberProfile resources);
/**
* 根据ID查询
* @param id ID
* @return MemberProfileDTO
* 默认属性
* @param resources
* @return
*/
MemberProfileDTO findById(Long id);
MemberProfileDTO createDefault(MemberProfile resources);
MemberProfile create(MemberProfile resources);
/**
* 通过会员创建默认属性
* @param resources
* @return
*/
MemberProfileDTO createDefault(Member resources);
MemberProfile createDefault(MemberProfile resources);
/**
* 通过会员id创建默认属性
* @param resources
* @return
*/
MemberProfileDTO createDefaultByMemberId(Long resources);
void update(MemberProfile resources);
/**
* 修改
* @param resources
*/
MemberProfileDTO update(MemberProfile resources);
/**
* 删除
* @param id
*/
void delete(Long id);
/**
* 通过会员id查询
* @param memberId
* @return
*/
MemberProfileDTO findByMemberId(Long memberId);
void updateMemberProfileAndMember(MemberProfile resources);
/**
* 通过会员code查询
* @param memberCode
* @return
*/
MemberProfileDTO findByMemberCode(String memberCode);
/**
* 修改会员属性并同步会员信息
* @param resources
*/
MemberProfileDTO updateMemberProfileAndMember(MemberProfile resources, MemberDTO memberDTO);
}
......
......@@ -12,63 +12,63 @@ import java.io.Serializable;
@Data
public class MemberProfileDTO implements Serializable {
// 主键
/** 会员code */
private String memberCode;
/** 主键 */
private Long id;
// 会员id
/** 会员id */
private Long memberId;
// 姓名
/** 姓名 */
private String realname;
private String nickname;
// 性别 0:女; 1:男 -1:未知
/** 性别 0:女; 1:男 -1:未知 */
private Integer gender;
// 生日
/** 生日 */
private String birthday;
// 生日字符串
private String birthdayStr;
// vip
private Integer vip;
/** 电话 */
private String phone;
// 星座
/** 星座 */
private String constellation;
private Long vipExpireTime;
private String phone;
// 身份证
/** 身份证 */
private String idCard;
// 电子邮件
/** 电子邮件 */
private String email;
// 国家
/** 国家 */
private String country;
// 省份
/** 省份 */
private String province;
// 城市
/** 城市 */
private String city;
// 头像
private String avatarUrl;
// 区县
/** 区县 */
private String district;
// 描述
/** 描述 */
private String description;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
/** vip */
private Integer vip;
/** vip过期时间 */
private Long vipExpireTime;
/** 头像 */
private String avatarUrl;
}
......
package com.topdraw.business.module.member.profile.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberProfileQueryCriteria{
}
package com.topdraw.business.module.member.profile.service.impl;
import cn.hutool.core.date.DateUtil;
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.utils.StringUtils;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.util.Base64Util;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.member.profile.repository.MemberProfileRepository;
import com.topdraw.business.module.member.profile.service.MemberProfileService;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileQueryCriteria;
import com.topdraw.business.module.member.profile.service.mapper.MemberProfileMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import 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.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Objects;
/**
* @author XiangHan
......@@ -42,122 +35,167 @@ import java.util.Optional;
public class MemberProfileServiceImpl implements MemberProfileService {
@Autowired
private MemberProfileRepository MemberProfileRepository;
@Autowired
private MemberRepository memberRepository;
private MemberService memberService;
@Autowired
private MemberProfileMapper MemberProfileMapper;
private MemberProfileMapper memberProfileMapper;
@Autowired
private MemberService memberService;
private MemberProfileRepository memberProfileRepository;
@Autowired
private RedisUtils redisUtils;
@Override
public Map<String, Object> queryAll(MemberProfileQueryCriteria criteria, Pageable pageable) {
Page<MemberProfile> page = MemberProfileRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(MemberProfileMapper::toDto));
public MemberProfileDTO findById(Long id) {
MemberProfile MemberProfile = this.memberProfileRepository.findById(id).orElseGet(MemberProfile::new);
ValidationUtil.isNull(MemberProfile.getId(),"MemberProfile","id",id);
return this.memberProfileMapper.toDto(MemberProfile);
}
@Override
public List<MemberProfileDTO> queryAll(MemberProfileQueryCriteria criteria) {
return MemberProfileMapper.toDto(MemberProfileRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public MemberProfileDTO findByMemberId(Long memberId) {
log.info("MemberProfileDTO ==>> findByMemberId ==>> resources ===>> [{}]",memberId);
MemberProfile memberProfile = this.memberProfileRepository.findByMemberId(memberId).orElseGet(MemberProfile::new);
// ValidationUtil.isNull(memberProfile.getId(),"MemberProfile","memberId",memberId);
return this.memberProfileMapper.toDto(memberProfile);
}
@Override
public MemberProfileDTO findById(Long id) {
MemberProfile MemberProfile = MemberProfileRepository.findById(id).orElseGet(MemberProfile::new);
ValidationUtil.isNull(MemberProfile.getId(),"MemberProfile","id",id);
return MemberProfileMapper.toDto(MemberProfile);
public MemberProfileDTO findByMemberCode(String memberCode) {
log.info("MemberProfileDTO ==>> findByMemberCode ==>> resources ===>> [{}]",memberCode);
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
log.info("MemberProfileDTO ==>> findByMemberCode ==>> result ===>> [{}]",memberDTO);
return this.findByMemberId(memberDTO.getId());
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public MemberProfile create(MemberProfile resources) {
public MemberProfileDTO create(MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> [{}]",resources);
MemberProfileRepository.save(resources);
return resources;
// 检查会员
this.checkMember(resources);
MemberProfile _memberProfile = this.memberProfileRepository.save(resources);
MemberProfileDTO memberProfileDTO = new MemberProfileDTO();
BeanUtils.copyProperties(_memberProfile,memberProfileDTO);
return memberProfileDTO;
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberProfileDTO createDefault(MemberProfile resources) {
MemberProfile memberProfile = MemberProfileBuilder.build(resources);
return this.create(memberProfile);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberProfileDTO createDefault(Member resources) {
MemberProfile memberProfile = MemberProfileBuilder.build(resources);
return this.create(memberProfile);
}
@Override
public MemberProfile createDefault(MemberProfile resources) {
public MemberProfileDTO createDefaultByMemberId(Long resources) {
MemberProfile memberProfile = MemberProfileBuilder.build(resources);
return this.create(memberProfile);
}
private MemberDTO checkMember(MemberProfile resources){
Long memberId = resources.getMemberId();
String realname = resources.getRealname();
Integer gender = resources.getGender();
MemberProfile memberProfile = MemberProfileBuild.build();
MemberProfile memberProfile1 = this.MemberProfileRepository.save(memberProfile);
return memberProfile1;
String memberCode = resources.getMemberCode();
return this.memberService.checkMember(memberId,memberCode);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(MemberProfile resources) {
public MemberProfileDTO update(MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> [{}]",resources);
this.redisUtils.doLock("memberProfile::memberId::" + resources.getMemberId());
try {
MemberProfileDTO _memberProfileDTO1 = this.findById(resources.getId());
// 检查会员是否存在
this.checkMember(resources);
MemberProfile memberProfile = new MemberProfile();
BeanUtils.copyProperties(resources,memberProfile);
memberProfile.setCreateTime(_memberProfileDTO1.getCreateTime());
String idCard = resources.getIdCard();
if (StringUtils.isBlank(idCard)) {
idCard = _memberProfileDTO1.getIdCard();
memberProfile.setIdCard(idCard);
}
if (StringUtils.isNotBlank(resources.getRealname())) {
memberProfile.setRealname(resources.getRealname());
} else {
memberProfile.setRealname(_memberProfileDTO1.getRealname());
}
if (resources.getGender() != -1) {
memberProfile.setGender(resources.getGender());
} else {
memberProfile.setGender(_memberProfileDTO1.getGender());
}
MemberProfile _memberProfile = this.memberProfileRepository.save(memberProfile);
MemberProfile MemberProfile = MemberProfileRepository.findById(resources.getId()).orElseGet(MemberProfile::new);
ValidationUtil.isNull( MemberProfile.getId(),"MemberProfile","id",resources.getId());
MemberProfile.copy(resources);
MemberProfileDTO memberProfileDTO = new MemberProfileDTO();
BeanUtils.copyProperties(_memberProfile,memberProfileDTO);
return memberProfileDTO;
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("memberProfile::memberId::" + resources.getMemberId());
}
log.info("MemberProfileServiceImpl ==>> update ==>> copy ===>> resources ===>> [{}]",resources);
MemberProfileRepository.save(MemberProfile);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberProfile MemberProfile = MemberProfileRepository.findById(id).orElseThrow(
MemberProfile MemberProfile = this.memberProfileRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberProfile.class, id), 1));
MemberProfileRepository.delete(MemberProfile);
}
@Override
public MemberProfileDTO findByMemberId(Long memberId) {
Optional<MemberProfile> memberProfile = MemberProfileRepository.findByMemberId(memberId);
if (memberProfile.isPresent()) {
MemberProfile memberProfile1 = memberProfile.get();
return MemberProfileMapper.toDto(memberProfile1);
}
return null;
this.memberProfileRepository.delete(MemberProfile);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateMemberProfileAndMember(MemberProfile resources) {
public MemberProfileDTO updateMemberProfileAndMember(MemberProfile resources, MemberDTO memberDTO) {
log.info("MemberProfileServiceImpl ==>> updateMemberProfileAndMember ==>> resources ===>> [{}]",resources);
String realname = resources.getRealname();
String nickNameStr = "";
if (StringUtils.isNotBlank(realname)) {
byte[] encode = Base64.getEncoder().encode(realname.getBytes(StandardCharsets.UTF_8));
nickNameStr = new String(encode);
resources.setRealname(nickNameStr);
MemberProfileDTO memberProfileDTO = this.update(resources);
// 同步会员信息
this.synchronizedMemberData(resources, memberDTO);
return memberProfileDTO;
}
if (StringUtils.isNotBlank(resources.getIdCard())) {
resources.setIdCard("000000000000000000");
}
private void synchronizedMemberData(MemberProfile resources, MemberDTO memberDTO) {
this.MemberProfileRepository.save(resources);
log.info("updateMemberProfileAndMember ==>> resources ==>> [{}]",resources);
//修改member相关信息
Long memberId = resources.getMemberId();
Member member = memberRepository.findById(memberId).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"member","id", memberId);
memberDTO.setId(resources.getMemberId());
if(StringUtils.isNotBlank(resources.getRealname())) {
memberDTO.setNickname(resources.getRealname());
}
if(Objects.nonNull(resources.getGender()) && resources.getGender() != -1) {
memberDTO.setGender(resources.getGender());
}
if(StringUtils.isNotBlank(resources.getBirthday())) {
memberDTO.setBirthday(resources.getBirthday());
}
if(StringUtils.isNotBlank(resources.getAvatarUrl())) {
memberDTO.setAvatarUrl(resources.getAvatarUrl());
}
member.setNickname(nickNameStr);
member.setGender(resources.getGender());
// member.setBirthday(DateUtil.format(resources.getBirthday(), "yyyy-MM-dd"));
member.setBirthday(resources.getBirthday());
member.setAvatarUrl(resources.getAvatarUrl());
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
// memberRepository.save(member);
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.validated.UpdateGroup;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
......@@ -13,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
......@@ -24,56 +25,53 @@ import java.time.LocalDate;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_member_related_info")
public class MemberRelatedInfo implements Serializable {
public class MemberRelatedInfo extends AsyncMqModule implements Serializable {
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(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;
@Transient
private String memberCode;
// 人物关系 0:子女;1:父母
/** 人物关系 0:子女;1:父母 */
@Column(name = "type")
private Integer type;
// 手机号
/** 手机号 */
@Column(name = "cellphone")
private String cellphone;
// 身份证号
/** 身份证号 */
@Column(name = "id_card")
private String idCard;
// 姓名
/** 姓名 */
@Column(name = "name")
private String name;
// 性别 0:女;1:男;-1:未知
/** 性别 0:女;1:男;-1:未知 */
@Column(name = "sex")
private Integer sex;
// 生日
/** 生日 */
@Column(name = "birthday")
private LocalDate birthday;
private String birthday;
// 头像地址
/** 头像地址 */
@Column(name = "avatar_url")
private String avatarUrl;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.member.relatedinfo.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.GlobeExceptionMsg;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.time.LocalDate;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/11 13:56
* @version: :
* @modified By:
* @since : modified in 2022/3/11 13:56
*/
public class MemberRelatedInfoBuilder {
private static final Integer DEFAULT_VALUE_ = -1;
private static final Integer DEFAULT_VALUE_0 = 0;
public static MemberRelatedInfo build(MemberRelatedInfo memberRelatedInfo){
return build(memberRelatedInfo.getMemberId(),memberRelatedInfo.getMemberCode(),memberRelatedInfo.getId(),memberRelatedInfo.getName(),memberRelatedInfo.getSex(),
memberRelatedInfo.getCellphone(),memberRelatedInfo.getIdCard(),memberRelatedInfo.getBirthday(),memberRelatedInfo.getAvatarUrl(),memberRelatedInfo.getType());
}
public static MemberRelatedInfo build(Member member , MemberRelatedInfo memberRelatedInfo){
return build(member.getId(),member.getCode(),memberRelatedInfo.getId(),memberRelatedInfo.getName(),memberRelatedInfo.getSex(),
memberRelatedInfo.getCellphone(),memberRelatedInfo.getIdCard(),memberRelatedInfo.getBirthday(),memberRelatedInfo.getAvatarUrl(),memberRelatedInfo.getType());
}
public static MemberRelatedInfo build(Long memberId , String memberCode , Long id , String name , Integer sex ,
String cellphone , String idCard, String birthday , String avatarUrl , Integer type){
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
MemberRelatedInfo memberRelatedInfo = new MemberRelatedInfo();
memberRelatedInfo.setMemberId(memberId);
memberRelatedInfo.setMemberCode(memberCode);
memberRelatedInfo.setId(id);
memberRelatedInfo.setName(stringIsNull(name));
memberRelatedInfo.setSex(Objects.isNull(sex)?DEFAULT_VALUE_:sex);
memberRelatedInfo.setCellphone(stringIsNull(cellphone));
memberRelatedInfo.setIdCard(StringUtils.isBlank(idCard)?"000000000000000000":idCard);
memberRelatedInfo.setBirthday(StringUtils.isBlank(birthday) == true? "1900-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.annotation.AnonymousAccess;
import com.topdraw.business.module.member.relatedinfo.domain.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.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.relatedinfo.service.dto.BasicMemberRelatedInfoDTO;
import com.topdraw.business.process.service.member.MemberRelatedInfoOperationService;
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.business.module.member.relatedinfo.service.dto.MemberRelatedInfoQueryCriteria;
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.data.domain.Pageable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.util.Base64;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Slf4j
@Api(tags = "MemberRelatedInfo管理")
@Api(tags = "相关人员管理")
@RestController
@RequestMapping("/ucEngine/api/memberRelatedInfo")
@RequestMapping("/uce/memberRelatedInfo")
@CrossOrigin
@Slf4j
public class MemberRelatedInfoController {
@Autowired
private MemberRelatedInfoService MemberRelatedInfoService;
@Autowired
private MemberService memberService;
private MemberRelatedInfoOperationService memberRelatedInfoOperationService;
@GetMapping(value = "/pageMemberRelatedInfos")
@ApiOperation("查询MemberRelatedInfo")
public ResultInfo pageMemberRelatedInfos(@Validated MemberRelatedInfoQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(MemberRelatedInfoService.queryAll(criteria,pageable));
}
@PostMapping(value = "/create")
@ApiOperation("新增MemberRelatedInfo")
@RequestMapping(value = "/create")
@ApiOperation("新增相关人员")
@AnonymousAccess
public ResultInfo create(@Validated @RequestBody MemberRelatedInfo resources) {
String name = resources.getName();
if (StringUtils.hasText(name)) {
String nickNameEncode = Base64Util.encode(name);
resources.setName(nickNameEncode);
}
public ResultInfo create(@Validated(value = {CreateGroup.class}) @RequestBody MemberRelatedInfo resources) {
log.info("memberRelatedInfo ==>> create ==>> resources ===>> [{}]",resources);
MemberRelatedInfoService.create(resources);
return ResultInfo.success();
BasicMemberRelatedInfoDTO memberRelatedInfoDTO = this.memberRelatedInfoOperationService.create(resources);
return ResultInfo.success(memberRelatedInfoDTO);
}
@PutMapping(value = "/update")
@ApiOperation("修改MemberRelatedInfo")
@RequestMapping(value = "/update")
@ApiOperation("修改相关人员")
@AnonymousAccess
public ResultInfo update(@Validated(value = {UpdateGroup.class}) @RequestBody MemberRelatedInfo resources) {
log.info("Param ===> resources ===> [{}]",resources);
log.info("memberRelatedInfo ==>> update ==>> resources ===>> [{}]",resources);
String name = resources.getName();
if (StringUtils.hasText(name)) {
String nickNameEncode = Base64Util.encode(name);
resources.setName(nickNameEncode);
BasicMemberRelatedInfoDTO memberRelatedInfoDTO = this.memberRelatedInfoOperationService.update(resources);
return ResultInfo.success(memberRelatedInfoDTO);
}
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();
Assert.notNull(code,"code can't be null");
resources.setMemberCode(code);
MemberRelatedInfoService.update(resources);
}
}
return ResultInfo.success();
}
@GetMapping(value = "/findById/{id}")
@ApiOperation("查询指定MemberRelatedInfo")
public ResultInfo findById(@PathVariable("id") Long id) {
return ResultInfo.success(MemberRelatedInfoService.findById(id));
}
@DeleteMapping(value = "/delete/{id}")
@ApiOperation("删除MemberRelatedInfo")
@RequestMapping(value = "/delete")
@ApiOperation("删除相关人员")
@AnonymousAccess
public ResultInfo delete(@PathVariable Long id) {
MemberRelatedInfoService.delete(id);
public ResultInfo delete(@RequestParam(value = "id") Long resources) {
log.info("memberRelatedInfo ==>> delete ==>> resources ===>> [{}]",resources);
this.memberRelatedInfoOperationService.delete(resources);
log.info("memberRelatedInfo ==>> delete ==>> result ===>> [{}]",resources);
return ResultInfo.success();
}
......
package com.topdraw.business.module.member.relatedinfo.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -14,31 +11,72 @@ import java.util.List;
public interface MemberRelatedInfoService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
* 根据ID查询
* @param id ID
* @return MemberRelatedInfoDTO
*/
Map<String,Object> queryAll(MemberRelatedInfoQueryCriteria criteria, Pageable pageable);
MemberRelatedInfoDTO findById(Long id);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberRelatedInfoDTO>
* 新增
* @param resources
*/
List<MemberRelatedInfoDTO> queryAll(MemberRelatedInfoQueryCriteria criteria);
MemberRelatedInfoDTO create(MemberRelatedInfo resources);
/**
* 根据ID查询
* @param id ID
* @return MemberRelatedInfoDTO
* 修改
* @param resources
*/
MemberRelatedInfoDTO findById(Long id);
MemberRelatedInfoDTO update(MemberRelatedInfo resources);
void create(MemberRelatedInfo resources);
/**
* 删除
* @param id
*/
void delete(Long id);
void update(MemberRelatedInfo resources);
/**
* 通过身份证查询
* @param resources
* @return
*/
MemberRelatedInfoDTO findByIdCard(MemberRelatedInfo resources);
void delete(Long id);
/**
* 通过身份证查询
* @param idCard 身份证
* @return
*/
MemberRelatedInfoDTO findByIdCard(String idCard);
/**
*
* @param memberId
* @param idCard
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(Long memberId , String idCard);
/**
*
* @param memberCode
* @param idCard
* @return
*/
MemberRelatedInfoDTO findByMemberCodeAndIdCard(String memberCode , String idCard);
/**
*
* @param resources
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(MemberRelatedInfo resources);
/**
*
* @param member
* @param resources
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(Member member , MemberRelatedInfo resources);
}
......
package com.topdraw.business.module.member.relatedinfo.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class BasicMemberRelatedInfoDTO implements Serializable {
// ID
private Long id;
// 人物关系 0:子女;1:父母
private Integer type;
// 手机号
private String cellphone;
// 身份证号
private String idCard;
// 姓名
private String name;
// 性别 0:女;1:男;-1:未知
private Integer sex;
// 生日
private String birthday;
// 头像地址
private String avatarUrl;
}
......@@ -4,7 +4,6 @@ import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDate;
/**
......@@ -36,7 +35,7 @@ public class MemberRelatedInfoDTO implements Serializable {
private Integer sex;
// 生日
private LocalDate birthday;
private String birthday;
// 头像地址
private String avatarUrl;
......
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.utils.RedisUtils;
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.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;
/**
* @author XiangHan
......@@ -28,58 +31,177 @@ 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 RedisUtils redisUtils;
@Override
public Map<String, Object> queryAll(MemberRelatedInfoQueryCriteria criteria, Pageable pageable) {
Page<MemberRelatedInfo> page = MemberRelatedInfoRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(MemberRelatedInfoMapper::toDto));
}
@Override
public List<MemberRelatedInfoDTO> queryAll(MemberRelatedInfoQueryCriteria criteria) {
return MemberRelatedInfoMapper.toDto(MemberRelatedInfoRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
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);
public MemberRelatedInfoDTO create(MemberRelatedInfo resources) {
log.info("MemberRelatedInfoServiceImpl ==>> create ==>> param ==>> [{}]",resources);
String idCard = resources.getIdCard();
Long memberId = resources.getMemberId();
if (Objects.nonNull(memberId) && StringUtils.isNotBlank(idCard) && !idCard.equalsIgnoreCase(DEFAULT_IDCARD) ) {
MemberRelatedInfoDTO memberRelatedInfo = this.findByMemberIdAndIdCard(resources);
if (Objects.nonNull(memberRelatedInfo))
// 数据已存在
throw new BadRequestException(GlobeExceptionMsg.ENTITY_ALREADY_EXISTS);
}
this.checkMemberAndEncodeRealname(resources);
MemberRelatedInfo memberRelatedInfo = MemberRelatedInfoBuilder.build(resources);
this.memberRelatedInfoRepository.save(memberRelatedInfo);
log.info("MemberRelatedInfoServiceImpl ==>> create ==>> result ==>> [{}]",memberRelatedInfo);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
}
/**
* 检查会员是否存在,加密真实姓名
* @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.isNotBlank(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);
public MemberRelatedInfoDTO update(MemberRelatedInfo resources) {
log.info("MemberRelatedInfoServiceImpl ==>> update ==>> param ==>> [{}]",resources);
this.redisUtils.doLock("memberRelatedInfo::update::id" + resources.getId());
try {
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findById(resources.getId()).orElseGet(MemberRelatedInfo::new);
ValidationUtil.isNull(memberRelatedInfo.getId(), "MemberRelatedInfo", "id", resources.getId());
resources.setMemberId(memberRelatedInfo.getMemberId());
this.checkMemberAndEncodeRealname(resources);
memberRelatedInfo.copy(resources);
this.memberRelatedInfoRepository.save(memberRelatedInfo);
log.info("MemberRelatedInfoServiceImpl ==>> update ==>> param ==>> [{}]", resources);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("memberRelatedInfo::update::id" + resources.getId());
}
}
@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 MemberRelatedInfoDTO findByIdCard(MemberRelatedInfo resources){
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> param ==>> [{}]",resources);
String idCard = resources.getIdCard();
Assert.notNull(idCard,"idCard can't be null");
if (!idCard.equalsIgnoreCase(DEFAULT_IDCARD)) {
MemberRelatedInfoDTO memberRelatedInfoDTO = this.findByIdCard(idCard);
ValidationUtil.isNull(memberRelatedInfoDTO.getId(),"MemberRelatedInfo","id",resources.getId());
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> result ==>> [{}]",memberRelatedInfoDTO);
return memberRelatedInfoDTO;
}
return null;
}
@Override
public MemberRelatedInfoDTO findByIdCard(String idCard) {
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> param ==>> [{}]",idCard);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findByIdCard(idCard);
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> result ==>> [{}]",memberRelatedInfo);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
}
@Override
public MemberRelatedInfoDTO findByMemberCodeAndIdCard(String memberCode, String idCard) {
Assert.notNull(memberCode,"memberCode can't be null");
Assert.notNull(idCard,"idCard can't be null");
MemberDTO memberDTO = this.checkMember(null, memberCode);
return this.findByMemberIdAndIdCard(memberDTO.getId(),idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(Long memberId, String idCard) {
log.info("MemberRelatedInfoServiceImpl ==>> findByMemberIdAndIdCard ==>> param ==>> [{}]",memberId+","+idCard);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findByMemberIdAndIdCard(memberId, idCard);
log.info("MemberRelatedInfoServiceImpl ==>> findByMemberIdAndIdCard ==>> result ==>> [{}]",memberRelatedInfo);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(MemberRelatedInfo resources) {
Long memberId = resources.getMemberId();
String idCard = resources.getIdCard();
return this.findByMemberIdAndIdCard(memberId,idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(Member member, MemberRelatedInfo resources) {
Long memberId = member.getId();
String idCard = resources.getIdCard();
return this.findByMemberIdAndIdCard(memberId,idCard);
}
private MemberDTO checkMember(MemberRelatedInfo resources){
Long memberId = resources.getMemberId();
String code = resources.getMemberCode();
return this.memberService.checkMember(memberId, code);
}
private MemberDTO checkMember(Long memberId , String memberCode){
return this.memberService.checkMember(memberId, memberCode);
}
}
......
......@@ -16,4 +16,6 @@ public interface MemberRepository extends JpaRepository<Member, Long>, JpaSpecif
Optional<Member> findFirstByCode(String code);
List<Member> findByUserIptvId(Long id);
Optional<Member> findByIdOrCode(Long id,String code);
}
......
package com.topdraw.business.module.member.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.service.UserOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.util.Base64Util;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "Member管理")
@Api(tags = "会员管理")
@RestController
@RequestMapping("/ucEngine/api/member")
@RequestMapping("/uce/member")
@CrossOrigin
@Slf4j
public class MemberController {
@Autowired
private MemberService memberService;
private MemberOperationService memberOperationService;
@Autowired
private UserOperationService userTvOperationService;
@GetMapping(value = "/findById/{id}")
@ApiOperation("新增UserTv会员")
public ResultInfo findById(@PathVariable Long id) {
MemberDTO memberDTO = this.memberService.findById(id);
return ResultInfo.success(memberDTO);
}
@PostMapping(value = "/createMemberByUserTv")
@ApiOperation("新增UserTv会员")
public ResultInfo createMemberByUserTv(@Validated @RequestBody UserTv resources) {
String platformAccount = resources.getPlatformAccount();
Assert.notNull(platformAccount, "The given platformAccount must not be null!");
boolean result = this.userTvOperationService.createMemberByUserTv(resources);
return ResultInfo.success(result);
}
@PostMapping(value = "/create")
@ApiOperation("新增Member")
@AnonymousAccess
public ResultInfo create(@Validated @RequestBody Member resources) {
Long id = memberService.create(resources);
return ResultInfo.success(id);
}
private UserOperationService userOperationService;
@PostMapping(value = "/doUpdateVipAndSaveHistory")
@ApiOperation("修改Member等级")
public ResultInfo doUpdateVipAndSaveVipHistory(@RequestBody Member member) {
memberService.doUpdateVipAndSaveVipHistory(member);
return ResultInfo.success();
}
@RequestMapping(value = "/doUpdateVip")
@ApiOperation("修改Member等级")
@RequestMapping(value = "/createMemberByUserTv")
@ApiOperation("为大屏账户创建会员")
@AnonymousAccess
public ResultInfo doUpdateVip(@RequestBody Member member) {
memberService.update(member);
@Deprecated
public ResultInfo createMemberByUserTv(@Validated(value = {CreateGroup.class}) @RequestBody UserTv resources) {
// todo 此接口废弃,将移动至UserTvController中,AppEngine也要同步修改
log.info("member ==>> createMemberByUserTv ==>> param ==>> [{}]",resources);
this.userOperationService.createTvUserAndMember(resources);
return ResultInfo.success();
}
@RequestMapping(value = "/doUpdateVipByCode")
@ApiOperation("修改Member等级")
@AnonymousAccess
public ResultInfo doUpdateVipByCode(@RequestBody Member member) {
String code = member.getCode();
Assert.notNull(code,"code can't be null !");
memberService.doUpdateVipByCode(member);
@ApiOperation("手动修改vip")
public ResultInfo doUpdateVipByCode(@Validated(value = {UpdateGroup.class}) @RequestBody Member resources) {
log.info("member ==>> doUpdateVipByCode ==>> param ==>> [{}]",resources);
this.memberOperationService.updateMemberVip(resources);
return ResultInfo.success();
}
@PutMapping(value = "/update")
@ApiOperation("修改Member")
@ApiOperation("修改会员信息")
@AnonymousAccess
public ResultInfo update(@Validated @RequestBody Member resources) {
Long memberId = resources.getId();
Assert.notNull(memberId,"memberId can't be null");
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
Assert.notNull(code, "code can't be null");
resources.setCode(code);
memberService.update(resources);
}
return ResultInfo.success();
public ResultInfo update(@Validated(value = {UpdateGroup.class}) @RequestBody Member resources) {
log.info("member ==>> update ==>> param ==>> [{}]",resources);
String code = resources.getCode();
if (StringUtils.isNotBlank(code)) {
MemberDTO memberDTO = this.memberOperationService.findByCode(code);
resources.setId(memberDTO.getId());
// BeanUtils.copyProperties(resources, memberDTO);
}
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(memberService.getByCode(code));
MemberDTO memberDTO = this.memberOperationService.update(resources);
return ResultInfo.success(memberDTO);
}
}
......
package com.topdraw.business.module.member.service;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.dto.MemberQueryCriteria;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -18,19 +12,11 @@ import java.util.Map;
public interface MemberService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberDTO>
* 获取会员code
* @param id
* @return
*/
List<MemberDTO> queryAll(MemberQueryCriteria criteria);
String findCodeById(Long id);
/**
* 根据ID查询
......@@ -40,45 +26,69 @@ public interface MemberService {
MemberDTO findById(Long id);
/**
*
* 通过code查询会员
* @param code 会员编码
* @return MemberDTO
*/
MemberDTO findByCode(String code);
/**
* 保存
* @param resources
* @return
* @return Long id
*/
Long create(Member resources);
MemberDTO create(Member resources);
Member createAndReturnMember(Member resources);
/**
* 创建并返回会员
* @param resources 会员
* @return Member
*/
MemberDTO createAndReturnMember(Member resources);
/**
*
* 修改会员
* @param resources
*/
void update(Member resources);
MemberDTO update(Member resources);
/**
* 修改会员积分
* @param member 会员
*/
MemberDTO doUpdateMemberPoints(Member member);
void unbind(Member resources);
/**
* 查询绑定了大屏会员列表
* @param id 条件参数
* @return Map<String,Object>
*/
List<MemberDTO> findByUserIptvId(Long id);
/**
*
* @param id
* 检查会员信息
* @param id 会员id
* @param memberCode 会员编码
*/
void delete(Long id);
MemberDTO checkMember(Long id , String memberCode);
/**
* Code校验
* @param code
* @return MemberDTO
* 检查会员信息
* @param member 会员
*/
MemberDTO getByCode(String code);
MemberDTO checkMember(Member member);
/**
*
* @param member
* @param resources
* @return
*/
void doUpdateMemberPoints(Member member);
MemberDTO doUpdateMemberExpAndLevel(Member resources);
List<MemberDTO> findByUserIptvId(Long id);
void doUpdateVipByCode(Member member);
void doUpdateVipAndSaveVipHistory(Member member);
/**
*
* @param member
* @return
*/
MemberDTO doUpdateMemberCoupon(Member member);
}
......
package com.topdraw.business.module.member.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class BasicMemberDTO implements Serializable {
private String platformAccount;
/** iptv绑定的主会员 0:否 1:是 */
private Integer iptvMajor;
/** vip过期时间 */
private Timestamp vipExpireTime;
/** 主键 */
private Long id;
/** 标识 */
private String code;
/** 类型 1:大屏;2:小屏 */
private Integer type;
/** 状态 0:不可用;1:可用 */
private Integer status;
/** 昵称 base64 */
private String nickname;
/** 描述 */
private String description;
/** 性别 0:女;1:男;-1:未知 */
private Integer gender;
/** 生日 */
private String birthday;
/** 头像 */
private String avatarUrl;
/** 分组信息 */
private String groups;
/** 标签 */
private String tags;
/** 是否会员 0:非会员;1:会员 */
private Integer vip;
/** 会员等级(对应level表的level字段,非id) */
private Integer level;
/** 成长值 */
private Long exp;
/** 当前积分 */
private Long points;
/** 即将到期积分(一个月内) */
private Long duePoints;
/** 优惠券数量 */
private Long couponAmount;
/** 即将过期优惠券数量 */
private Long dueCouponAmount;
/** iptv账号id */
private Long userIptvId;
/** 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通 */
private Integer bindIptvPlatformType;
/** iptv账号绑定时间 */
private Timestamp bindIptvTime;
/** 创建时间 */
private Timestamp createTime;
/** 更新时间 */
private Timestamp updateTime;
/** 是否在黑名单 1:是;0否 */
private Long blackStatus;
}
......@@ -16,81 +16,81 @@ public class MemberDTO implements Serializable {
private String platformAccount;
// iptv绑定的主会员 0:否 1:是
/** iptv绑定的主会员 0:否 1:是 */
private Integer iptvMajor;
// vip过期时间
private LocalDateTime vipExpireTime;
/** vip过期时间 */
private Timestamp vipExpireTime;
// 主键
/** 主键 */
private Long id;
// 标识
/** 标识 */
private String code;
// 类型 1:大屏;2:小屏
/** 类型 1:大屏;2:小屏 */
private Integer type;
// 状态 0:不可用;1:可用
/** 状态 0:不可用;1:可用 */
private Integer status;
// 昵称 base64
/** 昵称 base64 */
private String nickname;
// 描述
/** 描述 */
private String description;
// 性别 0:女;1:男;-1:未知
/** 性别 0:女;1:男;-1:未知 */
private Integer gender;
// 生日
/** 生日 */
private String birthday;
// 头像
/** 头像 */
private String avatarUrl;
// 分组信息
/** 分组信息 */
private String groups;
// 标签
/** 标签 */
private String tags;
// 是否会员 0:非会员;1:会员
/** 是否会员 0:非会员;1:会员 */
private Integer vip;
// 会员等级(对应level表的level字段,非id)
/** 会员等级(对应level表的level字段,非id) */
private Integer level;
// 成长值
/** 成长值 */
private Long exp;
// 当前积分
/** 当前积分 */
private Long points;
// 即将到期积分(一个月内)
/** 即将到期积分(一个月内) */
private Long duePoints;
// 优惠券数量
/** 优惠券数量 */
private Long couponAmount;
// 即将过期优惠券数量
/** 即将过期优惠券数量 */
private Long dueCouponAmount;
// iptv账号id
/** iptv账号id */
private Long userIptvId;
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
/** 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通 */
private Integer bindIptvPlatformType;
// iptv账号绑定时间
private LocalDateTime bindIptvTime;
/** iptv账号绑定时间 */
private Timestamp bindIptvTime;
// 创建时间
private LocalDateTime createTime;
/** 创建时间 */
private Timestamp createTime;
// 更新时间
private LocalDateTime updateTime;
/** 更新时间 */
private Timestamp updateTime;
// 是否在黑名单 1:是;0否
/** 是否在黑名单 1:是;0否 */
private Long blackStatus;
}
......
package com.topdraw.business.module.member.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberQueryCriteria{
@Query(type = Query.Type.LEFT_LIKE)
private String code;
// 类型 1:大屏;2:小屏
@Query(type = Query.Type.EQUAL)
private Integer type;
// 状态 0:不可用;1:可用
@Query(type = Query.Type.EQUAL)
private Integer status;
// 昵称 base64
@Query(type = Query.Type.LEFT_LIKE)
private String nickname;
// 性别 0:女;1:男;-1:未知
@Query(type = Query.Type.EQUAL)
private Integer gender;
// 分组信息
@Query(type = Query.Type.EQUAL)
private String groups;
// 标签
@Query(type = Query.Type.IN)
private String tags;
// 是否会员 0:非会员;1:会员
@Query(type = Query.Type.EQUAL)
private Integer vip;
// 会员等级(对应level表的level字段,非id)
@Query(type = Query.Type.EQUAL)
private Integer level;
// iptv账号id
@Query(type = Query.Type.EQUAL)
private Long userIptvId;
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
@Query(type = Query.Type.IN)
private Integer bindIptvPlatformType;
}
package com.topdraw.business.module.member.service.impl;
import com.alibaba.fastjson.JSON;
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.MemberProfileBuilder;
import com.topdraw.business.module.member.profile.service.MemberProfileService;
import com.topdraw.business.module.member.repository.MemberRepository;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.dto.MemberQueryCriteria;
import com.topdraw.business.module.member.service.mapper.MemberMapper;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.member.viphistory.service.impl.MemberVipHistoryBuilder;
import com.topdraw.mq.domain.TableOperationMsg;
import com.topdraw.mq.producer.MessageProducer;
import com.topdraw.util.IdWorker;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.nio.charset.StandardCharsets;
import java.util.*;
/**
......@@ -47,208 +36,174 @@ import java.util.*;
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private MemberVipHistoryService memberVipHistoryService;
@Autowired
private MemberMapper memberMapper;
@Autowired
private RedissonClient redissonClient;
private MemberRepository memberRepository;
@Autowired
PlatformTransactionManager platformTransactionManager;
private MemberProfileService memberProfileService;
@Autowired
MessageProducer messageProducer;
private RedisUtils redisUtils;
@Override
public Map<String, Object> queryAll(MemberQueryCriteria criteria, Pageable pageable) {
Page<Member> page = memberRepository.findAll((root, criteriaQuery, criteriaBuilder)
-> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(memberMapper::toDto));
}
@Override
public List<MemberDTO> queryAll(MemberQueryCriteria criteria) {
return memberMapper.toDto(memberRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public String findCodeById(Long id) {
MemberDTO memberDTO = this.findById(id);
return memberDTO.getCode();
}
@Override
public MemberDTO findById(Long id) {
Member member = memberRepository.findById(id).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","id",id);
return memberMapper.toDto(member);
Member member = this.memberRepository.findById(id).orElseGet(Member::new);
return this.memberMapper.toDto(member);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public Long create(Member resources) {
Member member = this.checkMemberData(resources);
memberRepository.save(member);
return member.getId();
public MemberDTO findByCode(String code) {
Member member = this.memberRepository.findFirstByCode(code).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","id",code);
return this.memberMapper.toDto(member);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public Member createAndReturnMember(Member resources) {
Member member = this.checkMemberData(resources);
memberRepository.save(member);
return resources;
}
private Member checkMemberData(Member member) {
Long defaultValue = 0L;
String code = member.getCode();
member.setCode(StringUtils.isEmpty(code)?String.valueOf(IdWorker.generator()):code);
Integer gender = member.getGender();
member.setGender(Objects.nonNull(gender) ? gender : 0);
Integer type = member.getType();
member.setType(Objects.nonNull(type) ? type:-1);
Integer status = member.getStatus();
member.setStatus(Objects.nonNull(status) ? status:1);
Integer vip = member.getVip();
member.setVip(Objects.nonNull(vip) ? vip:0);
Integer level = member.getLevel();
member.setLevel(Objects.nonNull(level) ? level:1);
member.setExp(defaultValue);
member.setPoints(defaultValue);
member.setDuePoints(defaultValue);
member.setCouponAmount(defaultValue);
member.setDueCouponAmount(defaultValue);
member.setBlackStatus(0L);
String nickname = member.getNickname();
if (StringUtils.isNotEmpty(nickname)) {
//String base64Nickname = new String(Base64.getEncoder().encode(nickname.getBytes(StandardCharsets.UTF_8)));
member.setNickname(nickname);
}
return member;
private MemberDTO findByIdOrCode(Long id,String code) {
Member member = this.memberRepository.findByIdOrCode(id,code).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","param",code);
return this.memberMapper.toDto(member);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(Member resources) {
RLock rLock = this.redissonClient.getLock("member::update::id" + resources.getId().toString());
try {
RedissonUtil.lock(rLock);
Member member = memberRepository.findById(resources.getId()).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(), "Member", "id", resources.getId());
member.copy(resources);
this.save(member);
public List<MemberDTO> findByUserIptvId(Long id) {
List<Member> memberList = this.memberRepository.findByUserIptvId(id);
TableOperationMsg tableOperationMsg = new TableOperationMsg();
tableOperationMsg.setMethodName("update");
tableOperationMsg.setEntityBody(JSON.toJSONString(resources));
tableOperationMsg.setInterfaceName("com.topdraw.business.module.member.service.impl.MemberServiceImpl");
tableOperationMsg.setEntityName("com.topdraw.business.module.member.domain.Member");
return this.memberMapper.toDto(memberList);
messageProducer.sendMessage(JSON.toJSONString(tableOperationMsg));
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
@Override
public MemberDTO checkMember(Long id, String memberCode) {
if(Objects.isNull(id) && StringUtils.isBlank(memberCode))
throw new BadRequestException(GlobeExceptionMsg.MEMBER_ID_AND_CODE_ARE_NULL);
if (StringUtils.isNotBlank(memberCode)) {
MemberDTO memberDTO = this.findByCode(memberCode);
return memberDTO;
} else if (Objects.nonNull(id)) {
MemberDTO memberDTO = this.findById(id);
return memberDTO;
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void unbind(Member resources) {
RLock rLock = this.redissonClient.getLock("member::update::id" + resources.getId().toString());
try {
RedissonUtil.lock(rLock);
Member member = memberRepository.findById(resources.getId()).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(), "Member", "id", resources.getId());
member.copy(resources);
this.save(member);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
public MemberDTO checkMember(Member member) {
String memberCode = member.getCode();
Long memberId = member.getId();
return this.checkMember(memberId,memberCode);
}
@Override
public MemberDTO doUpdateMemberExpAndLevel(Member resources) {
MemberDTO memberDTO = this.update(resources);
return memberDTO;
}
private void save(Member member){
memberRepository.save(member);
@Override
public MemberDTO doUpdateMemberCoupon(Member member) {
MemberDTO memberDTO = this.update(member);
return memberDTO;
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
RLock rLock = this.redissonClient.getLock("member::delete::id" + id);
try {
RedissonUtil.lock(rLock);
Member member = memberRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Member.class, id), 1));
memberRepository.delete(member);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
public MemberDTO create(Member resources) {
Member member = MemberBuilder.build(resources);
Member _member = this.save(member);
if (Objects.nonNull(_member.getId())) {
MemberProfile memberProfile = MemberProfileBuilder.build(_member);
// 保存会员属性
this.memberProfileService.create(memberProfile);
}
return this.memberMapper.toDto(member);
}
@Override
public MemberDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? memberMapper.toDto(memberRepository.findFirstByCode(code).orElseGet(Member::new))
: new MemberDTO();
@Transactional(rollbackFor = Exception.class)
public MemberDTO createAndReturnMember(Member resources) {
MemberDTO memberDTO = this.create(MemberBuilder.build(resources));
return memberDTO;
}
@Override
@AsyncMqSend()
public void doUpdateMemberPoints(Member resources) {
RLock rLock = this.redissonClient.getLock("member::update::id" + resources.getId().toString());
@Transactional(rollbackFor = Exception.class)
public MemberDTO update(Member resources) {
log.info("MemberServiceImpl ==>> update ==>> resources ==>> [{}]" , resources);
this.redisUtils.doLock("member::code" + resources.getCode());
try {
RedissonUtil.lock(rLock);
Member member = memberRepository.findById(resources.getId()).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(), "Member", "id", resources.getId());
MemberDTO memberDTO = this.checkMember(resources);
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
member.copy(resources);
this.save(member);
Member _member = this.save(member);
return this.memberMapper.toDto(_member);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
this.redisUtils.doUnLock("member::code" + resources.getCode());
}
@Override
public List<MemberDTO> findByUserIptvId(Long id) {
List<Member> memberList = this.memberRepository.findByUserIptvId(id);
return memberMapper.toDto(memberList);
}
@Override
public void doUpdateVipByCode(Member member) {
MemberDTO memberDTO = this.getByCode(member.getCode());
ValidationUtil.isNull(member.getId(), "Member", "id", memberDTO.getId());
Member member1 = new Member();
BeanUtils.copyProperties(memberDTO,member1);
member1.setVip(member.getVip());
this.update(member1);
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Member save(Member member){
return this.memberRepository.save(member);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void doUpdateVipAndSaveVipHistory(Member member) {
MemberDTO memberDTO = this.getByCode(member.getCode());
MemberVipHistory memberVipHistory = MemberVipHistoryBuilder.build(memberDTO.getId(),
memberDTO.getVip(),memberDTO.getStatus(),memberDTO.getVipExpireTime(),member.getVip());
this.memberVipHistoryService.create(memberVipHistory);
public MemberDTO doUpdateMemberPoints(Member resources) {
try {
this.redisUtils.doLock("member::update::code" + resources.getCode());
Member member1 = new Member();
BeanUtils.copyProperties(memberDTO,member1);
member1.setVip(member.getVip());
this.update(member);
}
Member member = this.memberRepository.findById(resources.getId()).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(), "Member", "id", resources.getId());
member.copy(resources);
Member _member = this.save(member);
return this.memberMapper.toDto(_member);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("member::update::code" + resources.getCode());
}
}
}
......
......@@ -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;
......@@ -11,7 +12,6 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
* @author luerlong
......@@ -22,7 +22,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
......@@ -47,7 +47,7 @@ public class MemberVipHistory implements Serializable {
// vip失效时间
@Column(name = "vip_expire_time")
private LocalDateTime vipExpireTime;
private Timestamp vipExpireTime;
// 状态 1正常 0已过期
@Column(name = "status")
......
package com.topdraw.business.module.member.viphistory.domain;
import com.topdraw.business.module.member.domain.Member;
import java.sql.Timestamp;
import java.util.Objects;
public class MemberVipHistoryBuilder {
public static MemberVipHistory build(Member member , Integer beforeVip) {
Long id = member.getId();
Integer vip = member.getVip();
Timestamp vipExpireTime = member.getVipExpireTime();
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setMemberId(Objects.isNull(id)? null:id);
memberVipHistory.setVip(Objects.isNull(vip)? null:vip);
memberVipHistory.setBeforeVip(Objects.isNull(beforeVip)? null:beforeVip);
memberVipHistory.setVipExpireTime(Objects.isNull(vipExpireTime)? null:vipExpireTime);
return build(memberVipHistory);
}
public static MemberVipHistory build(Long memberId, Integer vip, Integer beforeVip, Timestamp vipExpireTime ) {
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setMemberId(Objects.isNull(memberId)? null:memberId);
memberVipHistory.setVip(Objects.isNull(vip)? null:vip);
memberVipHistory.setBeforeVip(Objects.isNull(beforeVip)? null:beforeVip);
memberVipHistory.setVipExpireTime(Objects.isNull(vipExpireTime)? null:vipExpireTime);
return build(memberVipHistory);
}
public static MemberVipHistory build(MemberVipHistory memberVipHistory) {
return build(memberVipHistory.getId(),
memberVipHistory.getMemberId(),
memberVipHistory.getVip(),
memberVipHistory.getBeforeVip(),
memberVipHistory.getVipExpireTime(),
memberVipHistory.getStatus());
}
public static MemberVipHistory build(Long id, Long memberId , Integer vip , Integer beforeVip , Timestamp vipExpireTime, Integer status){
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setId(Objects.isNull(id)? null:id);
memberVipHistory.setMemberId(Objects.isNull(memberId)? null:memberId) ;
memberVipHistory.setVip(Objects.isNull(vip)? null:vip);
memberVipHistory.setBeforeVip(Objects.isNull(beforeVip)? null:beforeVip);
memberVipHistory.setVipExpireTime(Objects.isNull(vipExpireTime)? null:vipExpireTime);
memberVipHistory.setStatus(Objects.isNull(status)? 1:status);
return memberVipHistory;
}
}
package com.topdraw.business.module.member.viphistory.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.business.process.service.member.MemberOperationService;
import com.topdraw.common.ResultInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -15,44 +13,18 @@ import org.springframework.web.bind.annotation.*;
* @author luerlong
* @date 2021-12-10
*/
@Api(tags = "MemberVipHistory管理")
@Api(tags = "会员vip历史管理")
@RestController
@RequestMapping("/api/memberVipHistory")
@RequestMapping("/uce/memberVipHistory")
public class MemberVipHistoryController {
@Autowired
private MemberVipHistoryService memberVipHistoryService;
@GetMapping
@ApiOperation("查询MemberVipHistory")
public ResultInfo getMemberVipHistorys(MemberVipHistoryQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(memberVipHistoryService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有MemberVipHistory")
public ResultInfo getMemberVipHistorys(MemberVipHistoryQueryCriteria criteria) {
return ResultInfo.success(memberVipHistoryService.queryAll(criteria));
}
private MemberOperationService memberOperationService;
@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);
this.memberOperationService.createVipHistory(resources);
return ResultInfo.success();
}
......
package com.topdraw.business.module.member.viphistory.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryDTO;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author luerlong
......@@ -17,32 +14,42 @@ 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 member
*/
void create(Member member, Integer beforeVip);
/**
*
* @param resources
*/
void update(MemberVipHistory resources);
/**
*
* @param id
*/
void delete(Long id);
MemberVipHistory findByTime(Long id, LocalDateTime nowTime);
/**
*
* @param id
* @param nowTime
* @return
*/
MemberVipHistory findByTime(Long id, Timestamp nowTime);
}
......
......@@ -4,7 +4,6 @@ import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -27,7 +26,7 @@ public class MemberVipHistoryDTO implements Serializable {
private Integer beforeVip;
// vip失效时间
private LocalDateTime vipExpireTime;
private Timestamp vipExpireTime;
// 状态 1正常 0已过期
private Integer status;
......
package com.topdraw.business.module.member.viphistory.service.dto;
import lombok.Data;
/**
* @author luerlong
* @date 2021-12-10
*/
@Data
public class MemberVipHistoryQueryCriteria {
}
......@@ -2,28 +2,27 @@ package com.topdraw.business.module.member.viphistory.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistoryBuilder;
import com.topdraw.business.module.member.viphistory.repository.MemberVipHistoryRepository;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryDTO;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryQueryCriteria;
import com.topdraw.business.module.member.viphistory.service.mapper.MemberVipHistoryMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.util.TimestampUtil;
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.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author luerlong
......@@ -31,62 +30,81 @@ 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) {
MemberVipHistory memberVipHistory = memberVipHistoryRepository.findById(id).orElseGet(MemberVipHistory::new);
log.info("MemberVipHistoryServiceImpl ==>> findById ==>> param ==>> [{}]",id);
MemberVipHistory memberVipHistory = this.memberVipHistoryRepository.findById(id).orElseGet(MemberVipHistory::new);
ValidationUtil.isNull(memberVipHistory.getId(),"MemberVipHistory","id",id);
return memberVipHistoryMapper.toDto(memberVipHistory);
log.info("MemberVipHistoryServiceImpl ==>> findById ==>> result ==>> [{}]",memberVipHistory);
return this.memberVipHistoryMapper.toDto(memberVipHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void create(MemberVipHistory resources) {
memberVipHistoryRepository.save(resources);
log.info("MemberVipHistoryServiceImpl ==>> MemberVipHistoryServiceImpl ==>> param ==>> [{}]",resources);
MemberDTO memberDTO = this.checkMember(resources);
MemberVipHistory memberVipHistory = MemberVipHistoryBuilder.build(resources);
MemberVipHistory vipHistory = this.memberVipHistoryRepository.save(memberVipHistory);
vipHistory.setMemberCode(memberDTO.getCode());
}
@Override
public void create(Member member, Integer beforeVip) {
this.checkMember(member);
MemberVipHistory memberVipHistory = MemberVipHistoryBuilder.build(member, beforeVip);
this.memberVipHistoryRepository.save(memberVipHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(MemberVipHistory resources) {
MemberVipHistory memberVipHistory = memberVipHistoryRepository.findById(resources.getId()).orElseGet(MemberVipHistory::new);
MemberVipHistory memberVipHistory = this.memberVipHistoryRepository.findById(resources.getId()).orElseGet(MemberVipHistory::new);
ValidationUtil.isNull( memberVipHistory.getId(),"MemberVipHistory","id",resources.getId());
memberVipHistory.copy(resources);
memberVipHistoryRepository.save(memberVipHistory);
this.memberVipHistoryRepository.save(memberVipHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberVipHistory memberVipHistory = memberVipHistoryRepository.findById(id).orElseThrow(
MemberVipHistory memberVipHistory = this.memberVipHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberVipHistory.class, id), 1));
memberVipHistoryRepository.delete(memberVipHistory);
this.memberVipHistoryRepository.delete(memberVipHistory);
}
@Override
public MemberVipHistory findByTime(Long memberId, LocalDateTime nowTime) {
MemberVipHistory memberVipHistory = this.memberVipHistoryRepository.findByTime(memberId, nowTime).orElseGet(MemberVipHistory::new);
public MemberVipHistory findByTime(Long memberId, Timestamp nowTime) {
LocalDateTime localDateTime = TimestampUtil.timestamp2LocalDateTime(nowTime);
MemberVipHistory memberVipHistory = this.memberVipHistoryRepository.findByTime(memberId, localDateTime).orElseGet(MemberVipHistory::new);
return memberVipHistory;
}
private MemberDTO checkMember(MemberVipHistory resources){
Long memberId = resources.getMemberId();
String code = resources.getMemberCode();
return this.memberService.checkMember(memberId, code);
}
private MemberDTO checkMember(Member resources){
Long memberId = resources.getId();
String code = resources.getCode();
return this.memberService.checkMember(memberId, code);
}
}
......
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;
......@@ -10,7 +10,6 @@ import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.io.Serializable;
......@@ -25,49 +24,49 @@ 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
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code")
private String code;
// 积分类型 0:通用型
/** 积分类型 0:通用型 */
@Column(name = "points_type")
private Integer pointsType;
// 设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
@Column(name = "device_type")
private Integer deviceType;
// 会员id
/** 会员id */
@Column(name = "member_id", nullable = false)
private Long memberId;
// 积分值
/** 积分值 */
@Column(name = "points")
private Long points;
// 过期时间
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
/** 过期时间 */
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",locale = "")
@Column(name = "expire_time")
private LocalDateTime expireTime;
private Timestamp expireTime;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
......@@ -25,7 +25,7 @@ public interface PointsAvailableRepository extends JpaRepository<PointsAvailable
List<PointsAvailableDTO> findByMemberId(Long memberId);
List<PointsAvailable> findByMemberIdAndExpireTimeBefore(Long memberId , LocalDateTime now);
List<PointsAvailable> findByMemberIdAndExpireTimeBefore(Long memberId , Timestamp now);
/**
* 即将过期的积分
......
package com.topdraw.business.module.points.available.rest;
/**
* @author XiangHan
* @date 2021-10-23
*/
//@Api(tags = "PointsAvailable管理")
//@RestController
//@RequestMapping("/api/PointsAvailable")
public class PointsAvailableController {
/*@Autowired
private PointsAvailableService PointsAvailableService;
@GetMapping
@ApiOperation("查询PointsAvailable")
public ResultInfo getPointsAvailables(PointsAvailableQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(PointsAvailableService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有PointsAvailable")
public ResultInfo getPointsAvailables(PointsAvailableQueryCriteria criteria) {
return ResultInfo.success(PointsAvailableService.queryAll(criteria));
}
@Log
@PostMapping
@ApiOperation("新增PointsAvailable")
public ResultInfo create(@Validated @RequestBody PointsAvailable resources) {
PointsAvailableService.create(resources);
return ResultInfo.success();
}
@Log
@PutMapping
@ApiOperation("修改PointsAvailable")
public ResultInfo update(@Validated @RequestBody PointsAvailable resources) {
PointsAvailableService.update(resources);
return ResultInfo.success();
}
@Log
@DeleteMapping(value = "/{id}")
@ApiOperation("删除PointsAvailable")
public ResultInfo delete(@PathVariable Long id) {
PointsAvailableService.delete(id);
return ResultInfo.success();
}
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(PointsAvailableService.getByCode(code));
}*/
}
......@@ -5,6 +5,7 @@ import com.topdraw.business.module.points.available.service.dto.PointsAvailableD
import com.topdraw.business.module.points.available.service.dto.PointsAvailableQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.List;
......@@ -16,21 +17,6 @@ import java.util.List;
public interface PointsAvailableService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PointsAvailableQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PointsAvailableDTO>
*/
List<PointsAvailableDTO> queryAll(PointsAvailableQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PointsAvailableDTO
......@@ -41,13 +27,13 @@ public interface PointsAvailableService {
*
* @param resources
*/
void create(PointsAvailable resources);
PointsAvailableDTO create(PointsAvailable resources);
/**
*
* @param resources
*/
void update(PointsAvailable resources);
PointsAvailableDTO update(PointsAvailable resources);
/**
*
......@@ -74,7 +60,7 @@ public interface PointsAvailableService {
* @param timestamp
* @return
*/
List<PointsAvailableDTO> findByMemberIdAndExpireTimeBefore(Long memberId, LocalDateTime timestamp);
List<PointsAvailableDTO> findByMemberIdAndExpireTimeBefore(Long memberId, Timestamp timestamp);
/**
* 即将过期的积分
......@@ -105,7 +91,15 @@ public interface PointsAvailableService {
*/
long findTotalPointsByMemberId(Long memberId);
/**
*
* @param id
*/
void delete4Custom(Long id);
void create4Custom(PointsAvailable pointsAvailable);
/**
*
* @param pointsAvailable
*/
PointsAvailableDTO create4Custom(PointsAvailable pointsAvailable);
}
......
......@@ -13,33 +13,33 @@ import java.time.LocalDateTime;
@Data
public class PointsAvailableDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 标识
/** 标识 */
private String code;
// 积分类型 0:通用型
/** 积分类型 0:通用型 */
private Integer pointsType;
// 设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
private Integer deviceType;
// 会员id
/** 会员id */
private Long memberId;
// 积分值
/** 积分值 */
private Long points;
// 过期时间
private LocalDateTime expireTime;
/** 过期时间 */
private Timestamp expireTime;
// 描述
/** 描述 */
private String description;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.points.available.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.points.available.domain.PointsAvailable;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.points.available.repository.PointsAvailableRepository;
import com.topdraw.business.module.points.available.service.PointsAvailableService;
import com.topdraw.business.module.points.available.service.dto.PointsAvailableDTO;
import com.topdraw.business.module.points.available.service.dto.PointsAvailableQueryCriteria;
import com.topdraw.business.module.points.available.service.mapper.PointsAvailableMapper;
import 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 com.topdraw.utils.StringUtils;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.*;
......@@ -35,69 +28,57 @@ import java.util.*;
public class PointsAvailableServiceImpl implements PointsAvailableService {
@Autowired
private PointsAvailableRepository PointsAvailableRepository;
private PointsAvailableRepository pointsAvailableRepository;
@Autowired
private PointsAvailableMapper PointsAvailableMapper;
private PointsAvailableMapper pointsAvailableMapper;
@Autowired
private RedissonClient redissonClient;
@Override
public Map<String, Object> queryAll(PointsAvailableQueryCriteria criteria, Pageable pageable) {
Page<PointsAvailable> page = PointsAvailableRepository.findAll((root, criteriaQuery, criteriaBuilder) ->
QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PointsAvailableMapper::toDto));
}
private RedisUtils redisUtils;
@Override
public List<PointsAvailableDTO> findByMemberIdOrderByExpireTime(Long memberId) {
return PointsAvailableMapper.toDto(PointsAvailableRepository.findByMemberIdOrderByExpireTime(memberId));
}
@Override
public List<PointsAvailableDTO> queryAll(PointsAvailableQueryCriteria criteria) {
return PointsAvailableMapper.toDto(PointsAvailableRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
return this.pointsAvailableMapper.toDto(this.pointsAvailableRepository.findByMemberIdOrderByExpireTime(memberId));
}
@Override
public PointsAvailableDTO findById(Long id) {
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(id).orElseGet(PointsAvailable::new);
ValidationUtil.isNull(PointsAvailable.getId(),"PointsAvailable","id",id);
return PointsAvailableMapper.toDto(PointsAvailable);
PointsAvailable pointsAvailable = this.pointsAvailableRepository.findById(id).orElseGet(PointsAvailable::new);
ValidationUtil.isNull(pointsAvailable.getId(),"PointsAvailable","id",id);
return this.pointsAvailableMapper.toDto(pointsAvailable);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void create(PointsAvailable resources) {
RLock rLock = this.redissonClient.getLock("PointsAvailable::create::id"+resources.getMemberId().toString());
public PointsAvailableDTO create(PointsAvailable resources) {
try {
RedissonUtil.lock(rLock);
PointsAvailableRepository.save(resources);
this.redisUtils.doLock("PointsAvailable::create::id"+resources.getMemberId().toString());
PointsAvailable pointsAvailable = this.pointsAvailableRepository.save(resources);
return this.pointsAvailableMapper.toDto(pointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doUnLock("PointsAvailable::create::id"+resources.getMemberId().toString());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(PointsAvailable resources) {
RLock rLock = this.redissonClient.getLock("PointsAvailable::update::id"+resources.getMemberId().toString());
public PointsAvailableDTO update(PointsAvailable resources) {
try {
RedissonUtil.lock(rLock);
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(resources.getId()).orElseGet(PointsAvailable::new);
ValidationUtil.isNull( PointsAvailable.getId(),"PointsAvailable","id",resources.getId());
PointsAvailable.copy(resources);
PointsAvailableRepository.save(PointsAvailable);
this.redisUtils.doLock("PointsAvailable::update::id"+resources.getMemberId().toString());
PointsAvailable pointsAvailable = this.pointsAvailableRepository.findById(resources.getId()).orElseGet(PointsAvailable::new);
ValidationUtil.isNull(pointsAvailable.getId(),"PointsAvailable","id",resources.getId());
pointsAvailable.copy(resources);
PointsAvailable _pointsAvailable = this.pointsAvailableRepository.save(pointsAvailable);
return this.pointsAvailableMapper.toDto(_pointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doUnLock("PointsAvailable::update::id"+resources.getMemberId().toString());
}
}
......@@ -105,93 +86,90 @@ public class PointsAvailableServiceImpl implements PointsAvailableService {
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
RLock rLock = this.redissonClient.getLock("PointsAvailable::delete::id"+id);
this.redisUtils.doLock("PointsAvailable::delete::id"+id);
try {
RedissonUtil.lock(rLock);
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(id).orElseThrow(
PointsAvailable PointsAvailable = this.pointsAvailableRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsAvailable.class, id), 1));
PointsAvailableRepository.delete(PointsAvailable);
this.pointsAvailableRepository.delete(PointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doLock("PointsAvailable::delete::id"+id);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteBatchByIds(List<Long> id) {
RLock rLock = this.redissonClient.getLock("PointsAvailable::create::id"+id.get(0));
this.redisUtils.doLock("PointsAvailable::create::id"+id);
try {
RedissonUtil.lock(rLock);
PointsAvailableRepository.deleteBatchByIds(id);
this.pointsAvailableRepository.deleteBatchByIds(id);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doUnLock("PointsAvailable::create::id"+id);
}
}
@Override
public PointsAvailableDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? PointsAvailableMapper.toDto(PointsAvailableRepository.findFirstByCode(code).orElseGet(PointsAvailable::new))
return StringUtils.isNotEmpty(code) ? this.pointsAvailableMapper.toDto(this.pointsAvailableRepository.findFirstByCode(code).orElseGet(PointsAvailable::new))
: new PointsAvailableDTO();
}
@Override
public List<PointsAvailableDTO> findByMemberIdAndExpireTimeBefore(Long memberId, LocalDateTime timestamp) {
public List<PointsAvailableDTO> findByMemberIdAndExpireTimeBefore(Long memberId, Timestamp timestamp) {
return Objects.nonNull(memberId)?
PointsAvailableMapper.toDto(PointsAvailableRepository.findByMemberIdAndExpireTimeBefore(memberId, timestamp))
this.pointsAvailableMapper.toDto(this.pointsAvailableRepository.findByMemberIdAndExpireTimeBefore(memberId, timestamp))
:null;
}
@Override
public Long findSoonExpireTime(Long memberId, Integer factor) {
return PointsAvailableRepository.findSoonExpireTime(memberId, factor);
return this.pointsAvailableRepository.findSoonExpireTime(memberId, factor);
}
@Override
public long findAvailablePointsByMemberId(long memberId) {
Long availablePoints = this.PointsAvailableRepository.findAvailablePointsByMemberId(memberId);
Long availablePoints = this.pointsAvailableRepository.findAvailablePointsByMemberId(memberId);
return availablePoints == null ? 0L : availablePoints;
}
@Override
public long findTotalPointsByMemberId(Long memberId) {
return this.PointsAvailableRepository.findTotalCountByMemberId(memberId);
return this.pointsAvailableRepository.findTotalCountByMemberId(memberId);
}
@Override
public void delete4Custom(Long id) {
Assert.notNull(id, "The given id must not be null!");
RLock rLock = this.redissonClient.getLock("PointsAvailable::delete::id"+id);
this.redisUtils.doLock("PointsAvailable::delete::id"+id);
try {
RedissonUtil.lock(rLock);
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(id).orElseThrow(
PointsAvailable PointsAvailable = this.pointsAvailableRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsAvailable.class, id), 1));
PointsAvailableRepository.delete(PointsAvailable);
this.pointsAvailableRepository.delete(PointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doUnLock("PointsAvailable::delete::id"+id);
}
}
@Override
public void create4Custom(PointsAvailable resources) {
RLock rLock = this.redissonClient.getLock("PointsAvailable::create::id"+resources.getMemberId().toString());
public PointsAvailableDTO create4Custom(PointsAvailable resources) {
this.redisUtils.doLock("PointsAvailable::create::id"+resources.getMemberId().toString());
try {
RedissonUtil.lock(rLock);
PointsAvailableRepository.save(resources);
PointsAvailable pointsAvailable = this.pointsAvailableRepository.save(resources);
return this.pointsAvailableMapper.toDto(pointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doUnLock("PointsAvailable::create::id"+resources.getMemberId().toString());
}
}
......
......@@ -2,10 +2,6 @@ package com.topdraw.business.module.points.detail.detailhistory.service;
import com.topdraw.business.module.points.detail.detailhistory.domain.PointsDetailHistory;
import com.topdraw.business.module.points.detail.detailhistory.service.dto.PointsDetailHistoryDTO;
import com.topdraw.business.module.points.detail.detailhistory.service.dto.PointsDetailHistoryQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -14,31 +10,28 @@ import java.util.List;
public interface PointsDetailHistoryService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PointsDetailHistoryQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PointsDetailHistoryDTO>
*/
List<PointsDetailHistoryDTO> queryAll(PointsDetailHistoryQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PointsDetailHistoryDTO
*/
PointsDetailHistoryDTO findById(Long id);
/**
*
* @param resources
*/
void create(PointsDetailHistory resources);
/**
*
* @param resources
*/
void update(PointsDetailHistory resources);
/**
*
* @param id
*/
void delete(Long id);
/**
......
package com.topdraw.business.module.points.detail.detailhistory.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class PointsDetailHistoryQueryCriteria{
}
package com.topdraw.business.module.points.detail.detailhistory.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.points.detail.detailhistory.domain.PointsDetailHistory;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.points.detail.detailhistory.repository.PointsDetailHistoryRepository;
import com.topdraw.business.module.points.detail.detailhistory.service.PointsDetailHistoryService;
import com.topdraw.business.module.points.detail.detailhistory.service.dto.PointsDetailHistoryDTO;
import com.topdraw.business.module.points.detail.detailhistory.service.dto.PointsDetailHistoryQueryCriteria;
import com.topdraw.business.module.points.detail.detailhistory.service.mapper.PointsDetailHistoryMapper;
import 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
* @date 2021-10-22
......@@ -32,60 +23,45 @@ import java.util.Map;
public class PointsDetailHistoryServiceImpl implements PointsDetailHistoryService {
@Autowired
private PointsDetailHistoryRepository PointsDetailHistoryRepository;
private PointsDetailHistoryRepository pointsDetailHistoryRepository;
@Autowired
private PointsDetailHistoryMapper PointsDetailHistoryMapper;
@Override
public Map<String, Object> queryAll(PointsDetailHistoryQueryCriteria criteria, Pageable pageable) {
Page<PointsDetailHistory> page = PointsDetailHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PointsDetailHistoryMapper::toDto));
}
@Override
public List<PointsDetailHistoryDTO> queryAll(PointsDetailHistoryQueryCriteria criteria) {
return PointsDetailHistoryMapper.toDto(PointsDetailHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private PointsDetailHistoryMapper pointsDetailHistoryMapper;
@Override
public PointsDetailHistoryDTO findById(Long id) {
PointsDetailHistory PointsDetailHistory = PointsDetailHistoryRepository.findById(id).orElseGet(PointsDetailHistory::new);
ValidationUtil.isNull(PointsDetailHistory.getId(),"PointsDetailHistory","id",id);
return PointsDetailHistoryMapper.toDto(PointsDetailHistory);
PointsDetailHistory pointsDetailHistory = this.pointsDetailHistoryRepository.findById(id).orElseGet(PointsDetailHistory::new);
ValidationUtil.isNull(pointsDetailHistory.getId(),"PointsDetailHistory","id",id);
return this.pointsDetailHistoryMapper.toDto(pointsDetailHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(PointsDetailHistory resources) {
PointsDetailHistoryRepository.save(resources);
this.pointsDetailHistoryRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(PointsDetailHistory resources) {
PointsDetailHistory PointsDetailHistory = PointsDetailHistoryRepository.findById(resources.getId()).orElseGet(PointsDetailHistory::new);
ValidationUtil.isNull( PointsDetailHistory.getId(),"PointsDetailHistory","id",resources.getId());
PointsDetailHistory.copy(resources);
PointsDetailHistoryRepository.save(PointsDetailHistory);
PointsDetailHistory pointsDetailHistory = this.pointsDetailHistoryRepository.findById(resources.getId()).orElseGet(PointsDetailHistory::new);
ValidationUtil.isNull( pointsDetailHistory.getId(),"PointsDetailHistory","id",resources.getId());
pointsDetailHistory.copy(resources);
this.pointsDetailHistoryRepository.save(pointsDetailHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PointsDetailHistory PointsDetailHistory = PointsDetailHistoryRepository.findById(id).orElseThrow(
PointsDetailHistory pointsDetailHistory = this.pointsDetailHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsDetailHistory.class, id), 1));
PointsDetailHistoryRepository.delete(PointsDetailHistory);
this.pointsDetailHistoryRepository.delete(pointsDetailHistory);
}
@Override
public PointsDetailHistoryDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? PointsDetailHistoryMapper.toDto(PointsDetailHistoryRepository.findFirstByCode(code).orElseGet(PointsDetailHistory::new))
return StringUtils.isNotEmpty(code) ? this.pointsDetailHistoryMapper.toDto(this.pointsDetailHistoryRepository.findFirstByCode(code).orElseGet(PointsDetailHistory::new))
: new PointsDetailHistoryDTO();
}
}
......
......@@ -84,6 +84,10 @@ public class PointsDetail implements Serializable {
@Column(name = "description", nullable = false)
private String description;
// 商品id
@Column(name = "item_id")
private Long itemId;
// 创建时间
@CreatedDate
@Column(name = "create_time")
......
package com.topdraw.business.module.points.detail.rest;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "PointsDetail管理")
//@RestController
//@RequestMapping("/api/PointsDetail")
public class PointsDetailController {
/*@Autowired
private PointsDetailService PointsDetailService;
@GetMapping
@ApiOperation("查询PointsDetail")
public ResultInfo getPointsDetails(PointsDetailQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(PointsDetailService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有PointsDetail")
public ResultInfo getPointsDetails(PointsDetailQueryCriteria criteria) {
return ResultInfo.success(PointsDetailService.queryAll(criteria));
}
@Log
@PostMapping
@ApiOperation("新增PointsDetail")
public ResultInfo create(@Validated @RequestBody PointsDetail resources) {
PointsDetailService.create(resources);
return ResultInfo.success();
}
@Log
@PutMapping
@ApiOperation("修改PointsDetail")
public ResultInfo update(@Validated @RequestBody PointsDetail resources) {
PointsDetailService.update(resources);
return ResultInfo.success();
}
@Log
@DeleteMapping(value = "/{id}")
@ApiOperation("删除PointsDetail")
public ResultInfo delete(@PathVariable Long id) {
PointsDetailService.delete(id);
return ResultInfo.success();
}
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(PointsDetailService.getByCode(code));
}*/
}
......@@ -2,10 +2,7 @@ package com.topdraw.business.module.points.detail.service;
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import com.topdraw.business.module.points.detail.service.dto.PointsDetailDTO;
import com.topdraw.business.module.points.detail.service.dto.PointsDetailQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
......@@ -15,31 +12,30 @@ import java.util.List;
public interface PointsDetailService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PointsDetailQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PointsDetailDTO>
*/
List<PointsDetailDTO> queryAll(PointsDetailQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PointsDetailDTO
*/
PointsDetailDTO findById(Long id);
void create(PointsDetail resources);
/**
*
* @param resources
* @return
*/
PointsDetailDTO create(PointsDetail resources);
void update(PointsDetail resources);
/**
*
* @param resources
* @return
*/
PointsDetailDTO update(PointsDetail resources);
/**
*
* @param id
*/
void delete(Long id);
/**
......@@ -49,9 +45,13 @@ public interface PointsDetailService {
*/
PointsDetailDTO getByCode(String code);
/**
*
* @param memberId
* @return
*/
List<PointsDetailDTO> loadListExpirePointsByMemberId(Long memberId);
/**
* 已过期的积分
* @param memberId
......@@ -59,5 +59,9 @@ public interface PointsDetailService {
*/
List<PointsDetailDTO> findByMemberId(Long memberId);
/**
*
* @param pointsDetail
*/
void create4Custom(PointsDetail pointsDetail);
}
......
......@@ -54,6 +54,9 @@ public class PointsDetailDTO implements Serializable {
// 积分变化描述,用于管理侧显示
private String description;
// 商品id
private Long itemId;
// 创建时间
private Timestamp createTime;
......
package com.topdraw.business.module.points.detail.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class PointsDetailQueryCriteria{
@Query(type = Query.Type.EQUAL)
private Long memberId;
@Query(type = Query.Type.EQUAL)
private Long accountId;
}
package com.topdraw.business.module.points.detail.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.points.detail.repository.PointsDetailRepository;
import com.topdraw.business.module.points.detail.service.PointsDetailService;
import com.topdraw.business.module.points.detail.service.dto.PointsDetailDTO;
import com.topdraw.business.module.points.detail.service.dto.PointsDetailQueryCriteria;
import com.topdraw.business.module.points.detail.service.mapper.PointsDetailMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
......@@ -33,58 +26,47 @@ import java.util.Objects;
public class PointsDetailServiceImpl implements PointsDetailService {
@Autowired
private PointsDetailRepository PointsDetailRepository;
private PointsDetailRepository pointsDetailRepository;
@Autowired
private PointsDetailMapper PointsDetailMapper;
@Override
public Map<String, Object> queryAll(PointsDetailQueryCriteria criteria, Pageable pageable) {
Page<PointsDetail> page = PointsDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PointsDetailMapper::toDto));
}
@Override
public List<PointsDetailDTO> queryAll(PointsDetailQueryCriteria criteria) {
return PointsDetailMapper.toDto(PointsDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private PointsDetailMapper pointsDetailMapper;
@Override
public PointsDetailDTO findById(Long id) {
PointsDetail PointsDetail = PointsDetailRepository.findById(id).orElseGet(PointsDetail::new);
ValidationUtil.isNull(PointsDetail.getId(),"PointsDetail","id",id);
return PointsDetailMapper.toDto(PointsDetail);
PointsDetail pointsDetail = this.pointsDetailRepository.findById(id).orElseGet(PointsDetail::new);
ValidationUtil.isNull(pointsDetail.getId(),"PointsDetail","id",id);
return this.pointsDetailMapper.toDto(pointsDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void create(PointsDetail resources) {
PointsDetailRepository.save(resources);
public PointsDetailDTO create(PointsDetail resources) {
PointsDetail pointsDetail = this.pointsDetailRepository.save(resources);
return this.pointsDetailMapper.toDto(pointsDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(PointsDetail resources) {
PointsDetail PointsDetail = PointsDetailRepository.findById(resources.getId()).orElseGet(PointsDetail::new);
ValidationUtil.isNull( PointsDetail.getId(),"PointsDetail","id",resources.getId());
PointsDetail.copy(resources);
PointsDetailRepository.save(PointsDetail);
public PointsDetailDTO update(PointsDetail resources) {
PointsDetail pointsDetail = this.pointsDetailRepository.findById(resources.getId()).orElseGet(PointsDetail::new);
ValidationUtil.isNull( pointsDetail.getId(),"PointsDetail","id",resources.getId());
pointsDetail.copy(resources);
PointsDetail _pointsDetail = this.pointsDetailRepository.save(pointsDetail);
return this.pointsDetailMapper.toDto(_pointsDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PointsDetail PointsDetail = PointsDetailRepository.findById(id).orElseThrow(
PointsDetail pointsDetail = this.pointsDetailRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsDetail.class, id), 1));
PointsDetailRepository.delete(PointsDetail);
this.pointsDetailRepository.delete(pointsDetail);
}
@Override
public PointsDetailDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? PointsDetailMapper.toDto(PointsDetailRepository.findFirstByCode(code).orElseGet(PointsDetail::new))
return StringUtils.isNotEmpty(code) ? this.pointsDetailMapper.toDto(this.pointsDetailRepository.findFirstByCode(code).orElseGet(PointsDetail::new))
: new PointsDetailDTO();
}
......@@ -96,12 +78,12 @@ public class PointsDetailServiceImpl implements PointsDetailService {
@Override
public List<PointsDetailDTO> findByMemberId(Long memberId) {
return Objects.nonNull(memberId)?
PointsDetailMapper.toDto(PointsDetailRepository.findByMemberId(memberId))
this.pointsDetailMapper.toDto(this.pointsDetailRepository.findByMemberId(memberId))
:null;
}
@Override
public void create4Custom(PointsDetail pointsDetail) {
PointsDetailRepository.save(pointsDetail);
this.pointsDetailRepository.save(pointsDetail);
}
}
......
......@@ -27,35 +27,37 @@ public class Points implements Serializable {
@Column(name = "id")
private Long id;
/** 账号id */
@Column(name = "user_id")
private Long userId;
// 积分类型,通用,绑定, 区分大小屏
/** 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏)
21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)*/
@Column(name = "point_type")
private Integer pointType;
// 绑定对应的实体, 如何描述?
/** 绑定对应的实体, 如何描述? */
@Column(name = "target_no")
private String targetNo;
// 本月期初积分值
/** 本月期初积分值 */
@Column(name = "begin_points")
private Integer beginPoints;
// 当前积分余额
/** 当前积分余额 */
@Column(name = "current_points")
private Integer currentPoints;
// 本月到期积分
/** 本月到期积分 */
@Column(name = "expire_points")
private Integer expirePoints;
// 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏) 21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 最后修改时间
/** 最后修改时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.points.rest;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "Points管理")
//@RestController
//@RequestMapping("/api/Points")
public class PointsController {
/*@Autowired
private PointsService PointsService;
@GetMapping
@ApiOperation("查询Points")
public ResultInfo getPointss(PointsQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(PointsService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有Points")
public ResultInfo getPointss(PointsQueryCriteria criteria) {
return ResultInfo.success(PointsService.queryAll(criteria));
}*/
/*@Log
@PostMapping
@ApiOperation("新增Points")
public ResultInfo create(@Validated @RequestBody Points resources) {
PointsService.create(resources);
return ResultInfo.success();
}
@Log
@PutMapping
@ApiOperation("修改Points")
public ResultInfo update(@Validated @RequestBody Points resources) {
PointsService.update(resources);
return ResultInfo.success();
}
@Log
@DeleteMapping(value = "/{id}")
@ApiOperation("删除Points")
public ResultInfo delete(@PathVariable Long id) {
PointsService.delete(id);
return ResultInfo.success();
}*/
}
......@@ -2,10 +2,6 @@ package com.topdraw.business.module.points.service;
import com.topdraw.business.module.points.domain.Points;
import com.topdraw.business.module.points.service.dto.PointsDTO;
import com.topdraw.business.module.points.service.dto.PointsQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -14,31 +10,28 @@ import java.util.List;
public interface PointsService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PointsQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PointsDTO>
*/
List<PointsDTO> queryAll(PointsQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PointsDTO
*/
PointsDTO findById(Long id);
void create(Points resources);
/**
*
* @param resources
*/
PointsDTO create(Points resources);
void update(Points resources);
/**
*
* @param resources
*/
PointsDTO update(Points resources);
/**
*
* @param id
*/
void delete(Long id);
}
......
......@@ -18,26 +18,30 @@ public class PointsDTO implements Serializable {
@JsonSerialize(using= ToStringSerializer.class)
private Long id;
/** 账号id */
private Long userId;
// 积分类型,通用,绑定, 区分大小屏 todo
/** 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏)
21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)*/
private Integer pointType;
// 绑定对应的实体, 如何描述?
/** 绑定对应的实体, 如何描述? */
private String targetNo;
// 本月期初积分值
/** 本月期初积分值 */
private Integer beginPoints;
// 当前积分余额
/** 当前积分余额 */
private Integer currentPoints;
// 本月到期积分
/** 本月到期积分 */
private Integer expirePoints;
// 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏) 21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)
/** 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏)
* 21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)
*/
private Timestamp createTime;
// 最后修改时间
/** 最后修改时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.points.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class PointsQueryCriteria{
}
package com.topdraw.business.module.points.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.points.domain.Points;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.points.repository.PointsRepository;
import com.topdraw.business.module.points.service.PointsService;
import com.topdraw.business.module.points.service.dto.PointsDTO;
import com.topdraw.business.module.points.service.dto.PointsQueryCriteria;
import com.topdraw.business.module.points.service.mapper.PointsMapper;
import 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 cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -36,68 +24,54 @@ import java.util.Map;
public class PointsServiceImpl implements PointsService {
@Autowired
private PointsRepository PointsRepository;
private PointsRepository pointsRepository;
@Autowired
private PointsMapper PointsMapper;
private PointsMapper pointsMapper;
@Autowired
private RedissonClient redissonClient;
@Override
public Map<String, Object> queryAll(PointsQueryCriteria criteria, Pageable pageable) {
Page<Points> page = PointsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PointsMapper::toDto));
}
@Override
public List<PointsDTO> queryAll(PointsQueryCriteria criteria) {
return PointsMapper.toDto(PointsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private RedisUtils redisUtils;
@Override
public PointsDTO findById(Long id) {
Points Points = PointsRepository.findById(id).orElseGet(Points::new);
Points Points = this.pointsRepository.findById(id).orElseGet(Points::new);
ValidationUtil.isNull(Points.getId(),"Points","id",id);
return PointsMapper.toDto(Points);
return this.pointsMapper.toDto(Points);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(Points resources) {
Snowflake snowflake = IdUtil.createSnowflake(1, 1);
resources.setId(snowflake.nextId());
PointsRepository.save(resources);
public PointsDTO create(Points resources) {
Points points = this.pointsRepository.save(resources);
return this.pointsMapper.toDto(points);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(Points resources) {
RLock rLock = this.redissonClient.getLock(resources.getId().toString());
public PointsDTO update(Points resources) {
this.redisUtils.doLock("Points::update::userId"+resources.getUserId().toString());
try {
RedissonUtil.lock(rLock);
Points Points = PointsRepository.findById(resources.getId()).orElseGet(Points::new);
ValidationUtil.isNull(Points.getId(), "Points", "id", resources.getId());
Points.copy(resources);
PointsRepository.save(Points);
Points points = this.pointsRepository.findById(resources.getId()).orElseGet(Points::new);
ValidationUtil.isNull(points.getId(), "Points", "id", resources.getId());
points.copy(resources);
this.pointsRepository.save(points);
return this.pointsMapper.toDto(points);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doUnLock("Points::update::userId"+resources.getUserId().toString());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
Points Points = PointsRepository.findById(id).orElseThrow(
Points Points = this.pointsRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Points.class, id), 1));
PointsRepository.delete(Points);
this.pointsRepository.delete(Points);
}
......
package com.topdraw.business.module.points.standingbook.repository;
import com.topdraw.business.module.points.standingbook.domain.PointsStandingBook;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author XiangHan
* @date 2021-10-29
*/
public interface PointsStandingBookRepository extends JpaRepository<PointsStandingBook, Long>, JpaSpecificationExecutor<PointsStandingBook> {
}
package com.topdraw.business.module.points.standingbook.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.points.standingbook.domain.PointsStandingBook;
import com.topdraw.business.module.points.standingbook.service.PointsStandingBookService;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookQueryCriteria;
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-10-29
*/
@Api(tags = "PointsStandingBook管理")
@RestController
@RequestMapping("/api/PointsStandingBook")
public class PointsStandingBookController {
@Autowired
private PointsStandingBookService PointsStandingBookService;
@GetMapping
@ApiOperation("查询PointsStandingBook")
public ResultInfo getPointsStandingBooks(PointsStandingBookQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(PointsStandingBookService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有PointsStandingBook")
public ResultInfo getPointsStandingBooks(PointsStandingBookQueryCriteria criteria) {
return ResultInfo.success(PointsStandingBookService.queryAll(criteria));
}
@PostMapping
@ApiOperation("新增PointsStandingBook")
public ResultInfo create(@Validated @RequestBody PointsStandingBook resources) {
PointsStandingBookService.create(resources);
return ResultInfo.success();
}
@PutMapping
@ApiOperation("修改PointsStandingBook")
public ResultInfo update(@Validated @RequestBody PointsStandingBook resources) {
PointsStandingBookService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/{id}")
@ApiOperation("删除PointsStandingBook")
public ResultInfo delete(@PathVariable Long id) {
PointsStandingBookService.delete(id);
return ResultInfo.success();
}
}
package com.topdraw.business.module.points.standingbook.service;
import com.topdraw.business.module.points.standingbook.domain.PointsStandingBook;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookDTO;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
* @date 2021-10-29
*/
public interface PointsStandingBookService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PointsStandingBookQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PointsStandingBookDTO>
*/
List<PointsStandingBookDTO> queryAll(PointsStandingBookQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PointsStandingBookDTO
*/
PointsStandingBookDTO findById(Long id);
void create(PointsStandingBook resources);
void update(PointsStandingBook resources);
void delete(Long id);
}
package com.topdraw.business.module.points.standingbook.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2021-10-29
*/
@Data
public class PointsStandingBookDTO implements Serializable {
// 主键
private Long id;
// 积分生产
private Long pointsProduce;
// 积分消耗
private Long pointsConsume;
// 可用总积分
private Long pointsAvailable;
// 积分过期
private Long pointsExpire;
// 日期
private String day;
// 创建时间
private Timestamp createTime;
// 创建时间
private Timestamp updateTime;
}
package com.topdraw.business.module.points.standingbook.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-29
*/
@Data
public class PointsStandingBookQueryCriteria{
}
package com.topdraw.business.module.points.standingbook.service.impl;
import com.topdraw.business.module.points.standingbook.domain.PointsStandingBook;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.points.standingbook.repository.PointsStandingBookRepository;
import com.topdraw.business.module.points.standingbook.service.PointsStandingBookService;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookDTO;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookQueryCriteria;
import com.topdraw.business.module.points.standingbook.service.mapper.PointsStandingBookMapper;
import 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
* @date 2021-10-29
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class PointsStandingBookServiceImpl implements PointsStandingBookService {
@Autowired
private PointsStandingBookRepository PointsStandingBookRepository;
@Autowired
private PointsStandingBookMapper PointsStandingBookMapper;
@Override
public Map<String, Object> queryAll(PointsStandingBookQueryCriteria criteria, Pageable pageable) {
Page<PointsStandingBook> page = PointsStandingBookRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PointsStandingBookMapper::toDto));
}
@Override
public List<PointsStandingBookDTO> queryAll(PointsStandingBookQueryCriteria criteria) {
return PointsStandingBookMapper.toDto(PointsStandingBookRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public PointsStandingBookDTO findById(Long id) {
PointsStandingBook PointsStandingBook = PointsStandingBookRepository.findById(id).orElseGet(PointsStandingBook::new);
ValidationUtil.isNull(PointsStandingBook.getId(),"PointsStandingBook","id",id);
return PointsStandingBookMapper.toDto(PointsStandingBook);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(PointsStandingBook resources) {
PointsStandingBookRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(PointsStandingBook resources) {
PointsStandingBook PointsStandingBook = PointsStandingBookRepository.findById(resources.getId()).orElseGet(PointsStandingBook::new);
ValidationUtil.isNull( PointsStandingBook.getId(),"PointsStandingBook","id",resources.getId());
PointsStandingBook.copy(resources);
PointsStandingBookRepository.save(PointsStandingBook);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PointsStandingBook PointsStandingBook = PointsStandingBookRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsStandingBook.class, id), 1));
PointsStandingBookRepository.delete(PointsStandingBook);
}
}
......@@ -23,63 +23,63 @@ import java.io.Serializable;
@Table(name="tr_rights")
public class Rights implements Serializable {
// 主键
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 权益名称
// @Column(name = "name")
// private String name;
/** 权益名称 */
@Column(name = "name")
private String name;
// 类型 1:实体类 (预留字段)
/** 类型 1:实体类 (预留字段) */
@Column(name = "type", nullable = false)
private Integer type;
// 终端类型 0:大屏;1:微信小程序/公众号;2:App
/** 终端类型 0:大屏;1:微信小程序/公众号;2:App */
@Column(name = "device_type", nullable = false)
private Integer deviceType;
// 权益的实体类型 1:积分;2成长值;3优惠券
/** 权益的实体类型 1:积分;2成长值;3优惠券 */
@Column(name = "entity_type", nullable = false)
private String entityType;
// 实体id
/** 实体id */
@Column(name = "entity_id", nullable = false)
private Long entityId;
// 生效时间,为null表示获取后立即生效,不为空时,表示特定的生效时间
/** 生效时间,为null表示获取后立即生效,不为空时,表示特定的生效时间 */
@Column(name = "valid_time")
private Timestamp validTime;
// 失效时间,空为不失效,否则为获得权益后直到失效的毫秒数
/** 失效时间,空为不失效,否则为获得权益后直到失效的毫秒数 */
@Column(name = "expire_time")
private Long expireTime;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
// 图片
/** 图片 */
@Column(name = "image")
private String image;
// 图片
/** 图片 */
@Column(name = "images")
private String images;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
......
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
......@@ -56,7 +56,7 @@ public class RightsHistory extends DefaultAsyncMqModule implements Serializable
// 失效时间
@Column(name = "expire_time")
private LocalDateTime expireTime;
private Timestamp expireTime;
@CreatedDate
@Column(name = "create_time")
......
package com.topdraw.business.module.rights.history.repository;
import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryDTO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
/**
* @author XiangHan
* @date 2021-10-22
*/
public interface RightsHistoryRepository extends JpaRepository<RightsHistory, Long>, JpaSpecificationExecutor<RightsHistory> {
List<RightsHistoryDTO> findByMemberId(Long memberId);
}
......
package com.topdraw.business.module.rights.history.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.rights.history.service.RightsHistoryService;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryQueryCriteria;
import com.topdraw.util.TimestampUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "RightsHistory管理")
@RestController
@RequestMapping("/api/RightsHistory")
public class RightsHistoryController {
@Autowired
private RightsHistoryService RightsHistoryService;
@GetMapping(value = "/pageRightsHistory")
@ApiOperation("查询RightsHistory")
public ResultInfo pageRightsHistory(RightsHistoryQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(RightsHistoryService.queryAll(criteria,pageable));
}
@GetMapping(value = "/pageAvailableRights")
@ApiOperation("查询用户可用权益列表")
public ResultInfo pageAvailableRights(RightsHistoryQueryCriteria criteria, Pageable pageable) {
criteria.setExpireTime(TimestampUtil.now());
return ResultInfo.successPage(RightsHistoryService.queryAll(criteria,pageable));
}
}
......@@ -14,19 +14,12 @@ import java.util.List;
public interface RightsHistoryService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(RightsHistoryQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<RightsHistoryDTO>
*
* @param memberId
* @param memberCode
* @return
*/
List<RightsHistoryDTO> queryAll(RightsHistoryQueryCriteria criteria);
List<RightsHistoryDTO> findByMemberIdOrMemberCode(Long memberId , String memberCode);
/**
* 根据ID查询
......
......@@ -33,7 +33,7 @@ public class RightsHistoryDTO implements Serializable {
private Timestamp sendTime;
// 失效时间
private LocalDateTime expireTime;
private Timestamp expireTime;
private Timestamp createTime;
......
package com.topdraw.business.module.rights.history.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.rights.history.domain.RightsHistory;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.rights.history.repository.RightsHistoryRepository;
......@@ -13,14 +14,9 @@ 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
......@@ -31,54 +27,49 @@ import java.util.Map;
public class RightsHistoryServiceImpl implements RightsHistoryService {
@Autowired
private RightsHistoryRepository RightsHistoryRepository;
private MemberService memberService;
@Autowired
private RightsHistoryMapper rightsHistoryMapper;
@Autowired
private RightsHistoryMapper RightsHistoryMapper;
private RightsHistoryRepository rightsHistoryRepository;
@Override
public Map<String, Object> queryAll(RightsHistoryQueryCriteria criteria, Pageable pageable) {
Page<RightsHistory> page = RightsHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(RightsHistoryMapper::toDto));
}
@Override
public List<RightsHistoryDTO> queryAll(RightsHistoryQueryCriteria criteria) {
return RightsHistoryMapper.toDto(RightsHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public List<RightsHistoryDTO> findByMemberIdOrMemberCode(Long memberId, String memberCode) {
MemberDTO memberDTO = this.memberService.checkMember(memberId, memberCode);
List<RightsHistoryDTO> rightsHistoryDTOList = this.rightsHistoryRepository.findByMemberId(memberDTO.getId());
return rightsHistoryDTOList;
}
@Override
public RightsHistoryDTO findById(Long id) {
RightsHistory RightsHistory = RightsHistoryRepository.findById(id).orElseGet(RightsHistory::new);
RightsHistory RightsHistory = this.rightsHistoryRepository.findById(id).orElseGet(RightsHistory::new);
ValidationUtil.isNull(RightsHistory.getId(),"RightsHistory","id",id);
return RightsHistoryMapper.toDto(RightsHistory);
return this.rightsHistoryMapper.toDto(RightsHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(RightsHistory resources) {
RightsHistoryRepository.save(resources);
this.rightsHistoryRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(RightsHistory resources) {
RightsHistory RightsHistory = RightsHistoryRepository.findById(resources.getId()).orElseGet(RightsHistory::new);
RightsHistory RightsHistory = this.rightsHistoryRepository.findById(resources.getId()).orElseGet(RightsHistory::new);
ValidationUtil.isNull(RightsHistory.getId(),"RightsHistory","id",resources.getId());
RightsHistory.copy(resources);
RightsHistoryRepository.save(RightsHistory);
this.rightsHistoryRepository.save(RightsHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
RightsHistory RightsHistory = RightsHistoryRepository.findById(id).orElseThrow(
RightsHistory RightsHistory = this.rightsHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", RightsHistory.class, id), 1));
RightsHistoryRepository.delete(RightsHistory);
this.rightsHistoryRepository.delete(RightsHistory);
}
......
......@@ -24,58 +24,58 @@ import java.io.Serializable;
@Table(name="uc_permanent_rights")
public class PermanentRights implements Serializable {
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 名称
/** 名称 */
@Column(name = "name", nullable = false)
private String name;
// 永久权益类型 0:vip;1:会员等级
/** 永久权益类型 0:vip;1:会员等级 */
@Column(name = "type")
private Integer type;
// 等级(当权益类型为vip时,对应vip值,当权益类型为会员等级时,对应等级index)
/** 等级(当权益类型为vip时,对应vip值,当权益类型为会员等级时,对应等级index) */
@Column(name = "level")
private Integer level;
// 商品折扣,10代表10% off,范围为0-100
/** 商品折扣,10代表10% off,范围为0-100 */
@Column(name = "item_discount", nullable = false)
private BigDecimal itemDiscount;
// 额外积分比率,范围为0-1000
/** 额外积分比率,范围为0-1000 */
@Column(name = "extra_points", nullable = false)
private BigDecimal extraPoints;
// 免广告
/** 免广告 */
@Column(name = "ad_disabled", nullable = false)
private Integer adDisabled;
// 额外活动参与机会
/** 额外活动参与机会 */
@Column(name = "extra_activity_ticket", nullable = false)
private Integer extraActivityTicket;
// 免费试看
/** 免费试看 */
@Column(name = "free_trial", nullable = false)
private Integer freeTrial;
// 上电视专区权益
/** 上电视专区权益 */
@Column(name = "zone_sds", nullable = false)
private Integer zoneSds;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.rights.permanentrights.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.rights.permanentrights.domain.PermanentRights;
import com.topdraw.business.module.rights.permanentrights.service.PermanentRightsService;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsQueryCriteria;
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-10-22
*/
@Api(tags = "PermanentRights管理")
@RestController
@RequestMapping("/api/PermanentRights")
public class PermanentRightsController {
@Autowired
private PermanentRightsService PermanentRightsService;
@GetMapping
@ApiOperation("查询PermanentRights")
public ResultInfo pagePermanentRights(PermanentRightsQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(PermanentRightsService.queryAll(criteria,pageable));
}
@GetMapping(value = "/findById/{id}")
@ApiOperation("查询PermanentRights")
public ResultInfo findById(@PathVariable("id") Long id) {
return ResultInfo.success(PermanentRightsService.findById(id));
}
@PostMapping(value = "/create")
@ApiOperation("新增PermanentRights")
public ResultInfo create(@Validated @RequestBody PermanentRights resources) {
PermanentRightsService.create(resources);
return ResultInfo.success();
}
@PutMapping(value = "/update")
@ApiOperation("修改PermanentRights")
public ResultInfo update(@Validated @RequestBody PermanentRights resources) {
PermanentRightsService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/delete/{id}")
@ApiOperation("删除PermanentRights")
public ResultInfo delete(@PathVariable Long id) {
PermanentRightsService.delete(id);
return ResultInfo.success();
}
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(PermanentRightsService.getByCode(code));
}
}
package com.topdraw.business.module.rights.permanentrights.service;
import com.topdraw.business.module.rights.permanentrights.domain.PermanentRights;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsDTO;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -14,33 +9,12 @@ import java.util.List;
public interface PermanentRightsService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PermanentRightsQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PermanentRightsDTO>
*/
List<PermanentRightsDTO> queryAll(PermanentRightsQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PermanentRightsDTO
*/
PermanentRightsDTO findById(Long id);
void create(PermanentRights resources);
void update(PermanentRights resources);
void delete(Long id);
/**
* Code校验
* @param code
......
......@@ -13,42 +13,42 @@ import java.io.Serializable;
@Data
public class PermanentRightsDTO implements Serializable {
// ID
/** ID */
private Long id;
// 标识
/** 标识 */
private String code;
// 名称
/** 名称 */
private String name;
// 永久权益类型 0:vip;1:会员等级
/** 永久权益类型 0:vip;1:会员等级 */
private Integer type;
// 等级(当权益类型为vip时,对应vip值,当权益类型为会员等级时,对应等级index)
/** 等级(当权益类型为vip时,对应vip值,当权益类型为会员等级时,对应等级index) */
private Integer level;
// 商品折扣,10代表10% off,范围为0-100
/** 商品折扣,10代表10% off,范围为0-100 */
private BigDecimal itemDiscount;
// 额外积分比率,范围为0-1000
/** 额外积分比率,范围为0-1000 */
private BigDecimal extraPoints;
// 免广告
/** 免广告 */
private Integer adDisabled;
// 额外活动参与机会
/** 额外活动参与机会 */
private Integer extraActivityTicket;
// 免费试看
/** 免费试看 */
private Integer freeTrial;
// 上电视专区权益
/** 上电视专区权益 */
private Integer zoneSds;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.rights.permanentrights.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class PermanentRightsQueryCriteria{
@Query(type = Query.Type.EQUAL)
private Integer level;
}
......@@ -5,23 +5,13 @@ import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.rights.permanentrights.repository.PermanentRightsRepository;
import com.topdraw.business.module.rights.permanentrights.service.PermanentRightsService;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsDTO;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsQueryCriteria;
import com.topdraw.business.module.rights.permanentrights.service.mapper.PermanentRightsMapper;
import 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
* @date 2021-10-22
......@@ -31,65 +21,27 @@ import java.util.Map;
public class PermanentRightsServiceImpl implements PermanentRightsService {
@Autowired
private PermanentRightsRepository PermanentRightsRepository;
private PermanentRightsRepository permanentRightsRepository;
@Autowired
private PermanentRightsMapper PermanentRightsMapper;
@Override
public Map<String, Object> queryAll(PermanentRightsQueryCriteria criteria, Pageable pageable) {
Page<PermanentRights> page = PermanentRightsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PermanentRightsMapper::toDto));
}
@Override
public List<PermanentRightsDTO> queryAll(PermanentRightsQueryCriteria criteria) {
return PermanentRightsMapper.toDto(PermanentRightsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private PermanentRightsMapper permanentRightsMapper;
@Override
public PermanentRightsDTO findById(Long id) {
PermanentRights PermanentRights = PermanentRightsRepository.findById(id).orElseGet(PermanentRights::new);
PermanentRights PermanentRights = this.permanentRightsRepository.findById(id).orElseGet(PermanentRights::new);
ValidationUtil.isNull(PermanentRights.getId(),"PermanentRights","id",id);
return PermanentRightsMapper.toDto(PermanentRights);
return this.permanentRightsMapper.toDto(PermanentRights);
}
@Override
@Transactional(rollbackFor = Exception.class)
// @AsyncMqSend()
public void create(PermanentRights resources) {
PermanentRightsRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
// @AsyncMqSend()
public void update(PermanentRights resources) {
PermanentRights PermanentRights = PermanentRightsRepository.findById(resources.getId()).orElseGet(PermanentRights::new);
ValidationUtil.isNull( PermanentRights.getId(),"PermanentRights","id",resources.getId());
PermanentRights.copy(resources);
PermanentRightsRepository.save(PermanentRights);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PermanentRights PermanentRights = PermanentRightsRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PermanentRights.class, id), 1));
PermanentRightsRepository.delete(PermanentRights);
}
@Override
public PermanentRightsDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? PermanentRightsMapper.toDto(PermanentRightsRepository.findFirstByCode(code).orElseGet(PermanentRights::new))
return StringUtils.isNotEmpty(code) ? this.permanentRightsMapper.toDto(this.permanentRightsRepository.findFirstByCode(code).orElseGet(PermanentRights::new))
: new PermanentRightsDTO();
}
@Override
public PermanentRightsDTO findByLevel(Integer level) {
PermanentRights PermanentRights = PermanentRightsRepository.findByLevel(level);
return PermanentRightsMapper.toDto(PermanentRights);
PermanentRights PermanentRights = this.permanentRightsRepository.findByLevel(level);
return this.permanentRightsMapper.toDto(PermanentRights);
}
}
......
package com.topdraw.business.module.rights.rest;
import com.topdraw.business.module.rights.service.RightsService;
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.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "Rights管理")
@RestController
@RequestMapping("/api/Rights")
public class RightsController {
@Autowired
private RightsService rightsService;
@GetMapping(value = "/findById/{id}")
@ApiOperation("查询Rights")
public ResultInfo findById(@PathVariable("id") Long id) {
return ResultInfo.success(rightsService.findById(id));
}
}
package com.topdraw.business.module.rights.service;
import com.topdraw.business.module.rights.domain.Rights;
import com.topdraw.business.module.rights.service.dto.RightsDTO;
import com.topdraw.business.module.rights.service.dto.RightsQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -14,21 +9,6 @@ import java.util.List;
public interface RightsService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(RightsQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<RightsDTO>
*/
List<RightsDTO> queryAll(RightsQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return RightsDTO
......@@ -36,19 +16,6 @@ public interface RightsService {
RightsDTO findById(Long id);
/**
* 批量查询
* @param ids
* @return
*/
List<RightsDTO> findBatchByIds(Long... ids);
void create(Rights resources);
void update(Rights resources);
void delete(Long id);
/**
* Code校验
* @param code
* @return RightsDTO
......
......@@ -12,44 +12,45 @@ import java.io.Serializable;
@Data
public class RightsDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 标识
/** 标识 */
private String code;
// 权益名称
// private String name;
// 终端类型 0:大屏;1:微信小程序/公众号;2:App
/** 权益名称 */
private String name;
/** 终端类型 0:大屏;1:微信小程序/公众号;2:App */
private Integer deviceType;
// 类型 1:实体类 (预留字段)
/** 类型 1:实体类 (预留字段) */
private Integer type;
// 权益的实体类型 1:积分;2成长值;3优惠券
/** 权益的实体类型 1:积分;2成长值;3优惠券 */
private String entityType;
// 实体id
/** 实体id */
private Long entityId;
// 生效时间,为null表示获取后立即生效,不为空时,表示特定的生效时间
/** 生效时间,为null表示获取后立即生效,不为空时,表示特定的生效时间 */
private Timestamp validTime;
// 失效时间,空为不失效,否则为获得权益后直到失效的毫秒数
/** 失效时间,空为不失效,否则为获得权益后直到失效的毫秒数 */
private Long expireTime;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
// 图片
/** 图片 */
private String image;
// 图片
/** 图片 */
private String images;
// 描述
/** 描述 */
private String description;
}
......
package com.topdraw.business.module.rights.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class RightsQueryCriteria{
@Query
private Long memberId;
private RightsQueryType queryType;
}
package com.topdraw.business.module.rights.service.dto;
public enum RightsQueryType {
// 全部
ALL,
// 可用
AVAILABLE_ONLY
}
package com.topdraw.business.module.rights.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.rights.domain.Rights;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.utils.*;
import com.topdraw.business.module.rights.repository.RightsRepository;
import com.topdraw.business.module.rights.service.RightsService;
import com.topdraw.business.module.rights.service.dto.RightsDTO;
import com.topdraw.business.module.rights.service.dto.RightsQueryCriteria;
import com.topdraw.business.module.rights.service.mapper.RightsMapper;
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 com.topdraw.utils.StringUtils;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -35,77 +20,20 @@ import java.util.Map;
public class RightsServiceImpl implements RightsService {
@Autowired
private RightsRepository RightsRepository;
@Autowired
private RightsMapper RightsMapper;
private RightsRepository rightsRepository;
@Autowired
private RedissonClient redissonClient;
@Override
public Map<String, Object> queryAll(RightsQueryCriteria criteria, Pageable pageable) {
Page<Rights> page = RightsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(RightsMapper::toDto));
}
@Override
public List<RightsDTO> queryAll(RightsQueryCriteria criteria) {
return RightsMapper.toDto(RightsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private RightsMapper rightsMapper;
@Override
public RightsDTO findById(Long id) {
Rights Rights = RightsRepository.findById(id).orElseGet(Rights::new);
Rights Rights = this.rightsRepository.findById(id).orElseGet(Rights::new);
ValidationUtil.isNull(Rights.getId(),"Rights","id",id);
return RightsMapper.toDto(Rights);
}
@Override
public List<RightsDTO> findBatchByIds(Long... ids) {
List<Rights> rightsList = this.RightsRepository.findBatchByIds(ids);
return !CollectionUtils.isEmpty(rightsList) ? RightsMapper.toDto(rightsList) : null;
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(Rights resources) {
RightsRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(Rights resources) {
RLock rLock = this.redissonClient.getLock(resources.getId().toString());
try {
Rights Rights = RightsRepository.findById(resources.getId()).orElseGet(Rights::new);
ValidationUtil.isNull( Rights.getId(),"Rights","id",resources.getId());
Rights.copy(resources);
RightsRepository.save(Rights);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
rLock.unlock();
}
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
Rights Rights = RightsRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Rights.class, id), 1));
RightsRepository.delete(Rights);
return this.rightsMapper.toDto(Rights);
}
@Override
public RightsDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? RightsMapper.toDto(RightsRepository.findFirstByCode(code).orElseGet(Rights::new))
return StringUtils.isNotEmpty(code) ? this.rightsMapper.toDto(this.rightsRepository.findFirstByCode(code).orElseGet(Rights::new))
: new RightsDTO();
}
}
......
......@@ -5,8 +5,6 @@ import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.io.Serializable;
......@@ -27,11 +25,11 @@ public class TaskAttr implements Serializable {
@Column(name = "id")
private Long id;
// 任务id(关联task主键)
/** 任务id(关联task主键) */
@Column(name = "task_id")
private Long taskId;
// 任务属性字符串
/** 任务属性字符串 */
@Column(name = "attr_str")
private String attrStr;
......
package com.topdraw.business.module.task.attribute.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.business.module.task.attribute.service.TaskAttrService;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrQueryCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
* @author XiangHan
* @date 2022-01-13
*/
@Api(tags = "TaskAttr管理")
@RestController
@RequestMapping("/api/TaskAttr")
public class TaskAttrController {
@Autowired
private TaskAttrService TaskAttrService;
@GetMapping
@ApiOperation("查询TaskAttr")
public ResultInfo getTaskAttrs(TaskAttrQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(TaskAttrService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有TaskAttr")
public ResultInfo getTaskAttrs(TaskAttrQueryCriteria criteria) {
return ResultInfo.success(TaskAttrService.queryAll(criteria));
}
@PostMapping
@ApiOperation("新增TaskAttr")
public ResultInfo create(@Validated @RequestBody TaskAttr resources) {
TaskAttrService.create(resources);
return ResultInfo.success();
}
@PutMapping
@ApiOperation("修改TaskAttr")
public ResultInfo update(@Validated @RequestBody TaskAttr resources) {
TaskAttrService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/{id}")
@ApiOperation("删除TaskAttr")
public ResultInfo delete(@PathVariable Long id) {
TaskAttrService.delete(id);
return ResultInfo.success();
}
}
......@@ -2,34 +2,12 @@ package com.topdraw.business.module.task.attribute.service;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrDTO;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
* @author XiangHan
* @date 2022-01-13
*/
public interface TaskAttrService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(TaskAttrQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<TaskAttrDTO>
*/
List<TaskAttrDTO> queryAll(TaskAttrQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
......@@ -37,11 +15,28 @@ public interface TaskAttrService {
*/
TaskAttrDTO findById(Long id);
/**
*
* @param resources
*/
void create(TaskAttr resources);
/**
*
* @param resources
*/
void update(TaskAttr resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param taskId
* @return
*/
TaskAttrDTO findByTaskId(Long taskId);
}
......
......@@ -3,7 +3,6 @@ package com.topdraw.business.module.task.attribute.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-01-13
......@@ -13,9 +12,9 @@ public class TaskAttrDTO implements Serializable {
private Long id;
// 任务id(关联task主键)
/** 任务id(关联task主键) */
private Long taskId;
// 任务属性字符串
/** 任务属性字符串 */
private String attrStr;
}
......
package com.topdraw.business.module.task.attribute.service.dto;
import lombok.Data;
import com.topdraw.annotation.Query;
/**
* @author XiangHan
* @date 2022-01-13
*/
@Data
public class TaskAttrQueryCriteria{
}
......@@ -2,30 +2,16 @@ package com.topdraw.business.module.task.attribute.service.impl;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.utils.FileUtil;
import com.topdraw.business.module.task.attribute.repository.TaskAttrRepository;
import com.topdraw.business.module.task.attribute.service.TaskAttrService;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrDTO;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrQueryCriteria;
import com.topdraw.business.module.task.attribute.service.mapper.TaskAttrMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import java.util.List;
import java.util.Map;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.LinkedHashMap;
/**
* @author XiangHan
......@@ -36,57 +22,46 @@ import java.util.LinkedHashMap;
public class TaskAttrServiceImpl implements TaskAttrService {
@Autowired
private TaskAttrRepository TaskAttrRepository;
private TaskAttrMapper taskAttrMapper;
@Autowired
private TaskAttrMapper TaskAttrMapper;
private TaskAttrRepository taskAttrRepository;
@Override
public Map<String, Object> queryAll(TaskAttrQueryCriteria criteria, Pageable pageable) {
Page<TaskAttr> page = TaskAttrRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(TaskAttrMapper::toDto));
}
@Override
public List<TaskAttrDTO> queryAll(TaskAttrQueryCriteria criteria) {
return TaskAttrMapper.toDto(TaskAttrRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public TaskAttrDTO findById(Long id) {
TaskAttr TaskAttr = TaskAttrRepository.findById(id).orElseGet(TaskAttr::new);
TaskAttr TaskAttr = this.taskAttrRepository.findById(id).orElseGet(TaskAttr::new);
ValidationUtil.isNull(TaskAttr.getId(),"TaskAttr","id",id);
return TaskAttrMapper.toDto(TaskAttr);
return this.taskAttrMapper.toDto(TaskAttr);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(TaskAttr resources) {
TaskAttrRepository.save(resources);
this.taskAttrRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(TaskAttr resources) {
TaskAttr TaskAttr = TaskAttrRepository.findById(resources.getId()).orElseGet(TaskAttr::new);
TaskAttr TaskAttr = this.taskAttrRepository.findById(resources.getId()).orElseGet(TaskAttr::new);
ValidationUtil.isNull( TaskAttr.getId(),"TaskAttr","id",resources.getId());
TaskAttr.copy(resources);
TaskAttrRepository.save(TaskAttr);
this.taskAttrRepository.save(TaskAttr);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
TaskAttr TaskAttr = TaskAttrRepository.findById(id).orElseThrow(
TaskAttr taskAttr = this.taskAttrRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", TaskAttr.class, id), 1));
TaskAttrRepository.delete(TaskAttr);
this.taskAttrRepository.delete(taskAttr);
}
@Override
public TaskAttrDTO findByTaskId(Long taskId) {
TaskAttr TaskAttr = TaskAttrRepository.findByTaskId(taskId).orElseGet(TaskAttr::new);
return TaskAttrMapper.toDto(TaskAttr);
TaskAttr taskAttr = this.taskAttrRepository.findByTaskId(taskId).orElseGet(TaskAttr::new);
return this.taskAttrMapper.toDto(taskAttr);
}
......
package com.topdraw.business.module.task.domain;
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;
......@@ -29,104 +32,131 @@ public class Task implements Serializable {
@Column(name = "id")
private Long id;
// 任务模板id
/** 任务模板id */
@Column(name = "task_template_id", nullable = false)
@NotNull(message = "taskTemplateId is null", groups = {CreateGroup.class})
private Long taskTemplateId;
// 任务重复类型,-1:不限次;1:单次;>1:多次
@Transient
private String taskTemplateCode;
/** 任务重复类型,-1:不限次;1:单次;>1:多次 */
@Column(name = "task_repeat_type", nullable = false)
private Integer taskRepeatType;
// 任务每日重置 0:不重置;1:重置
/** 任务每日重置 0:不重置;1:重置 */
@Column(name = "task_daily_reset", nullable = false)
private Integer taskDailyReset;
// 行为量(完成此任务需要多少次相同行为的触发)
/** 行为量(完成此任务需要多少次相同行为的触发) */
@Column(name = "action_amount", nullable = false)
private Integer actionAmount;
// 任务生效时间
/** 任务生效时间 */
@Column(name = "valid_time")
private Timestamp validTime;
// 任务失效时间
/** 任务失效时间 */
@Column(name = "expire_time")
private LocalDateTime expireTime;
private Timestamp expireTime;
// 显示顺序
/** 显示顺序 */
@Column(name = "sequence")
private Integer sequence;
// 获得成长值
/** 获得成长值 */
@Column(name = "reward_exp", nullable = false)
private Long rewardExp;
// 获得积分
/** 获得积分 */
@Column(name = "reward_points", nullable = false)
private Long rewardPoints;
// 积分过期时间(空为不过期)
/** 积分过期时间(空为不过期) */
@Column(name = "reward_points_expire_time")
private Long rewardPointsExpireTime;
// 积分获取类型 0:定值;1:随机
/** 积分获取类型 0:定值;1:随机 */
@Column(name = "points_type")
private Integer pointsType;
// 随机积分最大值
/** 随机积分最大值 */
@Column(name = "reward_max_points")
private Integer rewardMaxPoints;
// 能够获取该任务的用户分组,为空则都能获取
/** 能够获取该任务的用户分组,为空则都能获取 */
@Column(name = "groups")
private String groups;
// 权益发放策略 0:立即发放;1:次日发放;2:次月发放
/** 权益发放策略 0:立即发放;1:次日发放;2:次月发放 */
@Column(name = "rights_send_strategy", nullable = false)
private Integer rightsSendStrategy;
// 会员等级门槛(0表示无门槛)
/** 会员等级门槛(0表示无门槛) */
@Column(name = "member_level", nullable = false)
private Integer memberLevel;
// 会员vip门槛(0表示没有门槛)
/** 会员vip门槛(0表示没有门槛) */
@Column(name = "member_vip")
private Integer memberVip;
// 权益id
/** 权益id */
@Column(name = "rights_id")
private Long rightsId;
// 权益数量(活动机会次数、优惠券数量、奖品数量)
/** 权益数量(活动机会次数、优惠券数量、奖品数量) */
@Column(name = "rights_amount")
private Integer rightsAmount;
// 权益2id
/** 权益2id */
@Column(name = "rights2_id")
private Long rights2Id;
// 权益2数量
/** 权益2数量 */
@Column(name = "rights2_amount")
private Integer rights2Amount;
// 权益3id
/** 权益3id */
@Column(name = "rights3_id")
private Long rights3Id;
// 权益3数量
/** 权益3数量 */
@Column(name = "rights3_amount")
private Integer rights3Amount;
// 状态 0:失效;1:生效
/** 会员专享 0:会员专享 1:非会员专享 */
@Column(name = "member_exclusive")
private Integer memberExclusive;
/** 状态 0:失效;1:生效 */
@Column(name = "status", nullable = false)
private Integer status;
// 创建时间
/** 任务名称 */
@Column(name = "name", nullable = false)
private String name;
/** 编号 */
@Column(name = "code", nullable = false)
private String code;
/** 任务描述 */
@Column(name = "description", nullable = false)
private String description;
/** 删除标识 0:正常;1:已删除;*/
@Column(name = "delete_mark", nullable = false)
private Integer deleteMark;
@Transient
private String attr;
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.task.domain;
import com.topdraw.util.DateUtil;
import com.topdraw.util.IdWorker;
import com.topdraw.util.RandomUtil;
import com.topdraw.util.TimestampUtil;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/4/25 16:33
* @version: :
* @modified By:
* @since : modified in 2022/4/25 16:33
*/
public class TaskBuilder {
public static Task build(Task task) {
Task task_ = new Task();
task_.setTaskTemplateId(task.getTaskTemplateId());
task_.setTaskTemplateCode(task.getTaskTemplateCode());
task_.setName(task.getName());
task_.setCode(StringUtils.isEmpty(task.getCode()) ? IdWorker.generatorCode("task_") : task.getCode());
task_.setStatus(Objects.isNull(task.getStatus()) ? 1 : task.getStatus());
task_.setSequence(task.getSequence());
task_.setValidTime(Objects.isNull(task.getValidTime()) ? TimestampUtil.now() : task.getValidTime());
task_.setExpireTime(task.getExpireTime());
task_.setDescription(task.getDescription());
task_.setActionAmount(task.getActionAmount());
task_.setTaskDailyReset(Objects.isNull(task.getTaskDailyReset()) ? 1 : task.getTaskDailyReset());
task_.setTaskRepeatType(Objects.isNull(task.getTaskRepeatType()) ? 1 : task.getTaskRepeatType());
task_.setRightsSendStrategy(Objects.isNull(task.getRightsSendStrategy()) ? 1 : task.getRightsSendStrategy());
task_.setGroups(task.getGroups());
task_.setMemberLevel(Objects.isNull(task.getMemberLevel()) ? 1 : task.getMemberLevel());
task_.setMemberVip(Objects.isNull(task.getMemberVip()) ? 0 : task.getMemberVip());
task_.setMemberExclusive(Objects.isNull(task.getMemberExclusive()) ? 1 : 0);
task_.setPointsType(Objects.isNull(task.getPointsType()) ? 0 : task.getPointsType());
task_.setRewardPoints(Objects.isNull(task.getRewardPoints()) ? 0 : task.getRewardPoints());
task_.setRewardPointsExpireTime(Objects.isNull(task.getRewardPointsExpireTime()) ?
DateUtil.getLastDateTimeSecondYearLong() : task.getRewardPointsExpireTime());
task_.setRewardMaxPoints(Objects.isNull(task.getRewardMaxPoints()) ?
RandomUtil.getRandomPoints(1, 10).intValue() : task.getRewardMaxPoints());
task_.setRewardExp(Objects.isNull(task.getRewardExp()) ? 0L : task.getRewardExp());
task_.setRightsId(task.getRightsId());
task_.setRightsAmount(task.getRightsAmount());
task_.setRights2Id(task.getRights2Id());
task_.setRights2Amount(task.getRights2Amount());
task_.setRights3Id(task.getRights3Id());
task_.setRights3Amount(task.getRights3Amount());
task_.setDeleteMark(Objects.isNull(task.getDeleteMark()) ? 0 : task.getDeleteMark());
task_.setAttr(StringUtils.isBlank(task.getAttr()) ? null : task.getAttr());
return task_;
}
}
......@@ -32,27 +32,27 @@ public class TrTaskProgress implements Serializable {
@Column(name = "id")
private Long id;
// 用户id
/** 用户id */
@Column(name = "member_id", nullable = false)
private Long memberId;
// 任务id
/** 任务id */
@Column(name = "task_id")
private Long taskId;
// 已完成的行为量
/** 已完成的行为量 */
@Column(name = "current_action_amount")
private Integer currentActionAmount;
// 目标行为量
/** 目标行为量 */
@Column(name = "target_action_amount")
private Integer targetActionAmount;
// 状态 0:未完成;1:已完成
/** 状态 0:未完成;1:已完成 */
@Column(name = "status")
private Integer status;
// 完成时间
/** 完成时间 */
@Column(name = "completion_time")
private Timestamp completionTime;
......
package com.topdraw.business.module.task.progress.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.task.progress.domain.TrTaskProgress;
import com.topdraw.business.module.task.progress.service.TrTaskProgressService;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressQueryCriteria;
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-11-02
*/
@Api(tags = "TrTaskProgress管理")
@RestController
@RequestMapping("/api/TrTaskProgress")
public class TrTaskProgressController {
@Autowired
private TrTaskProgressService TrTaskProgressService;
@GetMapping
@ApiOperation("查询TrTaskProgress")
public ResultInfo getTrTaskProgresss(TrTaskProgressQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(TrTaskProgressService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有TrTaskProgress")
public ResultInfo getTrTaskProgresss(TrTaskProgressQueryCriteria criteria) {
return ResultInfo.success(TrTaskProgressService.queryAll(criteria));
}
@PostMapping
@ApiOperation("新增TrTaskProgress")
public ResultInfo create(@Validated @RequestBody TrTaskProgress resources) {
TrTaskProgressService.create(resources);
return ResultInfo.success();
}
@PutMapping
@ApiOperation("修改TrTaskProgress")
public ResultInfo update(@Validated @RequestBody TrTaskProgress resources) {
TrTaskProgressService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/{id}")
@ApiOperation("删除TrTaskProgress")
public ResultInfo delete(@PathVariable Long id) {
TrTaskProgressService.delete(id);
return ResultInfo.success();
}
}
......@@ -2,9 +2,6 @@ package com.topdraw.business.module.task.progress.service;
import com.topdraw.business.module.task.progress.domain.TrTaskProgress;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressDTO;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
......@@ -14,32 +11,36 @@ import java.util.List;
public interface TrTaskProgressService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(TrTaskProgressQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<TrTaskProgressDTO>
*/
List<TrTaskProgressDTO> queryAll(TrTaskProgressQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return TrTaskProgressDTO
*/
TrTaskProgressDTO findById(Long id);
/**
*
* @param resources
*/
void create(TrTaskProgress resources);
/**
*
* @param resources
*/
void update(TrTaskProgress resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param memberId
* @param taskId
* @param time1
* @return
*/
List<TrTaskProgressDTO> findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1);
}
......
......@@ -14,22 +14,22 @@ public class TrTaskProgressDTO implements Serializable {
private Long id;
// 用户id
/** 用户id */
private Long memberId;
// 任务id
/** 任务id */
private Long taskId;
// 已完成的行为量
/** 已完成的行为量 */
private Integer currentActionAmount;
// 目标行为量
/** 目标行为量 */
private Integer targetActionAmount;
// 状态 0:未完成;1:已完成
/** 状态 0:未完成;1:已完成 */
private Integer status;
// 完成时间
/** 完成时间 */
private Timestamp completionTime;
private Timestamp createTime;
......
package com.topdraw.business.module.task.progress.service.dto;
import lombok.Data;
import com.topdraw.annotation.Query;
/**
* @author XiangHan
* @date 2021-11-02
*/
@Data
public class TrTaskProgressQueryCriteria{
@Query(type = Query.Type.EQUAL)
private Long taskId;
@Query(type = Query.Type.EQUAL)
private Long memberId;
@Query(type = Query.Type.BETWEEN)
private String completionTime;
}
......@@ -5,21 +5,15 @@ import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.task.progress.repository.TrTaskProgressRepository;
import com.topdraw.business.module.task.progress.service.TrTaskProgressService;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressDTO;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressQueryCriteria;
import com.topdraw.business.module.task.progress.service.mapper.TrTaskProgressMapper;
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
......@@ -30,56 +24,45 @@ import java.util.Map;
public class TrTaskProgressServiceImpl implements TrTaskProgressService {
@Autowired
private TrTaskProgressRepository TrTaskProgressRepository;
private TrTaskProgressRepository trTaskProgressRepository;
@Autowired
private TrTaskProgressMapper TrTaskProgressMapper;
@Override
public Map<String, Object> queryAll(TrTaskProgressQueryCriteria criteria, Pageable pageable) {
Page<TrTaskProgress> page = TrTaskProgressRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(TrTaskProgressMapper::toDto));
}
@Override
public List<TrTaskProgressDTO> queryAll(TrTaskProgressQueryCriteria criteria) {
return TrTaskProgressMapper.toDto(TrTaskProgressRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private TrTaskProgressMapper trTaskProgressMapper;
@Override
public TrTaskProgressDTO findById(Long id) {
TrTaskProgress TrTaskProgress = TrTaskProgressRepository.findById(id).orElseGet(TrTaskProgress::new);
TrTaskProgress TrTaskProgress = this.trTaskProgressRepository.findById(id).orElseGet(TrTaskProgress::new);
ValidationUtil.isNull(TrTaskProgress.getId(),"TrTaskProgress","id",id);
return TrTaskProgressMapper.toDto(TrTaskProgress);
return this.trTaskProgressMapper.toDto(TrTaskProgress);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(TrTaskProgress resources) {
TrTaskProgressRepository.save(resources);
this.trTaskProgressRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(TrTaskProgress resources) {
TrTaskProgress TrTaskProgress = TrTaskProgressRepository.findById(resources.getId()).orElseGet(TrTaskProgress::new);
TrTaskProgress TrTaskProgress = this.trTaskProgressRepository.findById(resources.getId()).orElseGet(TrTaskProgress::new);
ValidationUtil.isNull( TrTaskProgress.getId(),"TrTaskProgress","id",resources.getId());
TrTaskProgress.copy(resources);
TrTaskProgressRepository.save(TrTaskProgress);
this.trTaskProgressRepository.save(TrTaskProgress);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
TrTaskProgress TrTaskProgress = TrTaskProgressRepository.findById(id).orElseThrow(
TrTaskProgress TrTaskProgress = this.trTaskProgressRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", TrTaskProgress.class, id), 1));
TrTaskProgressRepository.delete(TrTaskProgress);
this.trTaskProgressRepository.delete(TrTaskProgress);
}
@Override
public List<TrTaskProgressDTO> findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1) {
return TrTaskProgressMapper.toDto(this.TrTaskProgressRepository.findByMemberIdAndTaskIdAndCompletionTime(memberId,taskId,time1));
return this.trTaskProgressMapper.toDto(this.trTaskProgressRepository.findByMemberIdAndTaskIdAndCompletionTime(memberId,taskId,time1));
}
......
......@@ -3,8 +3,12 @@ package com.topdraw.business.module.task.repository;
import com.topdraw.business.module.task.domain.Task;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
/**
* @author XiangHan
......@@ -14,5 +18,10 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
List<Task> findByTaskTemplateId(Long taskTemplateId);
// List<Task> findByTemplateId(Long taskTemplateId);
@Modifying
@Transactional
@Query(value = "UPDATE `tr_task` SET `delete_mark` = 1 , `update_time` = now() WHERE `id` = ?1", nativeQuery = true)
void updateDeleteMark(Long id);
Optional<Task> findByCode(String code);
}
......
package com.topdraw.business.module.task.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.service.TaskService;
import com.topdraw.business.module.task.service.dto.TaskQueryCriteria;
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-10-22
*/
@Api(tags = "Task管理")
@RestController
@RequestMapping("/api/Task")
public class TaskController {
@Autowired
private TaskService TaskService;
@GetMapping
@ApiOperation("查询Task")
public ResultInfo getTasks(TaskQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(TaskService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有Task")
public ResultInfo getTasks(TaskQueryCriteria criteria) {
return ResultInfo.success(TaskService.queryAll(criteria));
}
@PostMapping
@ApiOperation("新增Task")
public ResultInfo create(@Validated @RequestBody Task resources) {
TaskService.create(resources);
return ResultInfo.success();
}
@PutMapping
@ApiOperation("修改Task")
public ResultInfo update(@Validated @RequestBody Task resources) {
TaskService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/{id}")
@ApiOperation("删除Task")
public ResultInfo delete(@PathVariable Long id) {
TaskService.delete(id);
return ResultInfo.success();
}
}
......@@ -2,9 +2,6 @@ package com.topdraw.business.module.task.service;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.business.module.task.service.dto.TaskQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
......@@ -14,32 +11,47 @@ import java.util.List;
public interface TaskService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*
* @param id ID
* @return TaskDTO
*/
Map<String,Object> queryAll(TaskQueryCriteria criteria, Pageable pageable);
TaskDTO findById(Long id);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<TaskDTO>
*
* @param code 编号
* @return TaskDTO
*/
List<TaskDTO> queryAll(TaskQueryCriteria criteria);
TaskDTO findByCode(String code);
/**
* 根据ID查询
* @param id ID
* @return TaskDTO
*
* @param taskTemplateId
* @return
*/
TaskDTO findById(Long id);
List<Task> findByTemplateId(Long taskTemplateId);
void create(Task resources);
/**
*
* @param task
*/
TaskDTO create(Task task);
void update(Task resources);
/**
*
* @param task
*/
TaskDTO update(Task task);
void delete(Long id);
/**
*
* @param task
*/
void delete(Task task);
List<Task> findByTemplateId(Long taskTemplateId);
/**
*
* @param id
*/
void delete(Long id);
}
......
......@@ -2,6 +2,7 @@ package com.topdraw.business.module.task.service.dto;
import lombok.Data;
import javax.persistence.Column;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
......@@ -16,69 +17,86 @@ public class TaskDTO implements Serializable {
private Long id;
// 任务模板id
/** 任务模板id */
private Long taskTemplateId;
// 任务重复类型,-1:不限次;1:单次;>1:多次
/** 删除标识 0:正常;1:已删除;*/
private Integer deleteMark;
/** 任务重复类型,-1:不限次;1:单次;>1:多次 */
private Integer taskRepeatType;
// 任务每日重置 0:不重置;1:重置
/** 任务每日重置 0:不重置;1:重置 */
private Integer taskDailyReset;
// 行为量(完成此任务需要多少次相同行为的触发)
/** 行为量(完成此任务需要多少次相同行为的触发) */
private Integer actionAmount;
// 任务生效时间
/** 任务生效时间 */
private Timestamp validTime;
// 任务失效时间
private LocalDateTime expireTime;
/** 任务失效时间 */
private Timestamp expireTime;
// 显示顺序
/** 显示顺序 */
private Integer sequence;
// 获得成长值
/** 获得成长值 */
private Long rewardExp;
// 获得积分
/** 获得积分 */
private Long rewardPoints;
// 积分过期时间(空为不过期)
/** 积分过期时间(空为不过期) */
private Long rewardPointsExpireTime;
// 能够获取该任务的用户分组,为空则都能获取
/** 能够获取该任务的用户分组,为空则都能获取 */
private String groups;
// 会员等级门槛(0表示无门槛)
/** 会员等级门槛(0表示无门槛) */
private Integer memberLevel;
// 会员vip门槛(0表示没有门槛)
/** 会员vip门槛(0表示没有门槛) */
private Integer memberVip;
// 权益id
/** 权益id */
private Long rightsId;
// 权益数量(活动机会次数、优惠券数量、奖品数量)
/** 权益数量(活动机会次数、优惠券数量、奖品数量) */
private Integer rightsAmount;
// 权益2id
/** 权益2id */
private Long rights2Id;
// 权益2数量
/** 权益2数量 */
private Integer rights2Amount;
// 权益3id
/** 权益3id */
private Long rights3Id;
// 权益3数量
/** 权益3数量 */
private Integer rights3Amount;
// 状态 0:失效;1:生效
/** 会员专享 0:会员专享 1:非会员专享 */
private Integer memberExclusive;
/** 状态 0:失效;1:生效 */
private Integer status;
// 创建时间
/** 任务名称 */
private String name;
/** 编号 */
private String code;
/** 任务描述 */
private String description;
private String attr;
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.task.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class TaskQueryCriteria{
}
package com.topdraw.business.module.task.service.impl;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.task.repository.TaskRepository;
import com.topdraw.business.module.task.service.TaskService;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.business.module.task.service.dto.TaskQueryCriteria;
import com.topdraw.business.module.task.service.mapper.TaskMapper;
import 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;
/**
......@@ -31,58 +22,48 @@ import java.util.Objects;
public class TaskServiceImpl implements TaskService {
@Autowired
private TaskRepository TaskRepository;
private TaskMapper taskMapper;
@Autowired
private TaskMapper TaskMapper;
private TaskRepository taskRepository;
@Override
public Map<String, Object> queryAll(TaskQueryCriteria criteria, Pageable pageable) {
Page<Task> page = TaskRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(TaskMapper::toDto));
public TaskDTO findById(Long id) {
Task Task = this.taskRepository.findById(id).orElseGet(Task::new);
return this.taskMapper.toDto(Task);
}
@Override
public List<TaskDTO> queryAll(TaskQueryCriteria criteria) {
return TaskMapper.toDto(TaskRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public TaskDTO findByCode(String code) {
Task Task = this.taskRepository.findByCode(code).orElseGet(Task::new);
return this.taskMapper.toDto(Task);
}
@Override
public TaskDTO findById(Long id) {
Task Task = TaskRepository.findById(id).orElseGet(Task::new);
ValidationUtil.isNull(Task.getId(),"Task","id",id);
return TaskMapper.toDto(Task);
public List<Task> findByTemplateId(Long taskTemplateId) {
return Objects.nonNull(taskTemplateId) ? this.taskRepository.findByTaskTemplateId(taskTemplateId) : null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(Task resources) {
TaskRepository.save(resources);
public TaskDTO create(Task task) {
Task save = this.taskRepository.save(task);
return this.taskMapper.toDto(save);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(Task resources) {
Task Task = TaskRepository.findById(resources.getId()).orElseGet(Task::new);
ValidationUtil.isNull( Task.getId(),"Task","id",resources.getId());
Task.copy(resources);
TaskRepository.save(Task);
public TaskDTO update(Task task) {
Task save = this.taskRepository.save(task);
return this.taskMapper.toDto(save);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
Task Task = TaskRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Task.class, id), 1));
TaskRepository.delete(Task);
public void delete(Task task) {
Long id = task.getId();
this.delete(id);
}
// @Cacheable(cacheNames = "uc-admin_taskList" , key = "#taskTemplateId")
@Override
public List<Task> findByTemplateId(Long taskTemplateId) {
return Objects.nonNull(taskTemplateId) ? this.TaskRepository.findByTaskTemplateId(taskTemplateId) : null;
public void delete(Long id) {
this.taskRepository.updateDeleteMark(id);
}
}
......
package com.topdraw.business.module.task.template.domain;
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;
......@@ -28,34 +31,40 @@ public class TaskTemplate implements Serializable {
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code")
private String code;
// 名称
/** 名称 */
@Column(name = "name")
private String name;
// 关注事件(和MQ topic相关)
/** 关注事件(和MQ topic相关) */
@Column(name = "event")
@NotNull(message = "event is null", groups = {CreateGroup.class})
private String event;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 状态 0:失效;1:生效
/** 状态 0:失效;1:生效 */
@Column(name = "status")
private Integer status;
// 类型 0:活动任务模板
/** 类型 0:活动任务模板 */
@Column(name = "type")
@NotNull(message = "type is null", groups = {CreateGroup.class})
private Integer type;
// 模板参数,json
/** 模板参数,json */
@Column(name = "params")
private String params;
/** 删除标识 0:正常;1:已删除; */
@Column(name = "delete_mark")
private Integer deleteMark;
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
......
package com.topdraw.business.module.task.template.domain;
import com.topdraw.util.IdWorker;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/4/25 17:22
* @version: :
* @modified By:
* @since : modified in 2022/4/25 17:22
*/
public class TaskTemplateBuilder {
public static TaskTemplate build(TaskTemplate taskTemplate){
TaskTemplate taskTemplate_ = new TaskTemplate();
taskTemplate_.setCode(StringUtils.isEmpty(taskTemplate.getCode()) ? IdWorker.generatorCode("taskTemplate_") : taskTemplate.getCode());
taskTemplate_.setName(taskTemplate.getName());
taskTemplate_.setType(taskTemplate.getType());
taskTemplate_.setStatus(Objects.isNull(taskTemplate.getStatus()) ? 1:taskTemplate.getStatus());
taskTemplate_.setEvent(taskTemplate.getEvent());
taskTemplate_.setParams(taskTemplate.getParams());
taskTemplate_.setDescription(taskTemplate.getDescription());
taskTemplate_.setDeleteMark(Objects.isNull(taskTemplate.getDeleteMark()) ? 0 : taskTemplate.getDeleteMark());
return taskTemplate_;
}
}
......@@ -3,6 +3,9 @@ package com.topdraw.business.module.task.template.repository;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
......@@ -15,7 +18,12 @@ public interface TaskTemplateRepository extends JpaRepository<TaskTemplate, Long
Optional<TaskTemplate> findFirstByCode(String code);
TaskTemplate findByEvent(String event);
Optional<TaskTemplate> findByEvent(String event);
List<TaskTemplate> findByType(Integer event);
Optional<TaskTemplate> findByType(Integer event);
@Modifying
@Transactional
@Query(value = "UPDATE `tr_task_template` SET `delete_mark` = 1 , `update_time` = now() WHERE `id` = ?1", nativeQuery = true)
void updateDeleteMark(Long id);
}
......
package com.topdraw.business.module.task.template.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.service.TaskTemplateService;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateQueryCriteria;
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-10-22
*/
@Api(tags = "TaskTemplate管理")
@RestController
@RequestMapping("/api/TaskTemplate")
public class TaskTemplateController {
@Autowired
private TaskTemplateService TaskTemplateService;
@GetMapping
@ApiOperation("查询TaskTemplate")
public ResultInfo getTaskTemplates(TaskTemplateQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(TaskTemplateService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有TaskTemplate")
public ResultInfo getTaskTemplates(TaskTemplateQueryCriteria criteria) {
return ResultInfo.success(TaskTemplateService.queryAll(criteria));
}
@PostMapping
@ApiOperation("新增TaskTemplate")
public ResultInfo create(@Validated @RequestBody TaskTemplate resources) {
TaskTemplateService.create(resources);
return ResultInfo.success();
}
@PutMapping
@ApiOperation("修改TaskTemplate")
public ResultInfo update(@Validated @RequestBody TaskTemplate resources) {
TaskTemplateService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/{id}")
@ApiOperation("删除TaskTemplate")
public ResultInfo delete(@PathVariable Long id) {
TaskTemplateService.delete(id);
return ResultInfo.success();
}
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(TaskTemplateService.getByCode(code));
}
}
......@@ -2,9 +2,6 @@ package com.topdraw.business.module.task.template.service;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
......@@ -14,41 +11,54 @@ import java.util.List;
public interface TaskTemplateService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(TaskTemplateQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<TaskTemplateDTO>
*/
List<TaskTemplateDTO> queryAll(TaskTemplateQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return TaskTemplateDTO
*/
TaskTemplateDTO findById(Long id);
void create(TaskTemplate resources);
/**
*
* @param resources
*/
TaskTemplateDTO create(TaskTemplate resources);
void update(TaskTemplate resources);
/**
*
* @param resources
*/
TaskTemplateDTO update(TaskTemplate resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param resources
*/
void delete(TaskTemplate resources);
/**
* Code校验
* @param code
* @return TaskTemplateDTO
*/
TaskTemplateDTO getByCode(String code);
TaskTemplateDTO findByCode(String code);
TaskTemplate findByEvent(String event);
/**
*
* @param event
* @return
*/
TaskTemplateDTO findByEvent(String event);
List<TaskTemplate> findByType(Integer event);
/**
*
* @param event
* @return
*/
TaskTemplateDTO findByType(Integer event);
}
......
......@@ -14,27 +14,30 @@ public class TaskTemplateDTO implements Serializable {
private Long id;
// 标识
/** 标识 */
private String code;
// 名称
/** 名称 */
private String name;
// 关注事件(和MQ topic相关)
/** 关注事件(和MQ topic相关) */
private String event;
// 描述
/** 描述 */
private String description;
// 状态 0:失效;1:生效
/** 状态 0:失效;1:生效 */
private Integer status;
// 类型 0:活动任务模板
/** 类型 0:活动任务模板 */
private Integer type;
// 模板参数,json
/** 模板参数,json */
private String params;
/** 删除标识 0:正常;1:已删除; */
private Integer deleteMark;
private Timestamp createTime;
private Timestamp updateTime;
......
package com.topdraw.business.module.task.template.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class TaskTemplateQueryCriteria{
}
package com.topdraw.business.module.task.template.service.impl;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.domain.TaskTemplateBuilder;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.task.template.repository.TaskTemplateRepository;
import com.topdraw.business.module.task.template.service.TaskTemplateService;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateQueryCriteria;
import com.topdraw.business.module.task.template.service.mapper.TaskTemplateMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
......@@ -32,69 +27,60 @@ import java.util.Objects;
public class TaskTemplateServiceImpl implements TaskTemplateService {
@Autowired
private TaskTemplateRepository TaskTemplateRepository;
private TaskTemplateRepository taskTemplateRepository;
@Autowired
private TaskTemplateMapper TaskTemplateMapper;
@Override
public Map<String, Object> queryAll(TaskTemplateQueryCriteria criteria, Pageable pageable) {
Page<TaskTemplate> page = TaskTemplateRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(TaskTemplateMapper::toDto));
}
@Override
public List<TaskTemplateDTO> queryAll(TaskTemplateQueryCriteria criteria) {
return TaskTemplateMapper.toDto(TaskTemplateRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private TaskTemplateMapper taskTemplateMapper;
@Override
public TaskTemplateDTO findById(Long id) {
TaskTemplate TaskTemplate = TaskTemplateRepository.findById(id).orElseGet(TaskTemplate::new);
ValidationUtil.isNull(TaskTemplate.getId(),"TaskTemplate","id",id);
return TaskTemplateMapper.toDto(TaskTemplate);
TaskTemplate TaskTemplate = this.taskTemplateRepository.findById(id).orElseGet(TaskTemplate::new);
ValidationUtil.isNull(TaskTemplate.getId(),"TaskTemplate","id", id);
return this.taskTemplateMapper.toDto(TaskTemplate);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(TaskTemplate resources) {
TaskTemplateRepository.save(resources);
public TaskTemplateDTO create(TaskTemplate resources) {
TaskTemplate save = this.taskTemplateRepository.save(resources);
return this.taskTemplateMapper.toDto(save);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(TaskTemplate resources) {
TaskTemplate TaskTemplate = TaskTemplateRepository.findById(resources.getId()).orElseGet(TaskTemplate::new);
ValidationUtil.isNull( TaskTemplate.getId(),"TaskTemplate","id",resources.getId());
TaskTemplate.copy(resources);
TaskTemplateRepository.save(TaskTemplate);
public TaskTemplateDTO update(TaskTemplate resources) {
TaskTemplate taskTemplate = this.taskTemplateRepository.findById(resources.getId()).orElseGet(TaskTemplate::new);
ValidationUtil.isNull(taskTemplate.getId(),"TaskTemplate","id", resources.getId());
taskTemplate.copy(resources);
TaskTemplate save = this.taskTemplateRepository.save(taskTemplate);
return this.taskTemplateMapper.toDto(save);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
TaskTemplate TaskTemplate = TaskTemplateRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", TaskTemplate.class, id), 1));
TaskTemplateRepository.delete(TaskTemplate);
this.taskTemplateRepository.updateDeleteMark(id);
}
@Override
public void delete(TaskTemplate resources) {
this.delete(resources.getId());
}
@Override
public TaskTemplateDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? TaskTemplateMapper.toDto(TaskTemplateRepository.findFirstByCode(code).orElseGet(TaskTemplate::new))
public TaskTemplateDTO findByCode(String code) {
return StringUtils.isNotEmpty(code) ? this.taskTemplateMapper.toDto(this.taskTemplateRepository.findFirstByCode(code).orElseGet(TaskTemplate::new))
: new TaskTemplateDTO();
}
@Override
public TaskTemplate findByEvent(String event) {
return StringUtils.isNotEmpty(event) ? this.TaskTemplateRepository.findByEvent(event) : null;
public TaskTemplateDTO findByEvent(String event) {
return StringUtils.isNotEmpty(event) ? this.taskTemplateMapper.toDto(this.taskTemplateRepository.findByEvent(event).orElseGet(TaskTemplate::new)) : new TaskTemplateDTO();
}
// @Cacheable(cacheNames = "uc-admin_taskTemplate" , key = "#event")
@Override
public List<TaskTemplate> findByType(Integer event) {
return Objects.nonNull(event) ? this.TaskTemplateRepository.findByType(event) : null;
public TaskTemplateDTO findByType(Integer event) {
return Objects.nonNull(event) ? this.taskTemplateMapper.toDto(this.taskTemplateRepository.findByType(event).orElseGet(TaskTemplate::new)) : new TaskTemplateDTO();
}
}
......
package com.topdraw.business.module.user.iptv.domain;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import 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;
......@@ -21,108 +26,106 @@ 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 {
@NotNull(message = "visUserId can't be null !",groups = {CreateGroup.class})
@Column(name = "vis_user_id")
private Long visUserId;
/** 绑定的小屏账户会员编码 */
@Column(name = "priority_member_code")
private String priorityMemberCode;
@Transient
private String memberCode;
// vis_user表主键
@Column(name = "vis_user_id")
private Long visUserId;
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 人ID
/** 人ID */
@Column(name = "person_id")
private Long personId;
// 运营商平台
/** 运营商平台 */
@Column(name = "platform")
private String platform;
// 运营商平台账号
/** 运营商平台账号 */
@Column(name = "platform_account")
@NotNull(message = "platformAccount can't be null !",groups = {CreateGroup.class, UpdateGroup.class})
private String platformAccount;
// 手机号
/** 手机号 */
@Column(name = "cellphone")
private String cellphone;
// 用户名
/** 用户名 */
@Column(name = "username")
private String username;
// 密码 MD5
/** 密码 MD5 */
@Column(name = "password")
private String password;
// 昵称 Base64
/** 昵称 Base64 */
@Column(name = "nickname")
private String nickname;
// 头像
/** 头像 */
@Column(name = "image")
private String image;
// 登录天数(总天数)
/** 登录天数(总天数) */
@Column(name = "login_days")
private Integer loginDays;
// 连续登录天数
/** 连续登录天数 */
@Column(name = "continue_days")
private Integer continueDays;
// 活跃时间
/** 活跃时间 */
@Column(name = "active_time")
private Timestamp activeTime;
// 分组 分组ID用逗号分隔
/** 分组 分组ID用逗号分隔 */
@Column(name = "groups")
private String groups;
// 标签 标签用逗号分隔
/** 标签 标签用逗号分隔 */
@Column(name = "tags")
private String tags;
// 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录
/** 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录 */
@Column(name = "login_type")
private Integer loginType;
// 状态 0-下线 1-上线
/** 状态 0-下线 1-上线 */
@Column(name = "status")
private Integer status;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 创建者
/** 创建者 */
@Column(name = "create_by")
private String createBy;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新者
/** 更新者 */
@Column(name = "update_by")
private String updateBy;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
// 会员id
/** 会员id */
@Column(name = "member_id")
private Long memberId;
......
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;
import org.springframework.util.Assert;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/14 14:36
* @version: :
* @modified By:
* @since : modified in 2022/3/14 14:36
*/
public class UserTvBuilder {
private static final Integer DEFAULT_VALUE = 1;
private static final String DEFAULT_CREATE_BY = "system";
private static final String DEFAULT_UPDATE_BY = "system";
public static UserTv build(UserTv userTv){
return build(userTv.getMemberId(),userTv.getMemberCode(),userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy(), userTv.getVisUserId());
}
public static UserTv build(Long memberId, String memberCode , UserTv userTv){
return build(memberId,memberCode,userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy(), userTv.getVisUserId());
}
public static UserTv build(String memberCode, UserTv userTv){
return build(null,memberCode,userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy(), userTv.getVisUserId());
}
public static UserTv build(Member member, UserTv userTv){
return build(member.getId() , member.getCode(),userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy(), userTv.getVisUserId());
}
public static UserTv build(Long memberId , String memberCode , Long id , String platformAccount , String nickname , String username,
Integer loginDays , Integer status ,Integer continueDays , String createBy , String updateBy,Long visUserId){
Assert.notNull(memberId,GlobeExceptionMsg.MEMBER_ID_IS_NULL);
Assert.notNull(memberCode,GlobeExceptionMsg.MEMBER_CODE_IS_NULL);
Assert.notNull(platformAccount,GlobeExceptionMsg.IPTV_PLATFORM_ACCOUNT_IS_NULL);
Assert.notNull(platformAccount,GlobeExceptionMsg.VIS_USER_ID_IS_NULL);
// todo 原型模式
UserTv userTv = new UserTv();
userTv.setId(id);
userTv.setPlatformAccount(platformAccount);
userTv.setMemberCode(memberCode);
userTv.setMemberId(memberId);
userTv.setNickname(StringUtils.isBlank(nickname)?platformAccount:nickname);
userTv.setUsername(StringUtils.isBlank(username)?platformAccount:username);
userTv.setLoginDays(Objects.nonNull(loginDays)?loginDays:DEFAULT_VALUE);
userTv.setLoginType(DEFAULT_VALUE);
userTv.setStatus(Objects.nonNull(status)?status:DEFAULT_VALUE);
userTv.setActiveTime(TimestampUtil.now());
userTv.setContinueDays(Objects.nonNull(continueDays)?loginDays:DEFAULT_VALUE);
userTv.setCreateBy(StringUtils.isBlank(createBy)?DEFAULT_CREATE_BY:createBy);
userTv.setUpdateBy(StringUtils.isBlank(updateBy)?DEFAULT_UPDATE_BY:updateBy);
userTv.setVisUserId(visUserId);
return userTv;
}
}
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,70 @@ 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
*/
UserTvDTO create(UserTv resources);
void update(UserTv resources);
/**
*
* @param resources
*/
UserTvDTO update(UserTv resources);
void unbindPriorityMemberCode(UserTv resources);
/**
*
* @param resources
*/
UserTvDTO unbindPriorityMemberCode(UserTv resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param platformAccount
* @return
*/
UserTvDTO findByPlatformAccount(String platformAccount);
/**
*
* @param memberCode
* @return
*/
UserTvDTO findByPriorityMemberCode(String memberCode);
/**
* 通过会员
* @param memberId
* @return
*/
UserTvDTO findByMemberId(Long memberId);
/**
* 检查会员是否是主账号
* @param memberId
* @param memberCode
* @return
*/
boolean checkPriorityMemberByMemberIdOrMemberCode(Long memberId,String memberCode);
/**
*
* @param platformAccount
* @return
*/
MemberDTO findMemberByPlatformAccount(String platformAccount);
}
......
......@@ -12,77 +12,77 @@ import java.io.Serializable;
@Data
public class UserTvDTO implements Serializable {
private Long visUserId;
private String memberCode;
/** 绑定的小屏账户会员编码 */
private String priorityMemberCode;
private Long visUserId;
// ID
/** ID */
private Long id;
// 人ID
/** 人ID */
private Long personId;
// 运营商平台
/** 运营商平台 */
private String platform;
// 运营商平台账号
/** 运营商平台账号 */
private String platformAccount;
// 手机号
/** 手机号 */
private String cellphone;
// 用户名
/** 用户名 */
private String username;
// 密码 MD5
/** 密码 MD5 */
private String password;
// 昵称 Base64
/** 昵称 Base64 */
private String nickname;
// 头像
/** 头像 */
private String image;
// 登录天数(总天数)
/** 登录天数(总天数) */
private Integer loginDays;
// 连续登录天数
/** 连续登录天数 */
private Integer continueDays;
// 活跃时间
/** 活跃时间 */
private 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;
}
......
package com.topdraw.business.module.user.iptv.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Data
public class UserTvQueryCriteria{
}
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,143 @@ 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) {
MemberDTO memberDTO = memberService.getByCode(resources.getMemberCode());
public UserTvDTO create(UserTv resources) {
MemberDTO memberDTO = memberService.findByCode(resources.getMemberCode());
if (Objects.nonNull(memberDTO)) {
Long id = memberDTO.getId();
resources.setMemberId(id);
UserTvRepository.save(resources);
return resources.getId();
UserTv userTv = this.userTvRepository.save(resources);
userTv.setMemberCode(memberDTO.getCode());
return this.userTvMapper.toDto(userTv);
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void update(UserTv resources) {
UserTv UserTv = UserTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
ValidationUtil.isNull( UserTv.getId(),"UserTv","id",resources.getId());
UserTv.copy(resources);
UserTvRepository.save(UserTv);
public UserTvDTO update(UserTv resources) {
UserTv userTv = this.userTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
ValidationUtil.isNull(userTv.getId(),"UserTv","id",resources.getId());
userTv.copy(resources);
UserTv _userTv = this.userTvRepository.save(userTv);
return this.userTvMapper.toDto(_userTv);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void unbindPriorityMemberCode(UserTv resources) {
UserTv UserTv = UserTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
ValidationUtil.isNull( UserTv.getId(),"UserTv","id",resources.getId());
UserTv.copy(resources);
UserTvRepository.save(UserTv);
public UserTvDTO unbindPriorityMemberCode(UserTv resources) {
UserTv userTv = this.userTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
ValidationUtil.isNull( userTv.getId(),"UserTv","id",resources.getId());
userTv.copy(resources);
UserTv _userTv = this.userTvRepository.save(userTv);
return this.userTvMapper.toDto(_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);
}
}
......
......@@ -23,38 +23,38 @@ import java.sql.Timestamp;
@Table(name="uc_user_collection")
public class UserCollection implements Serializable {
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 应用ID
/** 应用ID */
@Column(name = "app_id")
private Long appId;
// 用户ID
/** 用户ID */
@Column(name = "user_id")
private Long userId;
// 收藏夹类型:1-收藏 2-播放记录 3-播放列表 4-评分 5-点赞/关注/订阅
/** 收藏夹类型:1-收藏 2-播放记录 3-播放列表 4-评分 5-点赞/关注/订阅 */
@Column(name = "type")
private Integer type;
// 收藏夹名称
/** 收藏夹名称 */
@Column(name = "name")
private String name;
// 数量
/** 数量 */
@Column(name = "count")
private Integer count;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
......@@ -25,89 +25,89 @@ public class UserCollectionDetail implements Serializable {
@JoinColumn(name = "user_collection_id", insertable = false, updatable = false)
private UserCollection userCollection;
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 收藏夹ID
/** 收藏夹ID */
@Column(name = "user_collection_id")
private Long userCollectionId;
// 自定义收藏内容的类型CODE,默认:DEFAULT
/** 自定义收藏内容的类型CODE,默认:DEFAULT */
@Column(name = "detail_folder_code")
private String detailFolderCode;
// 收藏内容的类型:MEDIA|EPISODE|CATEGORY|SUBJECT|ARTICLE|ARTIST|SCHOOL
/** 收藏内容的类型:MEDIA|EPISODE|CATEGORY|SUBJECT|ARTICLE|ARTIST|SCHOOL */
@Column(name = "detail_type")
private String detailType;
// 收藏内容的ID
/** 收藏内容的ID */
@Column(name = "detail_id")
private Long detailId;
// 收藏内容的CODE
/** 收藏内容的CODE */
@Column(name = "detail_code")
private String detailCode;
// 收藏内容的剧集ID
/** 收藏内容的剧集ID */
@Column(name = "detail_episode_id")
private Long detailEpisodeId;
// 收藏内容的剧集CODE
/** 收藏内容的剧集CODE */
@Column(name = "detail_episode_code")
private String detailEpisodeCode;
// 收藏内容的名称
/** 收藏内容的名称 */
@Column(name = "detail_name")
private String detailName;
// 收藏内容的标记
/** 收藏内容的标记 */
@Column(name = "detail_mark")
private Integer detailMark;
// 收藏内容的图片
/** 收藏内容的图片 */
@Column(name = "detail_img")
private String detailImg;
// 收藏内容的剧集序号
/** 收藏内容的剧集序号 */
@Column(name = "detail_index")
private Integer detailIndex;
// 收藏内容的剧集总数
/** 收藏内容的剧集总数 */
@Column(name = "detail_total_index")
private Integer detailTotalIndex;
// 收藏内容的播放时间
/** 收藏内容的播放时间 */
@Column(name = "detail_play_time")
private Integer detailPlayTime;
// 收藏内容的总时间
/** 收藏内容的总时间 */
@Column(name = "detail_total_time")
private Integer detailTotalTime;
// 收藏内容在同一folder中的顺序
/** 收藏内容在同一folder中的顺序 */
@Column(name = "detail_sequence")
private Integer detailSequence;
// 收藏内容的评分
/** 收藏内容的评分 */
@Column(name = "detail_score")
private Float detailScore;
// 收藏内容(根据文件夹和类型的不同)的点赞/关注/订阅
/** 收藏内容(根据文件夹和类型的不同)的点赞/关注/订阅 */
@Column(name = "detail_like")
private Integer detailLike;
// 收藏内容的扩展数据
/** 收藏内容的扩展数据 */
@Column(name = "detail_ext_data")
private String detailExtData;
// 创建时间
/** 创建时间 */
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@Column(name = "update_time")
private Timestamp updateTime;
......
......@@ -5,6 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import java.util.List;
import java.util.Optional;
/**
......@@ -16,5 +17,6 @@ public interface UserCollectionDetailRepository extends JpaRepository<UserCollec
@Modifying
void deleteAllByUserCollectionId(Long userCollectionId);
Optional<UserCollectionDetail> findByDetailIdAndDetailTypeAndUserCollectionId(Long detailId, String detailType, Long userCollectionId);
// Optional<UserCollectionDetail> findByDetailIdAndDetailTypeAndUserCollectionId(Long detailId, String detailType, Long userCollectionId);
List<UserCollectionDetail> findByDetailIdAndDetailTypeAndUserCollectionId(Long detailId, String detailType, Long userCollectionId);
}
......
......@@ -14,8 +14,7 @@ import java.util.Optional;
*/
public interface UserCollectionRepository extends JpaRepository<UserCollection, Long>, JpaSpecificationExecutor<UserCollection> {
Optional<UserCollection> findFirstByUserIdAndTypeAndName(Long userId, Integer type, String name);
List<UserCollection> findByUserIdAndType(Long userId, Integer type);
Optional<UserCollection> findFirstByUserIdAndTypeAndName(Long userId, Integer type, String name);
}
......
......@@ -2,11 +2,8 @@ package com.topdraw.business.module.user.weixin.collection.service;
import com.topdraw.business.module.user.weixin.collection.domain.UserCollectionDetail;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDetailDTO;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDetailQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author pengmengqing
......@@ -15,27 +12,40 @@ import java.util.Map;
public interface UserCollectionDetailService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(UserCollectionDetailQueryCriteria criteria, Pageable pageable);
/**
* 根据ID查询
* @param id ID
* @return UserCollectionDetailDTO
*/
UserCollectionDetailDTO findById(Long id);
/**
*
* @param resources
* @return
*/
UserCollectionDetailDTO create(UserCollectionDetail resources);
/**
*
* @param resources
*/
void update(UserCollectionDetail resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param id
*/
void deleteAllByUserCollectionId(Long id);
/**
*
* @param userCollectionDetailOptional
*/
void deleteAll(List<UserCollectionDetail> userCollectionDetailOptional);
}
......
......@@ -2,13 +2,10 @@ package com.topdraw.business.module.user.weixin.collection.service;
import com.topdraw.business.module.user.weixin.collection.domain.UserCollection;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDTO;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionQueryCriteria;
import org.springframework.data.domain.Pageable;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
......@@ -18,38 +15,60 @@ import java.util.Optional;
public interface UserCollectionService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(UserCollectionQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<UserCollectionDTO>
*/
List<UserCollectionDTO> queryAll(UserCollectionQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return UserCollectionDTO
*/
UserCollectionDTO findById(Long id);
/**
*
* @param resources
* @return
*/
UserCollectionDTO create(UserCollection resources);
/**
*
* @param resources
*/
void update(UserCollection resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param all
* @param response
* @throws IOException
*/
void download(List<UserCollectionDTO> all, HttpServletResponse response) throws IOException;
/**
*
* @param id
* @param type
* @return
*/
List<UserCollection> findByUserIdAndType(Long id, Integer type);
Optional<UserCollection> findFirstByUserIdAndTypeAndName(Long id, Integer type, String name);
/**
*
* @param id
* @param type
* @param name
* @return
*/
UserCollection findFirstByUserIdAndTypeAndName(Long id, Integer type, String name);
/**
*
* @param userCollection
* @return
*/
UserCollection save(UserCollection userCollection);
}
......
......@@ -13,27 +13,27 @@ import java.sql.Timestamp;
@Data
public class UserCollectionDTO implements Serializable {
// ID
/** ID */
private Long id;
// 应用ID
/** 应用ID */
private Long appId;
// 用户ID
/** 用户ID */
private Long userId;
// 收藏夹类型:1-收藏 2-播放记录 3-播放列表 4-评分 5-点赞/关注/订阅
/** 收藏夹类型:1-收藏 2-播放记录 3-播放列表 4-评分 5-点赞/关注/订阅 */
private Integer type;
// 收藏夹名称
/** 收藏夹名称 */
private String name;
// 数量
/** 数量 */
private Integer count;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
......@@ -14,71 +14,71 @@ import java.sql.Timestamp;
@Data
public class UserCollectionDetailDTO implements Serializable {
// ID
/** ID */
private Long id;
// 收藏夹ID
/** 收藏夹ID */
private Long userCollectionId;
// 自定义收藏内容的类型CODE,默认:DEFAULT
/** 自定义收藏内容的类型CODE,默认:DEFAULT */
private String detailFolderCode;
// 收藏内容的类型:MEDIA|EPISODE|CATEGORY|SUBJECT|ARTICLE|ARTIST|SCHOOL
/** 收藏内容的类型:MEDIA|EPISODE|CATEGORY|SUBJECT|ARTICLE|ARTIST|SCHOOL */
private String detailType;
// 收藏内容的ID
/** 收藏内容的ID */
private Long detailId;
// 收藏内容的CODE
/** 收藏内容的CODE */
private String detailCode;
// 收藏内容的剧集ID
/** 收藏内容的剧集ID */
private Long detailEpisodeId;
// 收藏内容的剧集CODE
/** 收藏内容的剧集CODE */
private String detailEpisodeCode;
// 收藏内容的名称
/** 收藏内容的名称 */
private String detailName;
// 收藏内容的标记
/** 收藏内容的标记 */
private Integer detailMark;
// 收藏内容的图片
/** 收藏内容的图片 */
private String detailImg;
// 收藏内容的剧集序号
/** 收藏内容的剧集序号 */
private Integer detailIndex;
// 收藏内容的剧集总数
/** 收藏内容的剧集总数 */
private Integer detailTotalIndex;
// 收藏内容的播放时间
/** 收藏内容的播放时间 */
private Integer detailPlayTime;
// 收藏内容的总时间
/** 收藏内容的总时间 */
private Integer detailTotalTime;
// 收藏内容在同一folder中的顺序
/** 收藏内容在同一folder中的顺序 */
private Integer detailSequence;
// 收藏内容的评分
/** 收藏内容的评分 */
private Float detailScore;
// 收藏内容(根据文件夹和类型的不同)的点赞/关注/订阅
/** 收藏内容(根据文件夹和类型的不同)的点赞/关注/订阅 */
private Integer detailLike;
// 收藏内容的扩展数据
/** 收藏内容的扩展数据 */
private String detailExtData;
// 创建时间
/** 创建时间 */
@JsonFormat(
pattern = "MM月dd日 HH:mm",
timezone = "GMT+8"
)
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@JsonFormat(
pattern = "MM月dd日 HH:mm",
timezone = "GMT+8"
......
package com.topdraw.business.module.user.weixin.collection.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
import javax.persistence.criteria.JoinType;
/**
* @author pengmengqing
* @date 2021-04-02
*/
@Data
public class UserCollectionDetailQueryCriteria{
private Long userWeixinId;
@Query(joinType = JoinType.INNER, joinName = "userCollection")
private Long userId;
@Query(joinType = JoinType.INNER, joinName = "userCollection")
private Integer type;
private String detailType;
private String detailFolderCode = "DEFAULT";
private Long detailId;
}
package com.topdraw.business.module.user.weixin.collection.service.dto;
import lombok.Data;
/**
* @author pengmengqing
* @date 2021-04-02
*/
@Data
public class UserCollectionQueryCriteria{
}
......@@ -4,13 +4,10 @@ import com.topdraw.business.module.user.weixin.collection.domain.UserCollectionD
import com.topdraw.business.module.user.weixin.collection.repository.UserCollectionDetailRepository;
import com.topdraw.business.module.user.weixin.collection.service.UserCollectionDetailService;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDetailDTO;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDetailQueryCriteria;
import com.topdraw.business.module.user.weixin.collection.service.mapper.UserCollectionDetailMapper;
import com.topdraw.utils.*;
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;
......@@ -28,15 +25,9 @@ public class UserCollectionDetailServiceImpl implements UserCollectionDetailServ
@Autowired
private UserCollectionDetailRepository userCollectionDetailRepository;
@Autowired
private UserCollectionDetailMapper userCollectionDetailMapper;
@Override
public Map<String, Object> queryAll(UserCollectionDetailQueryCriteria criteria, Pageable pageable) {
Page<UserCollectionDetail> page = userCollectionDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(userCollectionDetailMapper::toDto));
}
@Override
public UserCollectionDetailDTO findById(Long id) {
......
......@@ -4,16 +4,11 @@ import com.topdraw.business.module.user.weixin.collection.domain.UserCollection;
import com.topdraw.business.module.user.weixin.collection.repository.UserCollectionRepository;
import com.topdraw.business.module.user.weixin.collection.service.UserCollectionService;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDTO;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionQueryCriteria;
import com.topdraw.business.module.user.weixin.collection.service.mapper.UserCollectionMapper;
import com.topdraw.utils.FileUtil;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
......@@ -37,19 +32,6 @@ public class UserCollectionServiceImpl implements UserCollectionService {
@Autowired
private UserCollectionMapper userCollectionMapper;
@Override
public Map<String, Object> queryAll(UserCollectionQueryCriteria criteria, Pageable pageable) {
Page<UserCollection> page = userCollectionRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(userCollectionMapper::toDto));
}
@Override
public List<UserCollectionDTO> queryAll(UserCollectionQueryCriteria criteria) {
return userCollectionMapper.toDto(userCollectionRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public UserCollectionDTO findById(Long id) {
UserCollection userCollection = userCollectionRepository.findById(id).orElseGet(UserCollection::new);
......@@ -106,8 +88,10 @@ public class UserCollectionServiceImpl implements UserCollectionService {
}
@Override
public Optional<UserCollection> findFirstByUserIdAndTypeAndName(Long id, Integer type, String name) {
return Optional.empty();
public UserCollection findFirstByUserIdAndTypeAndName(Long id, Integer type, String name) {
UserCollection userCollection =
this.userCollectionRepository.findFirstByUserIdAndTypeAndName(id, type, name).orElseGet(UserCollection::new);
return userCollection;
}
@Override
......
package com.topdraw.business.module.user.weixin.domain;
import com.topdraw.business.module.common.domain.DefaultAsyncMqModule;
import com.fasterxml.jackson.annotation.JsonFormat;
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 org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
......@@ -22,113 +24,114 @@ 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 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 用户ID
/** 用户ID */
@Column(name = "member_id")
private Long memberId;
// 微信unionid,针对开发者
/** 微信unionid,针对开发者 */
@Column(name = "unionid")
private String unionid;
// 微信appid
/** 微信appid */
@Column(name = "appid")
private String appid;
// 微信openid,针对微信app
/** 微信openid,针对微信app */
@Column(name = "openid")
private String openid;
// 关注状态 0 -未关注 1 - 已关注
/** 关注状态 0 -未关注 1 - 已关注 */
@Column(name = "status")
private Integer status;
// 关注同步状态 0-未同步,1-已同步
/** 关注同步状态 0-未同步,1-已同步 */
@Column(name = "sync_status")
private Integer syncStatus;
// 昵称
/** 昵称 */
@Column(name = "nickname")
private String nickname;
// 头像地址
/** 头像地址 */
@Column(name = "headimgurl")
private String headimgurl;
// 特权信息
/** 特权信息 */
@Column(name = "privilege")
private String privilege;
// 刷新凭据
/** 刷新凭据 */
@Column(name = "refresh_token")
private String refreshToken;
// 凭据
/** 凭据 */
@Column(name = "access_token")
private String accessToken;
// 超时(秒)
/** 超时(秒) */
@Column(name = "expires_in")
private Integer expiresIn;
// 超时时间
/** 超时时间 */
@Column(name = "expires_time")
private Timestamp expiresTime;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 创建者
/** 创建者 */
@Column(name = "create_by")
private String createBy;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新者
/** 更新者 */
@Column(name = "update_by")
private String updateBy;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
// 来源类型
/** 来源类型 */
@Column(name = "source_type")
private String sourceType;
// 来源id
/** 来源id */
@Column(name = "source_id")
private String sourceId;
// 来源id
/** 来源id */
@Column(name = "source_desc")
private String sourceDesc;
// 人id
/** 人id */
@Column(name = "person_id")
private Long personId;
// 来源用户id
/** 来源用户id */
@Column(name = "source_user")
private Long sourceUser;
// 来源实体:活动-activity/商品-item
/** 来源实体:活动-activity/商品-item */
@Column(name = "source_entity")
private String sourceEntity;
// 授权时间
/** 授权时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@Column(name = "auth_time")
private Timestamp authTime;
......
package com.topdraw.business.module.user.weixin.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.TimestampUtil;
import org.apache.commons.lang3.StringUtils;
import java.sql.Timestamp;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/14 17:02
* @version: :
* @modified By:
* @since : modified in 2022/3/14 17:02
*/
public class UserWeixinBuilder {
public static UserWeixin build(Long memberId,String appId,String openId,String unionId,String nickname,String headimgurl){
UserWeixin userWeixin = new UserWeixin();
userWeixin.setAppid(appId);
userWeixin.setOpenid(openId);
userWeixin.setUnionid(unionId);
userWeixin.setNickname(nickname);
userWeixin.setHeadimgurl(headimgurl);
return build(memberId,userWeixin);
}
public static UserWeixin build(Long memberId,String appId,String openId,String unionId){
UserWeixin userWeixin = new UserWeixin();
userWeixin.setAppid(appId);
userWeixin.setOpenid(openId);
userWeixin.setUnionid(unionId);
return build(memberId,userWeixin);
}
public static UserWeixin build(UserWeixin userWeixin){
return build(userWeixin.getId(),
userWeixin.getMemberId(),
userWeixin.getMemberCode(),
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Long memberId , String memberCode, UserWeixin userWeixin){
return build(userWeixin.getId(),
memberId,
memberCode,
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Long memberId , UserWeixin userWeixin){
return build(userWeixin.getId(),
memberId,
userWeixin.getMemberCode(),
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Member member , UserWeixin userWeixin) {
return build(userWeixin.getId(),
member.getId(),
member.getCode(),
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Long id ,
Long memberId,
String memberCode,
String unionId, String appId,String openId,
Integer status, Integer syncStatus,
String nickname,String headimgurl,
String privilege,String refreshToken,
String accessToken,Integer expiresIn,Timestamp expiresTime,String description,
String createBy,String updateBy,
String sourceType,String sourceId,
String sourceDesc,
Long sourceUser,String sourceEntity,
String country,String province,String city,
Integer sex){
if (Objects.isNull(memberId)) {
throw new BadRequestException(GlobeExceptionMsg.MEMBER_ID_IS_NULL);
}
UserWeixin userWeixin = new UserWeixin();
userWeixin.setId(Objects.nonNull(id)?id:null);
userWeixin.setMemberId(memberId);
userWeixin.setMemberCode(memberCode);
userWeixin.setUnionid(StringUtils.isNotBlank(unionId)?unionId:"");
userWeixin.setAppid(StringUtils.isNotBlank(appId)?appId:"");
userWeixin.setOpenid(StringUtils.isNotBlank(openId)?openId:"");
userWeixin.setStatus(Objects.nonNull(status)?status:0);
userWeixin.setSyncStatus(Objects.nonNull(syncStatus)?syncStatus:0);
userWeixin.setNickname(StringUtils.isNotBlank(nickname)?nickname:"");
userWeixin.setHeadimgurl(StringUtils.isNotBlank(headimgurl)?headimgurl:"");
userWeixin.setPrivilege(StringUtils.isNotBlank(privilege)?privilege:"");
userWeixin.setRefreshToken(StringUtils.isNotBlank(refreshToken)?refreshToken:"");
userWeixin.setAccessToken(StringUtils.isNotBlank(accessToken)?accessToken:"");
userWeixin.setExpiresIn(expiresIn);
userWeixin.setExpiresTime(expiresTime);
userWeixin.setDescription(StringUtils.isNotBlank(description)?description:"");
userWeixin.setCreateBy(StringUtils.isNotBlank(createBy)?createBy:"system");
userWeixin.setUpdateBy(StringUtils.isNotBlank(updateBy)?updateBy:"system");
userWeixin.setSourceType(StringUtils.isNotBlank(sourceType)?sourceType:"");
userWeixin.setSourceId(StringUtils.isNotBlank(sourceId)?sourceId:"");
userWeixin.setSourceDesc(StringUtils.isNotBlank(sourceDesc)?sourceId:"");
userWeixin.setSourceUser(Objects.nonNull(sourceUser)?sourceUser:0L);
userWeixin.setSourceEntity(StringUtils.isNotBlank(sourceEntity)?sourceEntity:"");
// userWeixin.setAuthTime(TimestampUtil.now());
userWeixin.setCountry(StringUtils.isNotBlank(country)?country:"");
userWeixin.setProvince(StringUtils.isNotBlank(province)?province:"");
userWeixin.setCity(StringUtils.isNotBlank(city)?city:"");
userWeixin.setSex(Objects.nonNull(sex)?sex:-1);
return userWeixin;
}
}
......@@ -26,8 +26,12 @@ public interface UserWeixinRepository extends JpaRepository<UserWeixin, Long>, J
Optional<UserWeixin> findFirstByUnionidAndAppid(String unionid, String appId);
Optional<UserWeixin> findFirstByMemberId(Long memberId);
@Modifying
@Transactional
@Query(value = "update uc_user_weixin set update_time = :#{#resources.updateTime} where appid = :#{#resources.appid} and openid = :#{#resources.openid}" , nativeQuery = true)
@Query(value = "update `uc_user_weixin` set update_time = :#{#resources.updateTime} " +
"where appid = :#{#resources.appid} and openid = :#{#resources.openid}", nativeQuery = true)
void updateTime(@Param("resources") UserWeixin resources);
}
......
......@@ -4,9 +4,7 @@ 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;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
......@@ -15,26 +13,14 @@ import io.swagger.annotations.*;
* @author XiangHan
* @date 2021-12-16
*/
@Api(tags = "UserWeixin管理")
@Api(tags = "微信管理")
@RestController
@RequestMapping("/ucEngine/api/userWeixin")
@RequestMapping("/uce/userWeixin")
public class UserWeixinController {
@Autowired
private UserWeixinService UserWeixinService;
@GetMapping
@ApiOperation("查询UserWeixin")
public ResultInfo getUserWeixins(UserWeixinQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(UserWeixinService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有UserWeixin")
public ResultInfo getUserWeixins(UserWeixinQueryCriteria criteria) {
return ResultInfo.success(UserWeixinService.queryAll(criteria));
}
@PostMapping(value = "/create")
@ApiOperation("新增UserWeixin")
@AnonymousAccess
......@@ -59,11 +45,4 @@ public class UserWeixinController {
return ResultInfo.success();
}
@DeleteMapping(value = "/{id}")
@ApiOperation("删除UserWeixin")
public ResultInfo delete(@PathVariable Long id) {
UserWeixinService.delete(id);
return ResultInfo.success();
}
}
......
......@@ -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,42 +10,81 @@ 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
*/
UserWeixinDTO findById(Long id);
UserWeixin create(UserWeixin resources);
/**
*
* @param resources
* @return
*/
UserWeixinDTO create(UserWeixin resources);
void update(UserWeixin resources);
/**
*
* @param resources
*/
UserWeixinDTO update(UserWeixin resources);
/**
*
* @param resources
*/
void updateTime(UserWeixin resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param memberId
* @param appid
* @return
*/
UserWeixinDTO findFirstByMemberIdAndAppid(Long memberId, String appid);
/**
*
* @param unionId
* @param appId
* @param openId
* @return
*/
UserWeixinDTO findFirstByUnionIdAndAppIdAndOpenId(String unionId, String appId, String openId);
/**
*
* @param appId
* @param openId
* @return
*/
UserWeixinDTO findFirstByAppIdAndOpenId(String appId, String openId);
/**
*
* @param unionid
* @return
*/
UserWeixinDTO findFirstByUnionId(String unionid);
/**
*
* @param unionid
* @param appId
* @return
*/
UserWeixinDTO findFirstByUnionidAndAppid(String unionid, String appId);
/**
*
* @param memberId
* @return
*/
UserWeixinDTO findFirstByMemberId(Long memberId);
}
......
......@@ -16,94 +16,98 @@ import java.io.Serializable;
@Data
public class UserWeixinDTO implements Serializable {
// ID
private Long id;
// memberCode
private String memberCode;
// 用户ID
/** ID */
private Long id;
/** 用户ID */
private Long memberId;
// 微信unionid,针对开发者
/** 微信unionid,针对开发者 */
private String unionid;
// 微信appid
/** 微信appid */
private String appid;
// 微信openid,针对微信app
/** 微信openid,针对微信app */
private String openid;
// 关注状态 0 -未关注 1 - 已关注
/** 关注状态 0 -未关注 1 - 已关注 */
private Integer status;
// 关注同步状态 0-未同步,1-已同步
/** 关注同步状态 0-未同步,1-已同步 */
private Integer syncStatus;
// 昵称
/** 昵称 */
private String nickname;
// 头像地址
/** 头像地址 */
private String headimgurl;
// 特权信息
/** 特权信息 */
private String privilege;
// 刷新凭据
/** 刷新凭据 */
private String refreshToken;
// 凭据
/** 凭据 */
private String accessToken;
// 超时(秒)
/** 超时(秒) */
private Integer expiresIn;
// 超时时间
/** 超时时间 */
private Timestamp expiresTime;
// 描述
/** 描述 */
private String description;
// 创建者
/** 创建者 */
private String createBy;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新者
/** 更新者 */
private String updateBy;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
// 来源类型
/** 来源类型 */
private String sourceType;
// 来源id
/** 来源id */
private String sourceId;
// 来源id
/** 来源id */
private String sourceDesc;
// 人id
/** 人id */
private Long personId;
// 来源用户id
/** 来源用户id */
private Long sourceUser;
// 来源实体:活动-activity/商品-item
/** 来源实体:活动-activity/商品-item */
private String sourceEntity;
// 授权时间
/** 授权时间 */
private Timestamp authTime;
/** */
private Integer gender;
/** */
private String country;
/** */
private String province;
/** */
private String city;
/** */
private Integer sex;
}
......
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
......@@ -31,91 +23,85 @@ import java.util.Map;
public class UserWeixinServiceImpl implements UserWeixinService {
@Autowired
private UserWeixinRepository UserWeixinRepository;
private UserWeixinRepository userWeixinRepository;
@Autowired
private UserWeixinMapper UserWeixinMapper;
@Override
public Map<String, Object> queryAll(UserWeixinQueryCriteria criteria, Pageable pageable) {
Page<UserWeixin> page = UserWeixinRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(UserWeixinMapper::toDto));
}
@Override
public List<UserWeixinDTO> queryAll(UserWeixinQueryCriteria criteria) {
return UserWeixinMapper.toDto(UserWeixinRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private UserWeixinMapper userWeixinMapper;
@Override
public UserWeixinDTO findById(Long id) {
UserWeixin UserWeixin = UserWeixinRepository.findById(id).orElseGet(UserWeixin::new);
UserWeixin UserWeixin = this.userWeixinRepository.findById(id).orElseGet(UserWeixin::new);
ValidationUtil.isNull(UserWeixin.getId(),"UserWeixin","id",id);
return UserWeixinMapper.toDto(UserWeixin);
return this.userWeixinMapper.toDto(UserWeixin);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public UserWeixin create(UserWeixin resources) {
UserWeixinRepository.save(resources);
return resources;
public UserWeixinDTO create(UserWeixin resources) {
UserWeixin build = UserWeixinBuilder.build(resources);
UserWeixin userWeixin = this.userWeixinRepository.save(build);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void update(UserWeixin resources) {
UserWeixin UserWeixin = UserWeixinRepository.findById(resources.getId()).orElseGet(UserWeixin::new);
ValidationUtil.isNull( UserWeixin.getId(),"UserWeixin","id",resources.getId());
UserWeixin.copy(resources);
UserWeixinRepository.save(UserWeixin);
public UserWeixinDTO update(UserWeixin resources) {
UserWeixin userWeixin = this.userWeixinRepository.findById(resources.getId()).orElseGet(UserWeixin::new);
ValidationUtil.isNull( userWeixin.getId(),"UserWeixin","id",resources.getId());
userWeixin.copy(resources);
UserWeixin _userWeixin = this.userWeixinRepository.save(userWeixin);
return this.userWeixinMapper.toDto(_userWeixin);
}
@Override
@AsyncMqSend
public void updateTime(UserWeixin resources) {
UserWeixinRepository.updateTime(resources);
this.userWeixinRepository.updateTime(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
UserWeixin UserWeixin = UserWeixinRepository.findById(id).orElseThrow(
UserWeixin UserWeixin = this.userWeixinRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", UserWeixin.class, id), 1));
UserWeixinRepository.delete(UserWeixin);
this.userWeixinRepository.delete(UserWeixin);
}
@Override
public UserWeixinDTO findFirstByMemberIdAndAppid(Long memberId, String appid) {
UserWeixin userWeixin = this.UserWeixinRepository.findFirstByMemberIdAndAppid(memberId, appid).orElseGet(UserWeixin::new);
UserWeixin userWeixin = this.userWeixinRepository.findFirstByMemberIdAndAppid(memberId, appid).orElseGet(UserWeixin::new);
ValidationUtil.isNull(userWeixin.getId(),"UserWeixin","id",memberId);
return UserWeixinMapper.toDto(userWeixin);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
public UserWeixinDTO findFirstByUnionIdAndAppIdAndOpenId(String unionId, String appId, String openId) {
UserWeixin userWeixin = this.UserWeixinRepository.findFirstByUnionidAndAppidAndOpenid(unionId, appId,openId).orElseGet(UserWeixin::new);
return UserWeixinMapper.toDto(userWeixin);
UserWeixin userWeixin = this.userWeixinRepository.findFirstByUnionidAndAppidAndOpenid(unionId, appId,openId).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
public UserWeixinDTO findFirstByAppIdAndOpenId(String appId, String openId) {
UserWeixin userWeixin = this.UserWeixinRepository.findFirstByAppidAndOpenid(appId,openId).orElseGet(UserWeixin::new);
return UserWeixinMapper.toDto(userWeixin);
UserWeixin userWeixin = this.userWeixinRepository.findFirstByAppidAndOpenid(appId,openId).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
public UserWeixinDTO findFirstByUnionId(String unionid) {
UserWeixin userWeixin = this.UserWeixinRepository.findFirstByUnionid(unionid).orElseGet(UserWeixin::new);
return UserWeixinMapper.toDto(userWeixin);
UserWeixin userWeixin = this.userWeixinRepository.findFirstByUnionid(unionid).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
public UserWeixinDTO findFirstByUnionidAndAppid(String unionid, String appId) {
UserWeixin userWeixin = this.UserWeixinRepository.findFirstByUnionidAndAppid(unionid,appId).orElseGet(UserWeixin::new);
return UserWeixinMapper.toDto(userWeixin);
UserWeixin userWeixin = this.userWeixinRepository.findFirstByUnionidAndAppid(unionid,appId).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
public UserWeixinDTO findFirstByMemberId(Long memberId) {
UserWeixin userWeixin = this.userWeixinRepository.findFirstByMemberId(memberId).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
}
......
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.process.domian;
import com.topdraw.business.module.common.validated.CreateGroup;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -15,77 +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;
// vis_user表主键
private Long visUserId;
// 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;
......
......@@ -5,9 +5,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
* 权益-非持久化数据
......@@ -51,12 +49,11 @@ public class TempRights {
/** 过期时间 */
@Transient
protected LocalDateTime expireTime;
protected Timestamp expireTime;
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
@Transient
@NotNull(message = "设备类型不得为空")
protected Integer deviceType;
/** 应用code(表示当前用户对应应用的标识) */
......
package com.topdraw.business.process.domian;
package com.topdraw.business.process.domian.constant;
public enum RightType {
/**积分*/
......
package com.topdraw.business.process.domian.result;
package com.topdraw.business.process.domian.constant;
public interface TaskTemplateType {
......@@ -6,5 +6,9 @@ public interface TaskTemplateType {
int TYPE_2 = 2;
int TYPE_3 = 3;
int TYPE_4 = 4;
// 签到
int TYPE_6 = 6;
// 播放记录
int TYPE_8 = 8;
}
......
package com.topdraw.business.process.domian.member;
import lombok.Data;
import java.sql.Timestamp;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/4/7 12:48
* @version: :
* @modified By:
* @since : modified in 2022/4/7 12:48
*/
@Data
public class MemberOperationBean {
private String memberCode;
private Long memberId;
private Integer vip;
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Timestamp vipExpireTime;
}
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;
import javax.validation.constraints.NotNull;
@Data
public class BindBean extends WeiXinUserBean {
private Long platformUserId;
@NotNull(message = "platformAccount can't be null" , groups = {BindGroup.class})
private String platformAccount;
private String memberCode;
}
......
package com.topdraw.business.process.domian.weixin;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/20 16:43
* @version: :
* @modified By:
* @since : modified in 2022/3/20 16:43
*/
public interface BindGroup {
}
......@@ -3,6 +3,7 @@ package com.topdraw.business.process.domian.weixin;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -15,8 +16,8 @@ public class BuyVipBean extends WeiXinUserBean {
private Integer vip;
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime vipExpireTime;
// @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss")
private Timestamp vipExpireTime;
}
......
......@@ -25,8 +25,8 @@ public class SubscribeBean extends WeiXinUserBean {
/** */
private String eventKey;
private String unionid;
private String nickname;
private String headimgurl;
private String sourceInfo;
}
......
package com.topdraw.business.process.domian.weixin;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class TvUnBindBean extends BindBean {
/** 是否自动设置主账号 true:是;false(默认):否 */
private Boolean autoModel;
/** 需要绑定的会员code */
private String bindMemberCode;
}
package com.topdraw.business.process.domian.weixin;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/20 16:43
* @version: :
* @modified By:
* @since : modified in 2022/3/20 16:43
*/
public interface UnbindGroup {
}
package com.topdraw.business.process.domian.weixin;
import lombok.Data;
import java.sql.Timestamp;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/4/7 12:48
* @version: :
* @modified By:
* @since : modified in 2022/4/7 12:48
*/
@Data
public class UserOperationBean {
private Long userId;
private Integer vip;
private Timestamp vipExpireTime;
}
......@@ -3,6 +3,8 @@ package com.topdraw.business.process.domian.weixin;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 微信账户信息
* @author XiangHan
......@@ -13,6 +15,7 @@ public class WeiXinUserBean {
private Long id;
// @NotNull(message = "unionid can't be null" , groups = {BindGroup.class})
private String unionid;
/** */
......@@ -33,6 +36,9 @@ public class WeiXinUserBean {
/** 会员id */
private Long memberId;
/** 会员code */
private String memberCode;
/** 加密信息 */
private String encryptedData;
......@@ -54,7 +60,15 @@ public class WeiXinUserBean {
/** 推荐者id */
private Long sourceUser;
/** 昵称 */
private String nikename;
/** 头像 */
private String headimgurl;
/** 授权码 */
private String authCode;
/** 来源信息 */
private String resourceInfo;
}
......
package com.topdraw.business.process.domian.weixin;
import lombok.Data;
@Data
public class WeixinUnBindBean extends WeiXinUserBean {
/** 是否自动设置主账号 true:是;false(默认):否 */
private Boolean autoModel;
}
......@@ -14,9 +14,9 @@ import java.util.List;
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "CouponOperation管理")
@Api(tags = "优惠券管理")
@RestController
@RequestMapping("/api/CouponOperation")
@RequestMapping("/uce/couponOperation")
public class CouponOperationController {
@Autowired
......
package com.topdraw.business.process.rest;
import com.topdraw.business.process.domian.TempCoupon;
import com.topdraw.business.process.domian.TempExp;
import com.topdraw.business.process.service.CouponOperationService;
import com.topdraw.business.process.service.ExpOperationService;
import com.topdraw.common.ResultInfo;
import io.swagger.annotations.Api;
......@@ -21,9 +19,9 @@ import java.util.List;
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "ExpOperation管理")
@Api(tags = "成长值管理")
@RestController
@RequestMapping("/api/ExpOperation")
@RequestMapping("/uce/expOperation")
public class ExpOperationController {
@Autowired
......
package com.topdraw.business.process.rest;
import cn.hutool.core.util.ObjectUtil;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinQueryCriteria;
import com.topdraw.business.process.domian.member.MemberOperationBean;
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.business.process.service.member.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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.sql.Timestamp;
import java.util.Objects;
@Api("会员处理")
@RestController
@RequestMapping(value = "/ucEngine/api/memberOperation")
@RequestMapping(value = "/uce/memberOperation")
@CrossOrigin
@Slf4j
public class MemberOperationController {
@Autowired
private MemberOperationService memberOperationService;
@Autowired
private MemberVipHistoryService memberVipHistoryService;
@Autowired
private UserWeixinService userWeixinService;
@Autowired
private MemberService memberService;
@RequestMapping(value = "/updateVipByMemberId")
@ApiOperation("手动修改vip")
@AnonymousAccess
public ResultInfo updateVipByMemberId(@Validated(value = {UpdateGroup.class}) @RequestBody MemberOperationBean resources) {
log.info("member ==>> doUpdateVipByCode ==>> param ==>> [{}]",resources);
Integer vip = resources.getVip();
Timestamp vipExpireTime = resources.getVipExpireTime();
Long memberId = resources.getMemberId();
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
if (Objects.nonNull(vip)) {
member.setVip(vip);
}
if (Objects.nonNull(vipExpireTime)) {
member.setVipExpireTime(vipExpireTime);
}
this.memberOperationService.update(member);
return ResultInfo.success();
}
@RequestMapping(value = "/updateVipByMemberCode")
@ApiOperation("手动修改vip")
@AnonymousAccess
public ResultInfo updateVipByMemberCode(@Validated(value = {UpdateGroup.class}) @RequestBody MemberOperationBean resources) {
log.info("member ==>> doUpdateVipByCode ==>> param ==>> [{}]",resources);
Integer vip = resources.getVip();
Timestamp vipExpireTime = resources.getVipExpireTime();
String memberCode = resources.getMemberCode();
MemberDTO memberDTO = this.memberOperationService.findByCode(memberCode);
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
if (Objects.nonNull(vip)) {
member.setVip(vip);
}
if (Objects.nonNull(vipExpireTime)) {
member.setVipExpireTime(vipExpireTime);
}
this.createVipHistory(memberDTO.getId(), memberDTO.getCode(), vip, vipExpireTime);
this.memberOperationService.updateMemberVip(member);
return ResultInfo.success();
}
private void createVipHistory(Long memberId, String code, Integer vip , Timestamp vipExpireTime){
BuyVipBean buyVipBean = new BuyVipBean();
buyVipBean.setMemberId(memberId);
buyVipBean.setMemberCode(code);
buyVipBean.setVip(vip);
buyVipBean.setVipExpireTime(vipExpireTime);
this.memberOperationService.buyVipByMemberId(buyVipBean);
}
@GetMapping("/getMemberProfileAndCheckVip/{appId}/{memberId}")
@ApiOperation("获取会员基本信息并且检查vip状态")
......@@ -50,9 +101,10 @@ public class MemberOperationController {
@PutMapping("/buyVip")
@ApiOperation("购买vip")
@AnonymousAccess
@Deprecated
public ResultInfo buyVip(@RequestBody BuyVipBean buyVipBean) {
// 小程序账户id
/* // 小程序账户id
Long id = buyVipBean.getId();
if (Objects.isNull(id))
throw new BadRequestException("参数异常: id is null !");
......@@ -62,45 +114,9 @@ public class MemberOperationController {
if (Objects.isNull(vip) || vip <= 0)
throw new BadRequestException("vip 等级有误");
MemberDTO memberDTO = memberOperationService.buyVip(buyVipBean);
LocalDateTime vipExpireTime = buyVipBean.getVipExpireTime();
// this.doInsertVipHistory(id,vip,vipExpireTime);
return ResultInfo.success(memberDTO);
}
private void doInsertVipHistory(Long id,Integer vip,LocalDateTime vipExpireTime) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findById(id);
Long memberId = userWeixinDTO.getMemberId();
MemberDTO member = this.memberService.findById(memberId);
LocalDateTime now = LocalDateTime.now();
MemberVipHistory memberVipHistory = new MemberVipHistory();
if (ObjectUtil.isNull(vipExpireTime)) {
LocalDateTime localDateTime = now.plusYears(1L);
member.setVipExpireTime(localDateTime);
} else {
//购买过 判断当前时间有没有过vip过期时间,没有过,失效时间加一年; 过了,当前时间加一年
//区分是当前vip续费 还是买新的vip
if (ObjectUtil.equal(vip, member.getVip())) {
if (now.isBefore(vipExpireTime)) {
LocalDateTime localDateTime = vipExpireTime.plusYears(1L);
member.setVipExpireTime(localDateTime);
} else {
LocalDateTime localDateTime = now.plusYears(1L);
member.setVipExpireTime(localDateTime);
}
} else {
LocalDateTime localDateTime = now.plusYears(1L);
member.setVipExpireTime(localDateTime);
}
}
memberVipHistory.setVipExpireTime(member.getVipExpireTime());
memberVipHistoryService.create(memberVipHistory);
MemberDTO memberDTO = this.memberOperationService.buyVip(buyVipBean);
return ResultInfo.success(memberDTO);*/
return null;
}
}
......
......@@ -3,28 +3,22 @@ package com.topdraw.business.process.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.points.available.service.PointsAvailableService;
import com.topdraw.business.module.points.available.service.dto.PointsAvailableQueryCriteria;
import com.topdraw.business.module.points.available.service.dto.PointsAvailableQueryType;
import com.topdraw.business.module.points.detail.service.PointsDetailService;
import com.topdraw.business.module.points.detail.service.dto.PointsDetailQueryCriteria;
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.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;
import com.topdraw.util.TimestampUtil;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -38,44 +32,20 @@ import java.util.Objects;
*/
@Api(tags = "PointsOperation管理")
@RestController
@RequestMapping("/ucEngine/api/pointsOperation")
@RequestMapping("/uce/pointsOperation")
@Slf4j
public class PointsOperationController {
private static final Logger LOG = LoggerFactory.getLogger(PointsOperationController.class);
@Autowired
PointsOperationService pointsOperationService;
@Autowired
PointsDetailService pointsDetailService;
private UserTvService userTvService;
@Autowired
PointsAvailableService pointsAvailableService;
private MemberService memberService;
@Autowired
UserTvService userTvService;
private UserWeixinService userWeixinService;
@Autowired
UserWeixinService userWeixinService;
@Autowired
MemberService memberService;
@GetMapping(value = "/pagePointsDetails")
@ApiOperation("查询PointsDetail")
@AnonymousAccess
public ResultInfo pagePointsDetails(PointsDetailQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(pointsDetailService.queryAll(criteria,pageable));
}
@GetMapping(value = "/pageAvailablePoints")
@ApiOperation("查询PointsAvailable")
@AnonymousAccess
public ResultInfo pageAvailablePoints(PointsAvailableQueryCriteria criteria, Pageable pageable) {
PointsAvailableQueryType queryType = criteria.getQueryType();
// 可用
if (queryType == PointsAvailableQueryType.AVAILABLE_ONLY) {
criteria.setExpireTime(TimestampUtil.now());
}
return ResultInfo.successPage(pointsAvailableService.queryAll(criteria,pageable));
}
private PointsOperationService pointsOperationService;
// @Log("清除过期积分并计算总积分,供客户端会员查询积分时调用")
@GetMapping(value = "/cleanInvalidPointsAndCalculateCurrentPoints/{id}")
@ApiOperation("清除过期积分并计算总积分,供客户端会员查询积分时调用")
@AnonymousAccess
......@@ -84,10 +54,11 @@ public class PointsOperationController {
return ResultInfo.success(Objects.isNull(aLong) ? 0L : aLong);
}
@PostMapping(value = "/grantPointsByManual")
// @Log("手动发放积分")
@PostMapping(value = "/addPoints")
@ApiOperation("手动发放积分")
@AnonymousAccess
public ResultInfo grantPointsByManual(@Validated @RequestBody TempPoints tempPoints) {
public ResultInfo addPoints(@Validated @RequestBody TempPoints tempPoints) {
Long memberId = tempPoints.getMemberId();
Long points = tempPoints.getPoints();
Assert.notNull(memberId,"memberId can't be null!");
......@@ -119,18 +90,19 @@ public class PointsOperationController {
Long orderId = tempIptvUser.getOrderId();
Integer deviceType = tempIptvUser.getDeviceType();
TempPoints tempPoints = new TempPoints();
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
Long memberId = userTvDTO.getMemberId();
if (Objects.isNull(memberId)) {
return ResultInfo.failed("会员信息不存在");
// return ResultInfo.failed("会员信息不存在");
return ResultInfo.failure("会员信息不存在");
}
MemberDTO memberDTO = this.memberService.findById(memberId);
tempPoints.setMemberCode(memberDTO.getCode());
tempPoints.setMemberId(memberId);
}
tempPoints.setPoints(points);
tempPoints.setDeviceType(deviceType);
tempPoints.setAppCode(LocalConstants.APP_CODE_CHONGQING_CHONGSHU_VIS);
......@@ -161,7 +133,8 @@ public class PointsOperationController {
memberId = this.getMemberIdByWeiXinUserId(userId);
}
if (Objects.isNull(memberId)) {
return ResultInfo.failed("会员信息不存在");
// return ResultInfo.failed("会员信息不存在");
return ResultInfo.failure("会员信息不存在");
}
tempPoints.setMemberId(memberId);
return this.customPoints(tempPoints);
......@@ -203,6 +176,33 @@ public class PointsOperationController {
return ResultInfo.success(Arrays.asList(b),description);
}
// @Log("积分兑换商品")
@PostMapping(value = "/consumeItemPoints")
@ApiOperation("积分兑换商品")
@AnonymousAccess
public ResultInfo consumeItemPoints(@Validated @RequestBody TempPoints tempPoints) {
log.info("pointsOperation ==>> consumeItemPoints ==>> param ==>> {}", tempPoints);
Long memberId = tempPoints.getMemberId();
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
Long points = tempPoints.getPoints();
if (Objects.isNull(points) || points <= 0) {
log.info("points ==>> {}", points);
throw new BadRequestException("points error");
}
Long itemId = tempPoints.getItemId();
Assert.notNull(itemId, "itemId can't be null");
// 积分兑换商品
tempPoints.setEvtType(30);
tempPoints.setPointsType(0);
CustomPointsResult b = this.pointsOperationService.customPoints(tempPoints);
String description = "操作成功";
if (!b.isResult()) {
description = "操作失败,积分不足";
}
return ResultInfo.success(Arrays.asList(b),description);
}
}
......
package com.topdraw.business.process.rest;
import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.module.rights.history.service.RightsHistoryService;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryQueryCriteria;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryQueryType;
import com.topdraw.business.process.service.RightsOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.util.TimestampUtil;
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.*;
......@@ -23,40 +18,11 @@ import java.util.List;
*/
@Api(tags = "Rights管理")
@RestController
@RequestMapping("/api/RightsOperation")
@RequestMapping("/uce/rightsOperation")
public class RightsOperationController {
@Autowired
private RightsOperationService rightsOperationService;
@Autowired
private RightsHistoryService rightsHistoryService;
/**
*
* @param criteria
* @param pageable
* @return
*/
@GetMapping
@ApiOperation("查询RightsHistory")
public ResultInfo queryRightsHistory(RightsHistoryQueryCriteria criteria, Pageable pageable) {
RightsHistoryQueryType queryType = criteria.getQueryType();
if (queryType == RightsHistoryQueryType.AVAILABLE_ONLY) {
criteria.setExpireTime(TimestampUtil.now());
}
return ResultInfo.successPage(rightsHistoryService.queryAll(criteria,pageable));
}
/**
*
* @param id
* @return
*/
@GetMapping(value = "/findRightsHistoryById/{id}")
@ApiOperation("查询RightsHistory")
public ResultInfo findRightsHistoryById(@PathVariable Long id) {
return ResultInfo.success(rightsHistoryService.findById(id));
}
/**
*
......@@ -64,7 +30,7 @@ public class RightsOperationController {
* @return
*/
@PostMapping(value = "/grantRightsByManual")
@ApiOperation("查询RightsHistory")
@ApiOperation("手动发放优惠券")
public ResultInfo grantRightsByManual(@Validated @RequestBody RightsHistory rightsHistory) {
List<RightsHistory> rightsHistories = Arrays.asList(rightsHistory);
this.rightsOperationService.grantRightsByManual(rightsHistories);
......
package com.topdraw.business.process.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.service.dto.TaskDTO;
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;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.Objects;
@Api("任务处理")
@RestController
@RequestMapping(value = "/ucEngine/api/taskOperation")
@RequestMapping(value = "/uce/taskOperation")
@Slf4j
public class TaskOperationController {
@Autowired
TaskOperationService taskOperationService;
private TaskOperationService taskOperationService;
/**
* 处理事件
......@@ -33,7 +41,63 @@ public class TaskOperationController {
this.taskOperationService.dealTask(criteria.getContent());
}
/**
* 新增任务
*
* @param task 消息
*/
@PostMapping(value = "/createTask")
@ApiOperation("新增任务")
@AnonymousAccess
public void createTask(@RequestBody @Validated(value = {CreateGroup.class}) Task task) {
log.info("taskOperation ==>> createTask ==>> param ==>> {}", task);
String code = task.getCode();
TaskDTO taskDTO = this.taskOperationService.findByCode(code);
if (Objects.isNull(taskDTO.getId())) {
// 新增任务
this.taskOperationService.createTask(task);
}
}
/**
* 修改任务
*
* @param task 消息
*/
@PostMapping(value = "/updateTask")
@ApiOperation("修改任务")
@AnonymousAccess
public void updateTask(@RequestBody @Validated Task task) {
log.info("taskOperation ==>> updateTask ==>> param ==>> {}", task);
Long id = task.getId();
TaskDTO taskDTO = this.taskOperationService.findById(id);
if (Objects.nonNull(taskDTO.getId())) {
task.setCode(taskDTO.getCode());
Task task_ = new Task();
BeanUtils.copyProperties(taskDTO, task_);
task_.copy(task);
// 修改任务
this.taskOperationService.updateTask(task_);
}
}
/**
* 删除任务
*
* @param task 消息
*/
@PostMapping(value = "/deleteTask")
@ApiOperation("删除任务")
@AnonymousAccess
public void deleteTask(@RequestBody @Validated Task task) {
log.info("taskOperation ==>> deleteTask ==>> param ==>> {}", task);
Long id = task.getId();
// 删除任务
this.taskOperationService.deleteTask(id);
}
/**
* 针对重庆20211220号的积分兑换活动专门定制的接口
......
package com.topdraw.business.process.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.process.service.TaskTemplateOperationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Objects;
@Api("任务模板处理")
@RestController
@RequestMapping(value = "/uce/taskTemplateOperation")
@Slf4j
public class TaskTemplateOperationController {
@Autowired
private TaskTemplateOperationService taskTemplateOperationService;
/**
* 新增任务
*
* @param taskTemplate 消息
*/
@PostMapping(value = "/create")
@ApiOperation("新增任务")
@AnonymousAccess
public void create(@RequestBody @Validated TaskTemplate taskTemplate) {
log.info("taskTemplateOperation ==>> create ==>> param ==>> {}", taskTemplate);
String code = taskTemplate.getCode();
Integer type = taskTemplate.getType();
TaskTemplateDTO taskTemplateDTO_ = this.taskTemplateOperationService.findByCode(code);
TaskTemplateDTO taskTemplateDTO_1 = this.taskTemplateOperationService.findByType(type);
if (Objects.isNull(taskTemplateDTO_.getId()) && Objects.isNull(taskTemplateDTO_1.getId())) {
// 新增任务
this.taskTemplateOperationService.create(taskTemplate);
}
}
/**
* 修改任务
*
* @param taskTemplate 消息
*/
@PostMapping(value = "/update")
@ApiOperation("修改任务模板")
@AnonymousAccess
public void update(@RequestBody @Validated TaskTemplate taskTemplate) {
log.info("taskTemplateOperation ==>> update ==>> param ==>> {}", taskTemplate);
// 修改任务
this.taskTemplateOperationService.update(taskTemplate);
}
/**
* 删除任务
*
* @param taskTemplate 消息
*/
@PostMapping(value = "/delete")
@ApiOperation("删除任务模板")
@AnonymousAccess
public void delete(@RequestBody @Validated TaskTemplate taskTemplate) {
log.info("taskTemplateOperation ==>> delete ==>> param ==>> {}", taskTemplate);
Long id = taskTemplate.getId();
// 删除任务
this.taskTemplateOperationService.delete(id);
}
}
......@@ -5,36 +5,33 @@ 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.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.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;
import com.topdraw.business.process.domian.weixin.WeiXinUserBean;
import com.topdraw.business.process.domian.weixin.*;
import com.topdraw.business.process.service.UserOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.config.RedisKeyUtil;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.resttemplate.RestTemplateClient;
import com.topdraw.util.Base64Util;
import com.topdraw.util.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.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
......@@ -43,232 +40,106 @@ import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URLDecoder;
import java.sql.Timestamp;
import java.util.*;
import java.util.stream.Collectors;
@Api("账户处理")
@RestController
@RequestMapping(value = "/ucEngine/api/userOperation")
@RequestMapping(value = "/uce/userOperation")
@Slf4j
@CrossOrigin
public class UserOperationController {
@Autowired
private UserOperationService userTvOperationService;
@Autowired
private UserWeixinService userWeixinService;
private MemberService memberService;
@Autowired
private UserTvService userTvService;
private UserOperationService userOperationService;
@Autowired
private MemberService memberService;
private MemberOperationService memberOperationService;
@Autowired
private RedisUtils redisUtils;
@Autowired
private UserOperationService userOperationService;
private static final String SUBSCRIBE = "subscribe";
private static final String UNSUBSCRIBE = "unsubscribe";
private static final Integer SUBSCRIBE_STATUS = 1;
@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}")
@PutMapping(value = "/updateWeixin")
@ApiOperation("修改UserWeixin")
@AnonymousAccess
public ResultInfo findBindByPlatformAccount(@PathVariable("platformAccount") String platformAccount) {
log.info("findBindByPlatformAccount ==> input ==> [{}]",platformAccount);
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);
return ResultInfo.success(result);
public ResultInfo updateWeixin(@Validated @RequestBody UserWeixin resources) {
userOperationService.updateWeixin(resources);
return ResultInfo.success();
}
@RequestMapping(value = "/unbind")
@ApiOperation("大屏用户解绑")
@RequestMapping(value = "/updateVipByUserId")
@ApiOperation("通过账号id修改vip")
@AnonymousAccess
public ResultInfo unbind(@Validated @RequestBody TempIptvUser resources) {
log.info("unbind ==> input ==> [{}]",resources);
public ResultInfo updateVipByUserId(@Validated(value = {UpdateGroup.class}) @RequestBody
UserOperationBean resources) {
log.info("userOperation ==>> updateVipByUserId ==>> param ==>> [{}]",resources);
UserTv userTv = new UserTv();
BeanUtils.copyProperties(resources,userTv);
String platformAccount = userTv.getPlatformAccount();
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.isNull(userTvDTO))
throw new EntityNotFoundException(UserTvDTO.class, "platformAccount", "大屏账户不存在");
String memberCode = resources.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
String _memberCode = memberDTO.getCode();
if (StringUtils.isNotBlank(_memberCode)) {
// 解绑
userTv.setMemberCode(_memberCode);
this.userTvOperationService.unbind(userTv);
}
// 设置默认账号,以时间最早的为准
/*List<MemberDTO> memberDTOList = this.memberService.findByUserIptvId(userTvDTO.getId());
if (CollectionUtils.isNotEmpty(memberDTOList)) {
List<MemberDTO> collect = memberDTOList.stream().filter(memberDTO1 -> !memberDTO1.getCode().equalsIgnoreCase(memberCode1)).collect(Collectors.toList());
Integer vip = resources.getVip();
Timestamp vipExpireTime = resources.getVipExpireTime();
// 微信账号id
Long userId = resources.getUserId();
UserWeixinDTO userWeixinDTO = this.userOperationService.findById(userId);
if (CollectionUtils.isNotEmpty(collect) ){
Long memberId = userWeixinDTO.getMemberId();
MemberDTO memberDTO = this.memberService.findById(memberId);
if(collect.size() > 1) {
collect.sort(new Comparator<MemberDTO>() {
@Override
public int compare(MemberDTO memberDTO, MemberDTO t1) {
return t1.getBindIptvTime().compareTo(memberDTO.getBindIptvTime());
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
if (Objects.nonNull(vip)) {
member.setVip(vip);
}
});
if (Objects.nonNull(vipExpireTime)) {
member.setVipExpireTime(vipExpireTime);
}
// 有其他会员的话,绑定最早的一个会员
MemberDTO memberDTO1 = collect.get(0);
userTvDTO.setPriorityMemberCode(memberDTO1.getCode());
BeanUtils.copyProperties(userTvDTO,userTv);
this.userTvService.update(userTv);
}
this.createVipHistory(userId, vip, vipExpireTime);
}*/
}
this.memberOperationService.updateMemberVip(member);
return ResultInfo.success();
}
@RequestMapping(value = "/changeMainAccount")
@ApiOperation("大屏更换主账号")
@AnonymousAccess
public ResultInfo changeMainAccount(@Validated @RequestBody TempIptvUser resources) {
log.info("changeMainAccount ==> input ==> [{}]",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.getByCode(memberCode1);
String memberCode = memberDTO.getCode();
if (StringUtils.isNotBlank(memberCode)) {
userTv.setMemberCode(memberCode);
this.userTvOperationService.changeMainAccount(userTv);
private void createVipHistory(Long weixinUserId, Integer vip , Timestamp vipExpireTime){
BuyVipBean buyVipBean = new BuyVipBean();
buyVipBean.setId(weixinUserId);
buyVipBean.setVip(vip);
buyVipBean.setVipExpireTime(vipExpireTime);
this.memberOperationService.buyVipByUserId(buyVipBean);
}
} else {
String unionid = resources.getUnionid();
this.userTvOperationService.changeMainAccountByUnionId(userTv,unionid);
}
@PostMapping(value = "/createWeixinUserAndCreateMember")
@ApiOperation("新增小屏账户同时创建会员信息")
@AnonymousAccess
public ResultInfo createWeixinUserAndMember(@Validated(value = {CreateGroup.class}) @RequestBody UserWeixin resources) {
log.info("UserOperationController ==> createWeixinUserAndMember ==> param ==> [{}]",resources);
return ResultInfo.success("update success");
UserWeixinDTO result = this.userOperationService.createWeixinUserAndMember(resources);
return ResultInfo.success(result);
}
@PostMapping("/serviceLogin")
@ApiOperation("微信服务号(H5)登录")
@AnonymousAccess
public ResultInfo serviceLogin(@Validated @RequestBody WeiXinUserBean resources) {
Object o = this.userTvOperationService.serviceLogin(resources);
return ResultInfo.success(o);
}
public ResultInfo serviceLogin(@Validated(value = {CreateGroup.class}) @RequestBody UserWeixin resources) {
log.info("UserOperationController ==> serviceLogin ==>> param ==> [{}]",resources);
@PostMapping("/appletLogin")
@ApiOperation("微信小程序登录")
@AnonymousAccess
public ResultInfo appletLogin(@Validated @RequestBody WeiXinUserBean resources) {
log.info("appletLogin ==> input ==> [{}]",resources);
UserWeixinDTO result = this.userTvOperationService.appletLogin(resources);
UserWeixinDTO result = this.userOperationService.serviceLogin(resources);
return ResultInfo.success(result);
}
@PostMapping("/appletBind")
@ApiOperation("微信小程序绑定大屏")
@PostMapping("/appletLogin")
@ApiOperation("微信小程序登录")
@AnonymousAccess
public ResultInfo appletBind(@Validated @RequestBody BindBean resources) {
log.info("appletBind ==> input ==> [{}]",resources);
String unionId = resources.getUnionid();
if (StringUtils.isBlank(unionId))
Assert.state(StrUtil.isNotBlank(unionId), "跨屏绑定,请先进行授权");
public ResultInfo appletLogin(@Validated(value = {CreateGroup.class}) @RequestBody UserWeixin resources) {
log.info("UserOperationController ==> appletLogin ==>> param ==> [{}]",resources);
String platformAccount = resources.getPlatformAccount();
if (Objects.isNull(platformAccount))
Assert.state(StrUtil.isNotBlank(platformAccount), "大屏账户不得为空");
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
resources.setPlatformUserId(userTvDTO.getId());
resources.setPlatformAccount(platformAccount);
boolean result = this.userTvOperationService.appletBind(resources);
UserWeixinDTO result = this.userOperationService.appletLogin(resources);
return ResultInfo.success(result);
}
......@@ -276,13 +147,13 @@ public class UserOperationController {
@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);
this.userOperationService.subscribe(subscribeBean);
return ResultInfo.success();
}
/**
......@@ -291,22 +162,16 @@ public class UserOperationController {
* @throws IOException
*/
private void parseSubscribe(SubscribeBean subscribeBean) throws IOException {
if (Objects.nonNull(subscribeBean)) {
String appId = subscribeBean.getAppId();
// appId不得为空
if (StringUtils.isBlank(appId))
throw new BadRequestException("appId 不存在!");
// appId
String appId = subscribeBean.getAppid();
Assert.notNull(appId, GlobeExceptionMsg.APP_ID_IS_NULL);
// openId
String openId = subscribeBean.getOpenId();
if (StringUtils.isBlank(openId))
throw new BadRequestException("openId 不存在!");
String openId = subscribeBean.getOpenid();
Assert.notNull(openId, GlobeExceptionMsg.OPEN_ID_IS_NULL);
// unionId
String unionId = subscribeBean.getUnionid();
if (StringUtils.isBlank(unionId))
throw new BadRequestException("unionId 不存在!");
Assert.notNull(openId, GlobeExceptionMsg.UNION_ID_IS_NULL);
// 匹配配置文件中的微信列表信息
Map<String, String> wxInfoMap = WeixinUtil.getWeixinInfoByAppid(appId);
......@@ -317,6 +182,7 @@ public class UserOperationController {
// 非订阅号,暂不处理。返回暂不支持
if (ObjectUtil.notEqual(appType, WeChatConstants.WX_SUBSCRIPTION))
throw new BadRequestException("非订阅号");
}
// 大屏账户信息
......@@ -326,27 +192,19 @@ public class UserOperationController {
if (StringUtils.isNotBlank(content)) {
// 大屏信息
iptvUserInfo = JSONObject.parseObject(content);
} else {
String eventKey = subscribeBean.getEventKey();
log.info(" eventKey ==> [{}] ", eventKey);
if (StringUtils.isNotBlank(eventKey)) {
// 用户扫描带参二维码关注。发消息
// 去除固定前缀,获取二维码参数
eventKey = eventKey.substring(8);
iptvUserInfo = JSONObject.parseObject(eventKey);
}
}
// 用户自己搜索关注就没有大屏信息,否则表示扫码关注
if (Objects.nonNull(iptvUserInfo)) {
subscribeBean.setIptvUserInfo(iptvUserInfo);
Object sourceInfo1 = iptvUserInfo.get("sourceInfo");
if (Objects.nonNull(sourceInfo1)) {
String sourceInfo = sourceInfo1.toString();
if (StringUtils.isNotBlank(sourceInfo))
subscribeBean.setSourceInfo(sourceInfo);
}
String headimgurl = iptvUserInfo.get("headimgurl").toString();
String nickname = iptvUserInfo.get("nickname").toString();
if (StringUtils.isNotBlank(nickname)) {
String nicknameDecode = URLDecoder.decode(nickname, "UTF-8");
......@@ -354,56 +212,87 @@ public class UserOperationController {
subscribeBean.setNickname(nicknameEncode);
}
String headimgurl = iptvUserInfo.get("headimgurl").toString();
log.info("parseSubscribe ==>> headimgurl ==>> {}", headimgurl);
if (StringUtils.isNotBlank(headimgurl)) {
String headimgurlDecode = URLDecoder.decode(headimgurl, "UTF-8");
String netImage = RestTemplateClient.netImage(headimgurlDecode);
subscribeBean.setHeadimgurl(netImage);
if (StringUtils.isNotBlank(headimgurlDecode)) {
if (headimgurl.contains("https") || headimgurl.contains("http")) {
headimgurl = this.downloadWeixinImge(headimgurlDecode);
}
subscribeBean.setHeadimgurl(headimgurl);
}
}
} else {
// headimgurl
String headimgurl = subscribeBean.getHeadimgurl();
if (StringUtils.isNotBlank(headimgurl)) {
if (headimgurl.contains("https") || headimgurl.contains("http")) {
String headImgUrl = this.downloadWeixinImge(headimgurl);
subscribeBean.setHeadimgurl(headImgUrl);
}
}
}
}
@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);
boolean result = this.userTvOperationService.unsubscribe(subscribeBean);
SubscribeBean subscribeBean = JSONUtil.parseMsg2Object(data.getContent(), SubscribeBean.class);
String appId = subscribeBean.getAppid();
Assert.notNull(appId, GlobeExceptionMsg.APP_ID_IS_NULL);
// openId
String openId = subscribeBean.getOpenid();
Assert.notNull(openId, GlobeExceptionMsg.OPEN_ID_IS_NULL);
subscribeBean.setAppid(appId);
subscribeBean.setOpenid(openId);
boolean result = this.userOperationService.unsubscribe(subscribeBean);
return ResultInfo.success(result);
}
@PostMapping("/minaBind")
@ApiOperation("微信小程序绑定大屏")
@AnonymousAccess
public ResultInfo minaBind(@Validated(value = {BindGroup.class}) @RequestBody BindBean resources) {
log.info("UserOperationController ==> appletBind ==>> param ==> [{}]",resources);
boolean result = this.userOperationService.minaBind(resources);
return ResultInfo.success(result);
}
@PostMapping("/minaUnbind")
@ApiOperation("小屏解绑")
@AnonymousAccess
public ResultInfo minaUnbind(@Validated(value = {UnbindGroup.class}) @RequestBody WeixinUnBindBean weixinUnBindBean) {
log.info("UserOperationController ==> minaUnbind ==>> param ==> [{}]", weixinUnBindBean);
this.userOperationService.minaUnbind(weixinUnBindBean);
return ResultInfo.success();
}
/**
* 1.未关注、未绑定
* 2.已绑定、未关注
* 3.已关注、未绑定
* @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 下午
* @return
*/
@PostMapping(value = "/saveUserInfo")
@ApiOperation("保存大屏侧信息")
@PostMapping(value = "/memberPreprocess")
@ApiOperation("暂存大小屏信息并检查关注与绑定状态")
@AnonymousAccess
public ResultInfo saveUserInfo(@RequestBody String data) {
public ResultInfo memberPreprocess(@RequestBody String data) {
log.info("saveUserInfo ==> input ==> [{}]",data);
log.info("UserOperationController ==> saveUserInfo ==>> param ==>> [{}]",data);
Assert.notNull(data, "用户数据不可为空");
JSONObject json = JSONObject.parseObject(data);
......@@ -418,44 +307,50 @@ public class UserOperationController {
String platformAccount1 = "";
// 保存大小屏信息到redis同时返回小屏信息
UserWeixinDTO userWeixinDTO = this.userTvOperationService.saveUserInfo(data);
if (Objects.isNull(userWeixinDTO.getId())) {
UserWeixinDTO userWeixinDTO = this.userOperationService.saveUserInfo(data);
// 小屏账号不存在
if (Objects.isNull(userWeixinDTO) || Objects.isNull(userWeixinDTO.getId())) {
result = UNSUBSCRIBE;
resultList.add(result);
resultList.add(platformAccount1);
log.info("saveUserInfo ==>> result ==>> [{}]",resultList);
return ResultInfo.success(resultList);
} else {
// 账号存在,未关注
if (userWeixinDTO.getStatus() != SUBSCRIBE_STATUS) {
result = UNSUBSCRIBE;
}
// 小屏会员
MemberDTO memberDTO = this.memberService.findById(userWeixinDTO.getMemberId());
// 小屏用户不存在或者关注状态为未关注(0),返回未关注
if (Objects.isNull(userWeixinDTO) || Objects.isNull(userWeixinDTO.getId()) || userWeixinDTO.getStatus() != SUBSCRIBE_STATUS) {
result = UNSUBSCRIBE;
if (Objects.nonNull(memberDTO)) {
// 检查是否绑定,返回绑定的大屏账户
UserTvDTO userTvDTO = this.userOperationService.checkBind(memberDTO);
if (Objects.nonNull(userTvDTO)) {
// 绑定的大屏账号
platformAccount1 = userTvDTO.getPlatformAccount();
}
} else {
// 数据异常,没有会员
log.info("userWeixinDTO ==>> [{}]",userWeixinDTO);
throw new EntityNotFoundException(MemberDTO.class,"code","member is null !!");
}
resultList.add(result);
resultList.add(platformAccount1);
log.info("saveUserInfo ==>> result ==>> [{}]",resultList);
return ResultInfo.success(resultList);
}
/***************************************************************************************/
// 关注未绑定
// 已关注
if (result.equalsIgnoreCase(SUBSCRIBE)) {
// 未绑定
if (StringUtils.isBlank(platformAccount1)) {
// redis中的大小屏信息
String content = (String) this.redisUtils.get(RedisKeyUtil.genSeSuSubscribeKey(unionid));
JSONObject iptvUserInfo = JSONObject.parseObject(content);
......@@ -467,6 +362,9 @@ public class UserOperationController {
try {
String headimgurl = iptvUserInfo.get("headimgurl").toString();
log.info("headimgurl ==>> {}", headimgurl);
String nickname = iptvUserInfo.get("nickname").toString();
if (StringUtils.isNotBlank(nickname)) {
String nicknameDecode = URLDecoder.decode(nickname, "UTF-8");
......@@ -475,24 +373,32 @@ public class UserOperationController {
}
if (StringUtils.isNotBlank(headimgurl)) {
if(headimgurl.contains("https")||headimgurl.contains("http")) {
String headimgurlDecode = URLDecoder.decode(headimgurl, "UTF-8");
// String imageEncode = Base64Util.encode(headimgurlDecode);
String image = RestTemplateClient.netImage(headimgurlDecode);
memberDTO.setAvatarUrl(StringUtils.isNotBlank(image) == true ? image:headimgurlDecode);
}
}catch (Exception e) {
log.info("headimgurl , nickname ===>> encode error!");
}
} catch (Exception e) {
log.info("头像解析失败!!!");
e.printStackTrace();
}
// 大小屏绑定,如果已经绑定了别的大屏,则不进行处理,返回已绑定的大屏信息
// 已绑定的大屏信息
UserTvDTO userTvDTO = this.userOperationService.bind(memberDTO, platformAccount);
if (userTvDTO != null) {
platformAccount1 = userTvDTO.getPlatformAccount();
}
}
/****************************************************************************************/
}
}
resultList.add(result);
resultList.add(platformAccount1);
......@@ -504,20 +410,107 @@ public class UserOperationController {
return success;
}
/**
*
* @param resources
* @return
*/
@PostMapping(value = "/saveUserWeixinPhone")
@ApiOperation("保存用户手机号信息")
private String downloadWeixinImge(String headimgurl){
try {
if (StringUtils.isNotBlank(headimgurl)) {
String image = RestTemplateClient.netImage(headimgurl);
return image;
}
} catch (Exception e) {
log.info("头像解析失败!!!");
e.printStackTrace();
}
return null;
}
/******************************************************* IPTV ************************************/
@PostMapping(value = "/updateUserTv")
@ApiOperation("修改大屏账号")
@AnonymousAccess
public ResultInfo updateUserTv(@Validated(value = {UpdateGroup.class}) @RequestBody UserTv resources) {
log.info("UserOperationController ==> updateUserTv ==>> param ==> [{}]",resources);
UserTvDTO result = this.userOperationService.updateUserTv(resources);
return ResultInfo.success(result);
}
@PostMapping(value = "/createTvUserAndMember")
@ApiOperation("保存大屏账户同时创建会员信息")
@AnonymousAccess
public ResultInfo createTvUserAndMember(@Validated(value = {CreateGroup.class}) @RequestBody UserTv resources) {
log.info("UserOperationController ==> createUserAndCreateMember ==>> param ==> [{}]",resources);
UserTvDTO result = this.userOperationService.createTvUserAndMember(resources);
return ResultInfo.success(result);
}
@RequestMapping(value = "/tvUnbind")
@ApiOperation("大屏解绑")
@AnonymousAccess
public ResultInfo tvUnbind(@Validated(value = {UpdateGroup.class}) @RequestBody TvUnBindBean resources) {
log.info("UserOperationController ==> unbind ==>> param ==> [{}]",resources);
this.userOperationService.tvUnbind(resources);
return ResultInfo.success();
}
@RequestMapping(value = "/changeMainAccount")
@ApiOperation("大屏更换主账号")
@AnonymousAccess
public ResultInfo changeMainAccount(@Validated(value = {UpdateGroup.class}) @RequestBody BindBean resources) {
log.info("UserOperationController ==> changeMainAccount ==>> param ==> [{}]",resources);
Long memberId = resources.getMemberId();
String memberCode = resources.getMemberCode();
if (StringUtils.isBlank(memberCode) && Objects.nonNull(memberId)) {
memberCode = this.memberService.findCodeById(memberId);
}
String platformAccount = resources.getPlatformAccount();
if (StringUtils.isBlank(platformAccount))
throw new BadRequestException(GlobeExceptionMsg.IPTV_PLATFORM_ACCOUNT_IS_NULL);
UserTv userTv = new UserTv();
userTv.setMemberCode(memberCode);
userTv.setPlatformAccount(platformAccount);
this.userOperationService.changeMainAccount(userTv);
return ResultInfo.success();
}
@PostMapping(value = "/deleteAllCollection")
@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 deleteAllCollection(@RequestBody String content) {
log.info("UserOperationController ==> deleteAllCollection ==> param ==> [{}]",content);
boolean result = this.userOperationService.deleteAllCollection(content);
return ResultInfo.success(result);
}
@PostMapping(value = "/deleteCollection")
@ApiOperation("删除收藏")
@AnonymousAccess
public ResultInfo deleteCollection(@RequestBody String content) {
log.info("UserOperationController ==> deleteCollection ==> param ==> [{}]",content);
boolean result = this.userOperationService.deleteCollection(content);
return ResultInfo.success(result);
}
@PostMapping(value = "/addCollection")
@ApiOperation("添加收藏")
@AnonymousAccess
public ResultInfo addCollection(@RequestBody String content) {
log.info("UserOperationController ==> addCollection ==>> param ==> [{}]",content);
if (StringUtils.isNotBlank(content)) {
boolean result = this.userOperationService.addCollection(content);
return ResultInfo.success(result);
}
return ResultInfo.success();
}
}
......
package com.topdraw.business.process.service;
import com.topdraw.business.process.domian.TempCoupon;
import com.topdraw.business.process.domian.TempExp;
import com.topdraw.business.process.domian.TempRights;
import java.util.List;
......@@ -17,7 +15,7 @@ public interface ExpOperationService {
* 任务完成后自动发放成长值
* @param tempExpList
*/
void grantPointsThroughTempExp( List<TempExp> tempExpList);
void grantExpThroughTempExp( List<TempExp> tempExpList);
/**
* 系统手动发放优惠券
......@@ -27,6 +25,10 @@ public interface ExpOperationService {
*/
void grantExpByManual(Long memberId,Long userId ,List<TempExp> tempExpList);
/**
*
* @param tempExpList
*/
void grantExpByManual(List<TempExp> tempExpList);
}
......
package com.topdraw.business.process.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.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 {
void doUpdateMemberInfo(Member member);
void doInsertMember(Member member);
MemberDTO findById(Long memberId);
void doUpdateMemberExp(Member member);
void doUpdateMemberPoints(Member member);
void doUpdateMemberCoupon(Member member);
MemberProfileDTO getMemberProfileAndCheckVip(Long memberId, String appid);
MemberDTO buyVip(BuyVipBean buyVipBean);
}
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;
......@@ -36,7 +36,7 @@ public interface PointsOperationService {
* 积分发放,基于已获得的权益
* @param tempPointsList 已获得的权益
*/
void grantPointsThroughTempRightsList(List<TempPoints> tempPointsList);
void grantPointsThroughTempPoint(List<TempPoints> tempPointsList);
/**
......
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.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.common.ResultInfo;
/**
......@@ -9,6 +11,10 @@ import com.topdraw.common.ResultInfo;
*/
public interface TaskOperationService {
TaskDTO findById(Long id);
TaskDTO findByCode(String code);
/**
* 处理任务
*
......@@ -16,6 +22,38 @@ public interface TaskOperationService {
*/
ResultInfo dealTask(String content);
/**
*
* @param task
*/
void createTask(Task task);
/**
*
* @param task
*/
void updateTask(Task task);
/**
*
* @param task
*/
void deleteTask(Task task);
/**
*
* @param id
*/
void deleteTask(Long id);
/**
*
* @param platformAccount
* @param points
* @return
*/
boolean createPoint2ChongQing(String platformAccount, Long points);
}
......
package com.topdraw.business.process.service;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
/**
* @description 权益操作接口
* @author XiangHan
* @date 2021.10.22
*/
public interface TaskTemplateOperationService {
/**
*
* @param task
*/
void create(TaskTemplate task);
/**
*
* @param task
*/
void update(TaskTemplate task);
/**
*
* @param task
*/
void delete(TaskTemplate task);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param code
* @return
*/
TaskTemplateDTO findByCode(String code);
/**
*
* @param id
* @return
*/
TaskTemplateDTO findById(Long id);
/**
*
* @param event
* @return
*/
TaskTemplateDTO findByEvent(String event);
/**
*
* @param event
* @return
*/
TaskTemplateDTO findByType(Integer event);
}
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 com.topdraw.business.process.domian.weixin.TvUnBindBean;
import com.topdraw.business.process.domian.weixin.WeixinUnBindBean;
import java.util.List;
import java.util.Map;
public interface UserOperationService {
......@@ -22,40 +18,47 @@ public interface UserOperationService {
* @param resources
* @return
*/
boolean createMemberByUserTv(UserTv resources);
UserTvDTO createTvUserAndMember(UserTv resources);
/**
* 大屏解绑
* @param userTv
* 保存小屏账户并创建会员
* @param resources
* @return
*/
void unbind(UserTv userTv);
UserWeixinDTO createWeixinUserAndMember(UserWeixin resources);
/**
*
* @param userTv
* @param unionId
* 保存小屏账户并创建会员
* @param resources
* @return
*/
void unbindByUnionId(UserTv userTv,String unionId);
UserWeixinDTO createWeixinUserAndMember(UserWeixin resources, Integer vip);
/**
* 大屏切换主账户(会员)
* @param userTv
* 服务号(H5)登录
* @param resources
* @return
*/
void changeMainAccount(UserTv userTv);
UserWeixinDTO serviceLogin(UserWeixin resources);
/**
*
* 微信小程序登录
* @param resources
* @return
*/
UserWeixinDTO appletLogin(UserWeixin resources);
/**
* 大屏解绑
* @param userTv
* @param unionId
*/
void changeMainAccountByUnionId(UserTv userTv,String unionId);
void tvUnbind(TvUnBindBean userTv);
/**
* 微信小程序登录
* @param resources
* @return
* 大屏切换主账户(会员)
* @param userTv
*/
UserWeixinDTO appletLogin(WeiXinUserBean resources);
void changeMainAccount(UserTv userTv);
/**
* 微信公众号关注
......@@ -82,20 +85,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,36 +106,71 @@ public interface UserOperationService {
boolean addCollection(String content);
/**
* 获取大屏绑定的小屏会员列表
* @param platformAccount
* 小程序绑定大屏
* @param resources
* @return
*/
List<MemberDTO> findBindByPlatformAccount(String platformAccount);
boolean minaBind(BindBean resources);
/**
* 服务号(H5)登录
* @param resources
* @return
*
* @param memberCode
* @param platformAccount
*/
Object serviceLogin(WeiXinUserBean resources);
void bind(String memberCode, String platformAccount);
/**
* 小程序绑定大屏
* @param resources
* @return
*
* @param memberDTO
* @param userTvDTO
*/
boolean appletBind(BindBean resources);
void bind(MemberDTO memberDTO, UserTvDTO userTvDTO);
/**
*
* @param memberDTO
* @param platformAccount
* @return
*/
UserTvDTO bind(MemberDTO memberDTO, String platformAccount);
JSONObject getUnionIdByAppIdAndOpenId(String appId,String secret,String code);
/**
*
* @param memberDTO
* @return
*/
UserTvDTO checkBind(MemberDTO memberDTO);
UserWeixinDTO createWeixinUserAndCreateMember(UserWeixin resources);
/**
*
* @param platformAccount
* @return
*/
UserTvDTO findByPlatformAccount(String platformAccount);
void bind(String memberCode, String platformAccount);
/**
* 小屏解绑
* @param weixinUnBindBean
*/
void minaUnbind(WeixinUnBindBean weixinUnBindBean);
void bind(MemberDTO memberDTO, UserTvDTO userTvDTO);
/**
*
* @param userId
* @return
*/
UserWeixinDTO findById(Long userId);
UserTvDTO bind(MemberDTO memberDTO, String platformAccount);
/**
*
* @param resources
*/
UserWeixinDTO updateWeixin(UserWeixin resources);
UserTvDTO checkBind(MemberDTO memberDTO);
/**
*
* @param resources
* @return
*/
UserTvDTO updateUserTv(UserTv resources);
}
......
package com.topdraw.business.process.service.dto;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/23 9:48
* @version: :
* @modified By:
* @since : modified in 2022/3/23 9:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberAndUserTvDTO implements Serializable {
private MemberDTO memberDTO;
private UserTvDTO userTvDTO;
}
package com.topdraw.business.process.service.dto;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/23 9:48
* @version: :
* @modified By:
* @since : modified in 2022/3/23 9:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberAndWeixinUserDTO implements Serializable {
private MemberDTO memberDTO;
private UserWeixinDTO userWeixinDTO;
}
package com.topdraw.business.process.service.dto;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/23 9:48
* @version: :
* @modified By:
* @since : modified in 2022/3/23 9:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberProfileAndMemberDTO implements Serializable {
private MemberProfileDTO memberProfileDTO;
private MemberDTO memberDTO;
}
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,25 +4,22 @@ import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.coupon.history.domain.CouponHistory;
import com.topdraw.business.module.coupon.history.service.CouponHistoryService;
import com.topdraw.business.module.coupon.service.CouponService;
import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.process.service.CouponOperationService;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.domian.TempCoupon;
import com.topdraw.business.process.service.RightsOperationService;
import com.topdraw.util.RedissonUtil;
import com.topdraw.util.TimestampUtil;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.topdraw.utils.RedisUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
......@@ -31,8 +28,6 @@ import java.util.Objects;
@Service
public class CouponOperationServiceImpl implements CouponOperationService {
private static final Logger LOG = LoggerFactory.getLogger(CouponOperationServiceImpl.class);
@Autowired
CouponService couponService;
@Autowired
......@@ -43,16 +38,23 @@ public class CouponOperationServiceImpl implements CouponOperationService {
RightsOperationService rightsOperationService;
@Autowired
MemberService memberService;
@Autowired
RedissonClient redissonClient;
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
private RedisUtils redisUtils;
// 过期阀值(默认一个月)
private static final Integer EXPIRE_FACTOR_DAY = 30;
@Override
@AsyncMqSend
public void asyncMemberCoupon(Member member) {}
@AsyncMqSend
public void asyncCouponHistory(CouponHistory couponHistory) {}
@Override
public void grantCouponThroughTempCoupon(List<TempCoupon> tempCouponList) {
// 优惠券领取、使用历史记录表
for (TempCoupon tempCoupon : tempCouponList) {
......@@ -94,9 +96,8 @@ public class CouponOperationServiceImpl implements CouponOperationService {
// Long userId = tempCoupon.getUserId();
Long memberId = tempCoupon.getMemberId();
Integer rightsAmount = tempCoupon.getRightsAmount();
RLock rLock = this.redissonClient.getLock("refreshMemberCoupon:" + memberId.toString());
try {
RedissonUtil.lock(rLock);
this.redisUtils.doLock("refreshMemberCoupon:" + memberId.toString());
// 1.历史总优惠券数量
Long historyCouponCount = this.getTotalHistoryCoupon(memberId);
// 1.当前总优惠券数量
......@@ -113,7 +114,7 @@ public class CouponOperationServiceImpl implements CouponOperationService {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doUnLock("refreshMemberCoupon:" + memberId.toString());
}
}
......@@ -136,8 +137,10 @@ public class CouponOperationServiceImpl implements CouponOperationService {
member.setCouponAmount(currentCoupon);
member.setDueCouponAmount(expireSoonCouponCount);
member.setUpdateTime(LocalDateTime.now());
this.memberOperationService.doUpdateMemberInfo(member);
member.setUpdateTime(TimestampUtil.now());
this.memberOperationService.doUpdateMemberCoupon(member);
((CouponOperationServiceImpl) AopContext.currentProxy()).asyncMemberCoupon(member);
}
private MemberDTO findMemberByMemberId(Long memberId) {
......@@ -200,11 +203,14 @@ public class CouponOperationServiceImpl implements CouponOperationService {
couponHistory.setCouponId(tempCoupon.getId());
couponHistory.setUserId(tempCoupon.getMemberId());
couponHistory.setCouponCode(tempCoupon.getCode());
couponHistory.setMemberCode(tempCoupon.getMemberCode());
couponHistory.setUserNickname(tempCoupon.getUserNickname());
couponHistory.setOrderDetailId(tempCoupon.getOrderId());
couponHistory.setReceiveTime(LocalDateTime.now());
couponHistory.setReceiveTime(TimestampUtil.now());
couponHistory.setUseStatus(Objects.nonNull(couponHistory.getUseStatus()) ? couponHistory.getUseStatus():0);
this.couponHistoryService.create(couponHistory);
((CouponOperationServiceImpl) AopContext.currentProxy()).asyncCouponHistory(couponHistory);
}
......
......@@ -8,17 +8,18 @@ import com.topdraw.business.module.member.level.service.MemberLevelService;
import com.topdraw.business.module.member.level.service.dto.MemberLevelDTO;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.points.available.domain.PointsAvailable;
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import com.topdraw.business.process.service.ExpOperationService;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.domian.TempExp;
import com.topdraw.util.IdWorker;
import com.topdraw.util.RedissonUtil;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
......@@ -35,8 +36,6 @@ import java.util.Objects;
@Service
public class ExpOperationServiceImpl implements ExpOperationService {
private static final Logger LOG = LoggerFactory.getLogger(ExpOperationServiceImpl.class);
@Autowired
ExpDetailService expDetailService;
@Autowired
......@@ -45,19 +44,23 @@ public class ExpOperationServiceImpl implements ExpOperationService {
MemberLevelService memberLevelService;
@Autowired
MemberService memberService;
@Autowired
RedissonClient redissonClient;
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Override
@Autowired
private RedisUtils redisUtils;
@AsyncMqSend
public void asyncMemberExpAndLevel(Member member) {}
@AsyncMqSend
public void grantPointsThroughTempExp(List<TempExp> tempExpList) {
public void asyncExpDetail(ExpDetail expDetail) {}
@Override
public void grantExpThroughTempExp(List<TempExp> tempExpList) {
for (TempExp tempExp : tempExpList) {
this.refresh(tempExp);
}
}
@Override
......@@ -74,15 +77,13 @@ public class ExpOperationServiceImpl implements ExpOperationService {
}
}
/**
*
* @param tempExp
*/
private void refresh(TempExp tempExp) {
RLock lock = this.redissonClient.getLock("uc-refresh-exp:" + tempExp.getMemberId());
try {
RedissonUtil.lock(lock);
this.redisUtils.doLock("uc-refresh-exp:" + tempExp.getMemberId());
// 原始积分
long originExp = this.getExpByMemberId(tempExp);
// 总积分
......@@ -90,7 +91,7 @@ public class ExpOperationServiceImpl implements ExpOperationService {
// 1.添加成长值记录
// this.threadPoolTaskExecutor.execute(() -> this.doInsertExpDetail(tempExp, originExp, totalExp));
// 2.更新成长值与等级
this.refreshMemberExpAndLevel(tempExp,totalExp);
this.refreshMemberExpAndLevel(tempExp, totalExp);
this.doInsertExpDetail(tempExp, originExp, totalExp);
......@@ -98,15 +99,20 @@ public class ExpOperationServiceImpl implements ExpOperationService {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(lock);
this.redisUtils.doUnLock("uc-refresh-exp:" + tempExp.getMemberId());
}
}
private long calculateTotalExp(long originalExp,TempExp tempExp) {
private long calculateTotalExp(long originalExp, TempExp tempExp) {
Long rewardExp = tempExp.getRewardExp();
return rewardExp + originalExp;
}
/**
*
* @param tempExp
* @return
*/
private long getExpByMemberId(TempExp tempExp) {
Long memberId = tempExp.getMemberId();
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
......@@ -117,7 +123,6 @@ public class ExpOperationServiceImpl implements ExpOperationService {
return 0L;
}
/**
* 更新成长值与等级
*
......@@ -146,12 +151,14 @@ public class ExpOperationServiceImpl implements ExpOperationService {
MemberDTO memberDTO = this.findMemberByMemberId(memberId);
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
BeanUtils.copyProperties(memberDTO, member);
member.setExp(totalExp);
member.setLevel(level);
member.setUpdateTime(LocalDateTime.now());
this.memberOperationService.doUpdateMemberInfo(member);
member.setUpdateTime(TimestampUtil.now());
this.memberOperationService.doUpdateMemberExpAndLevel(member);
((ExpOperationServiceImpl) AopContext.currentProxy()).asyncMemberExpAndLevel(member);
}
private MemberDTO findMemberByMemberId(Long memberId) {
......@@ -212,6 +219,9 @@ public class ExpOperationServiceImpl implements ExpOperationService {
expDetail.setDescription("#");
}
this.expDetailService.create(expDetail);
((ExpOperationServiceImpl) AopContext.currentProxy()).asyncExpDetail(expDetail);
}
}
......
......@@ -12,19 +12,21 @@ 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.MemberOperationService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.process.service.dto.CustomPointsResult;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.util.DateUtil;
import com.topdraw.util.IdWorker;
import com.topdraw.util.RedissonUtil;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
......@@ -36,6 +38,7 @@ import org.springframework.util.CollectionUtils;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
......@@ -46,20 +49,23 @@ import java.util.stream.Collectors;
@Slf4j
public class PointsOperationServiceImpl implements PointsOperationService {
private static final Logger LOG = LoggerFactory.getLogger(PointsOperationServiceImpl.class);
@Autowired
PointsService pointsService;
private PointsService pointsService;
@Autowired
private PointsDetailService pointsDetailService;
@Autowired
private PointsAvailableService pointsAvailableService;
@Autowired
PointsDetailService pointsDetailService;
private PointsDetailHistoryService pointsDetailHistoryService;
@Autowired
PointsAvailableService pointsAvailableService;
private MemberOperationService memberOperationService;
@Autowired
PointsDetailHistoryService pointsDetailHistoryService;
private MemberService memberService;
@Autowired
MemberOperationService memberOperationService;
private RedisUtils redisUtils;
@Autowired
MemberService memberService;
ThreadPoolTaskExecutor threadPoolTaskExecutor;
// 过期阈值 30天
private static final Integer EXPIRE_FACTOR = 30;
......@@ -67,14 +73,18 @@ public class PointsOperationServiceImpl implements PointsOperationService {
private static final String DELETE_AVAILABLE_POINTS = "delete";
private static final String INSERT_AVAILABLE_POINTS = "insert";
@Autowired
RedissonClient redissonClient;
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
@AsyncMqSend
public void asyncMemberPoint(Member member) {}
@AsyncMqSend
public void asyncPointsAvailable(PointsAvailable pointsAvailable) {}
@AsyncMqSend
public void asyncDeletePointsAvailable(PointsAvailable pointsAvailable) {}
@AsyncMqSend
public void asyncPointsDetail(PointsDetail pointsDetail) {}
@Override
@Transactional(rollbackFor = Exception.class)
public void grantPointsByManual(Long memberId,TempPoints tempPoints){
public void grantPointsByManual(Long memberId, TempPoints tempPoints){
if (Objects.nonNull(tempPoints) && Objects.nonNull(tempPoints.getPoints())) {
MemberDTO memberDTo = this.memberService.findById(memberId);
String memberCode = memberDTo.getCode();
......@@ -84,9 +94,12 @@ public class PointsOperationServiceImpl implements PointsOperationService {
}
@Override
@AsyncMqSend
public void grantPointsByManualByTempPoints(TempPoints tempPoints) {
if (Objects.nonNull(tempPoints) && Objects.nonNull(tempPoints.getPoints())) {
Timestamp expireTime = tempPoints.getExpireTime();
if (Objects.isNull(expireTime)){
tempPoints.setExpireTime(TimestampUtil.localDateTime2Timestamp(DateUtil.getLastDateTimeSecondYear()));
}
this.refresh(tempPoints);
}
}
......@@ -98,18 +111,17 @@ public class PointsOperationServiceImpl implements PointsOperationService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public CustomPointsResult customPoints(TempPoints tempPoints) {
CustomPointsResult customPointsResult = new CustomPointsResult();
Long memberId = tempPoints.getMemberId();
RLock rLock = this.redissonClient.getLock("member::id::" + memberId.toString());
try {
RedissonUtil.lock(rLock);
this.redisUtils.doLock("member::id::" + memberId.toString());
//1.删除过期的积分
this.cleanInvalidAvailablePointsByMemberId(memberId);
log.info("删除过期的积分 ==>> cleanInvalidAvailablePointsByMemberId ==>> ");
// 1.判断可用积分是否够用
boolean b = this.checkAvailablePoints(tempPoints);
// 3.当前可用总积分
......@@ -122,25 +134,28 @@ public class PointsOperationServiceImpl implements PointsOperationService {
this.customAvailablePoints(tempPoints, pointsAvailableDTOS);
// 3.添加积分明细
this.doInsertTrPointsDetailByAvailablePointsMap(tempPoints, customAvailablePointsMap, currentPoints);
log.info("添加积分明细 ==>> doInsertTrPointsDetailByAvailablePointsMap ==>> ");
// 4.更新可用积分表,超过的删除,剩余的新增
long totalPoints = this.doFreshTrPointsAvailableByAvailablePointsMap(customAvailablePointsMap, currentPoints);
// 5.即将过期的积分
long soonExpirePoints = this.getSoonExpirePoints(memberId, tempPoints);
// 6.更新会员积分信息
this.freshMemberCurrentPoints(memberId, totalPoints,soonExpirePoints,tempPoints);
this.freshMemberCurrentPoints(memberId, totalPoints, soonExpirePoints);
customPointsResult.setResult(true);
customPointsResult.setPoint(totalPoints);
return customPointsResult;
} else {
customPointsResult.setResult(false);
customPointsResult.setPoint(currentPoints);
}
}catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doUnLock("member::id::" + memberId.toString());
}
return customPointsResult;
......@@ -151,7 +166,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
* @param customAvailablePointsMap
*/
private long doFreshTrPointsAvailableByAvailablePointsMap(
Map<String, List<PointsAvailableDTO>> customAvailablePointsMap,long currentPoints) {
Map<String, List<PointsAvailableDTO>> customAvailablePointsMap, long currentPoints) {
long totalCustomAvailablePoints = 0L;
if (customAvailablePointsMap != null) {
......@@ -161,6 +176,10 @@ public class PointsOperationServiceImpl implements PointsOperationService {
for (PointsAvailableDTO pointsAvailableDTO : pointsAvailableDTOS1) {
totalCustomAvailablePoints = (totalCustomAvailablePoints+pointsAvailableDTO.getPoints());
this.pointsAvailableService.delete4Custom(pointsAvailableDTO.getId());
PointsAvailable pointsAvailable = new PointsAvailable();
BeanUtils.copyProperties(pointsAvailableDTO, pointsAvailable);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncDeletePointsAvailable(pointsAvailable);
}
}
......@@ -169,10 +188,12 @@ public class PointsOperationServiceImpl implements PointsOperationService {
if (!CollectionUtils.isEmpty(pointsAvailableDTOS2)) {
PointsAvailableDTO pointsAvailableDTO = pointsAvailableDTOS2.get(0);
PointsAvailable pointsAvailable = new PointsAvailable();
BeanUtils.copyProperties(pointsAvailableDTO,pointsAvailable);
BeanUtils.copyProperties(pointsAvailableDTO, pointsAvailable);
pointsAvailable.setId(null);
pointsAvailable.setCode(String.valueOf(IdWorker.generator()));
this.pointsAvailableService.create4Custom(pointsAvailable);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncPointsAvailable(pointsAvailable);
}
}
......@@ -195,12 +216,13 @@ public class PointsOperationServiceImpl implements PointsOperationService {
PointsAvailableDTO pointsAvailableDTO = pointsAvailableDTOS.get(0);
Long memberId = pointsAvailableDTO.getMemberId();
TempPoints tempPoints1 = new TempPoints();
BeanUtils.copyProperties(pointsAvailableDTO,tempPoints1);
BeanUtils.copyProperties(tempPoints,tempPoints1);
tempPoints1.setPoints(-(Math.abs(points)));
Long totalPoints = this.calculateTotalPoints(tempPoints1, currentPoints);
this.doInsertTrPointsDetail(memberId,tempPoints1,currentPoints,totalPoints);
TempPoints _tempPoints = new TempPoints();
BeanUtils.copyProperties(pointsAvailableDTO, _tempPoints);
BeanUtils.copyProperties(tempPoints, _tempPoints);
_tempPoints.setPoints(-(Math.abs(points)));
Long totalPoints = this.calculateTotalPoints(_tempPoints, currentPoints);
this.doInsertTrPointsDetail(memberId, _tempPoints, currentPoints, totalPoints);
}
}
......@@ -241,7 +263,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
long beyond = points1_ - points;
// 新增
PointsAvailableDTO pointsAvailableDTO2 = new PointsAvailableDTO();
BeanUtils.copyProperties(pointsAvailableDTO,pointsAvailableDTO2);
BeanUtils.copyProperties(pointsAvailableDTO, pointsAvailableDTO2);
pointsAvailableDTO2.setPoints(beyond);
pointsAvailableDTOS2.add(pointsAvailableDTO2);
......@@ -249,7 +271,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
long suit = points1 - beyond;
// 扣除
PointsAvailableDTO pointsAvailableDTO1 = new PointsAvailableDTO();
BeanUtils.copyProperties(pointsAvailableDTO,pointsAvailableDTO1);
BeanUtils.copyProperties(pointsAvailableDTO, pointsAvailableDTO1);
pointsAvailableDTO1.setPoints(suit);
pointsAvailableDTOS1.add(pointsAvailableDTO1);
......@@ -296,8 +318,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void grantPointsThroughTempRightsList(List<TempPoints> tempPointsList){
public void grantPointsThroughTempPoint(List<TempPoints> tempPointsList){
log.info("------->>grantPointsThroughTempRightsList start1");
for (TempPoints tempPoints : tempPointsList){
log.info("------->>grantPointsThroughTempRightsList start");
......@@ -310,9 +331,12 @@ public class PointsOperationServiceImpl implements PointsOperationService {
* @param memberId
*/
private void cleanInvalidAvailablePointsByMemberId(Long memberId) {
List<PointsAvailableDTO> pointsAvailableDTOS =
pointsAvailableService.findByMemberIdAndExpireTimeBefore(memberId,LocalDateTime.now());
pointsAvailableService.findByMemberIdAndExpireTimeBefore(memberId, TimestampUtil.now());
if (!CollectionUtils.isEmpty(pointsAvailableDTOS)) {
//1.获取原始积分
for (PointsAvailableDTO pointsAvailableDTO : pointsAvailableDTOS) {
// 添加积分明细 uc_points_detail
......@@ -353,29 +377,29 @@ public class PointsOperationServiceImpl implements PointsOperationService {
* @param memberId
* @param currentPoints
*/
private void doUpdateMemberPoints(Long memberId, long currentPoints,long soonExpirePoints) {
private void doUpdateMemberPoints(Long memberId, long currentPoints, long soonExpirePoints) {
MemberDTO memberDTO = this.memberService.findById(memberId);
Member member = new Member();
member.setId(memberId);
BeanUtils.copyProperties(memberDTO, member);
member.setPoints(currentPoints);
member.setDuePoints(soonExpirePoints);
// this.memberOperationService.update(member);
this.memberOperationService.doUpdateMemberPoints(member);
}
/**
*
* @param pointsAvailableDTOS
*/
private void doDeleteBatchInvalidAvailablePoints(List<PointsAvailableDTO> pointsAvailableDTOS) {
List<Long> collect = pointsAvailableDTOS.stream().map(pointsAvailableDTO -> pointsAvailableDTO.getId()).collect(Collectors.toList());
this.pointsAvailableService.deleteBatchByIds(collect);
}
/**
*
* @param pointsAvailableDTO
*/
private void doDeleteInvalidAvailablePoints(PointsAvailableDTO pointsAvailableDTO) {
this.pointsAvailableService.delete4Custom(pointsAvailableDTO.getId());
PointsAvailable pointsAvailable = new PointsAvailable();
BeanUtils.copyProperties(pointsAvailableDTO, pointsAvailable);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncDeletePointsAvailable(pointsAvailable);
}
/**
......@@ -385,6 +409,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
private void doCreatePointsDetail(PointsAvailableDTO pointsAvailableDTO) {
Long memberId = pointsAvailableDTO.getMemberId();
MemberDTO memberDTO = this.memberService.findById(memberId);
// 原始积分
long availablePoints = this.pointsAvailableService.findTotalPointsByMemberId(memberId);//this.findAvailablePointsByMemberId(memberId);
// 过期积分
......@@ -403,7 +428,11 @@ public class PointsOperationServiceImpl implements PointsOperationService {
pointsDetail.setEvtType(99);
pointsDetail.setCreateTime(TimestampUtil.now());
pointsDetail.setUpdateTime(TimestampUtil.now());
pointsDetail.setMemberCode(memberDTO.getCode());
this.pointsDetailService.create4Custom(pointsDetail);
log.info("asyncPointsDetail ==>> pointsDetail ==>> {}",pointsDetail);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncPointsDetail(pointsDetail);
}
/**
......@@ -415,40 +444,37 @@ public class PointsOperationServiceImpl implements PointsOperationService {
private void refresh(TempPoints tempPoints) {
Long memberId = tempPoints.getMemberId();
log.info("----------->> 会员id ===>>>>" + memberId);
RLock rLock = this.redissonClient.getLock("member::id::" + memberId.toString());
log.info("----------->> rLock --->> start" );
try {
RedissonUtil.lock(rLock);
this.redisUtils.doLock("member::id::" + memberId.toString());
// 1.可用总积分
Long currentPoints = this.findAvailablePointsByMemberId(memberId);
log.info("----------->> 可用总积分 --->>>> " + currentPoints);
log.info("----------->> 可用总积分 --->>>> {}", currentPoints);
// 2.计算总积分
Long totalPoints = this.calculateTotalPoints(tempPoints, currentPoints);
log.info("----------->> 总积分(可用总积分+获得的积分) --->>> " + totalPoints);
log.info("----------->> 总积分(可用总积分+获得的积分) --->>> {}", totalPoints);
// 3.添加积分明细
this.doInsertTrPointsDetail(memberId, tempPoints, currentPoints, totalPoints);
log.info("----------->> 添加积分明细 ");
log.info("----------->> 添加积分明细 --->>> ");
// 4.添加可用积分
this.doInsertTrPointsAvailable(tempPoints);
log.info("----------->> 添加可用积分 ");
log.info("----------->> 添加可用积分 -->>> ");
// 5.即将过期的积分
long soonExpirePoints = this.getSoonExpirePoints(memberId, tempPoints);
log.info("----------->> 即将过期的积分 ------->>>>> " + soonExpirePoints);
log.info("----------->> 即将过期的积分 ------->>>>> {}", soonExpirePoints);
// 6.更新会员的总积分
log.info("----------->> 更新会员的总积分 ------->>>>> 总积分--->>>" + totalPoints);
this.freshMemberCurrentPoints(memberId, totalPoints,soonExpirePoints,tempPoints);
log.info("----------->> 更新会员的总积分 ------->>>>> 总积分--->>> {}", totalPoints);
this.freshMemberCurrentPoints(memberId, totalPoints, soonExpirePoints);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
this.redisUtils.doUnLock("member::id::" + memberId.toString());
}
}
......@@ -471,7 +497,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
* @param memberId
* @return
*/
private long getSoonExpirePoints(Long memberId,TempPoints tempPoints) {
private long getSoonExpirePoints(Long memberId, TempPoints tempPoints) {
// 计算即将过期的天数
Integer factor = this.calculateExpireFactor(tempPoints);
if (Objects.isNull(factor)) {
......@@ -497,7 +523,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
* @param memberId 会员Id
* @param currentPoints 当前总积分
*/
private void freshMemberCurrentPoints(Long memberId, Long currentPoints,long duePoints,TempPoints tempPoints) {
private void freshMemberCurrentPoints(Long memberId, Long currentPoints, long duePoints) {
MemberDTO memberDTO = this.findMemberByMemberId(memberId);
......@@ -506,9 +532,11 @@ public class PointsOperationServiceImpl implements PointsOperationService {
member.setPoints(Objects.nonNull(currentPoints)?currentPoints:0);
member.setDuePoints(duePoints);
member.setUpdateTime(LocalDateTime.now());
member.setUpdateTime(TimestampUtil.now());
try {
this.memberOperationService.doUpdateMemberPoints(member);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncMemberPoint(member);
} catch (Exception e){
throw e;
}
......@@ -520,16 +548,6 @@ public class PointsOperationServiceImpl implements PointsOperationService {
}
/**
* 计算当前总积分
* @param memberId 会员id
* @return
*/
private Long findAvailablePointsByMemberId(long memberId){
Long availablePoints = this.pointsAvailableService.findAvailablePointsByMemberId(memberId);
return Objects.nonNull(availablePoints) ? availablePoints : 0L;
}
/**
* 更新可用积分表
* @param tempPoints
*/
......@@ -541,13 +559,14 @@ public class PointsOperationServiceImpl implements PointsOperationService {
String description = pointsAvailable.getDescription();
pointsAvailable.setCode(String.valueOf(IdWorker.generator()));
pointsAvailable.setDescription(StringUtils.isEmpty(description)?"#":description);
LocalDateTime timestamp = tempPoints.getExpireTime();
Timestamp timestamp = tempPoints.getExpireTime();
if (Objects.nonNull(timestamp)) {
pointsAvailable.setExpireTime(timestamp);
}
this.pointsAvailableService.create4Custom(pointsAvailable);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncPointsAvailable(pointsAvailable);
}
/**
......@@ -556,13 +575,15 @@ public class PointsOperationServiceImpl implements PointsOperationService {
* @param tempPoints 积分
* @return Integer 总积分
*/
private void doInsertTrPointsDetail(Long memberId, TempPoints tempPoints,Long currentPoints,Long totalPoints){
private void doInsertTrPointsDetail(Long memberId, TempPoints tempPoints, Long currentPoints, Long totalPoints){
MemberDTO memberDTO = this.memberService.findById(memberId);
PointsDetail pointsDetail = new PointsDetail();
BeanUtils.copyProperties(tempPoints,pointsDetail);
BeanUtils.copyProperties(tempPoints, pointsDetail);
pointsDetail.setId(null);
pointsDetail.setMemberId(memberId);
pointsDetail.setMemberCode(tempPoints.getMemberCode());
pointsDetail.setMemberCode(memberDTO.getCode());
pointsDetail.setCode(String.valueOf(IdWorker.generator()));
pointsDetail.setPoints(tempPoints.getPoints());
pointsDetail.setOriginalPoints(currentPoints);
......@@ -577,6 +598,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
// 保存积分流水
this.pointsDetailService.create4Custom(pointsDetail);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncPointsDetail(pointsDetail);
}
}
......
......@@ -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;
......@@ -16,12 +17,14 @@ import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.sql.Timestamp;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 权益处理
......@@ -33,25 +36,21 @@ import java.util.concurrent.*;
@Slf4j
public class RightsOperationServiceImpl implements RightsOperationService {
private static final Logger LOG = LoggerFactory.getLogger(RightsOperationServiceImpl.class);
@Autowired
RightsHistoryService rightsHistoryService;
private RightsHistoryService rightsHistoryService;
@Autowired
CouponOperationService couponOperationService;
private CouponOperationService couponOperationService;
@Autowired
RightsService rightsService;
private RightsService rightsService;
@Autowired
ExpOperationService expOperationService;
private ExpOperationService expOperationService;
@Autowired
PointsOperationService pointsOperationService;
private PointsOperationService pointsOperationService;
@Autowired
CouponService couponService;
// @Autowired
// ThreadPoolTaskExecutor threadPoolTaskExecutor;
private CouponService couponService;
private ExecutorService threadPoolTaskExecutor = Executors.newFixedThreadPool(10);
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
/**
* 系统手动发放
......@@ -76,12 +75,14 @@ public class RightsOperationServiceImpl implements RightsOperationService {
@Override
public void grantRights(Map<RightType, Object> tempRightsMap) {
// this.threadPoolTaskExecutor.execute(()-> {
this.threadPoolTaskExecutor.execute(()-> {
// 2.创建权益历史对象
List<RightsHistory> rightsList = this.getRightHistory(tempRightsMap);
if (!CollectionUtils.isEmpty(rightsList)) {
// 3.保存权益历史
this.doInsertTrRightHistory(rightsList);
// });
}
});
// 1.权益下发
this.refresh(tempRightsMap);
......@@ -95,7 +96,7 @@ public class RightsOperationServiceImpl implements RightsOperationService {
private List<RightsHistory> getRightHistory(Map<RightType, Object> tempRightsMap) {
List<TempRights> values = (List<TempRights>)tempRightsMap.get(RightType.RIGHTS);
List<RightsHistory> rightsHistoryList = new ArrayList<>();
if (!CollectionUtils.isEmpty(values)) {
values.forEach(value -> {
RightsHistory rightsHistory = new RightsHistory();
rightsHistory.setSendTime(TimestampUtil.now());
......@@ -106,6 +107,7 @@ public class RightsOperationServiceImpl implements RightsOperationService {
rightsHistory.setMemberCode(memberCode);
rightsHistoryList.add(rightsHistory);
});
}
return rightsHistoryList;
}
......@@ -116,7 +118,7 @@ public class RightsOperationServiceImpl implements RightsOperationService {
*/
private void grantExp(List<TempExp> tempExpList) {
if (!CollectionUtils.isEmpty(tempExpList))
this.expOperationService.grantPointsThroughTempExp(tempExpList);
this.expOperationService.grantExpThroughTempExp(tempExpList);
}
/**
......@@ -126,7 +128,7 @@ public class RightsOperationServiceImpl implements RightsOperationService {
*/
private void grantPoint(List<TempPoints> tempPointsList) {
if (!CollectionUtils.isEmpty(tempPointsList))
this.pointsOperationService.grantPointsThroughTempRightsList(tempPointsList);
this.pointsOperationService.grantPointsThroughTempPoint(tempPointsList);
}
/**
......@@ -234,7 +236,11 @@ public class RightsOperationServiceImpl implements RightsOperationService {
RightsDTO rightsDTO = this.getRights(rightId);
// 权益的实体类型 1:积分;2成长值;3优惠券
String type = rightsDTO.getEntityType();
Long expireTime = rightsDTO.getExpireTime();
Long expireTime1 = rightsDTO.getExpireTime();
Timestamp expireTime = null;
if (Objects.nonNull(expireTime1)){
expireTime = TimestampUtil.long2Timestamp(expireTime1);
}
switch (type) {
// 优惠券
......@@ -250,7 +256,8 @@ public class RightsOperationServiceImpl implements RightsOperationService {
tempCoupon.setRightsSendStrategy(0);
tempCoupon.setCode(couponDTO.getCode());
if (Objects.nonNull(expireTime))
tempCoupon.setExpireTime(TimestampUtil.long2LocalDateTime(expireTime));
// tempCoupon.setExpireTime(TimestampUtil.long2LocalDateTime(expireTime));
tempCoupon.setExpireTime(expireTime);
tempCouponList.add(tempCoupon);
}
break;
......
package com.topdraw.business.process.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.coupon.service.CouponService;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.business.module.member.group.service.MemberGroupService;
import com.topdraw.business.module.member.group.service.dto.MemberGroupDTO;
import com.topdraw.business.module.member.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;
import com.topdraw.business.module.rights.service.dto.RightsDTO;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.business.module.task.attribute.service.TaskAttrService;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrDTO;
import com.topdraw.business.module.task.domain.TaskBuilder;
import com.topdraw.business.module.task.progress.domain.TrTaskProgress;
import com.topdraw.business.module.task.progress.service.TrTaskProgressService;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressDTO;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressQueryCriteria;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.process.domian.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;
......@@ -34,18 +37,18 @@ import com.topdraw.business.process.domian.*;
import com.topdraw.business.process.service.UserOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.exception.BadRequestException;
import com.topdraw.module.mq.DataSyncMsg;
import com.topdraw.mq.module.mq.DataSyncMsg;
import com.topdraw.util.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.validation.constraints.NotNull;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
......@@ -64,63 +67,174 @@ import static java.util.stream.Collectors.toList;
@Slf4j
public class TaskOperationServiceImpl implements TaskOperationService {
@Autowired
TaskService taskService;
@Autowired
MemberService memberService;
private TaskService taskService;
@Autowired
RightsService rightsService;
private UserTvService userTvService;
@Autowired
TaskTemplateService taskTemplateService;
private MemberService memberService;
@Autowired
RightsOperationService rightsOperationService;
private RightsService rightsService;
@Autowired
TrTaskProgressService trTaskProgressService;
private CouponService couponService;
@Autowired
PermanentRightsService permanentRightsService;
private TaskAttrService taskAttrService;
@Autowired
CouponService couponService;
private MemberGroupService memberGroupService;
@Autowired
MemberGroupService memberGroupService;
private TaskTemplateService taskTemplateService;
@Autowired
TaskAttrService taskAttrService;
private TrTaskProgressService trTaskProgressService;
@Autowired
UserTvService userTvService;
private RightsOperationService rightsOperationService;
private static final Integer TASK_FINISH_STATUS = 1;
private static final Integer TASK_UNFINISH_STATUS = 2;
private static final Integer POINTS_TYPE_RANDOM = 1;
private static final Integer POINTS_MIN = 1;
@AsyncMqSend
public void asyncCreateTask(Task task) {}
@AsyncMqSend
public void asyncUpdateTask(Task task) {}
@AsyncMqSend
public void asyncDeleteTask(Task task) {}
@Override
public void createTask(Task task) {
Long taskTemplateId = task.getTaskTemplateId();
TaskTemplateDTO taskTemplateDTO = this.findByTemplateId(taskTemplateId);
task.setTaskTemplateCode(taskTemplateDTO.getCode());
Task task_ = TaskBuilder.build(task);
TaskDTO taskDTO = this.taskService.create(task_);
if (Objects.nonNull(taskDTO.getId())) {
task_.setId(taskDTO.getId());
this.createTaskAttr(task_);
}
((TaskOperationServiceImpl) AopContext.currentProxy()).asyncCreateTask(task_);
}
/**
*
* @param taskTemplateId
* @return
*/
private TaskTemplateDTO findByTemplateId(Long taskTemplateId){
return this.taskTemplateService.findById(taskTemplateId);
}
/**
*
* @param task_
*/
private void createTaskAttr(Task task_) {
TaskAttr taskAttr = new TaskAttr();
taskAttr.setAttrStr(task_.getAttr());
taskAttr.setTaskId(task_.getId());
this.taskAttrService.create(taskAttr);
}
@Override
public void updateTask(Task task) {
Long taskTemplateId = task.getTaskTemplateId();
TaskTemplateDTO taskTemplateDTO = this.findByTemplateId(taskTemplateId);
task.setTaskTemplateCode(taskTemplateDTO.getCode());
TaskDTO update = this.taskService.update(task);
if (Objects.nonNull(update.getId())) {
this.updateTaskAttr(task);
}
((TaskOperationServiceImpl) AopContext.currentProxy()).asyncUpdateTask(task);
}
/**
*
* @param task_
*/
private void updateTaskAttr(Task task_) {
TaskAttrDTO taskAttrDTO = this.findTaskAttrByTaskId(task_.getId());
if (Objects.nonNull(taskAttrDTO.getId())) {
TaskAttr taskAttr = new TaskAttr();
BeanUtils.copyProperties(taskAttrDTO, taskAttr);
taskAttr.setAttrStr(task_.getAttr());
this.taskAttrService.update(taskAttr);
}
}
@Override
public void deleteTask(Task task) {
Long id = task.getId();
TaskDTO taskDTO = this.findById(id);
if (Objects.nonNull(taskDTO.getId())) {
task.setId(taskDTO.getId());
this.taskService.delete(task);
task.setCode(taskDTO.getCode());
((TaskOperationServiceImpl) AopContext.currentProxy()).asyncDeleteTask(task);
}
}
@Override
public void deleteTask(Long id) {
TaskDTO taskDTO = this.findById(id);
if (Objects.nonNull(taskDTO.getId())) {
Task task = new Task();
task.setId(taskDTO.getId());
task.setCode(taskDTO.getCode());
this.deleteTask(task);
}
}
@Override
public TaskDTO findById(Long id) {
TaskDTO taskDTO = this.taskService.findById(id);
Long id1 = taskDTO.getId();
TaskAttrDTO taskAttrDTO = this.taskAttrService.findByTaskId(id1);
if (Objects.nonNull(taskAttrDTO.getId())) {
String attrStr = taskAttrDTO.getAttrStr();
taskDTO.setAttr(attrStr);
}
return taskDTO;
}
@Override
public TaskDTO findByCode(String code) {
TaskDTO taskDTO = this.taskService.findByCode(code);
return taskDTO;
}
@Override
public ResultInfo dealTask(String content) {
DataSyncMsg dataSyncMsg = JSONUtil.parseMsg2Object(content, DataSyncMsg.class);
Integer event = dataSyncMsg.getEvent();
DataSyncMsg.MsgData msgData = dataSyncMsg.getMsg();
Integer event = msgData.getEvent();
String memberCode = msgData.getMemberCode();
Long memberId = msgData.getMemberId();
if (StringUtils.hasText(memberCode)) {
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (StringUtils.isNotBlank(memberCode)) {
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
memberId = memberDTO.getId();
}
// 检查当前会员的黑名单状态
boolean b = this.validatedMemberBlackStatus(memberId);
if (!b) {
return ResultInfo.forbidden(" 会员已被加入黑名单");
return ResultInfo.forbidden("会员已被加入黑名单");
}
// 1.通过任务标识获取任务模板,通过模板参数获取具体的模板
TaskTemplate taskTemplate = this.getTaskTemplate(event,dataSyncMsg);
TaskTemplate taskTemplate = this.getTaskTemplate(event, dataSyncMsg);
// 2.通过任务模板获取对应的任务列表
List<Task> taskList = this.loadListTaskByTaskTemplate(taskTemplate,dataSyncMsg);
List<Task> taskList = this.loadListTaskByTaskTemplate(taskTemplate, dataSyncMsg);
// 4.判断当前用户是否满足任务完成条件
boolean checkResult = this.checkTaskCompletion(memberId,taskList);
boolean checkResult = this.checkTaskCompletion(memberId, taskList, event, msgData);
if (checkResult) {
// 5.权益区分(积分、权益、成长值)
Map<RightType,Object> tempRightsMap = this.distinguishRight(memberId,taskList,msgData);
Map<RightType,Object> tempRightsMap = this.distinguishRight(memberId, taskList, msgData, dataSyncMsg);
// 6.风控检查
boolean result = this.checkRiskManagement(memberId,tempRightsMap);
......@@ -131,11 +245,12 @@ public class TaskOperationServiceImpl implements TaskOperationService {
this.grantRight(tempRightsMap);
}
System.out.println(taskList);
return ResultInfo.success();
}
/**
* 风控检查
* @param memberId
......@@ -156,7 +271,6 @@ public class TaskOperationServiceImpl implements TaskOperationService {
log.info("validatedMember -->>【memberId】 -->> " + memberId);
MemberDTO memberDTO = this.memberService.findById(memberId);
Long blackStatus = memberDTO.getBlackStatus();
// TODO 检查balckStatus无法获取的原因
if (Objects.nonNull(blackStatus) && blackStatus == 1) {
log.error("validatedMember -->> 会员已被加入黑名单 【blackStatus】 -->> " + blackStatus);
return false;
......@@ -192,7 +306,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param taskList 任务列表
* @return Map<RightType,Object> 权益分类
*/
private Map<RightType,Object> distinguishRight(Long memberId,List<Task> taskList,DataSyncMsg.MsgData msgData) {
private Map<RightType,Object> distinguishRight(Long memberId, List<Task> taskList, DataSyncMsg.MsgData msgData, DataSyncMsg dataSyncMsg) {
Map<RightType,Object> map = new HashMap<>();
......@@ -200,15 +314,17 @@ public class TaskOperationServiceImpl implements TaskOperationService {
for (Task task : taskList) {
// 积分
List<TempPoints> tempPointsList = this.getTempPoints(memberId,msgData,task);
List<TempPoints> tempPointsList = this.getTempPoints(memberId, msgData, task, dataSyncMsg);
if (!CollectionUtils.isEmpty(tempPointsList))
map.put(RightType.POINTS,tempPointsList);
// 成长值
List<TempExp> tempExpList = this.getTempExp(memberId,msgData,task);
List<TempExp> tempExpList = this.getTempExp(memberId,msgData,task, dataSyncMsg);
if (!CollectionUtils.isEmpty(tempExpList))
map.put(RightType.EXP,tempExpList);
// 权益
map = this.getTempRight(memberId,task,map);
map = this.getTempRight(memberId, task, map);
}
......@@ -216,78 +332,6 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
private Long getIptvPriorityMemberId(Long memberId1,DataSyncMsg.MsgData msgData) {
//
if (Objects.nonNull(memberId1)) {
return memberId1;
}
@NotNull Integer deviceType = msgData.getDeviceType();
Long userId = msgData.getUserId();
// 大屏
if (Objects.nonNull(userId) || deviceType == 1) {
}
MemberDTO memberDTO = this.findMemberById(memberId1);
if (Objects.nonNull(memberDTO.getId())) {
Long userIptvId = memberDTO.getUserIptvId();
// 绑定了大屏,直接返回小屏会员id
if (Objects.nonNull(userIptvId)) {
return memberDTO.getId();
} else {
//
}
}
return null;
}
/**
* 验证是否满足永久权益
* @param permanentRights
* @param memberId
* @return
*/
private boolean validatedPermanentRights(PermanentRightsDTO permanentRights, Long memberId){
// 永久权益类型 0:vip;1:会员等级
Integer type = 0;
// 等级(当权益类型为vip时,对应vip值,当权益类型为会员等级时,对应等级index)
Integer level = 0;
if (Objects.nonNull(permanentRights)) {
level = permanentRights.getLevel();
type = permanentRights.getType();
}
boolean result = false;
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
// 会员vip等级
Integer memberVip = memberDTO.getVip();
// 会员等级
Integer memberLevel = memberDTO.getLevel();
switch (type) {
// vip等级
case 0:
if ((Objects.isNull(memberVip) ? 0 : memberVip) >= level)
result = true;
break;
// 会员等级
case 1:
if ((Objects.isNull(memberLevel) ? 0 : memberLevel) >= level)
result = true;
break;
default:
break;
}
}
return result;
}
/**
* 创建权益
* @param memberId
......@@ -301,9 +345,12 @@ public class TaskOperationServiceImpl implements TaskOperationService {
tempRights.setMemberId(memberId);
tempRights.setMemberCode(memberCode);
tempRights.setRightsAmount(rightsAmount);
Long expireTime = rightsDTO.getExpireTime();
Long expireTime1 = rightsDTO.getExpireTime();
if (Objects.nonNull(expireTime1)) {
Timestamp expireTime = TimestampUtil.long2Timestamp(expireTime1);
if (Objects.nonNull(expireTime))
tempRights.setExpireTime(TimestampUtil.long2LocalDateTime(expireTime));
tempRights.setExpireTime(expireTime);
}
return tempRights;
}
......@@ -371,8 +418,13 @@ public class TaskOperationServiceImpl implements TaskOperationService {
this.getTempRightType(memberDTO,rights3Id,rights3Amount,rightsSendStrategy,tempCouponList,rightsList);
}
// 优惠券
if (!CollectionUtils.isEmpty(tempCouponList)) {
map.put(RightType.COUPON,tempCouponList);
}
// 权益
if (!CollectionUtils.isEmpty(rightsList)) {
map.put(RightType.RIGHTS,rightsList);
}
return map;
}
......@@ -454,17 +506,20 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param task
* @return
*/
private List<TempExp> getTempExp(Long memberId , DataSyncMsg.MsgData msgData,Task task) {
private List<TempExp> getTempExp(Long memberId, DataSyncMsg.MsgData msgData, Task task, DataSyncMsg dataSyncMsg) {
Long rewardExp = task.getRewardExp();
if (Objects.nonNull(rewardExp) && rewardExp > 0L) {
TempExp tempExp = new TempExp();
tempExp.setMemberId(memberId);
tempExp.setAppCode(msgData.getAppCode());
tempExp.setMemberId(msgData.getMemberId());
tempExp.setMemberId(memberId);
tempExp.setMemberCode(msgData.getMemberCode());
tempExp.setItemId(msgData.getItemId());
tempExp.setAccountId(msgData.getAccountId());
tempExp.setRewardExp(task.getRewardExp());
tempExp.setDeviceType(msgData.getDeviceType());
tempExp.setEvtType(msgData.getEvent());
tempExp.setDeviceType(dataSyncMsg.getDeviceType());
tempExp.setEvtType(dataSyncMsg.getEvent());
tempExp.setOrderId(msgData.getOrderId());
tempExp.setMediaId(msgData.getMediaId());
tempExp.setActivityId(msgData.getOrderId());
......@@ -474,18 +529,22 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
return null;
}
/**
* 积分
* @param task
* @return
*/
private List<TempPoints> getTempPoints(Long memberId,DataSyncMsg.MsgData msgData,Task task) {
private List<TempPoints> getTempPoints(Long memberId, DataSyncMsg.MsgData msgData, Task task, DataSyncMsg dataSyncMsg) {
// 积分: 数值、过期时间、积分类型(定值、随机)、随机积分最大值
Long rewardPoints = task.getRewardPoints();
// 过期时间
Long rewardPointsExpireTime = task.getRewardPointsExpireTime();
LocalDateTime expireTime = task.getExpireTime();
Timestamp expireTime = task.getExpireTime();
// 积分类型(0:定值、1:随机)
Integer pointsType = task.getPointsType();
// 随机积分的最大值
......@@ -502,14 +561,14 @@ public class TaskOperationServiceImpl implements TaskOperationService {
tempPoints.setAppCode(msgData.getAppCode());
tempPoints.setPoints(rewardPoints);
tempPoints.setPointsType(pointsType);
tempPoints.setDeviceType(msgData.getDeviceType());
tempPoints.setDeviceType(dataSyncMsg.getDeviceType());
tempPoints.setExpireTime(expireTime);
tempPoints.setOrderId(msgData.getOrderId());
tempPoints.setActivityId(msgData.getOrderId());
tempPoints.setMediaId(msgData.getMediaId());
tempPoints.setItemId(msgData.getItemId());
tempPoints.setAccountId(msgData.getAccountId());
tempPoints.setEvtType(msgData.getEvent());
tempPoints.setEvtType(dataSyncMsg.getEvent());
Integer rightsSendStrategy = task.getRightsSendStrategy();
tempPoints.setRightsSendStrategy(Objects.isNull(rightsSendStrategy) ? 0 : rightsSendStrategy);
return Arrays.asList(tempPoints);
......@@ -534,7 +593,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @return boolean true:success false:fail
*/
//<taskId,boolean>
private boolean checkTaskCompletion(Long memberId , List<Task> taskList) {
private boolean checkTaskCompletion(Long memberId , List<Task> taskList, Integer event, DataSyncMsg.MsgData msgData) {
if (!CollectionUtils.isEmpty(taskList)) {
// 会员信息
MemberDTO memberDTO = this.memberService.findById(memberId);
......@@ -544,16 +603,14 @@ public class TaskOperationServiceImpl implements TaskOperationService {
List<Task> taskStream = taskList1.stream().filter(task1 ->
task1.getStatus() == 1 &&
(Objects.isNull(task1.getExpireTime()) || task1.getExpireTime().compareTo(LocalDateTime.now()) >= 0) &&
(Objects.isNull(task1.getExpireTime()) || task1.getExpireTime().compareTo(TimestampUtil.now()) >= 0) &&
(Objects.isNull(task1.getValidTime()) || task1.getValidTime().compareTo(TimestampUtil.now()) <= 0) &&
(Objects.isNull(task1.getMemberLevel()) || task1.getMemberLevel() <= memberDTO1.getLevel()) &&
(Objects.isNull(task1.getMemberVip()) || task1.getMemberVip() <= memberDTO1.getVip())
).collect(toList());
// 没有满足条件的数据
if (CollectionUtils.isEmpty(taskStream)) {
return false;
} else {
if (!CollectionUtils.isEmpty(taskStream)) {
// 验证会员分组
boolean result1 = this.validatedMemberGroup(memberId,taskList);
......@@ -561,11 +618,18 @@ public class TaskOperationServiceImpl implements TaskOperationService {
return false;
// 获取当前任务的完成情况
boolean result = this.checkAndRefreshTaskCompletion(memberId,taskList);
boolean result = this.checkAndRefreshTaskCompletion(memberId,taskList,event,msgData);
return result;
} else {
return false;
}
};
return compareTaskCondition.compareCondition(memberDTO,taskList);
}
......@@ -646,9 +710,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @return
*/
private List<MemberGroupDTO> findGroupByMemberId(Long memberId) {
MemberGroupQueryCriteria memberGroupQueryCriteria = new MemberGroupQueryCriteria();
memberGroupQueryCriteria.setMemberId(memberId);
return this.memberGroupService.queryAll(memberGroupQueryCriteria);
return this.memberGroupService.findByMemberId(memberId);
}
/**
......@@ -672,15 +734,11 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param taskStream
* @return boolean false:失败 true:成功
*/
private boolean checkAndRefreshTaskCompletion(Long memberId , List<Task> taskStream) {
TrTaskProgressQueryCriteria trTaskProgressQueryCriteria = new TrTaskProgressQueryCriteria();
trTaskProgressQueryCriteria.setMemberId(memberId);
private boolean checkAndRefreshTaskCompletion(Long memberId , List<Task> taskStream, Integer event, DataSyncMsg.MsgData msgData) {
String time1 = LocalDateTimeUtil.todayStart();
for (Task task : taskStream) {
Long taskId = task.getId();
trTaskProgressQueryCriteria.setTaskId(taskId);
// 任务完成记录
List<TrTaskProgressDTO> trTaskProgressDTOS =
this.trTaskProgressService.findByMemberIdAndTaskIdAndCompletionTime(memberId,taskId,time1);
......@@ -693,6 +751,30 @@ public class TaskOperationServiceImpl implements TaskOperationService {
// 行为量(完成此任务需要多少次相同行为的触发)
Integer actionAmount = task.getActionAmount();
switch (event) {
// 播放记录
case 8:
if (!CollectionUtils.isEmpty(trTaskProgressDTOS)) {
TrTaskProgressDTO trTaskProgressDTO_0 = trTaskProgressDTOS.get(0);
Integer status_0 = trTaskProgressDTO_0.getStatus();
Integer currentActionAmount_0 = trTaskProgressDTO_0.getCurrentActionAmount();
Timestamp completionTime_0 = trTaskProgressDTO_0.getCompletionTime();
if (status_0 == 1 && currentActionAmount_0 != null && Objects.nonNull(completionTime_0)) {
return false;
}
}
String param = msgData.getParam();
JSONObject jsonObject = JSON.parseObject(param);
Integer value = Integer.valueOf(jsonObject.get("playDuration").toString());
if (value >= actionAmount) {
currentActionAmount = actionAmount;
completionTime = TimestampUtil.now();
status = TASK_FINISH_STATUS;
}
break;
default:
// 行为量 1
if (actionAmount == 1) {
......@@ -716,6 +798,15 @@ public class TaskOperationServiceImpl implements TaskOperationService {
Objects.nonNull(completionTime1) &&
completionTime1.toLocalDateTime().toLocalDate().compareTo(LocalDate.now()) == 0) {
// 任务重复类型
Integer taskDailyReset = task.getTaskDailyReset();
if (taskDailyReset == -1) {
return true;
} else if (currentActionAmount_ < taskDailyReset){
return true;
}
return false;
// 未做,成功
......@@ -763,6 +854,12 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
break;
}
TrTaskProgress trTaskProgress = new TrTaskProgress();
trTaskProgress.setId(id);
trTaskProgress.setCurrentActionAmount(currentActionAmount);
......@@ -774,11 +871,9 @@ public class TaskOperationServiceImpl implements TaskOperationService {
// 更新任务完成情况
this.doRefreshTrTaskProcess(trTaskProgress);
// 行为量达标
if (currentActionAmount.compareTo(actionAmount) == 0) {
return true;
}
}
return false;
}
......@@ -789,7 +884,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param taskTemplate 任务模板
* @return List<task> 任务列表
*/
private List<Task> loadListTaskByTaskTemplate(TaskTemplate taskTemplate,DataSyncMsg dataSyncMsg) {
private List<Task> loadListTaskByTaskTemplate(TaskTemplate taskTemplate, DataSyncMsg dataSyncMsg) {
if (Objects.nonNull(taskTemplate)) {
......@@ -798,7 +893,8 @@ public class TaskOperationServiceImpl implements TaskOperationService {
List<Task> taskList = this.taskService.findByTemplateId(taskTemplateId);
Integer type = taskTemplate.getType();
taskList = this.pickUpTask(taskList,dataSyncMsg,type);
taskList = this.pickUpTask(taskList, dataSyncMsg, type);
return taskList;
}
......@@ -818,10 +914,10 @@ public class TaskOperationServiceImpl implements TaskOperationService {
DataSyncMsg.MsgData msgData = dataSyncMsg.getMsg();
if (Objects.nonNull(msgData)) {
if (Objects.nonNull(msgData.getParam())) {
String param = msgData.getParam();
Map<String,String> jsonObjectMap = JSONObject.parseObject(param,Map.class);
Map<String,String> jsonObjectMap = JSONObject.parseObject(param, Map.class);
Collection<String> values = jsonObjectMap.values();
for (Task task : taskList) {
......@@ -832,7 +928,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
continue;
String attrStr = taskAttrDTO.getAttrStr();
if (StringUtils.hasText(attrStr)) {
if (StringUtils.isNotBlank(attrStr)) {
JSONObject jsonObject = JSONObject.parseObject(attrStr);
JSONArray values_0 = jsonObject.getJSONArray("value");
......@@ -850,12 +946,59 @@ public class TaskOperationServiceImpl implements TaskOperationService {
taskList1.add(task);
break;
// 观影
case TaskTemplateType.TYPE_2:
Integer view0 = (Integer)values_0.get(0);
Integer view1 = (Integer)values_0.get(1);
List<Integer> view0List = Arrays.asList(view0, view1);
String view_0 = values.toArray()[0].toString();
Integer view0_ = Integer.valueOf(view_0);
boolean view = UcListUtils.compareIntegerList(view0_, view0List);
if (view)
taskList1.add(task);
break;
// 参加活动
case TaskTemplateType.TYPE_3:
/*String activityCode = values_0.get(0).toString();
String activityCode_ = values.toArray()[0].toString();
if (activityCode_.equalsIgnoreCase(activityCode)) {
taskList1.add(task);
}*/
if (values_0.containsAll(values))
taskList1.add(task);
break;
// 订购
case TaskTemplateType.TYPE_4:
if (values_0.containsAll(values))
taskList1.add(task);
break;
// 签到
case TaskTemplateType.TYPE_6:
Integer sign0 = (Integer)values_0.get(0);
Integer sign1 = (Integer)values_0.get(1);
List<Integer> signi0List = Arrays.asList(sign0, sign1);
String signs0 = values.toArray()[0].toString();
Integer signi0 = Integer.valueOf(signs0);
boolean signb0 = UcListUtils.compareIntegerList(signi0, signi0List);
if (signb0)
taskList1.add(task);
break;
// 播放记录
case TaskTemplateType.TYPE_8:
Integer play0 = (Integer)values_0.get(0);
Integer play1 = (Integer)values_0.get(1);
List<Integer> playList = Arrays.asList(play0, play1);
String s0 = values.toArray()[0].toString();
Integer i0 = Integer.valueOf(s0);
boolean b0 = UcListUtils.compareIntegerList(i0, playList);
if (b0)
taskList1.add(task);
break;
default:
break;
}
......@@ -899,20 +1042,22 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param event 任务
* @return TaskTemplate 任务模板
*/
private TaskTemplate getTaskTemplate(Integer event,DataSyncMsg msgData) {
private TaskTemplate getTaskTemplate(Integer event, DataSyncMsg msgData) {
DataSyncMsg.MsgData msg = msgData.getMsg();
if (Objects.nonNull(msg)) {
if (Objects.nonNull(msg.getParam())) {
return this.findByTypeAndParam(event,msg);
} else {
List<TaskTemplate> taskTemplateList = this.taskTemplateService.findByType(event);
TaskTemplateDTO taskTemplateDTO = this.taskTemplateService.findByType(event);
if (!CollectionUtils.isEmpty(taskTemplateList)) {
if (Objects.nonNull(taskTemplateDTO)) {
return taskTemplateList.get(0);
TaskTemplate taskTemplate = new TaskTemplate();
BeanUtils.copyProperties(taskTemplateDTO, taskTemplate);
return taskTemplate;
} else {
......@@ -925,22 +1070,26 @@ public class TaskOperationServiceImpl implements TaskOperationService {
private TaskTemplate findByTypeAndParam(Integer event, DataSyncMsg.MsgData taskTemplateParam) {
String param = taskTemplateParam.getParam();
if (StringUtils.hasText(param)) {
if (StringUtils.isNotBlank(param)) {
Map<String,String> jsonObject = JSONObject.parseObject(param,Map.class);
List<TaskTemplate> taskTemplateList = this.taskTemplateService.findByType(event);
if (!CollectionUtils.isEmpty(taskTemplateList)) {
TaskTemplateDTO taskTemplateDTO = this.taskTemplateService.findByType(event);
if (Objects.nonNull(taskTemplateDTO)) {
for (TaskTemplate taskTemplate : taskTemplateList) {
String templateParams = taskTemplate.getParams();
if(StringUtils.hasText(templateParams)) {
String templateParams = taskTemplateDTO.getParams();
if(StringUtils.isNotBlank(templateParams)) {
String templateParamsUpperCase = templateParams.toUpperCase();
boolean b = jsonObject.containsKey(templateParamsUpperCase);
if (b)
Set<String> keySet = jsonObject.keySet();
for (String key : keySet) {
String s = key.toUpperCase();
if (s.equals(templateParamsUpperCase)) {
TaskTemplate taskTemplate = new TaskTemplate();
BeanUtils.copyProperties(taskTemplateDTO, taskTemplate);
return taskTemplate;
}
continue;
}
}
}
......@@ -983,7 +1132,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
long l = System.currentTimeMillis();
this.userTvOperationService.createMemberByUserTv(this.checkUserTv(platformAccount));
this.userTvOperationService.createTvUserAndMember(this.checkUserTv(platformAccount));
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
......@@ -1000,7 +1149,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
tempPoints.setDeviceType(1);
tempPoints.setEvtType(3);
tempPoints.setPointsType(0);
tempPoints.setExpireTime(LocalDateTime.of(2022,12,31,23,59,59));
tempPoints.setExpireTime(TimestampUtil.localDateTime2Timestamp(LocalDateTime.of(2022,12,31,23,59,59)));
this.pointsOperationService.grantPointsByManualByTempPoints(tempPoints);
}
......
package com.topdraw.business.process.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.domain.TaskTemplateBuilder;
import com.topdraw.business.module.task.template.service.TaskTemplateService;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.process.service.TaskTemplateOperationService;
import com.topdraw.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/4/25 22:27
* @version: :
* @modified By:
* @since : modified in 2022/4/25 22:27
*/
@Service
@Slf4j
public class TaskTemplateOperationServiceImpl implements TaskTemplateOperationService {
@Autowired
private TaskTemplateService taskTemplateService;
@AsyncMqSend
public void asyncCreate(TaskTemplate resources) {}
@AsyncMqSend
public void asyncUpdate(TaskTemplate resources) {}
@AsyncMqSend
public void asyncDelete(TaskTemplate resources) {}
@Override
public void create(TaskTemplate resources) {
TaskTemplate taskTemplate = TaskTemplateBuilder.build(resources);
TaskTemplateDTO taskTemplate_ = this.taskTemplateService.create(taskTemplate);
TaskTemplate taskTemplate1 = new TaskTemplate();
BeanUtils.copyProperties(taskTemplate_, taskTemplate1);
((TaskTemplateOperationServiceImpl) AopContext.currentProxy()).asyncCreate(taskTemplate1);
}
@Override
public void update(TaskTemplate resources) {
TaskTemplateDTO taskTemplate_ = this.taskTemplateService.update(resources);
TaskTemplate taskTemplate1 = new TaskTemplate();
BeanUtils.copyProperties(taskTemplate_, taskTemplate1);
((TaskTemplateOperationServiceImpl) AopContext.currentProxy()).asyncUpdate(taskTemplate1);
}
@Override
public void delete(TaskTemplate resources) {
this.taskTemplateService.delete(resources);
((TaskTemplateOperationServiceImpl) AopContext.currentProxy()).asyncDelete(resources);
}
@Override
public void delete(Long id) {
TaskTemplateDTO taskTemplateDTO = this.findById(id);
if (Objects.nonNull(taskTemplateDTO.getId())) {
TaskTemplate taskTemplate = new TaskTemplate();
taskTemplate.setId(id);
taskTemplate.setCode(taskTemplateDTO.getCode());
this.delete(taskTemplate);
}
}
@Override
public TaskTemplateDTO findByCode(String code) {
return this.taskTemplateService.findByCode(code);
}
@Override
public TaskTemplateDTO findById(Long id) {
return this.taskTemplateService.findById(id);
}
@Override
public TaskTemplateDTO findByEvent(String event) {
return this.taskTemplateService.findByEvent(event);
}
@Override
public TaskTemplateDTO findByType(Integer type) {
return this.taskTemplateService.findByType(type);
}
}
package com.topdraw.business.process.service.impl.member;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.service.MemberAddressService;
import com.topdraw.business.module.member.address.service.dto.BasicMemberAddressDTO;
import com.topdraw.business.module.member.address.service.dto.MemberAddressDTO;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.process.service.member.MemberAddressOperationService;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class MemberAddressOperationServiceImpl implements MemberAddressOperationService {
@Autowired
private MemberAddressService memberAddressService;
@Autowired
private MemberService memberService;
@AsyncMqSend
public void asyncMemberAddress(MemberAddressDTO memberAddressDTO){}
@AsyncMqSend
public void asyncDeleteMemberAddress(MemberAddressDTO memberAddressDTO){}
@Override
public MemberAddressDTO findById(Long id) {
return this.memberAddressService.findById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public BasicMemberAddressDTO create(MemberAddress resources) {
log.info("MemberAddressOperationServiceImpl ==>> create ==>> param ==>> [{}]",resources);
int maxSequence = this.memberAddressService.findMaxSequenceByMemberId(resources.getMemberId());
if (maxSequence < 6) {
resources.setSequence(maxSequence+1);
MemberAddressDTO memberAddressDTO = this.memberAddressService.create(resources);
MemberDTO memberDTO = this.memberService.findById(resources.getMemberId());
memberAddressDTO.setMemberCode(memberDTO.getCode());
((MemberAddressOperationServiceImpl) AopContext.currentProxy()).asyncMemberAddress(memberAddressDTO);
BasicMemberAddressDTO basicMemberAddressDTO = new BasicMemberAddressDTO();
BeanUtils.copyProperties(memberAddressDTO, basicMemberAddressDTO);
return basicMemberAddressDTO;
}
throw new BadRequestException(GlobeExceptionMsg.SEQUENCE_MAX);
}
@Override
@Transactional(rollbackFor = Exception.class)
public BasicMemberAddressDTO update(MemberAddress resources) {
log.info("MemberAddressOperationServiceImpl ==>> update ==>> param ==>> [{}]",resources);
MemberAddressDTO memberAddressDTO = this.memberAddressService.update(resources);
MemberDTO memberDTO = this.memberService.findById(memberAddressDTO.getMemberId());
memberAddressDTO.setMemberCode(memberDTO.getCode());
((MemberAddressOperationServiceImpl) AopContext.currentProxy()).asyncMemberAddress(memberAddressDTO);
BasicMemberAddressDTO basicMemberAddressDTO = new BasicMemberAddressDTO();
BeanUtils.copyProperties(memberAddressDTO, basicMemberAddressDTO);
return basicMemberAddressDTO;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
MemberAddressDTO memberAddressDTO = this.memberAddressService.findById(id);
MemberDTO memberDTO = this.memberService.findById(memberAddressDTO.getMemberId());
memberAddressDTO.setMemberCode(memberDTO.getCode());
this.memberAddressService.delete(id);
((MemberAddressOperationServiceImpl) AopContext.currentProxy()).asyncDeleteMemberAddress(memberAddressDTO);
}
}
package com.topdraw.business.process.service.impl;
package com.topdraw.business.process.service.impl.member;
import cn.hutool.core.util.ObjectUtil;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.profile.service.MemberProfileService;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.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;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.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.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.service.member.MemberProfileOperationService;
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.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
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
//@CacheConfig(cacheNames = "member")
public class MemberOperationServiceImpl implements MemberOperationService {
@Autowired
......@@ -50,25 +50,36 @@ public class MemberOperationServiceImpl implements MemberOperationService {
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Override
public MemberDTO buyVip(BuyVipBean criteria) {
// 小程序账户id
Long id = criteria.getId();
// 过期时间
LocalDateTime vipExpireTime1 = criteria.getVipExpireTime();
Integer vip1 = criteria.getVip();
@AsyncMqSend
public void asyncUpdateMemberVip(MemberDTO me) {}
// @CachePut(key = "#resources.memberId")
@Override
public MemberDTO buyVipByUserId(BuyVipBean resources) {
// 小程序账户id
Long id = resources.getId();
// 查询微信账户
UserWeixinDTO userWeixin = this.findWeiXinById(id);
Long memberId = userWeixin.getMemberId();
resources.setMemberId(memberId);
return this.buyVipByMemberId(resources);
}
@Override
public MemberDTO buyVipByMemberId(BuyVipBean resources) {
Timestamp vipExpireTime1 = resources.getVipExpireTime();
Integer vip1 = resources.getVip();
Long memberId = resources.getMemberId();
//
MemberDTO memberDTO = this.findById(memberId);
String memberCode = memberDTO.getCode();
Integer vip = memberDTO.getVip();
//
LocalDateTime vipExpireTime = memberDTO.getVipExpireTime();
Timestamp vipExpireTime = memberDTO.getVipExpireTime();
if (Objects.nonNull(vipExpireTime1)) {
vipExpireTime = vipExpireTime1;
}
......@@ -77,9 +88,10 @@ public class MemberOperationServiceImpl implements MemberOperationService {
if (Objects.isNull(vipExpireTime1)) {
if (ObjectUtil.isNull(vipExpireTime)) {
LocalDateTime now = LocalDateTime.now();
vipExpireTime = now.plusYears(1L);
vipExpireTime = TimestampUtil.localDateTime2Timestamp(now.plusYears(1L));
} else {
vipExpireTime = vipExpireTime.plusYears(1L);
LocalDateTime localDateTime = TimestampUtil.timestamp2LocalDateTime(vipExpireTime).plusYears(1L);
vipExpireTime = TimestampUtil.localDateTime2Timestamp(localDateTime);
}
}
......@@ -88,21 +100,38 @@ public class MemberOperationServiceImpl implements MemberOperationService {
memberDTO.setVipExpireTime(vipExpireTime);
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
this.memberService.create(member);
BeanUtils.copyProperties(memberDTO,member);
this.update(member);
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setMemberId(memberId).setVip(vip1).setBeforeVip(vip);
if (ObjectUtil.equal(vip1,vip)) {
memberVipHistory.setStatus(1);
}
memberVipHistory.setMemberCode(member.getCode());
memberVipHistory.setMemberCode(memberCode);
memberVipHistory.setVipExpireTime(member.getVipExpireTime());
memberVipHistoryService.create(memberVipHistory);
this.createVipHistory(memberVipHistory);
return memberDTO;
}
@Override
public void createVipHistory(MemberVipHistory memberVipHistory){
this.memberVipHistoryService.create(memberVipHistory);
}
@AsyncMqSend
@Override
public MemberDTO update(Member resources) {
MemberDTO memberDTO = this.memberService.update(resources);
return memberDTO;
}
@Override
public MemberDTO findByCode(String code) {
return this.memberService.findByCode(code);
}
private UserWeixinDTO findWeiXinById(Long id) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findById(id);
if (Objects.isNull(userWeixinDTO)) {
......@@ -113,35 +142,52 @@ public class MemberOperationServiceImpl implements MemberOperationService {
}
@Override
public void doUpdateMemberInfo(Member member) {
Long id = member.getId();
public MemberDTO doUpdateMember(Member resources) {
Long id = resources.getId();
Assert.notNull(id,"ERROR MSG: MemberOperationServiceImpl -> doUpdateMemberInfo -> id not be null!!");
this.memberService.update(member);
return this.update(resources);
}
// @CachePut(key = "#resources.id")
@Override
public void doInsertMember(Member member) {
this.memberService.create(member);
public MemberDTO doInsertMember(Member resources) {
return this.memberService.create(resources);
}
@Override
public MemberDTO findById(Long memberId) {
return Objects.nonNull(memberId) ? this.memberService.findById(memberId) : null;
MemberDTO memberDTO = this.memberService.findById(memberId);
return Objects.nonNull(memberId) ? memberDTO : null;
}
// @CachePut(key = "#resources.id")
@Override
public void doUpdateMemberExp(Member member) {
this.doUpdateMemberInfo(member);
public MemberDTO doUpdateMemberExpAndLevel(Member resources) {
return this.memberService.doUpdateMemberExpAndLevel(resources);
}
// @CachePut(key = "#resources.id")
@Override
public void doUpdateMemberPoints(Member member) {
this.memberService.doUpdateMemberPoints(member);
public MemberDTO doUpdateMemberPoints(Member resources) {
return this.memberService.doUpdateMemberPoints(resources);
}
// @CachePut(key = "#resources.id")
@Override
public void doUpdateMemberCoupon(Member member) {
this.doUpdateMemberInfo(member);
public MemberDTO doUpdateMemberCoupon(Member member) {
return this.memberService.doUpdateMemberCoupon(member);
}
@Override
public MemberDTO updateMemberVip(Member member) {
MemberDTO memberDTO1 = this.memberService.findByCode(member.getCode());
Member member1 = new Member();
BeanUtils.copyProperties(memberDTO1, member1);
member1.setVip(member.getVip());
member1.setVipExpireTime(member.getVipExpireTime());
MemberDTO memberDTO = this.update(member1);
((MemberOperationServiceImpl) AopContext.currentProxy()).asyncUpdateMemberVip(memberDTO);
return memberDTO;
}
@Override
......@@ -159,12 +205,7 @@ public class MemberOperationServiceImpl implements MemberOperationService {
return memberProfileDTO_1;
}
/**
* 配置会员信息
* @param memberProfileDTO_0
* @param memberDTO
* @return
*/
private MemberProfileDTO configMemberProfile(MemberProfileDTO memberProfileDTO_0, MemberDTO memberDTO, String appid) {
if (Objects.isNull(memberProfileDTO_0)) return memberProfileDTO_0;
......@@ -172,22 +213,10 @@ public class MemberOperationServiceImpl implements MemberOperationService {
MemberProfileDTO memberProfileDTO = new MemberProfileDTO();
BeanUtils.copyProperties(memberProfileDTO_0,memberProfileDTO);
/*// 真实姓名
String realname = memberProfileDTO.getRealname();
if (StringUtils.isNotBlank(realname)) {
realname = new String(Base64.getEncoder().encode(realname.getBytes(StandardCharsets.UTF_8)));
}
// 昵称
String nickname = memberDTO.getNickname();
if (StringUtils.isNotBlank(nickname)) {
nickname = new String(Base64.getEncoder().encode(nickname.getBytes(StandardCharsets.UTF_8)));
}*/
// vip
Integer vip = memberDTO.getVip();
// 过期时间
LocalDateTime vipExpireTime = memberDTO.getVipExpireTime();
Timestamp vipExpireTime = memberDTO.getVipExpireTime();
Long timeLong = 0L;
if (ObjectUtil.isNotNull(vipExpireTime)) {
......@@ -199,28 +228,24 @@ public class MemberOperationServiceImpl implements MemberOperationService {
this.threadPoolTaskExecutor.execute(()->{
Member member = new Member();
BeanUtils.copyProperties(memberDTO1,member);
this.memberService.update(member);
this.update(member);
});
vip = memberDTO1.getVip();
LocalDateTime vipExpireTime1 = memberDTO1.getVipExpireTime();
Timestamp vipExpireTime1 = memberDTO1.getVipExpireTime();
if (Objects.nonNull(vipExpireTime1)) {
timeLong = vipExpireTime1.toInstant(ZoneOffset.of("+8")).toEpochMilli();
timeLong = TimestampUtil.timestamp2long(vipExpireTime1);//vipExpireTime1.toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
}
// 过期时间
memberProfileDTO.setVipExpireTime(timeLong);
// 真实姓名
// memberProfileDTO.setRealname(realname);
// 头像
memberProfileDTO.setAvatarUrl(memberDTO.getAvatarUrl());
// 生日
memberProfileDTO.setBirthdayStr(memberDTO.getBirthday());
memberProfileDTO.setBirthday(memberDTO.getBirthday());
// 性别
memberProfileDTO.setGender(memberDTO.getGender());
// 昵称
// memberProfileDTO.setNickname(nickname);
// 会员id
memberProfileDTO.setMemberId(memberDTO.getId());
// vip
......@@ -237,16 +262,16 @@ public class MemberOperationServiceImpl implements MemberOperationService {
* @param vipExpireTime
* @return
*/
private MemberDTO checkVipStatus(MemberDTO memberDTO,LocalDateTime vipExpireTime, String appid) {
private MemberDTO checkVipStatus(MemberDTO memberDTO,Timestamp vipExpireTime, String appid) {
Long memberId = memberDTO.getId();
LocalDateTime nowTime = LocalDateTime.now();
Timestamp nowTime = TimestampUtil.now();
//vip过期,回退上个vip状态 同时修改member表vip
if (nowTime.compareTo(vipExpireTime) >= 0 ) {
Integer vip = 0;
LocalDateTime vipExpireTime1 = memberDTO.getVipExpireTime();
Timestamp vipExpireTime1 = memberDTO.getVipExpireTime();
//查询小于失效时间的那条记录 查不到 取微信表里 关注状态
MemberVipHistory memberVipHistory = this.memberVipHistoryService.findByTime(memberId, nowTime);
......
package com.topdraw.business.process.service.impl.member;
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.service.MemberProfileService;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.process.service.dto.MemberProfileAndMemberDTO;
import com.topdraw.business.process.service.member.MemberProfileOperationService;
import com.topdraw.exception.EntityExistException;
import com.topdraw.exception.EntityNotFoundException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.validation.constraints.NotNull;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/20 17:34
* @version: :
* @modified By:
* @since : modified in 2022/3/20 17:34
*/
@Service
public class MemberProfileOperationServiceImpl implements MemberProfileOperationService {
@Autowired
private MemberProfileService memberProfileService;
@Autowired
private MemberService memberService;
@AsyncMqSend
public void asyncMemberProfile(MemberProfileDTO memberProfileDTO){}
@AsyncMqSend
public void asyncMemberProfileAndMember(MemberProfileAndMemberDTO memberProfileAndMemberDTO){}
@AsyncMqSend
public void asyncCreateMemberProfile(MemberProfileDTO memberProfileDTO) {}
@Override
public MemberProfileDTO update(MemberProfile resources) {
MemberProfileDTO memberProfileDTO = this.memberProfileService.update(resources);
memberProfileDTO.setMemberCode(resources.getMemberCode());
((MemberProfileOperationServiceImpl) AopContext.currentProxy()).asyncMemberProfile(memberProfileDTO);
return memberProfileDTO;
}
@Override
public MemberProfileDTO updateMemberProfileAndMember(MemberProfile resources) {
Long id = resources.getId();
MemberProfileDTO _memberProfile = this.memberProfileService.findById(id);
Long memberId = _memberProfile.getMemberId();
resources.setMemberId(memberId);
MemberDTO memberDTO = this.memberService.checkMember(resources.getMemberId(), resources.getMemberCode());
resources.setMemberCode(memberDTO.getCode());
MemberProfileDTO memberProfileDTO =
this.memberProfileService.updateMemberProfileAndMember(resources, memberDTO);
memberProfileDTO.setMemberCode(memberDTO.getCode());
((MemberProfileOperationServiceImpl)AopContext.currentProxy())
.asyncMemberProfileAndMember(new MemberProfileAndMemberDTO(memberProfileDTO, memberDTO));
return memberProfileDTO;
}
@Override
public MemberProfileDTO createMemberProfileAndSyncMember(MemberProfile resources) {
MemberDTO memberDTO = this.memberService.findById(resources.getMemberId());
if (Objects.isNull(memberDTO.getId()))
throw new EntityNotFoundException(MemberDTO.class, "code", memberDTO.getCode());
MemberProfileDTO _memberProfileDTO = this.memberProfileService.findByMemberId(resources.getMemberId());
if (Objects.isNull(_memberProfileDTO.getId())) {
MemberProfileDTO memberProfileDTO = this.memberProfileService.createDefault(resources);
memberProfileDTO.setMemberCode(memberDTO.getCode());
this.createMemberProfileAndSyncMember(memberProfileDTO, memberDTO);
((MemberProfileOperationServiceImpl) AopContext.currentProxy()).asyncCreateMemberProfile(memberProfileDTO);
} else {
throw new EntityExistException(MemberProfileDTO.class, "id", _memberProfileDTO.getId().toString());
}
return null;
}
private void createMemberProfile(MemberProfileDTO memberProfileDTO) {
MemberProfile memberProfile = new MemberProfile();
BeanUtils.copyProperties(memberProfileDTO, memberProfile);
this.memberProfileService.createDefault(memberProfile);
}
private void createMemberProfileAndSyncMember(MemberProfileDTO memberProfileDTO, MemberDTO memberDTO) {
this.createMemberProfile(memberProfileDTO);
this.syncMember(memberProfileDTO, memberDTO);
}
private void syncMember(MemberProfileDTO memberProfileDTO, MemberDTO memberDTO) {
memberDTO.setAvatarUrl(memberProfileDTO.getAvatarUrl());
memberDTO.setNickname(memberProfileDTO.getRealname());
memberDTO.setGender(memberProfileDTO.getGender());
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
this.memberService.update(member);
}
}
package com.topdraw.business.process.service.impl.member;
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.service.MemberRelatedInfoService;
import com.topdraw.business.module.member.relatedinfo.service.dto.BasicMemberRelatedInfoDTO;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
import com.topdraw.business.process.service.member.MemberRelatedInfoOperationService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/20 18:41
* @version: :
* @modified By:
* @since : modified in 2022/3/20 18:41
*/
@Service
public class MemberRelatedInfoOperationServiceImpl implements MemberRelatedInfoOperationService {
@Autowired
private MemberRelatedInfoService memberRelatedInfoService;
@Override
public MemberRelatedInfoDTO findById(Long id) {
return this.memberRelatedInfoService.findById(id);
}
@Override
public BasicMemberRelatedInfoDTO create(MemberRelatedInfo resources) {
MemberRelatedInfoDTO memberRelatedInfoDTO = this.memberRelatedInfoService.create(resources);
BasicMemberRelatedInfoDTO basicMemberRelatedInfoDTO = new BasicMemberRelatedInfoDTO();
BeanUtils.copyProperties(memberRelatedInfoDTO, basicMemberRelatedInfoDTO);
return basicMemberRelatedInfoDTO;
}
@Override
public BasicMemberRelatedInfoDTO update(MemberRelatedInfo resources) {
MemberRelatedInfoDTO memberRelatedInfoDTO = this.memberRelatedInfoService.update(resources);
BasicMemberRelatedInfoDTO basicMemberRelatedInfoDTO = new BasicMemberRelatedInfoDTO();
BeanUtils.copyProperties(memberRelatedInfoDTO, basicMemberRelatedInfoDTO);
return basicMemberRelatedInfoDTO;
}
@Override
public void delete(Long id) {
this.memberRelatedInfoService.delete(id);
}
@Override
public MemberRelatedInfoDTO findByIdCard(MemberRelatedInfo resources) {
return this.memberRelatedInfoService.findByIdCard(resources);
}
@Override
public MemberRelatedInfoDTO findByIdCard(String idCard) {
return this.memberRelatedInfoService.findByIdCard(idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(Long memberId, String idCard) {
return this.memberRelatedInfoService.findByMemberIdAndIdCard(memberId, idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberCodeAndIdCard(String memberCode, String idCard) {
return this.memberRelatedInfoService.findByMemberCodeAndIdCard(memberCode, idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(MemberRelatedInfo resources) {
return this.memberRelatedInfoService.findByMemberIdAndIdCard(resources);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(Member member, MemberRelatedInfo resources) {
return this.memberRelatedInfoService.findByMemberIdAndIdCard(member, resources);
}
}
package com.topdraw.business.process.service.member;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.service.dto.BasicMemberAddressDTO;
import com.topdraw.business.module.member.address.service.dto.MemberAddressDTO;
public interface MemberAddressOperationService {
/**
* 根据ID查询
* @param resources ID
* @return MemberAddressDTO
*/
MemberAddressDTO findById(Long resources);
/**
* 保存会员地址
* @param resources
*/
BasicMemberAddressDTO create(MemberAddress resources);
/**
* 修改会员地址
* @param resources
*/
BasicMemberAddressDTO update(MemberAddress resources);
/**
* 通过id删除
* @param resources
*/
void delete(Long resources);
}
package com.topdraw.business.process.service.member;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.process.domian.weixin.BuyVipBean;
public interface MemberOperationService {
/**
*
* @param memberId
* @return
*/
MemberDTO findById(Long memberId);
/**
*
* @param code
* @return
*/
MemberDTO findByCode(String code);
/**
*
* @param memberId
* @param appid
* @return
*/
MemberProfileDTO getMemberProfileAndCheckVip(Long memberId, String appid);
/**
*
* @param resources
* @return
*/
MemberDTO buyVipByUserId(BuyVipBean resources);
/**
*
* @param resources
* @return
*/
MemberDTO buyVipByMemberId(BuyVipBean resources);
/**
*
* @param memberVipHistory
*/
void createVipHistory(MemberVipHistory memberVipHistory);
/**
* 修改会员
* @param resources
*/
MemberDTO update(Member resources);
/**
*
* @param resources
*/
MemberDTO doUpdateMember(Member resources);
/**
*
* @param resources
*/
MemberDTO doInsertMember(Member resources);
/**
*
* @param resources
*/
MemberDTO doUpdateMemberExpAndLevel(Member resources);
/**
*
* @param resources
*/
MemberDTO doUpdateMemberPoints(Member resources);
/**
*
* @param resources
*/
MemberDTO doUpdateMemberCoupon(Member resources);
/**
*
* @param member
*/
MemberDTO updateMemberVip(Member member);
}
package com.topdraw.business.process.service.member;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
public interface MemberProfileOperationService {
/**
* 修改
* @param resources
*/
MemberProfileDTO update(MemberProfile resources);
/**
* 修改会员属性并同步会员信息
* @param resources
*/
MemberProfileDTO updateMemberProfileAndMember(MemberProfile resources);
/**
*
* @param resources
* @return
*/
MemberProfileDTO createMemberProfileAndSyncMember(MemberProfile resources);
}
package com.topdraw.business.process.service.member;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.service.dto.BasicMemberRelatedInfoDTO;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
/**
* @author XiangHan
* @date 2021-10-22
*/
public interface MemberRelatedInfoOperationService {
/**
* 根据ID查询
* @param id ID
* @return MemberRelatedInfoDTO
*/
MemberRelatedInfoDTO findById(Long id);
/**
* 新增
* @param resources
*/
BasicMemberRelatedInfoDTO create(MemberRelatedInfo resources);
/**
* 修改
* @param resources
*/
BasicMemberRelatedInfoDTO update(MemberRelatedInfo resources);
/**
* 删除
* @param id
*/
void delete(Long id);
/**
* 通过身份证查询
* @param resources
* @return
*/
MemberRelatedInfoDTO findByIdCard(MemberRelatedInfo resources);
/**
* 通过身份证查询
* @param idCard 身份证
* @return
*/
MemberRelatedInfoDTO findByIdCard(String idCard);
/**
*
* @param memberId
* @param idCard
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(Long memberId, String idCard);
/**
*
* @param memberCode
* @param idCard
* @return
*/
MemberRelatedInfoDTO findByMemberCodeAndIdCard(String memberCode, String idCard);
/**
*
* @param resources
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(MemberRelatedInfo resources);
/**
*
* @param member
* @param resources
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(Member member, MemberRelatedInfo resources);
}
package com.topdraw.config;
import com.topdraw.utils.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedissonConfig {
// @Value("122.112.214.149")
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private String port;
@Value("${spring.redis.password}")
private String password;
@Bean
public Redisson redisson(){
Config config = new Config();
if (StringUtils.isNotEmpty(password)) {
config.useSingleServer().setAddress("redis://"+redisHost+":"+port).setPassword(password);
} else {
config.useSingleServer().setAddress("redis://"+redisHost+":"+port);
}
/* config.useClusterServers().addNodeAddress(
"redis://172.29.3.245:6375","redis://172.29.3.245:6376", "redis://172.29.3.245:6377",
"redis://172.29.3.245:6378","redis://172.29.3.245:6i379", "redis://172.29.3.245:6380")
.setPassword("a123456").setScanInterval(5000);*/
Redisson redissonClient = (Redisson)Redisson.create(config);
return redissonClient;
}
}
package com.topdraw.exception;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/10 17:16
* @version: :
* @modified By:
* @since : modified in 2022/3/10 17:16
*/
public interface GlobeExceptionCode {
// 会员信息
Integer MEMBER_CODE_IS_NULL = 000100001;
}
package com.topdraw.exception;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/10 17:16
* @version: :
* @modified By:
* @since : modified in 2022/3/10 17:16
*/
public interface GlobeExceptionMsg {
/**************************************************************/
/** 系统 */
String OPERATION_FORBID = "operation forbid";
String ENTITY_ALREADY_EXISTS = "entity already exists";
/**************************************************************/
/** 优惠券 */
String COUPON_ID_IS_NULL = "coupon id is null";
String COUPON_CODE_IS_NULL = "coupon code is null";
/**************************************************************/
/** 会员管理 */
String MEMBER_CODE_IS_NULL = "memberCode is null";
String MEMBER_ID_IS_NULL = "memberId is null";
String MEMBER_ID_AND_CODE_ARE_NULL = "memberId and memberCode both null";
String MEMBER_INFO_ERROR = "member info is error";
String MEMBER_BLOCK_STATUS = "member status is block";
String SEQUENCE_MAX = "member address more then 5";
/**************************************************************/
/** 账户管理 **/
/** iptv */
String IPTV_ID_IS_NULL = "iptvId is null";
String IPTV_PLATFORM_ACCOUNT_IS_NULL = "platformAccount is null";
String IPTV_IS_NULL = "iptv is null";
String VIS_USER_ID_IS_NULL = "visUserId is null";
/** 微信 */
String APP_ID_IS_NULL = "appId is null";
String OPEN_ID_IS_NULL = "openId is null";
String UNION_ID_IS_NULL = "unionId is null";
String ALREADY_BIND = "already bind";
}
package com.topdraw.mq.config;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfig {
/** 交换机--广播*/
public static final String UC_EXCHANGE_FANOUT = "uc.fanout";
public static final String UC_EXCHANGE_DIRECT = "uc.direct";
/** 队列-- */
public static final String UC_QUEUE_DIRECT_BBB = "uc.route.key.direct.event.bbb";
public static final String UC_QUEUE_DIRECT_CCC = "uc.route.key.direct.event.ccc";
/** 队列-- */
public static final String UC_QUEUE_FANOUT_IPTV = "uc.fanout.iptv";
public static final String UC_QUEUE_FANOUT_WEIXIN = "uc.fanout.weixin";
@Bean
FanoutExchange ucFanoutExchange(){
return ExchangeBuilder.fanoutExchange(UC_EXCHANGE_FANOUT).build();
}
public static final String UCE_EXCHANGE = "uce.exchange";
public static final String UCE_QUEUE = "uce.queue";
@Bean
DirectExchange ucDirectExchange(){
return ExchangeBuilder.directExchange(UC_EXCHANGE_DIRECT).build();
}
@Value("${service.mq.exchange}")
private String exchange;
@Bean
Queue ucDirectQueueCCC(){
return new Queue(UC_QUEUE_DIRECT_CCC);
}
@Value("${service.mq.queue}")
private String queue;
@Bean
Queue ucDirectQueueBBB(){
return new Queue(UC_QUEUE_DIRECT_BBB);
public String getExchange(){
if (StringUtils.isEmpty(this.exchange)) {
this.exchange = UCE_EXCHANGE;
}
@Bean
Binding directExchangeBindingBBB(DirectExchange directExchange , Queue ucDirectQueueBBB) {
BindingBuilder.DirectExchangeRoutingKeyConfigurer directExchangeRoutingKeyConfigurer =
BindingBuilder.bind(ucDirectQueueBBB).to(directExchange);
return directExchangeRoutingKeyConfigurer.with(UC_QUEUE_DIRECT_BBB);
return this.exchange;
}
@Bean
Binding directExchangeBindingCCC(DirectExchange directExchange , Queue ucDirectQueueCCC) {
BindingBuilder.DirectExchangeRoutingKeyConfigurer directExchangeRoutingKeyConfigurer =
BindingBuilder.bind(ucDirectQueueCCC).to(directExchange);
return directExchangeRoutingKeyConfigurer.with(UC_QUEUE_DIRECT_CCC);
public String getQueue() {
if (StringUtils.isEmpty(this.queue)) {
this.queue = UCE_QUEUE;
}
@Bean
Queue ucFanoutQueueIptv(){
return new Queue(UC_QUEUE_FANOUT_IPTV);
return this.queue;
}
@Bean
Queue ucFanoutQueueWeiXin(){
return new Queue(UC_QUEUE_FANOUT_WEIXIN);
DirectExchange directExchange(){
return ExchangeBuilder.directExchange(getExchange()).build();
}
@Bean
Binding fanoutExchangeBindingIptv(FanoutExchange ucFanoutExchange , Queue ucFanoutQueueIptv) {
return BindingBuilder.bind(ucFanoutQueueIptv).to(ucFanoutExchange);
}
Queue queue(){ return new Queue(getQueue()); }
@Bean
Binding fanoutExchangeBindingWeiXin(FanoutExchange ucFanoutExchange , Queue ucFanoutQueueWeiXin) {
return BindingBuilder.bind(ucFanoutQueueWeiXin).to(ucFanoutExchange);
Binding binding(DirectExchange directExchange , Queue queue) {
BindingBuilder.DirectExchangeRoutingKeyConfigurer directExchangeRoutingKeyConfigurer =
BindingBuilder.bind(queue).to(directExchange);
return directExchangeRoutingKeyConfigurer.with(this.getQueue());
}
}
......
package com.topdraw.module.mq;
package com.topdraw.mq.module.mq;
import lombok.AllArgsConstructor;
import lombok.Data;
......@@ -6,6 +6,8 @@ import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
*
......@@ -17,17 +19,17 @@ public class DataSyncMsg implements Serializable {
// 事件类型(用户的实际操作)
@NotNull
private String eventType;
private String evt;
// 具体事件 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;11:积分转移;30:积分兑换商品;98:系统操作;99:其他
private Integer event;
//设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
@NotNull
private Integer deviceType;
// 发送时间
private LocalDateTime time;
// 消息体
private MsgData msg;
// 其他属性
private String extraData;
/** 模板参数 */
private TaskTemplateParam param;
/**
* 消息体
*/
......@@ -52,17 +54,7 @@ public class DataSyncMsg implements Serializable {
private Long mediaId;
private Long itemId;
private String param;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class TaskTemplateParam {
/** 类别 */
private String category;
/** 编码 */
private String code;
private String description;
}
}
......
package com.topdraw.module.mq;
import javax.annotation.Resource;
package com.topdraw.mq.module.mq;
// 关注的事件
public enum EventType {
......@@ -21,6 +19,8 @@ public enum EventType {
CONSUME_POINT,
// 观影
VIEWING,
// 播放记录
PLAY,
// 登录
LOGIN,
// 订购产品包
......
package com.topdraw.mq.producer;
import com.topdraw.config.LocalConstants;
import com.topdraw.mq.config.RabbitMqConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -18,65 +16,45 @@ public class MessageProducer {
@Autowired
private AmqpTemplate amqpTemplate;
@Value("#{rabbitMqConfig.getExchange()}")
private String exchange;
@Value("${uc.service.platform}")
private String platformType;
@Value("#{rabbitMqConfig.getQueue()}")
private String queue;
public void sendMessage(String msg,String exchangeName){
public void sendMessage(String msg){
// 管理侧
if (platformType.equalsIgnoreCase(LocalConstants.PLATFORM_TYPE_MANAGEMENT)) {
if (StringUtils.isEmpty(exchangeName)) {
exchangeName = RabbitMqConfig.UC_QUEUE_DIRECT_CCC;
}
this.sendDirectMessage(msg,exchangeName);
}
this.sendMessage(msg, null, null);
// 服务侧
if (platformType.equalsIgnoreCase(LocalConstants.PLATFORM_TYPE_SERVICE)) {
if (StringUtils.isEmpty(exchangeName)) {
exchangeName = RabbitMqConfig.UC_QUEUE_DIRECT_BBB;
}
this.sendDirectMessage(msg,exchangeName);
public void sendMessage(String msg, String queue){
// 管理侧
if (StringUtils.isEmpty(queue)) {
queue = this.queue;
}
this.sendMessage(msg, null, queue);
}
/**
* 广播
* @param msg
* @param exchangeName
* @author XiangHan
* @date 2021/9/7 11:10 上午
*/
private void sendFanoutMessage(String msg,String exchangeName) {
if (StringUtils.isEmpty(exchangeName)) {
exchangeName = RabbitMqConfig.UC_EXCHANGE_FANOUT;
public void sendMessage(String msg, String exchange, String queue){
if (StringUtils.isEmpty(exchange)) {
exchange = this.exchange;
}
amqpTemplate.convertAndSend(exchangeName, "", msg);
log.info("send sendFanoutMessage msg || entityType: {} || msg:{} ", msg);
if (StringUtils.isEmpty(queue)) {
queue = this.queue;
}
/**
* 直连
* @param msg
* @param queueName
* @author XiangHan
* @date 2021/9/7 11:10 上午
*/
private void sendDirectMessage(String msg,String queueName) {
amqpTemplate.convertAndSend(queueName, msg);
log.info("send sendFanoutMessage msg || entityType: {} || msg:{} ", msg);
this.sendDirectMessage(msg, exchange, queue);
}
/**
* 发送
* @param msg
* @author XiangHan
* @date 2021/9/7 11:10 上午
*/
public void sendMessage(String msg) {
this.sendMessage(msg,null);
private void sendDirectMessage(String msg, String exchange, String queue) {
amqpTemplate.convertAndSend(exchange, queue, msg);
log.info("send sendMessage msg || exchange: {} || queue: {} || msg:{} ", exchange, queue, msg);
}
}
......
......@@ -2,12 +2,8 @@ package com.topdraw.resttemplate;
import com.alibaba.fastjson.JSON;
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.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.ResponseEntity;
......@@ -17,7 +13,6 @@ import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Slf4j
......@@ -45,7 +40,7 @@ public class RestTemplateClient {
public static String netImage(String imageUrl) {
Image image = new Image(imageUrl);
String entityBody = "";
String url = BASE_URL + "/ucService/api/upload/netImage";
String url = BASE_URL + "/ucs/common/upload/netImage";
log.info("request uc : url is " + url + ", memberId is " + com.alibaba.fastjson.JSONObject.toJSONString(image));
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, image, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
......
package com.topdraw.schedule;
import com.topdraw.business.process.service.PointsOperationService;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 积分台账
*/
//@Component
//@Slf4j
//@EnableScheduling
public class ScheduledTask {
@Autowired
PointsOperationService pointsOperationService;
// @Scheduled(cron = "0/59 59 23 * * ? ")
/**
* 清理已过期的积分
*/
// @Scheduled(cron = "0 0/1 * * * ? ")
public void cleanValidAvailablePoints(){
// this.pointsOperationService.cleanInvalidAvailablePoints();
}
}
package com.topdraw.util;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class DateUtil {
......@@ -13,5 +18,190 @@ public class DateUtil {
return System.currentTimeMillis();
}
public static LocalDateTime getLastDateTimeCurrentYear(){
Long currentTime = System.currentTimeMillis();
Long yearEnd = getYearEndTime(currentTime, "GMT+8:00");
LocalDateTime localDateTime = TimestampUtil.long2LocalDateTime(yearEnd);
return localDateTime;
}
public static LocalDateTime getLastDateTimeSecondYear(){
int year = LocalDateTime.now().getYear()+1;
Long yearEndTime = getYearEndTime(year, "GMT+8:00");
LocalDateTime localDateTime = TimestampUtil.long2LocalDateTime(yearEndTime);
return localDateTime;
}
public static Long getLastDateTimeSecondYearLong(){
LocalDateTime localDateTime = getLastDateTimeSecondYear();
long l = TimestampUtil.localDateTime2long(localDateTime);
return l;
}
/**
* 获取指定某一天的开始时间戳
*
* @param timeStamp 毫秒级时间戳
* @param timeZone 如 GMT+8:00
* @return
*/
public static Long getDailyStartTime(Long timeStamp, String timeZone) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
calendar.setTimeInMillis(timeStamp);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTimeInMillis();
}
/**
* 获取指定某一天的结束时间戳
*
* @param timeStamp 毫秒级时间戳
* @param timeZone 如 GMT+8:00
* @return
*/
public static Long getDailyEndTime(Long timeStamp, String timeZone) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
calendar.setTimeInMillis(timeStamp);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTimeInMillis();
}
/**
* 获取当月开始时间戳
*
* @param timeStamp 毫秒级时间戳
* @param timeZone 如 GMT+8:00
* @return
*/
public static Long getMonthStartTime(Long timeStamp, String timeZone) {
Calendar calendar = Calendar.getInstance();// 获取当前日期
calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
calendar.setTimeInMillis(timeStamp);
calendar.add(Calendar.YEAR, 0);
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTimeInMillis();
}
/**
* 获取当月的结束时间戳
*
* @param timeStamp 毫秒级时间戳
* @param timeZone 如 GMT+8:00
* @return
*/
public static Long getMonthEndTime(Long timeStamp, String timeZone) {
Calendar calendar = Calendar.getInstance();// 获取当前日期
calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
calendar.setTimeInMillis(timeStamp);
calendar.add(Calendar.YEAR, 0);
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTimeInMillis();
}
/**
* 获取当年的开始时间戳
*
* @param timeStamp 毫秒级时间戳
* @param timeZone 如 GMT+8:00
* @return
*/
public static Long getYearStartTime(Long timeStamp, String timeZone) {
Calendar calendar = Calendar.getInstance();// 获取当前日期
calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
calendar.setTimeInMillis(timeStamp);
calendar.add(Calendar.YEAR, 0);
calendar.add(Calendar.DATE, 0);
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_YEAR, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTimeInMillis();
}
/**
* 获取当年的最后时间戳
*
* @param timeStamp 毫秒级时间戳
* @param timeZone 如 GMT+8:00
* @return
*/
public static Long getYearEndTime(Long timeStamp, String timeZone) {
Calendar calendar = Calendar.getInstance();// 获取当前日期
calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
calendar.setTimeInMillis(timeStamp);
int year = calendar.get(Calendar.YEAR);
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
calendar.roll(Calendar.DAY_OF_YEAR, -1);
return calendar.getTimeInMillis();
}
public static Long getYearEndTime(int year, String timeZone) {
Calendar calendar = Calendar.getInstance();// 获取当前日期
calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 000);
calendar.roll(Calendar.DAY_OF_YEAR, -1);
return calendar.getTimeInMillis();
}
/**
* 时间戳转字符串
*
* @param timestamp 毫秒级时间戳
* @param zoneId 如 GMT+8或UTC+08:00
* @return
*/
public static String timestampToStr(long timestamp, String zoneId) {
ZoneId timezone = ZoneId.of(zoneId);
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), timezone);
return localDateTime.toString();
}
public static void main(String[] args) {
/*Long currentTime = System.currentTimeMillis();
System.out.println("Current Time : " + currentTime + " = " + timestampToStr(currentTime, "GMT+8"));
Long dailyStart = getDailyStartTime(currentTime, "GMT+8:00");
Long dailyEnd = getDailyEndTime(currentTime, "GMT+8:00");
Long monthStart = getMonthStartTime(currentTime, "GMT+8:00");
Long monthEnd = getMonthEndTime(currentTime, "GMT+8:00");
Long yearStart = getYearStartTime(currentTime, "GMT+8:00");
Long yearEnd = getYearEndTime(currentTime, "GMT+8:00");
System.out.println("Daily Start : " + dailyStart + " = " + timestampToStr(dailyStart, "GMT+8") + " Daily End : " + dailyEnd + " = " + timestampToStr(dailyEnd, "GMT+8"));
System.out.println("Month Start : " + monthStart + " = " + timestampToStr(monthStart, "GMT+8") + " Month End : " + monthEnd + " = " + timestampToStr(monthEnd, "GMT+8"));
System.out.println("Year Start : " + yearStart + " = " + timestampToStr(yearStart, "GMT+8") + " Year End : " + yearEnd + " = " + timestampToStr(yearEnd, "GMT+8"));
*/
LocalDateTime lastDateTimeCurrentYear = getLastDateTimeSecondYear();
}
}
......
package com.topdraw.util;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -149,6 +150,20 @@ public class IdWorker {
return idWorker.nextId();
}
public static String generatorString(){
IdWorker idWorker = new IdWorker();
return String.valueOf(idWorker.nextId());
}
public static String generatorCode(String prefix){
IdWorker idWorker = new IdWorker();
if (StringUtils.isNotBlank(prefix)) {
return prefix+"_"+String.valueOf(idWorker.nextId());
}
return String.valueOf(idWorker.nextId());
}
public static void main(String[] args) {
IdWorker idWorker = new IdWorker();
System.out.println(idWorker.nextId());
......
......@@ -10,10 +10,10 @@ public class RandomUtil {
* @param min
* @return
*/
public static long getRandomPoints(Integer min,Integer max) {
public static Long getRandomPoints(Integer min,Integer max) {
Random random = new Random();
int s = random.nextInt(max)%(max-min+1) + min;
return s;
return Long.valueOf(s);
}
public static void main(String[] args) {
......
package com.topdraw.util;
import org.redisson.api.RLock;
public class RedissonUtil {
public static void lock(RLock rLock){
rLock.lock();
}
public static void unlock(RLock rLock){
if (rLock.isLocked() && rLock.isHeldByCurrentThread())
rLock.unlock();
}
/**
* 保存数据
* @param key 键
* @param value 值
* @param validTime 过期时间
*/
public static void doSave(String key , String value , Integer validTime){
}
}
......@@ -36,6 +36,12 @@ public class TimestampUtil {
return l;
}
public static LocalDateTime timestamp2LocalDateTime(Timestamp timestamp){
long l1 = timestamp2long(timestamp);
LocalDateTime localDateTime = long2LocalDateTime(l1);
return localDateTime;
}
public static LocalDateTime long2LocalDateTime(Long expireTime) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(expireTime),ZoneOffset.of("+8"));
}
......
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();
}
}
package com.topdraw.weixin.beans;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.exception.BadRequestException;
import com.topdraw.utils.StringUtils;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;
@Data
@Component
public class DefaultWeiXinBeanDefinition implements WeiXinBeanDefinition {
//
private String appid;
private String openId;
private String code;
private String token;
private String secret;
private String unionId;
private String nickname;
private String headImgUrl;
private JSONObject userInfo;
private String phoneNumber;
@Value("${file.upload:upload}")
private String filePath;
public DefaultWeiXinBeanDefinition() {
}
public DefaultWeiXinBeanDefinition(String appId, String code,String unionId,String openId, JSONObject userInfoWxJo,String phone) {
this.userInfo = userInfoWxJo;
if (userInfo != null) {
if (StringUtils.isNotBlank(userInfoWxJo.getString("unionId"))) {
unionId = userInfoWxJo.getString("unionId");
}
if (StringUtils.isNotBlank(userInfoWxJo.getString("openId"))) {
openId = userInfoWxJo.getString("openId");
}
headImgUrl = userInfoWxJo.getString("avatarUrl");
if (StringUtils.isNotBlank(userInfoWxJo.getString("nickName"))) {
nickname = Base64.getEncoder().encodeToString(userInfoWxJo.getString("nickName").getBytes(StandardCharsets.UTF_8));
}
String phoneNumber = userInfoWxJo.getString("phoneNumber");
if (StringUtils.isBlank(phoneNumber)) {
throw new BadRequestException("phoneNumber is null...");
}
this.phoneNumber = phoneNumber;
if (StringUtils.isNotBlank(headImgUrl)) {
new Thread(() -> {
String s = UUID.randomUUID().toString();
File file = new File(System.getProperty("user.dir") + "/" + filePath + "/icon/" + DateUtil.format(new Date(), "yyyy-MM-dd"));
if (!file.exists()) {
file.mkdirs();
}
HttpUtil.downloadFile(headImgUrl, new File(System.getProperty("user.dir") + "/" + filePath + "/icon/" + DateUtil.format(new Date(), "yyyy-MM-dd") + "/" + s + ".jpg"));
headImgUrl = filePath + "/icon/" + DateUtil.format(new Date(), "yyyy-MM-dd") + "/" + s + ".jpg";
}).start();
}
}
this.unionId = unionId;
this.phoneNumber = phone;
this.openId = openId;
this.appid = appId;
this.code = code;
}
@Override
public String getAppId() {
return this.appid;
}
@Override
public String getCode() {
return this.code;
}
@Override
public String getToken() {
return this.token;
}
@Override
public String getSecret() {
return this.secret;
}
@Override
public String getOpenId() {
return this.openId;
}
@Override
public String getUnionId() {
return this.unionId;
}
@Override
public String getNickname() {
return this.nickname;
}
@Override
public String getHeadImgUrl() {
return this.headImgUrl;
}
@Override
public JSONObject getUserInfo() {
return this.userInfo;
}
}
package com.topdraw.weixin.beans;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WeiXinBean {
//
private String appid;
private String openId;
private String code;
private String token;
private String secret;
private String unionId;
private String nickname;
private String headImgUrl;
}
package com.topdraw.weixin.beans;
import com.alibaba.fastjson.JSONObject;
public interface WeiXinBeanDefinition {
String getAppId();
String getCode();
String getToken();
String getSecret();
String getOpenId();
String getUnionId();
String getNickname();
String getHeadImgUrl();
JSONObject getUserInfo();
}
package com.topdraw.weixin.beans;
import com.topdraw.business.process.domian.weixin.WeiXinUserBean;
public interface WeiXinUserParser {
DefaultWeiXinBeanDefinition parse(WeiXinUserBean appletUserLoginInfo);
}
package com.topdraw.weixin.beans.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Data
@Configuration
@ConfigurationProperties(prefix = "weixin")
public class WeiXinAppListConfig {
private List<Map<String, String>> list;
/*@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;*/
}
package com.topdraw.business.module.weixin.domain;
package com.topdraw.weixin.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
......@@ -13,9 +13,9 @@ import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author pengmengqing
* @date 2021-01-28
*/
* @author pengmengqing
* @date 2021-01-28
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
......
package com.topdraw.business.module.weixin.domain;
package com.topdraw.weixin.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
......@@ -13,9 +13,9 @@ import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author pengmengqing
* @date 2021-01-28
*/
* @author pengmengqing
* @date 2021-01-28
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
......
package com.topdraw.business.module.weixin.repository;
package com.topdraw.weixin.repository;
import com.topdraw.business.module.weixin.domain.UserWeixinWeixinMessageTemplate;
import com.topdraw.weixin.domain.UserWeixinWeixinMessageTemplate;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author pengmengqing
* @date 2021-01-28
*/
* @author pengmengqing
* @date 2021-01-28
*/
public interface UserWeixinWeixinMessageTemplateRepository extends JpaRepository<UserWeixinWeixinMessageTemplate, Long>, JpaSpecificationExecutor<UserWeixinWeixinMessageTemplate> {
}
......
package com.topdraw.business.module.weixin.repository;
package com.topdraw.weixin.repository;
import com.topdraw.business.module.weixin.domain.WeixinMessageTemplate;
import com.topdraw.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
*/
* @author pengmengqing
* @date 2021-01-28
*/
public interface WeixinMessageTemplateRepository extends JpaRepository<WeixinMessageTemplate, Long>, JpaSpecificationExecutor<WeixinMessageTemplate> {
Optional<WeixinMessageTemplate> findFirstByCode(String code);
......
package com.topdraw.business.module.weixin.rest;
package com.topdraw.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 com.topdraw.weixin.service.UserWeixinWeixinMessageTemplateService;
import com.topdraw.weixin.service.dto.UpdateUserWeixinWeixinMessageTemplateQueryCriteria;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -20,7 +20,7 @@ import java.util.ArrayList;
*/
@Api(tags = "UserWeixinWeixinMessageTemplate管理")
@RestController
@RequestMapping("/ucEngine/api/UserWeixinWeixinMessageTemplate")
@RequestMapping("/uce/UserWeixinWeixinMessageTemplate")
public class UserWeixinWeixinMessageTemplateController {
@Autowired
......
package com.topdraw.weixin.service;
import com.topdraw.weixin.service.dto.UpdateUserWeixinWeixinMessageTemplateQueryCriteria;
/**
* @author pengmengqing
* @date 2021-01-28
*/
public interface UserWeixinWeixinMessageTemplateService {
void createOrUpdate(UpdateUserWeixinWeixinMessageTemplateQueryCriteria criteria);
}
package com.topdraw.business.module.weixin.service.dto;
package com.topdraw.weixin.service.dto;
import lombok.Data;
......@@ -7,9 +7,9 @@ import java.sql.Timestamp;
/**
* @author pengmengqing
* @date 2021-01-28
*/
* @author pengmengqing
* @date 2021-01-28
*/
@Data
public class UserWeixinWeixinMessageTemplateDTO implements Serializable {
......
package com.topdraw.business.module.weixin.service.dto;
package com.topdraw.weixin.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author pengmengqing
* @date 2021-01-28
*/
* @author pengmengqing
* @date 2021-01-28
*/
@Data
public class UserWeixinWeixinMessageTemplateQueryCriteria {
// 用户id
......
package com.topdraw.business.module.weixin.service.dto;
package com.topdraw.weixin.service.dto;
import lombok.Data;
......@@ -6,9 +6,9 @@ import java.io.Serializable;
/**
* @author pengmengqing
* @date 2021-01-28
*/
* @author pengmengqing
* @date 2021-01-28
*/
@Data
public class WeixinMessageTemplateDTO implements Serializable {
......
package com.topdraw.business.module.weixin.service.dto;
package com.topdraw.weixin.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
......@@ -6,9 +6,9 @@ import lombok.Data;
import java.util.List;
/**
* @author pengmengqing
* @date 2021-01-28
*/
* @author pengmengqing
* @date 2021-01-28
*/
@Data
public class WeixinMessageTemplateQueryCriteria{
......
package com.topdraw.business.module.weixin.service.impl;
package com.topdraw.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 com.topdraw.weixin.domain.UserWeixinWeixinMessageTemplate;
import com.topdraw.weixin.domain.WeixinMessageTemplate;
import com.topdraw.weixin.repository.UserWeixinWeixinMessageTemplateRepository;
import com.topdraw.weixin.repository.WeixinMessageTemplateRepository;
import com.topdraw.weixin.service.UserWeixinWeixinMessageTemplateService;
import com.topdraw.weixin.service.dto.UpdateUserWeixinWeixinMessageTemplateQueryCriteria;
import com.topdraw.weixin.service.dto.UserWeixinWeixinMessageTemplateQueryCriteria;
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.*;
/**
......
package com.topdraw.business.module.weixin.service.mapper;
package com.topdraw.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 com.topdraw.weixin.domain.UserWeixinWeixinMessageTemplate;
import com.topdraw.weixin.service.dto.UserWeixinWeixinMessageTemplateDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author pengmengqing
* @date 2021-01-28
*/
* @author pengmengqing
* @date 2021-01-28
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserWeixinWeixinMessageTemplateMapper extends BaseMapper<UserWeixinWeixinMessageTemplateDTO, UserWeixinWeixinMessageTemplate> {
......
package com.topdraw.business.module.weixin.service.mapper;
package com.topdraw.weixin.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.weixin.domain.WeixinMessageTemplate;
import com.topdraw.weixin.service.dto.WeixinMessageTemplateDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author pengmengqing
* @date 2021-01-28
*/
* @author pengmengqing
* @date 2021-01-28
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface WeixinMessageTemplateMapper extends BaseMapper<WeixinMessageTemplateDTO, WeixinMessageTemplate> {
}
......
package com.topdraw.weixin.subscribe.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.util.UUID;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-05-21
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_wechat_subscribe_record")
public class WechatSubscribeRecord implements Serializable {
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
@Column(name = "code", nullable = false)
private String code;
// 会员id
@Column(name = "member_id", nullable = false)
private Long memberId;
// 操作类型 1:关注;2:取关
@Column(name = "operation_flag")
private Integer operationFlag;
// 实例id
@Column(name = "entity_id")
private Long entityId;
// 实例code
@Column(name = "entity_code")
private String entityCode;
// 实例类型 1:大屏扫码;2:营销活动;
@Column(name = "entity_type")
private Integer entityType;
// 来源类型 1:大屏;2:营销活动;3:其他;
@Column(name = "source_type")
private Integer sourceType;
// 来源描述
@Column(name = "source_info")
private String sourceInfo;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(WechatSubscribeRecord source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.weixin.subscribe.repository;
import com.topdraw.weixin.subscribe.domain.WechatSubscribeRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.Optional;
/**
* @author XiangHan
* @date 2022-05-21
*/
public interface WechatSubscribeRecordRepository extends JpaRepository<WechatSubscribeRecord, Long>, JpaSpecificationExecutor<WechatSubscribeRecord> {
Optional<WechatSubscribeRecord> findFirstByCode(String code);
}
package com.topdraw.weixin.subscribe.service;
import com.topdraw.weixin.subscribe.domain.WechatSubscribeRecord;
/**
* @author XiangHan
* @date 2022-05-21
*/
public interface WechatSubscribeRecordService {
void create(WechatSubscribeRecord resources);
}
package com.topdraw.weixin.subscribe.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-05-21
*/
@Data
public class WechatSubscribeRecordDTO implements Serializable {
// ID
private Long id;
// 标识
private String code;
// 会员id
private Long memberId;
// 操作类型 1:关注;2:取关
private Integer operationFlag;
// 实例id
private Long entityId;
// 实例code
private String entityCode;
// 实例类型 1:大屏扫码;2:营销活动;
private Integer entityType;
// 来源类型 1:大屏;2:营销活动;3:其他;
private Integer sourceType;
// 来源描述
private String sourceInfo;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.weixin.subscribe.service.impl;
import com.topdraw.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.weixin.subscribe.repository.WechatSubscribeRecordRepository;
import com.topdraw.weixin.subscribe.service.WechatSubscribeRecordService;
import com.topdraw.weixin.subscribe.service.mapper.WechatSubscribeRecordMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* @author XiangHan
* @date 2022-05-21
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class WechatSubscribeRecordServiceImpl implements WechatSubscribeRecordService {
@Autowired
private WechatSubscribeRecordRepository wechatSubscribeRecordRepository;
@Autowired
private WechatSubscribeRecordMapper wechatSubscribeRecordMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void create(WechatSubscribeRecord resources) {
this.wechatSubscribeRecordRepository.save(resources);
}
}
package com.topdraw.weixin.subscribe.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.weixin.subscribe.service.dto.WechatSubscribeRecordDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-05-21
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface WechatSubscribeRecordMapper extends BaseMapper<WechatSubscribeRecordDTO, WechatSubscribeRecord> {
}
package com.topdraw.weixin.util;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import com.topdraw.weixin.beans.QrCode;
import com.topdraw.weixin.beans.WeiXinNotice;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class WeiXinRequestUtil {
@Autowired
private RedisUtils redisUtils;
/**
*
* */
private static String doGet(String url, Map<String, String> param) {
String result = null;
try {
String queryString = "";
if (null != param) {
for (Map.Entry<String, String> entry : param.entrySet()) {
queryString += entry.getKey() + "=" + URLEncoder.encode("" + entry.getValue(), "UTF-8") + "&";
}
if (queryString.length() > 0) {
queryString = queryString.substring(0, queryString.length() - 1);
}
}
log.info("weixin request: " + url + "?" + queryString);
HttpResponse response = HttpRequest.get(url + "?" + queryString).execute();
if (response.isOk()) {
result = response.body();
log.info("weixin response: " + result);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
private String wx_token(String appid, String secret) {
Map<String, String> param = new HashMap<>();
param.put("grant_type", "client_credential");
param.put("appid", appid);
param.put("secret", secret);
return this.doGet(WeChatConstants.HTTPS_TOKEN, param);
}
@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(delay = 0L, multiplier = 0.0))
public String wx_ticket_getticket(String appid, String secret) {
String token = getToken(appid, secret,null);
Map<String, String> param = new HashMap<>();
param.put("access_token", token);
param.put("type", "jsapi");
return doGet(WeChatConstants.HTTPS_TICKET_GETTICKET, param);
}
public String wx_sns_oauth2_access_token(String appid, String secret, String code) {
Map<String, String> param = new HashMap<>();
param.put("appid", appid);
param.put("secret", secret);
param.put("code", code);
param.put("grant_type", "authorization_code");
return doGet(WeChatConstants.HTTPS_SNS_OAUTH2_ACCESS_TOKEN, param);
}
public String wx_sns_userinfo(String oauth2_access_token, String openid) {
Map<String, String> param = new HashMap<>();
param.put("access_token", oauth2_access_token);
param.put("openid", openid);
param.put("lang", "zh_CN");
return doGet(WeChatConstants.HTTPS_SNS_USERINFO, param);
}
public String wx_get_userinfo(String oauth2_access_token, String openid) {
Map<String, String> param = new HashMap<>();
param.put("access_token", oauth2_access_token);
param.put("openid", openid);
param.put("lang", "zh_CN");
return doGet(WeChatConstants.GET_USER_INFO, param);
}
public String getToken(String appid, String secret,String code) {
String token = (String) redisUtils.get(WeChatConstants.TOKEN_KEY + appid);
if (StringUtils.isNotBlank(token)) {
return token;
}
token = this.getTokenNoRedis(appid, secret,code);
return token;
}
public String getToken(String appid, String secret) {
String token = (String) redisUtils.get(WeChatConstants.TOKEN_KEY + appid);
if (StringUtils.isNotBlank(token)) {
return token;
}
token = this.getTokenNoRedis(appid, secret,null);
return token;
}
public String getTokenNoRedis(String appid, String secret,String code) {
String token = null;
String response = this.wx_token(appid, secret);
// String response = this.wx_sns_oauth2_access_token(appid, secret,code);
try {
JSONObject joToken = JSON.parseObject(response);
if (null != joToken && null != joToken.getString("access_token")) {
token = joToken.getString("access_token");
Integer expiresIn = joToken.getInteger("expires_in");
redisUtils.set(WeChatConstants.TOKEN_KEY + appid, token, expiresIn, TimeUnit.SECONDS);
}
} catch (Exception e) {
e.printStackTrace();
}
return token;
}
public String getTokenNoRedis(String appid, String secret) {
String token = null;
// String response = this.wx_token(appid, secret);
String response = this.wx_sns_oauth2_access_token(appid, secret,null);
try {
JSONObject joToken = JSON.parseObject(response);
if (null != joToken && null != joToken.getString("access_token")) {
token = joToken.getString("access_token");
Integer expiresIn = joToken.getInteger("expires_in");
redisUtils.set(WeChatConstants.TOKEN_KEY + appid, token, expiresIn, TimeUnit.SECONDS);
}
} catch (Exception e) {
e.printStackTrace();
}
return token;
}
/**
* 发送订阅消息,access_token错误时,重新获取进行重试
*
* @param weixinInfo 微信参数
* @param request 订阅消息内容
*/
@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(delay = 0L, multiplier = 0.0))
public void sendNotice(Map<String, String> weixinInfo, WeiXinNotice request) {
String accessToken = getToken(weixinInfo.get("appid"), weixinInfo.get("secret"));
String url = MessageFormat.format(WeChatConstants.SUBSCRIBE_SEND_URL, accessToken);
log.info("send notice request : " + JSONObject.toJSONString(request));
HttpResponse response = HttpRequest.post(url).body(JSONObject.toJSONString(request), "application/json;charset=utf-8").execute();
if (!response.isOk()) {
log.error("send notice error || {}", response);
throw new RuntimeException("send notice error");
}
JSONObject jsonObject = JSONObject.parseObject(response.body());
Integer errCode = jsonObject.getInteger(WeChatConstants.ERR_CODE);
if (errCode != null && errCode != 0) {
if (WeChatConstants.ACCESS_TOKEN_INVALID_CODE.equals(errCode.toString())) {
getTokenNoRedis(weixinInfo.get("appid"), weixinInfo.get("secret"));
}
// 返回errCode时,也输出返回的结果信息
log.error("send notice error || {}", response.body());
throw new RuntimeException("send notice error");
}
log.info("send notice response : " + response.body());
}
/**
* 微信小程序客服发送消息,access_token错误时,重新获取进行重试
*
* @param weixinInfo 微信参数
* @param body 消息内容
*/
@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(delay = 0L, multiplier = 0.0))
public void sendMessage(Map<String, String> weixinInfo, String body) {
String accessToken = getToken(weixinInfo.get("appid"), weixinInfo.get("secret"));
String url = MessageFormat.format(WeChatConstants.CUSTOM_SEND_URL, accessToken);
HttpResponse response = HttpRequest.post(url).body(body, "application/json;charset=utf-8").execute();
if (!response.isOk()) {
log.error("send message error || {}", response);
throw new RuntimeException("send message error");
}
log.info("send message response || {}", response.body());
JSONObject jsonObject = JSONObject.parseObject(response.body());
Integer errCode = jsonObject.getInteger(WeChatConstants.ERR_CODE);
if (errCode != null && errCode != 0) {
if (WeChatConstants.ACCESS_TOKEN_INVALID_CODE.equals(errCode.toString())) {
getTokenNoRedis(weixinInfo.get("appid"), weixinInfo.get("secret"));
}
throw new RuntimeException("send message error");
}
}
/**
* 上传临时素材返回mediaId,access_token错误时,重新获取进行重试
*
* @param weixinInfo 微信参数
* @param imagePath 素材路径
*/
@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(delay = 0L, multiplier = 0.0))
public String getMediaId(Map<String, String> weixinInfo, String imagePath) throws IOException {
String accessToken = getToken(weixinInfo.get("appid"), weixinInfo.get("secret"));
String mediaId = (String) redisUtils.get(WeChatConstants.WEIXIN_MEDIA_KEY + weixinInfo.get("appid"));
if (StringUtils.isNotBlank(mediaId)) {
return mediaId;
}
String url = MessageFormat.format(WeChatConstants.UPLOAD_URL, accessToken);
HttpResponse response = HttpRequest.post(url).form("file", new File(imagePath)).execute();
if (!response.isOk()) {
log.error("upload image error || {}", response);
throw new RuntimeException("upload image error");
}
log.info("upload image response || {}", response.body());
JSONObject jsonObject = JSONObject.parseObject(response.body());
Integer errCode = jsonObject.getInteger(WeChatConstants.ERR_CODE);
if (errCode != null && errCode != 0) {
if (WeChatConstants.ACCESS_TOKEN_INVALID_CODE.equals(errCode.toString())) {
getTokenNoRedis(weixinInfo.get("appid"), weixinInfo.get("secret"));
}
throw new RuntimeException("upload image error");
}
mediaId = jsonObject.getString("media_id");
redisUtils.set(WeChatConstants.WEIXIN_MEDIA_KEY + weixinInfo.get("appid"), mediaId, 60, TimeUnit.HOURS);
return mediaId;
}
/**
* 公众号获取带参数二维码,access_token错误时,重新获取进行重试
*
* @param weixinInfo 微信参数
* @param qrCode 二维码信息
*/
@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(delay = 0L, multiplier = 0.0))
public JSONObject getQrCode(Map<String, String> weixinInfo, QrCode qrCode) throws IOException {
String accessToken = getToken(weixinInfo.get("appid"), weixinInfo.get("secret"));
String url = MessageFormat.format(WeChatConstants.QR_CODE_URL, accessToken);
HttpResponse response = HttpRequest.post(url).body(JSONObject.toJSONString(qrCode), "application/json;charset=utf-8").execute();
if (!response.isOk()) {
log.error("get qrCode error || {}", response);
throw new RuntimeException("get qrCode error");
}
log.info("get qrCode response || {}", response.body());
JSONObject jsonObject = JSONObject.parseObject(response.body());
Integer errCode = jsonObject.getInteger(WeChatConstants.ERR_CODE);
if (errCode != null && errCode != 0) {
if (WeChatConstants.ACCESS_TOKEN_INVALID_CODE.equals(errCode.toString())) {
getTokenNoRedis(weixinInfo.get("appid"), weixinInfo.get("secret"));
}
throw new RuntimeException("get qrCode error");
}
return jsonObject;
}
/**
* 公众号获取用户信息,access_token错误时,重新获取进行重试
*
* @param weixinInfo 微信参数
* @param openid 用户openid
*/
@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(delay = 0L, multiplier = 0.0))
public JSONObject getUserInfo(Map<String, String> weixinInfo, String openid,String code) throws IOException {
String accessToken = this.getToken(weixinInfo.get("appid"), weixinInfo.get("secret"),code);
String url = MessageFormat.format(WeChatConstants.GET_USER_INFO, accessToken, openid);
// String url = MessageFormat.format(WeChatConstants.HTTPS_SNS_USERINFO, accessToken, openid);
// String url = MessageFormat.format(WeChatConstants.HTTPS_AUTHORIZE_WITH_SNSAPI_USERINFO, accessToken, openid);
HttpResponse response = HttpRequest.get(url).execute();
if (!response.isOk()) {
log.error("get userInfo error || {}", response);
throw new RuntimeException("get userInfo error");
}
log.info("get userInfo response || {}", response.body());
JSONObject jsonObject = JSONObject.parseObject(response.body());
Integer errCode = jsonObject.getInteger(WeChatConstants.ERR_CODE);
if (errCode != null && errCode != 0) {
if (WeChatConstants.ACCESS_TOKEN_INVALID_CODE.equals(errCode.toString())) {
this.getTokenNoRedis(weixinInfo.get("appid"), weixinInfo.get("secret"));
}
throw new RuntimeException("get userInfo error");
}
return jsonObject;
}
/**
* 公众号获取用户信息,access_token错误时,重新获取进行重试
*
* @param weixinInfo 微信参数
* @param openid 用户openid
*/
@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(delay = 0L, multiplier = 0.0))
public JSONObject getUserInfo(Map<String, String> weixinInfo, String openid) throws IOException {
return this.getUserInfo(weixinInfo,openid,"");
}
/**
* @param weixinInfo
* @param nextOpenId
* @return com.alibaba.fastjson.JSONObject
* @description 公众号批量获取关注者列表,不传nextOpenId默认从头开始拉取,引用重试机制
* @author Hongyan Wang
* @date 2021/9/2 9:42 上午
*/
@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(delay = 0L, multiplier = 0.0))
public JSONObject getUserList(Map<String, String> weixinInfo, String nextOpenId) {
String accessToken = getToken(weixinInfo.get("appid"), weixinInfo.get("secret"));
// 不传next_openid,默认从头开始拉取
if (StrUtil.isBlank(nextOpenId))
nextOpenId = "";
String url = MessageFormat.format(WeChatConstants.GET_USER_LIST, accessToken, nextOpenId);
HttpResponse response = HttpRequest.get(url).execute();
if (!response.isOk()) {
log.error("get userList error || {}", response);
throw new RuntimeException("get userList error");
}
log.info("get userList response || {}", response.body());
//返回Json样例
// {
// "total":2,
// "count":2,
// "data":{
// "openid":["OPENID1","OPENID2"]},
// "next_openid":"NEXT_OPENID"
//}
JSONObject jsonObject = JSONObject.parseObject(response.body());
Integer errCode = jsonObject.getInteger(WeChatConstants.ERR_CODE);
if (errCode != null && errCode != 0) {
if (WeChatConstants.ACCESS_TOKEN_INVALID_CODE.equals(errCode.toString())) {
getTokenNoRedis(weixinInfo.get("appid"), weixinInfo.get("secret"));
}
throw new RuntimeException("get userList error");
}
return jsonObject;
}
}
......@@ -2,9 +2,9 @@
spring:
datasource:
# 测试/演示库url:
url: jdbc:log4jdbc:mysql://139.196.145.150:3306/ucs-small-sichuan?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
url: jdbc:log4jdbc:mysql://139.196.192.242:3306/tj_user_0819?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: Tjlh@2021
password: Tjlh@2017
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
#Druid
......@@ -42,36 +42,31 @@ spring:
hibernate:
# 生产环境设置成 none,避免程序运行时自动更新数据库结构
ddl-auto: none
show-sql: false
servlet:
multipart:
file-size-threshold: 2KB
max-file-size: 100MB
max-request-size: 200MB
# redis
redis:
#数据库索引
database: 0
host: 122.112.214.149
# host: 139.196.4.234
port: 6379
password: redis123
# password:
#连接超时时间
timeout: 5000
# rabbitmq:
# host: 47.100.212.170 # rabbitmq的连接地址
## host: 122.112.214.149 # rabbitmq的连接地址
# #host: 139.196.192.242 # rabbitmq的连接地址
# port: 5672 # rabbitmq的连接端口号
# #virtual-host: /member_center # rabbitmq的虚拟host
# #username: member_center # rabbitmq的用户名
# #password: Tjlh@2021 # rabbitmq的密码
# virtual-host: test # rabbitmq的虚拟host
# username: omo_test # rabbitmq的用户名
# password: omo_test # rabbitmq的密码
rabbitmq:
# host: 139.196.145.150 # rabbitmq的连接地址
# port: 5672 # rabbitmq的连接端口号
# virtual-host: member_center # rabbitmq的虚拟host
# username: admin # rabbitmq的用户名
# password: Topdraw1qaz # rabbitmq的密码
# publisher-confirms: true #如果对异步消息需要回调必须设置为true
host: 122.112.214.149 # rabbitmq的连接地址
port: 5672 # rabbitmq的连接端口号
virtual-host: member_center_small_sichuan # rabbitmq的虚拟host
virtual-host: member_center # rabbitmq的虚拟hosthhh
username: guest # rabbitmq的用户名
password: guest # rabbitmq的密码
publisher-confirms: true #如果对异步消息需要回调必须设置为true
......@@ -93,15 +88,54 @@ jwt:
#是否允许生成代码,生产环境设置为false
generator:
enabled: true
enabled: false
#是否开启 swagger-ui
swagger:
enabled: true
enabled: false
file:
path: system/file
avatar: system/avatar
upload: upload
# 文件大小 /M
maxSize: 100
avatarMaxSize: 5
service:
mq:
exchange: uce.exchange
queue: uce.queue
uc:
service:
platform: service
weixin:
list:
- appid: wxfaa765183a332521
secret: b5c1c39cb95b45b599a02fd68b5fcf17
token:
encodingAesKey:
imagePath:
content: 长按识别二维码,加入微信群。
miniprogramState: formal
# 点击模板卡片后的默认跳转页面
page: pages/index/main
# 生成带参数二维码的有效期
qrCodeExpireSeconds: 86400
env: dev
# 订阅号
- appid: wx5d88c7fe99f89f32
secret: b213afe99a469d4be576f330dad643b8
token: topdraw
encodingAesKey: g3mYB6yx2ZiebxwKcI1H2iw3LlYNBHb7PqsVYFHUQzi
# 应用类型 小程序 服务号 订阅号, 当前基于订阅号有特殊逻辑
appType: subscription
imagePath: /topdraw/app/user_center_service_te/upload/customer/weChat.png
content: 长按识别二维码,关注订阅号。
miniprogramState: formal
# 点击模板卡片后的默认跳转页面
page: pages/index/main
# 生成带参数二维码的有效期
qrCodeExpireSeconds: 300
env: dev
api:
uc-service: https://inet.dev1.topmall.topdraw.cn
\ No newline at end of file
uc-service: http://127.0.0.1:8446
\ No newline at end of file
......
#配置数据源
spring:
datasource:
# 测试/演示库
url: jdbc:log4jdbc:mysql://172.0.31.10:3306/tj_user?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: Tjlh@2021
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
#Druid
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 初始化配置
initial-size: 3
# 最小连接数
min-idle: 3
# 最大连接数
max-active: 15
# 获取连接超时时间
max-wait: 5000
# 连接有效性检测时间
time-between-eviction-runs-millis: 90000
# 最大空闲时间
min-evictable-idle-time-millis: 1800000
test-while-idle: true
test-on-borrow: false
test-on-return: false
validation-query: select 1
# 配置监控统计拦截的filters
filters: stat
stat-view-servlet:
url-pattern: /druid/*
reset-enable: false
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
#配置 Jpa
jpa:
hibernate:
# 生产环境设置成 none,避免程序运行时自动更新数据库结构
ddl-auto: none
servlet:
multipart:
file-size-threshold: 2KB
max-file-size: 100MB
max-request-size: 200MB
redis:
#数据库索引
database: 0
host: 127.0.0.1
port: 6379
#连接超时时间
timeout: 5000
rabbitmq:
host: 172.0.31.96 # rabbitmq的连接地址
#host: 139.196.192.242 # rabbitmq的连接地址
port: 5672 # rabbitmq的连接端口号
#virtual-host: /member_center # rabbitmq的虚拟host
#username: member_center # rabbitmq的用户名
#password: Tjlh@2021 # rabbitmq的密码
virtual-host: member_center # rabbitmq的虚拟host
username: admin # rabbitmq的用户名
password: Tjlh@2021 # rabbitmq的密码
publisher-confirms: true #如果对异步消息需要回调必须设置为true
#jwt。依赖的common中有需要jwt的部分属性。
jwt:
header: Authorization
secret: mySecret
# token 过期时间/毫秒,6小时 1小时 = 3600000 毫秒
expiration: 7200000
# 在线用户key
online: online-token
# 验证码
codeKey: code-key
# token 续期检查时间范围(60分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期
detect: 3600000
# 续期时间,2小时,单位毫秒
renew: 7200000
#是否允许生成代码,生产环境设置为false
generator:
enabled: true
#是否开启 swagger-ui
swagger:
enabled: true
#配置数据源
spring:
datasource:
# 测试/演示库
url: jdbc:log4jdbc:mysql://139.196.192.242:3306/tj_user_0819?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: Tjlh@2017
# url: jdbc:log4jdbc:mysql://122.112.214.149:3306/tj_user?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
# url: jdbc:mysql://122.112.214.149:3306/tj_user?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
# username: root
# password: root
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
#Druid
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 初始化配置
initial-size: 3
# 最小连接数
min-idle: 3
# 最大连接数
max-active: 15
# 获取连接超时时间
max-wait: 5000
# 连接有效性检测时间
time-between-eviction-runs-millis: 90000
# 最大空闲时间
min-evictable-idle-time-millis: 1800000
test-while-idle: true
test-on-borrow: false
test-on-return: false
validation-query: select 1
# 配置监控统计拦截的filters
filters: stat
stat-view-servlet:
url-pattern: /druid/*
reset-enable: false
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
#配置 Jpa
jpa:
hibernate:
# 生产环境设置成 none,避免程序运行时自动更新数据库结构
ddl-auto: none
servlet:
multipart:
file-size-threshold: 2KB
max-file-size: 100MB
max-request-size: 200MB
redis:
#数据库索引
database: 16
host: 122.112.214.149
# host: 139.196.4.234
port: 6379
password: redis123
# password:
#连接超时时间
timeout: 5000
rabbitmq:
host: 139.196.145.150 # rabbitmq的连接地址
port: 5672 # rabbitmq的连接端口号
virtual-host: member_center # rabbitmq的虚拟host
username: admin # rabbitmq的用户名
password: Topdraw1qaz # rabbitmq的密码
publisher-confirms: true #如果对异步消息需要回调必须设置为true
#jwt。依赖的common中有需要jwt的部分属性。
jwt:
header: Authorization
secret: mySecret
# token 过期时间/毫秒,6小时 1小时 = 3600000 毫秒
expiration: 7200000
# 在线用户key
online: online-token
# 验证码
codeKey: code-key
# token 续期检查时间范围(60分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期
detect: 3600000
# 续期时间,2小时,单位毫秒
renew: 7200000
#是否允许生成代码,生产环境设置为false
generator:
enabled: true
#是否开启 swagger-ui
swagger:
enabled: true
......@@ -9,8 +9,6 @@ spring:
active: dev
jackson:
time-zone: GMT+8
cache:
type: simple
data:
redis:
repositories:
......
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>UserCenter</contextName>
<contextName>uc-engine</contextName>
<!--定义参数,后面可以通过${app.name}使用-->
<property name="app.name" value="user-center"/>
<property name="app.name" value="uc-engine"/>
<property name="log.path" value="./logs"/>
<property name="log.pattern" value="%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n"/>
......@@ -64,12 +64,12 @@
<!--监控sql日志输出 -->
<logger name="jdbc.sqlonly" level="INFO" additivity="false">
<logger name="jdbc.sqlonly" level="OFF" additivity="false">
<appender-ref ref="console" />
<appender-ref ref="info" />
</logger>
<logger name="jdbc.resultset" level="ERROR" additivity="false">
<logger name="jdbc.resultset" level="OFF" additivity="false">
<appender-ref ref="console" />
<appender-ref ref="info" />
</logger>
......
......@@ -2,17 +2,12 @@ package com.topdraw;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.module.mq.DataSyncMsg;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@SpringBootTest(classes= MemberServiceApplication.class)
......
......@@ -39,16 +39,16 @@ public class GeneratorCode extends BaseTest {
@Rollback(value = false)
@Transactional(rollbackFor = Exception.class)
public void generator() {
var dbName = "tr_task_attr";
var dbName = "uc_wechat_subscribe_record";
// 表名称,支持多表
var tableNames = Arrays.asList(dbName);
String[] s = dbName.split("_");
var pre = s[0];
var target1 = s[s.length-1];
var preRoute = "com.topdraw.business.module.task.";
var preRoute = "com.topdraw.weixin.";
StringBuilder builder = new StringBuilder(preRoute);
builder.append("attribute");
builder.append("subscribe");
// builder.append(target);
tableNames.forEach(tableName -> {
......
package com.topdraw.test.business.basicdata.coupon;
import com.topdraw.BaseTest;
import com.topdraw.business.module.coupon.history.service.CouponHistoryService;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryDTO;
import com.topdraw.business.module.coupon.service.CouponService;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.business.module.member.rest.MemberController;
import com.topdraw.business.module.member.service.MemberService;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
public class CouponServiceTest extends BaseTest {
@Autowired
private CouponService couponService;
@Autowired
private CouponHistoryService couponHistoryService;
@Test
public void findBy(){
CouponDTO couponDTO = this.couponService.findById(1L);
System.out.println(couponDTO);
CouponDTO testvxv = this.couponService.getByCode("testvxv");
System.out.println(testvxv);
CouponHistoryDTO couponHistoryDTO = this.couponHistoryService.findById(1l);
System.out.println(couponHistoryDTO);
}
@Test
public void findHistoryBy(){
CouponHistoryDTO couponHistoryDTO = this.couponHistoryService.findById(130L);
System.out.println(couponHistoryDTO);
}
}
......@@ -16,9 +16,9 @@ public class MemberServiceTest extends BaseTest {
@Test
public void findById(){
Long memberId = 1L;
/*Long memberId = 1L;
ResultInfo memberDTO = this.memberController.findById(memberId);
LOG.info("=====>>>" + memberDTO);
LOG.info("=====>>>" + memberDTO);*/
}
}
......
......@@ -19,7 +19,7 @@ public class MemberProfileServiceTest extends BaseTest {
MemberProfile resources = new MemberProfile();
resources.setMemberId(memberId);
resources.setIdCard("422827199208010713");
// resources.setBirthday(TimestampUtil.now());
resources.setBirthday(TimestampUtil.now().toString());
resources.setGender(1);
resources.setDescription("");
resources.setRealname("");
......@@ -35,14 +35,11 @@ public class MemberProfileServiceTest extends BaseTest {
@Test
public void update(){
Long memberId = 517998L;
Long memberId = 1L;
MemberProfile resources = new MemberProfile();
resources.setId(352459L);
resources.setId(1L);
resources.setMemberId(memberId);
resources.setBirthday("1992-08-01 08:00:00.0");
resources.setGender(0);
resources.setRealname("65465464");
resources.setCity("fdf");
resources.setCity("sh");
String s = JSON.toJSONString(resources);
this.memberProfileService.update(resources);
LOG.info("=====>>>s=====>>>" + s);
......
......@@ -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 {
......@@ -18,15 +15,6 @@ public class MemberAddressControllerTest extends BaseTest {
MemberAddressController memberAddressController;
@Test
public void pageMemberAddress(){
MemberAddressQueryCriteria memberQueryCriteria = new MemberAddressQueryCriteria();
memberQueryCriteria.setMemberId(1L);
Pageable pageable = PageRequest.of(0,20);
ResultInfo byId = this.memberAddressController.pageMemberAddress(memberQueryCriteria,pageable);
LOG.info("===>>>"+byId);
}
@Test
public void update(){
MemberAddress memberAddress = new MemberAddress();
memberAddress.setId(1L);
......@@ -66,14 +54,14 @@ public class MemberAddressControllerTest extends BaseTest {
memberAddress.setAddress("");
memberAddress.setZipCode("");
String s = JSON.toJSONString(memberAddress);
ResultInfo byId = this.memberAddressController.create(memberAddress);
LOG.info("===>>>"+byId);
// ResultInfo byId = this.memberAddressController.create(memberAddress);
// LOG.info("===>>>"+byId);
}
@Test
public void findById(){
ResultInfo byId = this.memberAddressController.findById(1L);
LOG.info("===>>>"+byId);
// ResultInfo byId = this.memberAddressController.findById(1L);
// LOG.info("===>>>"+byId);
}
@Test
......
......@@ -24,7 +24,7 @@ public class MemberControllerTest extends BaseTest {
member.setId(5L);
member.setVip(4);
String s = JSON.toJSONString(member);
ResultInfo byId = this.memberController.doUpdateVipAndSaveVipHistory(member);
ResultInfo byId = this.memberController.doUpdateVipByCode(member);
LOG.info("===>>>"+byId);
}
......@@ -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);
}
......@@ -77,9 +77,8 @@ public class MemberControllerTest extends BaseTest {
member.setDueCouponAmount(0L);
member.setUserIptvId(1L);
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);
}
......
......@@ -14,32 +14,14 @@ public class MemberProfileControllerTest extends BaseTest {
private MemberProfileController memberProfileController;
@Test
public void create(){
Long memberId = 1L;
MemberProfile resources = new MemberProfile();
resources.setMemberId(memberId);
resources.setIdCard("422827199208010713");
// resources.setBirthday(TimestampUtil.now());
resources.setGender(1);
resources.setDescription("");
resources.setRealname("");
resources.setConstellation("");
resources.setProvince("");
resources.setCity("");
resources.setEmail("");
resources.setDistrict("");
String s = JSON.toJSONString(resources);
this.memberProfileController.create(resources);
LOG.info("=====>>>"+s);
}
@Test
public void update(){
Long memberId = 1L;
MemberProfile resources = new MemberProfile();
resources.setId(1L);
resources.setMemberId(memberId);
resources.setCity("sh");
resources.setId(4L);
resources.setRealname("吉贝");
resources.setGender(0);
resources.setBirthday("1992-08-01");
resources.setPhone("18271269120");
resources.setAvatarUrl("upload/icon/2022-03-29/d935ff29-d214-401b-98ad-bd3ef87cafd7.jpeg");
String s = JSON.toJSONString(resources);
this.memberProfileController.update(resources);
LOG.info("=====>>>s=====>>>" + s);
......@@ -48,7 +30,7 @@ public class MemberProfileControllerTest extends BaseTest {
@Test
public void delete(){
Long memberId = 1L;
this.memberProfileController.delete(memberId);
// this.memberProfileController.delete(memberId);
LOG.info("=====>>>s=====>>>");
}
......
......@@ -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;
......@@ -21,14 +18,6 @@ public class MemberRelatedInfoControllerTest extends BaseTest {
MemberRelatedInfoController memberRelatedInfoController;
@Test
public void getMembers(){
MemberRelatedInfoQueryCriteria memberQueryCriteria = new MemberRelatedInfoQueryCriteria();
Pageable pageable = PageRequest.of(0,20);
ResultInfo byId = this.memberRelatedInfoController.pageMemberRelatedInfos(memberQueryCriteria,pageable);
LOG.info("===>>>"+byId);
}
@Test
public void update(){
MemberRelatedInfo member = new MemberRelatedInfo();
member.setId(15L);
......@@ -38,7 +27,7 @@ public class MemberRelatedInfoControllerTest extends BaseTest {
member.setIdCard("422827199208010713");
member.setName("fdfd");
member.setSex(1);
member.setBirthday(LocalDate.of(2021,8,23));
member.setBirthday("1993-04-06");
member.setAvatarUrl("www.sougou.com");
// member.setCreateTime();
// member.setUpdateTime();
......@@ -57,7 +46,6 @@ public class MemberRelatedInfoControllerTest extends BaseTest {
member.setIdCard("422827199208010713");
member.setName("fdfd");
member.setSex(1);
member.setBirthday(LocalDate.now());
member.setAvatarUrl("www.baidu.com");
// member.setCreateTime();
// member.setUpdateTime();
......@@ -68,8 +56,8 @@ public class MemberRelatedInfoControllerTest extends BaseTest {
@Test
public void findById(){
ResultInfo byId = this.memberRelatedInfoController.findById(1L);
LOG.info("===>>>"+byId);
// ResultInfo byId = this.memberRelatedInfoController.findById(1L);
// LOG.info("===>>>"+byId);
}
@Test
......
......@@ -6,6 +6,7 @@ import com.topdraw.business.module.points.available.service.dto.PointsAvailableD
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.BaseTest;
import com.topdraw.util.IdWorker;
import com.topdraw.util.TimestampUtil;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -22,7 +23,7 @@ public class PointsAvailableServiceTest extends BaseTest {
public void loadListExpirePointsByMemberId() {
Long memberId = 2L;
List<PointsAvailableDTO> pointsAvailableDTOS =
this.pointsAvailableService.findByMemberIdAndExpireTimeBefore(memberId, LocalDateTime.now());
this.pointsAvailableService.findByMemberIdAndExpireTimeBefore(memberId,TimestampUtil.now());
LOG.info("===>>>"+pointsAvailableDTOS);
}
......@@ -51,7 +52,7 @@ public class PointsAvailableServiceTest extends BaseTest {
// tempPoints.setDescription("#");
tempPoints.setEvtType(1);
tempPoints.setPoints(10L);
tempPoints.setExpireTime(LocalDateTime.now());
tempPoints.setExpireTime(TimestampUtil.now());
PointsAvailable pointsAvailable = new PointsAvailable();
BeanUtils.copyProperties(tempPoints,pointsAvailable);
......
......@@ -3,10 +3,11 @@ package com.topdraw.test.business.basicdata.points;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import com.topdraw.business.module.points.detail.service.PointsDetailService;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.BaseTest;
import com.topdraw.util.IdWorker;
import com.topdraw.util.TimestampUtil;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -37,7 +38,7 @@ public class PointsDetailServiceTest extends BaseTest {
tempPoints.setDescription("");
tempPoints.setEvtType(1);
tempPoints.setPoints(10L);
tempPoints.setExpireTime(LocalDateTime.now());
tempPoints.setExpireTime(TimestampUtil.now());
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
......
......@@ -5,8 +5,9 @@ import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import com.topdraw.business.module.points.detail.service.PointsDetailService;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.util.IdWorker;
import com.topdraw.util.TimestampUtil;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -37,7 +38,7 @@ public class RightsServiceTest extends BaseTest {
tempPoints.setDescription("");
tempPoints.setEvtType(1);
tempPoints.setPoints(10L);
tempPoints.setExpireTime(LocalDateTime.now());
tempPoints.setExpireTime(TimestampUtil.now());
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
......
package com.topdraw.test.business.basicdata.rights.history;
import com.topdraw.BaseTest;
import com.topdraw.business.module.rights.history.rest.RightsHistoryController;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryQueryCriteria;
import com.topdraw.common.ResultInfo;
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 RightsHistoryControllerTest extends BaseTest {
@Autowired
RightsHistoryController rightsHistoryController;
@Test
public void pageRightsHistory(){
RightsHistoryQueryCriteria memberQueryCriteria = new RightsHistoryQueryCriteria();
memberQueryCriteria.setMemberId(1L);
Pageable pageable = PageRequest.of(0,20);
ResultInfo byId = this.rightsHistoryController.pageRightsHistory(memberQueryCriteria,pageable);
LOG.info("===>>>"+byId);
}
@Test
public void pageAvailableRights(){
RightsHistoryQueryCriteria memberQueryCriteria = new RightsHistoryQueryCriteria();
memberQueryCriteria.setMemberId(1L);
Pageable pageable = PageRequest.of(0,20);
ResultInfo byId = this.rightsHistoryController.pageAvailableRights(memberQueryCriteria,pageable);
LOG.info("===>>>"+byId);
}
}
package com.topdraw.test.business.basicdata.rights.permanentrights;
import com.topdraw.BaseTest;
import com.topdraw.business.module.rights.permanentrights.rest.PermanentRightsController;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsQueryCriteria;
import com.topdraw.common.ResultInfo;
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 PermanentRightsControllerTest extends BaseTest {
@Autowired
PermanentRightsController permanentRightsController;
@Test
public void pagePermanentRights(){
PermanentRightsQueryCriteria criteria = new PermanentRightsQueryCriteria();
criteria.setLevel(2);
Pageable pageable = PageRequest.of(0,20);
ResultInfo byId = this.permanentRightsController.pagePermanentRights(criteria,pageable);
LOG.info("===>>>"+byId);
}
@Test
public void findById(){
ResultInfo byId = this.permanentRightsController.findById(1L);
LOG.info("===>>>"+byId);
}
/*@Test
......
package com.topdraw.test.business.basicdata.rights.rest;
import com.topdraw.BaseTest;
import com.topdraw.business.module.rights.rest.RightsController;
import com.topdraw.common.ResultInfo;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
public class RightsControllerTest extends BaseTest {
@Autowired
RightsController rightsController;
@Test
public void findById(){
ResultInfo byId = this.rightsController.findById(1L);
LOG.info("===>>>"+byId);
}
}
......
......@@ -3,6 +3,7 @@ package com.topdraw.test.business.basicdata.task;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.service.TaskTemplateService;
import com.topdraw.BaseTest;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -14,7 +15,7 @@ public class TaskTemplateServiceTest extends BaseTest {
@Test
public void dealTaskTest(){
String eventCode = "tv";
TaskTemplate taskTemplate = this.taskTemplateService.findByEvent(eventCode);
TaskTemplateDTO taskTemplate = this.taskTemplateService.findByEvent(eventCode);
LOG.info("=====>>>" + taskTemplate);
}
......
package com.topdraw.test.business.process.rest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.BaseTest;
import com.topdraw.business.process.domian.TempCoupon;
import com.topdraw.business.process.rest.CouponOperationController;
......@@ -12,6 +13,7 @@ import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class CouponOperationControllerTest extends BaseTest {
......@@ -20,7 +22,7 @@ public class CouponOperationControllerTest extends BaseTest {
@Test
public void grantCouponByManual(){
Long memberId = 2L;
/*Long memberId = 2L;
Long userId = 2L;
TempCoupon tempCoupon = new TempCoupon();
tempCoupon.setId(1L);
......@@ -44,12 +46,17 @@ public class CouponOperationControllerTest extends BaseTest {
List<TempCoupon> tempCouponList = new ArrayList<>();
tempCouponList.add(tempCoupon);
String s = JSON.toJSONString(tempCouponList);
String s = JSON.toJSONString(tempCouponList);*/
// tempCouponList.add(tempCoupon1);
ResultInfo byId = this.couponOperationController.grantCouponByManual(tempCouponList);
LOG.info("===>>>"+byId);
String a = "{\"IPTVappid\":\"kids3\",\"platformAccount\":\"topdraw\",\"dyAppid\":\"wx5d88c7fe99f89f32\",\"unionid\":\"oqDha5lxMuXYMGgT6gyLIFL7VumM\",\"nickname\":\"%E5%90%89%E8%B4%9D\",\"headimgurl\":\"https%3A%2F%2Fthirdwx.qlogo.cn%2Fmmopen%2Fvi_32%2FDYAIOgq83erGuDK9HlicY2iasIB5VHXTNWtuqfIZxIpzicQKWg9ogSRKRO1DeYtWicDHMMibpibHOEZRfp1Fvd4EQgrg%2F132\"}";
Map parse = JSONObject.parseObject(a, Map.class);
// ResultInfo byId = this.couponOperationController.grantCouponByManual(tempCouponList);
LOG.info("===>>>"+parse);
}
}
......
......@@ -7,6 +7,7 @@ import com.topdraw.business.process.domian.TempExp;
import com.topdraw.business.process.rest.CouponOperationController;
import com.topdraw.business.process.rest.ExpOperationController;
import com.topdraw.common.ResultInfo;
import com.topdraw.util.TimestampUtil;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -29,7 +30,7 @@ public class ExpOperationControllerTest extends BaseTest {
tempExp.setRewardExp(10L);
tempExp.setRightsSendStrategy(0);
tempExp.setAccountId(userId);
tempExp.setExpireTime(LocalDateTime.now());
tempExp.setExpireTime(TimestampUtil.now());
tempExp.setDeviceType(2);
tempExp.setAppCode("WEI_XIN_GOLD_PANDA");
tempExp.setOrderId(null);
......
......@@ -5,6 +5,7 @@ import com.topdraw.BaseTest;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.business.process.rest.PointsOperationController;
import com.topdraw.common.ResultInfo;
import com.topdraw.util.TimestampUtil;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -39,7 +40,7 @@ public class PointsOperationControllerTest extends BaseTest {
tempPoints.setPointsType(0);
tempPoints.setRightsSendStrategy(0);
tempPoints.setAccountId(2L);
tempPoints.setExpireTime(LocalDateTime.now());
tempPoints.setExpireTime(TimestampUtil.now());
tempPoints.setDeviceType(2);
tempPoints.setAppCode("WEI_XIN_GOLD_PANDA");
tempPoints.setOrderId(null);
......@@ -47,10 +48,10 @@ public class PointsOperationControllerTest extends BaseTest {
tempPoints.setActivityId(null);
tempPoints.setItemId(null);
tempPoints.setDescription("系统发放");
tempPoints.setEvtType(1);
tempPoints.setActivityId(1L);
tempPoints.setEvtType(98);
// tempPoints.setActivityId(1L);
String s = JSON.toJSONString(tempPoints);
ResultInfo byId = this.pointsOperationController.grantPointsByManual(tempPoints);
ResultInfo byId = this.pointsOperationController.addPoints(tempPoints);
LOG.info("===>>>"+byId);
}
......@@ -72,7 +73,7 @@ public class PointsOperationControllerTest extends BaseTest {
tempPoints.setDescription("系统发放");
tempPoints.setEvtType(1);
String s = JSON.toJSONString(tempPoints);*/
ResultInfo byId = this.pointsOperationController.cleanInvalidPointsAndCalculateCurrentPoints(5L);
ResultInfo byId = this.pointsOperationController.cleanInvalidPointsAndCalculateCurrentPoints(22L);
LOG.info("===>>>"+byId);
}
......
......@@ -5,6 +5,7 @@ import com.topdraw.BaseTest;
import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.process.rest.RightsOperationController;
import com.topdraw.common.ResultInfo;
import com.topdraw.util.TimestampUtil;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -22,7 +23,7 @@ public class RightOperationControllerTest extends BaseTest {
rightsHistory.setMemberId(3L);
rightsHistory.setOperatorId(3L);
rightsHistory.setOperatorName("鲁二龙");
rightsHistory.setExpireTime(LocalDateTime.now());
rightsHistory.setExpireTime(TimestampUtil.now());
rightsHistory.setUserId(2L);
ResultInfo byId = this.rightsOperationController.grantRightsByManual(rightsHistory);
LOG.info("===>>>"+byId);
......
package com.topdraw.test.business.process.rest;
import com.alibaba.fastjson.JSON;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.business.process.rest.TaskOperationController;
import com.topdraw.business.process.rest.TaskOperationQueryCriteria;
import com.topdraw.module.mq.DataSyncMsg;
import com.topdraw.module.mq.EventType;
import com.topdraw.business.process.service.TaskOperationService;
import com.topdraw.business.process.service.dto.TaskOperationQueryCriteria;
import com.topdraw.BaseTest;
import com.topdraw.util.TimestampUtil;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
......@@ -16,93 +19,153 @@ public class TaskOperationControllerTest extends BaseTest {
@Autowired
TaskOperationController taskOperationController;
@Autowired
TaskOperationService taskOperationService;
@Test
public void dealTask() {
public void wechatShare() {
try {
DataSyncMsg dataSyncMsg = new DataSyncMsg();
dataSyncMsg.setEventType(EventType.VIEWING.name());
DataSyncMsg.MsgData msgData = new DataSyncMsg.MsgData();
msgData.setEvent(6); // 类型 1-登录 2-观影 3-参加活动 4-订购 5-优享会员 6-签到
msgData.setRemarks("remark");
msgData.setMemberId(2261L);
msgData.setDeviceType(2);
msgData.setAppCode("WEI_XIN_GOLD_PANDA");
dataSyncMsg.setMsg(msgData);
String s = JSON.toJSONString(dataSyncMsg);
String s = "{\"evt\":\"WECHATSHARE\",\"event\":8,\"time\":\"2022-05-03 23:10:09\",\"deviceType\":1," +
"\"msg\":{\"memberCode\":\"1530105170425733120\",\"param\":\"{\\\"shareCount\\\":2}\"}}";
TaskOperationQueryCriteria pointsQueryCriteria = new TaskOperationQueryCriteria();
pointsQueryCriteria.setContent(s);
String s1 = JSON.toJSONString(pointsQueryCriteria);
System.out.println(s1);
this.taskOperationController.dealTask(pointsQueryCriteria);
} catch (Exception e) {
e.printStackTrace();
}
}
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
public void t1() throws InterruptedException {
Thread.sleep(1*1000);
System.out.println(Thread.currentThread().getName()+"=======>>> t1");
@Test
public void completeMemberInfo() {
try {
String s = "{\"evt\":\"completeMemberInfo\",\"event\":7,\"time\":\"2022-05-03 23:10:09\",\"deviceType\":1, " +
"\"msg\":{\"memberCode\":\"1530105170425733120\"}}";
TaskOperationQueryCriteria pointsQueryCriteria = new TaskOperationQueryCriteria();
pointsQueryCriteria.setContent(s);
String s1 = JSON.toJSONString(pointsQueryCriteria);
this.taskOperationController.dealTask(pointsQueryCriteria);
} catch (Exception e) {
e.printStackTrace();
}
}
public void t2() throws InterruptedException {
Thread.sleep(1*1000);
System.out.println(Thread.currentThread().getName()+"=======>>> t2");
@Test
public void activity() {
try {
String s = "{\"evt\":\"ACTIVITY\",\"event\":3,\"time\":\"2022-05-03 23:10:09\",\"deviceType\":1," +
"\"msg\":{\"memberCode\":\"1530105170425733120\",\"param\":\"{\\\"ACTIVITY\\\":3}\"}}";
TaskOperationQueryCriteria pointsQueryCriteria = new TaskOperationQueryCriteria();
pointsQueryCriteria.setContent(s);
String s1 = JSON.toJSONString(pointsQueryCriteria);
this.taskOperationController.dealTask(pointsQueryCriteria);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void order() {
try {
String s = "{\"evt\":\"order\",\"event\":4,\"time\":\"2022-05-03 23:10:09\",\"deviceType\":2," +
"\"msg\":{\"memberCode\":\"1530105170425733120\",\"param\":\"{\\\"GOODS\\\":3}\"}}";
TaskOperationQueryCriteria pointsQueryCriteria = new TaskOperationQueryCriteria();
pointsQueryCriteria.setContent(s);
String s1 = JSON.toJSONString(pointsQueryCriteria);
this.taskOperationController.dealTask(pointsQueryCriteria);
} catch (Exception e) {
e.printStackTrace();
}
}
public void t3() throws InterruptedException {
Thread.sleep(1*1000);
System.out.println(Thread.currentThread().getName()+"=======>>> t3");
@Test
public void viewing() {
try {
String s = "{\"evt\":\"VIEWING\",\"event\":2,\"time\":\"2022-05-03 23:10:09\",\"deviceType\":1," +
"\"msg\":{\"memberCode\":\"1530105170425733120\",\"param\":\"{\\\"playDuration\\\":10}\"}}";
TaskOperationQueryCriteria pointsQueryCriteria = new TaskOperationQueryCriteria();
pointsQueryCriteria.setContent(s);
String s1 = JSON.toJSONString(pointsQueryCriteria);
this.taskOperationController.dealTask(pointsQueryCriteria);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void play() {
try {
String s = "{\"evt\":\"PLAY\",\"event\":8,\"time\":\"2022-05-03 23:10:09\",\"deviceType\":1," +
"\"msg\":{\"memberCode\":\"1530105170425733120\",\"param\":\"{\\\"playDuration\\\":60}\"}}";
TaskOperationQueryCriteria pointsQueryCriteria = new TaskOperationQueryCriteria();
pointsQueryCriteria.setContent(s);
String s1 = JSON.toJSONString(pointsQueryCriteria);
this.taskOperationController.dealTask(pointsQueryCriteria);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void main() {
long l = System.currentTimeMillis();
FutureTask futureTask1 = new FutureTask(()->{
t1();
return null;
});
FutureTask futureTask2 = new FutureTask(()->{
t2();
return null;
});
FutureTask futureTask3 = new FutureTask(()->{
t3();
return null;
});
threadPoolTaskExecutor.execute(futureTask1);
threadPoolTaskExecutor.execute(futureTask2);
threadPoolTaskExecutor.execute(futureTask3);
long l1 = System.currentTimeMillis();
System.out.println(l1-l);
/*threadPoolTaskExecutor.execute(()->{
for (int i = 0; i < 10; i++) {
public void sign() {
try {
// Thread.sleep(2*1000);
System.out.println("===>>>> ");
String s = "{\"evt\":\"SIGN\",\"event\":6,\"time\":\"2022-05-03 23:10:09\",\"deviceType\":1," +
"\"msg\":{\"memberCode\":\"1530105170425733120\",\"param\":\"{\\\"SIGN\\\":11}\"}}";
TaskOperationQueryCriteria pointsQueryCriteria = new TaskOperationQueryCriteria();
pointsQueryCriteria.setContent(s);
this.taskOperationController.dealTask(pointsQueryCriteria);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void createTask() {
Task task = new Task();
task.setName("testTask");
task.setCode("testTaskCode1122");
task.setRightsSendStrategy(0);
task.setMemberLevel(null);
task.setMemberVip(null);
task.setActionAmount(1);
task.setGroups(null);
task.setRewardExp(0L);
task.setStatus(1);
task.setTaskDailyReset(1);
task.setTaskRepeatType(1);
task.setTaskTemplateId(13L);
task.setExpireTime(TimestampUtil.now());
task.setValidTime(TimestampUtil.now());
task.setPointsType(0);
task.setAttr("{\"value\":\"[1,2]\"}");
task.setTaskTemplateId(13L);
this.taskOperationController.createTask(task);
}
});*/
System.out.println("======>>> main end");
@Test
public void updateTask() {
TaskDTO taskDTO = this.taskOperationService.findById(15L);
Task task = new Task();
BeanUtils.copyProperties(taskDTO, task);
task.setName("testTask4455");
task.setAttr("{\"value\":\"[4,10]\"}");
this.taskOperationController.updateTask(task);
}
@Test
public void deleteTask() {
Task task = new Task();
task.setId(15L);
this.taskOperationController.deleteTask(task);
}
......
package com.topdraw.test.business.process.rest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.BaseTest;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.process.domian.TempCoupon;
import com.topdraw.business.process.domian.weixin.SubscribeBeanEvent;
import com.topdraw.business.process.rest.CouponOperationController;
import com.topdraw.business.process.domian.weixin.BindBean;
import com.topdraw.business.process.domian.weixin.TvUnBindBean;
import com.topdraw.business.process.domian.weixin.WeixinUnBindBean;
import com.topdraw.business.process.rest.UserOperationController;
import com.topdraw.common.ResultInfo;
import com.topdraw.util.TimestampUtil;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.sql.Timestamp;
public class UserOperationControllerTest extends BaseTest {
@Autowired
UserOperationController userOperationController;
private UserOperationController userOperationController;
@Test
public void subscribe(){
SubscribeBeanEvent subscribeBeanEvent = new SubscribeBeanEvent();
public void deleteCollection() {
try {
String s = "{\n" +
" \"unionid\": \"oqDha5lxMuXYMGgT6gyLIFL7VumM\",\n" +
" \"dyAppid\": \"wx5d88c7fe99f89f32\",\n" +
" \"nickname\": \"%E5%90%89%E8%B4%9D\",\n" +
" \"headimgurl\": \"https%3A%2F%2Fthirdwx.qlogo.cn%2Fmmopen%2Fvi_32%2FDYAIOgq83erGuDK9HlicY2iasIB5VHXTNWtuqfIZxIpzicQKWg9ogSRKRO1DeYtWicDHMMibpibHOEZRfp1Fvd4EQgrg%2F132\",\n" +
" \"IPTVappid\": \"kids3\",\n" +
" \"platformAccount\": \"topdraw\"\n" +
String a = "eyJkYXRhIjpbeyJ1c2VyQ29sbGVjdGlvbklkIjo0LCJkZXRhaWxOYW1lIjoi6amv6b6Z5a6d5YW4IiwiY291bnQiOjIsImRldGFpbElkIjo0MDAsImRldGFpbFRvdGFsSW5kZXgiOjEsInVwZGF0ZVRpbWUiOjE2NTM1ODM2OTQwMDAsInR5cGUiOjEsImRldGFpbENvZGUiOiJtZWRpYV9lMmQ3NTIyMC1jNDExLTRkMWItOTM0ZS1jMWVhMjQ4Yzg4YTYiLCJ1c2VySWQiOjEsImRldGFpbFR5cGUiOiJNRURJQSIsImNyZWF0ZVRpbWUiOjE2NTM1ODM2OTQwMDAsImRldGFpbFNlcXVlbmNlIjoxLCJhcHBJZCI6NTcsIm5hbWUiOiJQZXJzb25hbENvbGxlY3Rpb25SZWNvcmRzIiwiZGV0YWlsRm9sZGVyQ29kZSI6IkRlZmF1bHQiLCJpZCI6OH1dLCJwbGF0Zm9ybUFjY291bnQiOiJ0b3BkcmF3In0=";
ResultInfo weixinUserAndMember = this.userOperationController.deleteCollection(a);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void deleteAllCollection() {
try {
String a = "{\n" +
"\t\"platformAccount\": \"topdraw\",\n" +
"\t\"collectionType\": \"1\"\n" +
"}";
userOperationController.saveUserInfo(s);
ResultInfo weixinUserAndMember = this.userOperationController.deleteAllCollection(a);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
String a = "{\"appId\":\"wx5d88c7fe99f89f32\",\"eventKey\":\"\",\"headimgurl\":\"https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83erGuDK9HlicY2iasIB5VHXTNWtuqfIZxIpzicQKWg9ogSRKRO1DeYtWicDHMMibpibHOEZRfp1Fvd4EQgrg/132\",\"openId\":\"oeHBC6JjlbNGFQ172uKICRDYDuGs\",\"unionid\":\"oqDha5lxMuXYMGgT6gyLIFL7VumM\"}"
;
subscribeBeanEvent.setContent(a);
userOperationController.subscribe(subscribeBeanEvent);
@Test
public void addCollection() {
try {
String a = "eyJkYXRhIjpbeyJ1c2VyQ29sbGVjdGlvbklkIjo0LCJpbWFnZXMiOiJ7XCJsaXN0XCI6W3tcInNpemVcIjowLFwiZW5hYmxlXCI6ZmFsc2UsXCJ3aWR0aFwiOjI5MSxcImZpbGVVcmxcIjpcInVwbG9hZC9pbWFnZS9tZWRpYS8yY2YzNjIxMS03ZjZjLTQ3N2YtYjFjZi0wYjViNDVkMDljNDYucG5nXCIsXCJpZFwiOjY5NDEsXCJoZWlnaHRcIjozNTV9LHtcInNpemVcIjowLFwiZW5hYmxlXCI6ZmFsc2UsXCJ3aWR0aFwiOjI3NCxcImZpbGVVcmxcIjpcInVwbG9hZC9pbWFnZS9tZWRpYS9jYTZkMzEyYS05ZjA1LTQ4YjAtYTJlMi1kOGExMTdhZjhlN2QucG5nXCIsXCJpZFwiOjY5NDIsXCJoZWlnaHRcIjoxNjh9LHtcInNpemVcIjowLFwiZW5hYmxlXCI6ZmFsc2UsXCJ3aWR0aFwiOjI2MCxcImZpbGVVcmxcIjpcInVwbG9hZC9pbWFnZS9tZWRpYS80NzE3YzYzYy03NjQ1LTRiMmYtYTA2MS03NTBhZDYyYTI3ZGYuanBnXCIsXCJpZFwiOjY5NDMsXCJoZWlnaHRcIjozNjB9XSxcIm1hcFwiOntcImNoYW5uZWxfbG9nb1wiOlsyXSxcInN0aWxsc1wiOlswXSxcInBvc3RlclwiOlsxXX19IiwiZGV0YWlsTmFtZSI6Iumpr+m+meWuneWFuCIsImNvdW50IjoyLCJkZXRhaWxJZCI6NDAwLCJkZXRhaWxUb3RhbEluZGV4IjoxLCJ1cGRhdGVUaW1lIjoxNjUzNTgzNjk0MDAwLCJ0eXBlIjoxLCJkZXRhaWxDb2RlIjoibWVkaWFfZTJkNzUyMjAtYzQxMS00ZDFiLTkzNGUtYzFlYTI0OGM4OGE2IiwidXNlcklkIjoxLCJkZXRhaWxUeXBlIjoiTUVESUEiLCJjcmVhdGVUaW1lIjoxNjUzNTgzNjk0MDAwLCJkZXRhaWxTZXF1ZW5jZSI6MSwiYXBwSWQiOjU3LCJuYW1lIjoiUGVyc29uYWxDb2xsZWN0aW9uUmVjb3JkcyIsImRldGFpbEZvbGRlckNvZGUiOiJEZWZhdWx0IiwiaWQiOjh9LHsidXNlckNvbGxlY3Rpb25JZCI6NCwiaW1hZ2VzIjoie1wibWFwXCI6e1wicG9zdGVyXCI6WzBdfSxcImxpc3RcIjpbe1wiaWRcIjo0NzQyMixcInR5cGVcIjoyLFwid2lkdGhcIjoyMjIsXCJoZWlnaHRcIjoyOTQsXCJmaWxlVXJsXCI6XCJ1cGxvYWQvaW1hZ2UvbWVkaWEvMjAyMC0wNy0zMC85YThhMDJkYi05NDQ0LTRiZmYtYmE1NC1lYTc4NGFlNGY4OGMuanBnXCIsXCJzaXplXCI6MTA0NjQzfV19IiwiZGV0YWlsTmFtZSI6IueGiuWHuuayoeS5i+aOoumZqeaXpeiusDIiLCJjb3VudCI6MiwiZGV0YWlsSWQiOjQ2NTMyLCJkZXRhaWxUb3RhbEluZGV4Ijo0MCwidXBkYXRlVGltZSI6MTY1Mzk4MDE5NDAwMCwidHlwZSI6MSwiZGV0YWlsQ29kZSI6Im1lZGlhXzU1OGJjNDVhLTU0ODAtNDZlYy1iZTlhLWM3NDlmZmRiZGY0OSIsInVzZXJJZCI6MSwiZGV0YWlsVHlwZSI6Ik1FRElBIiwiY3JlYXRlVGltZSI6MTY1Mzk4MDE5NDAwMCwiZGV0YWlsU2VxdWVuY2UiOjEsImFwcElkIjo1NywibmFtZSI6IlBlcnNvbmFsQ29sbGVjdGlvblJlY29yZHMiLCJkZXRhaWxGb2xkZXJDb2RlIjoiRGVmYXVsdCIsImlkIjoxMX1dLCJwbGF0Zm9ybUFjY291bnQiOiJ0b3BkcmF3In0=";
ResultInfo weixinUserAndMember = this.userOperationController.addCollection(a);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IOException e) {
@Test
public void minaUnbind() {
try {
WeixinUnBindBean bindBean = new WeixinUnBindBean();
// 小屏会员
bindBean.setMemberId(4L);
bindBean.setAutoModel(true);
ResultInfo weixinUserAndMember = this.userOperationController.minaUnbind(bindBean);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void createWeixinUserAndCreateMember(){
/*{"accessToken":"","appid":"wxfaa765183a332521","authTime":1648479958000,
"createTime":1648479958000,"description":"",
"headimgurl":"upload/icon/2022-04-20/a642c2cc-0e71-460b-a373-cbb9df6873f2.jpg",
"id":127942,"nickname":"5ZCJ6LSd","openid":"oxgff4goR2v2747JBYOhTRN38Z-o",
"privilege":"","refreshToken":"","sex":0,"sourceDesc":"","sourceEntity":"",
"sourceId":"","sourceType":"","sourceUser":0,"syncStatus":0,
"unionid":"oqDha5lxMuXYMGgT6gyLIFL7VumM","updateTime":1650450992000}*/
UserWeixin userWeixin = new UserWeixin();
userWeixin.setAccessToken("");
userWeixin.setAppid("wxfaa765183a332521");
userWeixin.setAuthTime(TimestampUtil.now());
userWeixin.setHeadimgurl("upload/icon/2022-04-20/a642c2cc-0e71-460b-a373-cbb9df6873f2.jpg");
userWeixin.setId(127942L);
// userWeixin.setNickname("5ZCJ6LSd");
userWeixin.setNickname(null);
userWeixin.setOpenid("oxgff4goR2v2747JBYOhTRN38Z-o");
// userWeixin.setOpenid("1");
userWeixin.setPrivilege("");
userWeixin.setRefreshToken("");
userWeixin.setSex(null);
// userWeixin.setSex(0);
userWeixin.setSourceDesc("");
userWeixin.setSourceEntity("");
userWeixin.setSourceId("");
userWeixin.setSourceType("");
userWeixin.setSourceUser(0L);
userWeixin.setSyncStatus(0);
userWeixin.setUnionid("oqDha5lxMuXYMGgT6gyLIFL7VumM");
ResultInfo resultInfo = this.userOperationController.createWeixinUserAndCreateMember(userWeixin);
LOG.info("===>>>"+resultInfo);
public void memberPreprocess() {
try {
String a = "{\"IPTVappid\":\"kids3\",\"platformAccount\":\"topdraw\"," +
"\"appid\":\"wx5d88c7fe99f89f32\",\"unionid\":\"oqDha5lxMuXYMGgT6gyLIFL7VumM\"," +
"\"nickname\":\"%E5%90%89%E8%B4%9D\"," +
"\"headimgurl\":\"https%3A%2F%2Fthirdwx.qlogo.cn%2Fmmopen%2Fvi_32%2FDYAIOgq83erGuDK9HlicY2iasIB5VHXTNWtuqfIZxIpzicQKWg9ogSRKRO1DeYtWicDHMMibpibHOEZRfp1Fvd4EQgrg%2F132\"}";
ResultInfo weixinUserAndMember = this.userOperationController.memberPreprocess(a);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void tvUnbind() {
try {
TvUnBindBean bindBean = new TvUnBindBean();
bindBean.setPlatformAccount("topdraw");
// 小屏会员
bindBean.setMemberId(20559L);
bindBean.setAutoModel(true);
ResultInfo weixinUserAndMember = this.userOperationController.tvUnbind(bindBean);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void changeMainAccount() {
try {
BindBean bindBean = new BindBean();
bindBean.setPlatformAccount("topdraw");
// 小屏会员
bindBean.setMemberId(20560L);
ResultInfo weixinUserAndMember = this.userOperationController.changeMainAccount(bindBean);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void minaBind() {
try {
BindBean bindBean = new BindBean();
bindBean.setPlatformAccount("topdraw");
// 小屏会员
bindBean.setMemberId(4L);
ResultInfo weixinUserAndMember = this.userOperationController.minaBind(bindBean);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void createWeixinUserAndMember() {
try {
// 初始化账号
UserWeixin userWeixinNew = new UserWeixin().setAppid("1").setOpenid("1").setUnionid("1")
.setNickname("1").setHeadimgurl("1").setSex(1);
userWeixinNew.setAuthTime(new Timestamp(System.currentTimeMillis()));
userWeixinNew.setSourceType(null);
userWeixinNew.setSourceId(null);
userWeixinNew.setSourceDesc(null);
userWeixinNew.setSourceUser(null);
userWeixinNew.setSourceEntity(null);
// UserWeixin parse = JSONObject.parseObject(a, UserWeixin.class);
ResultInfo weixinUserAndMember = this.userOperationController.createWeixinUserAndMember(userWeixinNew);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void createTvUserAndMember() {
try {
String a = "{\n" +
" \"platformAccount\": \"xianghan03@ITV\",\n" +
" \"visUserId\": 7\n" +
"}";
UserTv parse = JSONObject.parseObject(a, UserTv.class);
ResultInfo weixinUserAndMember = this.userOperationController.createTvUserAndMember(parse);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
}
......
......@@ -2,7 +2,7 @@ package com.topdraw.test.business.process.service;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.BaseTest;
import com.topdraw.util.IdWorker;
import com.topdraw.util.TimestampUtil;
......@@ -45,10 +45,10 @@ public class MemberOperationServiceTest extends BaseTest {
member.setDueCouponAmount(0L);
member.setUserIptvId(1L);
member.setBindIptvPlatformType(0);
member.setUpdateTime(LocalDateTime.now());
member.setUpdateTime(TimestampUtil.now());
String s = JSONObject.toJSONString(member);
this.memberOperationService.doUpdateMemberInfo(member);
this.memberOperationService.doUpdateMember(member);
}
@Test
......@@ -73,9 +73,7 @@ public class MemberOperationServiceTest extends BaseTest {
member.setDueCouponAmount(0L);
member.setUserIptvId(1L);
member.setBindIptvPlatformType(0);
member.setBindIptvTime(LocalDateTime.now());
member.setCreateTime(LocalDateTime.now());
member.setUpdateTime(LocalDateTime.now());
member.setBindIptvTime(TimestampUtil.now());
// member.setUpdateTime(Timestamp.valueOf(LocalDateTime.now()));
this.memberOperationService.doInsertMember(member);
}
......
......@@ -4,10 +4,6 @@ import com.alibaba.fastjson.JSON;
import com.topdraw.BaseTest;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.service.TaskOperationService;
import com.topdraw.module.mq.DataSyncMsg;
import com.topdraw.module.mq.EntityType;
import com.topdraw.module.mq.EventType;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -2,9 +2,8 @@ package com.topdraw.test.business.process.service;
import com.alibaba.fastjson.JSON;
import com.topdraw.business.process.service.TaskOperationService;
import com.topdraw.module.mq.DataSyncMsg;
import com.topdraw.module.mq.EntityType;
import com.topdraw.module.mq.EventType;
import com.topdraw.mq.module.mq.DataSyncMsg;
import com.topdraw.mq.module.mq.EventType;
import com.topdraw.BaseTest;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -19,7 +18,7 @@ public class TaskOperationServiceTest extends BaseTest {
Long memberId = 3L;
DataSyncMsg dataSyncMsg = new DataSyncMsg();
// dataSyncMsg.setEntityType(EntityType.MEMBER);
dataSyncMsg.setEventType(EventType.LOGIN.name());
dataSyncMsg.setEvt(EventType.LOGIN.name());
DataSyncMsg.MsgData msgData = new DataSyncMsg.MsgData();
msgData.setEvent(1);
msgData.setRemarks("remark");
......
package com.topdraw.test.business.process.service;
import com.alibaba.fastjson.JSON;
import com.topdraw.BaseTest;
import com.topdraw.business.process.domian.weixin.WeiXinUserBean;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.process.service.UserOperationService;
import com.topdraw.module.mq.DataSyncMsg;
import com.topdraw.module.mq.EventType;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -31,8 +28,8 @@ public class UserOperationServiceTest extends BaseTest {
String s = JSON.toJSONString(dataSyncMsg);*/
WeiXinUserBean weiXinUserBean = new WeiXinUserBean();
weiXinUserBean.setWxAppid("1");
UserWeixin weiXinUserBean = new UserWeixin();
/*weiXinUserBean.setWxAppid("1");
weiXinUserBean.setWxCode("1");
weiXinUserBean.setSourceType("1");
weiXinUserBean.setSourceId("1");
......@@ -41,7 +38,7 @@ public class UserOperationServiceTest extends BaseTest {
weiXinUserBean.setSourceEntity("1");
weiXinUserBean.setSourceDesc("1");
weiXinUserBean.setSourceUser(1L);
weiXinUserBean.setUserInfo("1");
weiXinUserBean.setUserInfo("1");*/
this.taskOperationService.appletLogin(weiXinUserBean);
}
......
......@@ -2,9 +2,8 @@ package com.topdraw.test.mq;
import com.alibaba.fastjson.JSON;
import com.topdraw.BaseTest;
import com.topdraw.module.mq.DataSyncMsg;
import com.topdraw.module.mq.EventType;
import com.topdraw.mq.config.RabbitMqConfig;
import com.topdraw.mq.module.mq.DataSyncMsg;
import com.topdraw.mq.module.mq.EventType;
import com.topdraw.mq.producer.MessageProducer;
import org.junit.Test;
import org.springframework.amqp.core.AmqpTemplate;
......@@ -21,7 +20,8 @@ public class MqTest extends BaseTest {
@Test
public void test(){
DataSyncMsg dataSyncMsg = new DataSyncMsg();
dataSyncMsg.setEventType(EventType.LOGIN.name());
// dataSyncMsg.setEventType(EventType.LOGIN.name());
dataSyncMsg.setEvt(EventType.LOGIN.name());
DataSyncMsg.MsgData msgData = new DataSyncMsg.MsgData();
msgData.setEvent(1);
msgData.setRemarks("remark");
......