From 02a84356417adde5e642335549f3f15e147449f3 Mon Sep 17 00:00:00 2001 From: chengkun <2500338766@qq.com> Date: Fri, 1 Jul 2022 18:28:24 +0800 Subject: [PATCH] =?UTF-8?q?feature1.0.0-img:=E9=81=97=E7=95=99=E9=82=80?= =?UTF-8?q?=E8=AF=B7=E6=94=B6=E7=9B=8ABUG=E5=BE=85=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bnyer-common/bnyer-common-redis/pom.xml | 18 ++- .../redis/configure/RedissonConfig.java | 40 ++++++ .../common/redis/service/RedissonService.java | 114 ++++++++++++++++ .../main/resources/META-INF/spring.factories | 6 +- bnyer-services/bnyer-img/pom.xml | 2 - .../com/bnyer/img/config/AlipayConfig.java | 16 --- .../bnyer/img/constants/RedisKeyConstant.java | 5 + .../img/controller/CreatorMiniController.java | 8 -- .../com/bnyer/img/domain/CreatorProfit.java | 11 +- .../bnyer/img/dto/BatchUpdateInviteDto.java | 33 ----- .../img/dto/CreatorProfitAdInsertDto.java | 2 +- .../bnyer/img/dto/CreatorProfitPageDto.java | 2 +- .../bnyer/img/dto/CreatorProfitUpdateDto.java | 2 +- .../bnyer/img/mapper/CreatorProfitMapper.java | 22 +--- .../img/service/CreatorProfitService.java | 18 +-- .../impl/CreatorProfitServiceImpl.java | 36 +++-- .../impl/ProfitVerifyOrderServiceImpl.java | 124 ++++++++++-------- .../bnyer/img/vo/CreatorProfitEndAmtVo.java | 2 +- .../bnyer/img/vo/CreatorProfitInAmtVo.java | 2 +- .../com/bnyer/img/vo/CreatorProfitPreVo.java | 2 +- .../com/bnyer/img/vo/CreatorProfitVo.java | 2 +- .../bnyer/img/mapper/CreatorProfitMapper.xml | 17 +-- pom.xml | 24 ++++ 23 files changed, 320 insertions(+), 188 deletions(-) create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/configure/RedissonConfig.java create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedissonService.java delete mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/BatchUpdateInviteDto.java diff --git a/bnyer-common/bnyer-common-redis/pom.xml b/bnyer-common/bnyer-common-redis/pom.xml index 4782190..2c7b99b 100644 --- a/bnyer-common/bnyer-common-redis/pom.xml +++ b/bnyer-common/bnyer-common-redis/pom.xml @@ -8,26 +8,32 @@ 1.0.0 4.0.0 - + bnyer-common-redis - + bnyer-common-redis缓存服务 - + org.springframework.boot spring-boot-starter-data-redis - + com.dimensionalnode bnyer-common-core - + + + + org.redisson + redisson-spring-boot-starter + + - \ No newline at end of file + diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/configure/RedissonConfig.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/configure/RedissonConfig.java new file mode 100644 index 0000000..f65a078 --- /dev/null +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/configure/RedissonConfig.java @@ -0,0 +1,40 @@ +package com.bnyer.common.redis.configure; + +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * redisson配置 + * @author chengkun + * @date 2022/7/1 11:12 + */ +@ConfigurationProperties(prefix = "spring.redis") +@Configuration +@RefreshScope +public class RedissonConfig { + + @Value("${spring.redis.host}") + private String host; + + @Value("${spring.redis.port}") + private String port; + + @Value("${spring.redis.password}") + private String password; + + @Bean(destroyMethod = "shutdown") + @ConditionalOnMissingBean(RedissonClient.class) + public RedissonClient redissonClient() + { + Config config = new Config(); + config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password); + return Redisson.create(config); + } +} diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedissonService.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedissonService.java new file mode 100644 index 0000000..0642c63 --- /dev/null +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedissonService.java @@ -0,0 +1,114 @@ +package com.bnyer.common.redis.service; + +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * redisson锁工具类 + * @author chengkun + * @date 2022/7/1 11:10 + */ +@Component +public class RedissonService { + + @Autowired + private RedissonClient redissonClient; + + /** + * 获取锁 + * + * @param lockKey 锁实例key + * @return 锁信息 + */ + public RLock getRLock(String lockKey) + { + return redissonClient.getLock(lockKey); + } + + /** + * 加锁 + * + * @param lockKey 锁实例key + * @return 锁信息 + */ + public RLock lock(String lockKey) + { + RLock lock = getRLock(lockKey); + lock.lock(); + return lock; + } + + /** + * 加锁 + * + * @param lockKey 锁实例key + * @param leaseTime 上锁后自动释放锁时间 + * @return true=成功;false=失败 + */ + public Boolean tryLock(String lockKey, long leaseTime) + { + return tryLock(lockKey, 0, leaseTime, TimeUnit.SECONDS); + } + + /** + * 加锁 + * + * @param lockKey 锁实例key + * @param leaseTime 上锁后自动释放锁时间 + * @param unit 时间颗粒度 + * @return true=加锁成功;false=加锁失败 + */ + public Boolean tryLock(String lockKey, long leaseTime, TimeUnit unit) + { + return tryLock(lockKey, 0, leaseTime, unit); + } + + /** + * 加锁 + * + * @param lockKey 锁实例key + * @param waitTime 最多等待时间 + * @param leaseTime 上锁后自动释放锁时间 + * @param unit 时间颗粒度 + * @return true=加锁成功;false=加锁失败 + */ + public Boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit) + { + RLock rLock = getRLock(lockKey); + boolean tryLock = false; + try + { + tryLock = rLock.tryLock(waitTime, leaseTime, unit); + } + catch (InterruptedException e) + { + return false; + } + return tryLock; + } + + /** + * 释放锁 + * + * @param lockKey 锁实例key + */ + public void unlock(String lockKey) + { + RLock lock = getRLock(lockKey); + lock.unlock(); + } + + /** + * 释放锁 + * + * @param lock 锁信息 + */ + public void unlock(RLock lock) + { + lock.unlock(); + } +} diff --git a/bnyer-common/bnyer-common-redis/src/main/resources/META-INF/spring.factories b/bnyer-common/bnyer-common-redis/src/main/resources/META-INF/spring.factories index 2d21a45..6dfffb0 100644 --- a/bnyer-common/bnyer-common-redis/src/main/resources/META-INF/spring.factories +++ b/bnyer-common/bnyer-common-redis/src/main/resources/META-INF/spring.factories @@ -1,5 +1,7 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.bnyer.common.redis.configure.RedisConfig,\ - com.bnyer.common.redis.service.RedisService + com.bnyer.common.redis.service.RedisService,\ + com.bnyer.common.redis.configure.RedissonConfig,\ + com.bnyer.common.redis.service.RedissonService + - diff --git a/bnyer-services/bnyer-img/pom.xml b/bnyer-services/bnyer-img/pom.xml index f70bda5..1811aec 100644 --- a/bnyer-services/bnyer-img/pom.xml +++ b/bnyer-services/bnyer-img/pom.xml @@ -107,14 +107,12 @@ com.github.binarywang weixin-java-pay - 4.2.0 com.alipay.sdk alipay-sdk-java - 4.23.21.ALL diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java index b173f11..7c95f63 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java @@ -35,20 +35,4 @@ public class AlipayConfig{ @Value("${alipay.rootPath}") public String rootPath; - -// @Resource -// private TokenCheckHandler tokenCheckHandler; - - /** 不需要拦截地址 */ -// public static final String[] excludeUrls = { "/mini/tiktok/loginTiktok", "/mini/tiktok/insertFeedback"}; -// -// @Override -// public void addInterceptors(InterceptorRegistry registry) { -// // 注册Token拦截器 -// registry.addInterceptor(tokenCheckHandler) -// .addPathPatterns("/**") -// .excludePathPatterns(excludeUrls) -// .order(-10); -// -// } } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java index 911f747..c665d13 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java @@ -51,4 +51,9 @@ public class RedisKeyConstant { * 微信小程序艺术家邀请键 */ public static final String WECHAT_CREATOR_INVITE_KEY = "bnyer.img.invite.creator:"; + + /** + * 审核收益锁键 + */ + public static final String VERIFY_PROFIT_LOCK_KEY = "bnyer.img.profit.lock:"; } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java index ac35ddc..9925830 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java @@ -265,12 +265,4 @@ public class CreatorMiniController extends BaseController { log.info("小程序艺术家数据参数为:{}", JSON.toJSON(param)); return AjaxResult.success(creatorService.login(param)); } - - //@TokenCheck - @ApiOperation(value="支付宝异步回调") - @GetMapping(value = "/callback") - public AjaxResult alipayCallback(){ - log.info("支付宝回调了!"); - return AjaxResult.success(); - } } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/CreatorProfit.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/CreatorProfit.java index c34ae02..94e05a7 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/CreatorProfit.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/CreatorProfit.java @@ -76,10 +76,10 @@ public class CreatorProfit extends BaseDomain { private String platform; /** - * 应用类型(0->bnyer壁纸) + * 应用类型(0->次元壁纸) */ @TableField(value = "app_type") - @ApiModelProperty(value="应用类型(0->bnyer壁纸)") + @ApiModelProperty(value="应用类型(0->次元壁纸)") private String appType; /** @@ -138,6 +138,13 @@ public class CreatorProfit extends BaseDomain { @ApiModelProperty(value="转入钱包时间") private Date walletTime; + /** + * 唯一标识 + */ + @TableField(value = "mark") + @ApiModelProperty(value="唯一标识") + private String mark; + private static final long serialVersionUID = 1L; } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/BatchUpdateInviteDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/BatchUpdateInviteDto.java deleted file mode 100644 index d769ee1..0000000 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/BatchUpdateInviteDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.bnyer.img.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; - -import java.io.Serializable; - - -@Getter -@Setter -@ApiModel("批量更新邀请者收益接收类") -public class BatchUpdateInviteDto implements Serializable { - - @ApiModelProperty(value="艺术家id") - private Long creatorId; - - @ApiModelProperty(value="图片id") - private Long imgId; - - @ApiModelProperty(value="应用类型(0->bnyer壁纸)") - private String appType; - - @ApiModelProperty(value="结算平台(0->抖音;1->快手;2->微信;3->uniapp)") - private String platform; - - @ApiModelProperty(value="收益类型(0->广告浏览;1->邀请;2->会员)") - private String type; - - @ApiModelProperty(value="创建时间") - private String date; -} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitAdInsertDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitAdInsertDto.java index 15fd71c..d65a415 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitAdInsertDto.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitAdInsertDto.java @@ -34,7 +34,7 @@ public class CreatorProfitAdInsertDto implements Serializable { private String platform; @NotBlank(message = "应用类型不能为空!") - @ApiModelProperty(value="应用类型(0->bnyer壁纸)") + @ApiModelProperty(value="应用类型(0->次元壁纸)") private String appType; public CreatorProfit extractParam(){ diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitPageDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitPageDto.java index 99dc33b..d97206d 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitPageDto.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitPageDto.java @@ -19,7 +19,7 @@ public class CreatorProfitPageDto extends BasePageDto { @ApiModelProperty(value="结算平台(0->抖音;1->快手;2->微信;3->uniapp)") private String platform; - @ApiModelProperty(value="应用类型(0->bnyer壁纸)") + @ApiModelProperty(value="应用类型(0->次元壁纸)") private String appType; @ApiModelProperty(value="收益类型(0->广告浏览;1->邀请;2->会员)") diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitUpdateDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitUpdateDto.java index 7237ce1..f8d484b 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitUpdateDto.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorProfitUpdateDto.java @@ -45,7 +45,7 @@ public class CreatorProfitUpdateDto implements Serializable { private String platform; @NotBlank(message = "应用类型不能为空!") - @ApiModelProperty(value="应用类型(0->bnyer壁纸)") + @ApiModelProperty(value="应用类型(0->次元壁纸)") private String appType; @NotBlank(message = "收益类型不能为空!") diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/CreatorProfitMapper.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/CreatorProfitMapper.java index c1fbe96..0c98e38 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/CreatorProfitMapper.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/CreatorProfitMapper.java @@ -1,9 +1,7 @@ package com.bnyer.img.mapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bnyer.img.domain.CreatorProfit; -import com.bnyer.img.dto.BatchUpdateInviteDto; import com.bnyer.img.dto.CreatorProfitPageDto; import com.bnyer.img.dto.ProfitInOrEndDto; import com.bnyer.img.vo.*; @@ -29,15 +27,10 @@ public interface CreatorProfitMapper extends BaseMapper { /** * 更新下载数量 - * @param creatorId 艺术家id - * @param imgId 图片Id - * @param appType 应用 - * @param platform 平台 - * @param type 类型 - * @param date 日期 + * @param mark 唯一标识 * @return - */ - int updateDownloadNum(@Param("creatorId") Long creatorId,@Param("imgId") Long imgId,@Param("appType") String appType,@Param("platform") String platform,@Param("type")String type,@Param("date") String date); + int updateDownloadNum(@Param("mark") String mark); /** * 小程序查询即将入账日期下载次数 @@ -98,21 +91,16 @@ public interface CreatorProfitMapper extends BaseMapper { /** * 判断当天是否存在结算收益订单数据 - * @param creatorId 艺术家id - * @param imgId 图片id - * @param platform 平台 - * @param appType 应用 - * @param date 日期(年月日) + * @param mark 唯一标识 * @return - */ - CreatorProfit checkCreatorProfitExist(@Param("creatorId") Long creatorId,@Param("imgId") Long imgId,@Param("appType") String appType, - @Param("platform") String platform, @Param("type") String type, @Param("date") String date); + CreatorProfit checkCreatorProfitExist(@Param("mark") String mark); /** * 批量更新邀请记录下载次数 * @param list - */ - void batchUpdateDownload(@Param("list") List list); + void batchUpdateDownload(@Param("list") List list); /** * 批量新增邀请收益 diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorProfitService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorProfitService.java index 7fc8ed3..bc9cc56 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorProfitService.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorProfitService.java @@ -16,15 +16,10 @@ public interface CreatorProfitService { /** * 判断当天是否存在结算收益订单数据 - * @param creatorId 艺术家id - * @param imgId 图片id - * @param platform 平台 - * @param appType 应用 - * @param type 类型 - * @param date 日期(年月日) + * @param mark 唯一标识 * @return - */ - boolean checkCreatorProfitExist(Long creatorId,Long imgId,String appType,String platform,String type,String date); + boolean checkCreatorProfitExist(String mark); /** * 新增或更新广告收益记录 @@ -41,15 +36,10 @@ public interface CreatorProfitService { /** * 更新指定日期图片下载数量 - * @param creatorId 艺术家id - * @param imgId 图片id - * @param appType 应用 - * @param platform 平台 - * @param type 类型 - * @param date 日期 + * @param mark 唯一标识 * @return - */ - int updateCreatorProfitDownloadNum(Long creatorId,Long imgId,String appType,String platform,String type,String date); + int updateCreatorProfitDownloadNum(String mark); /** * 修改结算收益 diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorProfitServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorProfitServiceImpl.java index 0fb4040..3f39f6b 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorProfitServiceImpl.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorProfitServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.bnyer.common.redis.service.RedisService; import com.bnyer.img.domain.CreatorProfit; import com.bnyer.img.domain.InviteLog; -import com.bnyer.img.dto.BatchUpdateInviteDto; import com.bnyer.img.dto.CreatorProfitPageDto; import com.bnyer.img.dto.ProfitInOrEndDto; import com.bnyer.img.mapper.CreatorProfitMapper; @@ -15,7 +14,6 @@ import com.bnyer.img.service.CreatorProfitService; import com.bnyer.img.service.TiktokImgService; import com.bnyer.img.vo.*; import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -43,8 +41,8 @@ public class CreatorProfitServiceImpl implements CreatorProfitService { private InviteLogMapper inviteLogMapper; @Override - public boolean checkCreatorProfitExist(Long creatorId, Long imgId,String appType,String platform,String type, String date) { - CreatorProfit creatorProfit = creatorProfitMapper.checkCreatorProfitExist(creatorId, imgId, appType, platform,type, date); + public boolean checkCreatorProfitExist(String mark) { + CreatorProfit creatorProfit = creatorProfitMapper.checkCreatorProfitExist(mark); if(creatorProfit != null){ return true; }else{ @@ -58,13 +56,15 @@ public class CreatorProfitServiceImpl implements CreatorProfitService { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); long times = System.currentTimeMillis(); String date = format.format(times); + String mark = creatorProfit.getCreatorId()+creatorProfit.getImgId()+creatorProfit.getAppType()+creatorProfit.getPlatform()+ + "0"+date.replace("-",""); //缓存中下载总数+1 tiktokImgService.writeDownloadTotalNum(creatorProfit.getAppType(),creatorProfit.getPlatform()); //检查收益表是否存在广告记录,存在则更新次数 - boolean b = this.checkCreatorProfitExist(creatorProfit.getCreatorId(),creatorProfit.getImgId(),creatorProfit.getAppType(),creatorProfit.getPlatform(),"0",date); + boolean b = this.checkCreatorProfitExist(mark); if(b){ - int update = this.updateCreatorProfitDownloadNum(creatorProfit.getCreatorId(), creatorProfit.getImgId(), creatorProfit.getAppType(), creatorProfit.getPlatform(),"0", date); - log.info("更新日期【{}】艺术家【{}】图片【{}】应用【{}】平台【{}】收益下载次数+1",date,creatorProfit.getCreatorId(), creatorProfit.getImgId(), creatorProfit.getAppType(), creatorProfit.getPlatform()); + int update = this.updateCreatorProfitDownloadNum(mark); + log.info("唯一标识【{}】收益下载次数+1",mark); return update; } //不存在则新增广告记录 @@ -75,6 +75,7 @@ public class CreatorProfitServiceImpl implements CreatorProfitService { creatorProfit.setIsShow("1"); creatorProfit.setSort(0); creatorProfit.setDownloadNum(1); + creatorProfit.setMark(mark); //根据平台生成订单号 switch (creatorProfit.getPlatform()){ case "0" : @@ -106,20 +107,15 @@ public class CreatorProfitServiceImpl implements CreatorProfitService { wrapper.eq(InviteLog::getInvitedCreatorId, creatorProfit.getCreatorId()); List inviteLogs = inviteLogMapper.selectList(wrapper); if(inviteLogs.size() > 0){ - List updateList = new ArrayList<>(); + List updateList = new ArrayList<>(); List insertList = new ArrayList<>(); for (InviteLog inviteLog : inviteLogs) { + String mark = inviteLog.getCreatorId()+creatorProfit.getImgId()+creatorProfit.getAppType()+creatorProfit.getPlatform()+ + "1"+date.replace("-",""); //检查收益表是否存在邀请记录,存在则记录更新邀请者Id - boolean b = this.checkCreatorProfitExist(inviteLog.getCreatorId(),creatorProfit.getImgId(),creatorProfit.getAppType(),creatorProfit.getPlatform(),"1",date); + boolean b = this.checkCreatorProfitExist(mark); if(b){ - BatchUpdateInviteDto dto = new BatchUpdateInviteDto(); - dto.setCreatorId(inviteLog.getCreatorId()); - dto.setAppType(creatorProfit.getAppType()); - dto.setImgId(creatorProfit.getImgId()); - dto.setPlatform(creatorProfit.getPlatform()); - dto.setDate(date); - dto.setType("1"); - updateList.add(dto); + updateList.add(mark); }else{ //不存在则新增邀请者id creatorProfit.setCreatorId(inviteLog.getCreatorId()); @@ -130,6 +126,7 @@ public class CreatorProfitServiceImpl implements CreatorProfitService { creatorProfit.setIsShow("1"); creatorProfit.setSort(0); creatorProfit.setDownloadNum(1); + creatorProfit.setMark(mark); //根据平台生成订单号 switch (creatorProfit.getPlatform()){ case "0" : @@ -150,6 +147,7 @@ public class CreatorProfitServiceImpl implements CreatorProfitService { } if(updateList.size() > 0){ //批量更新邀请记录 + //TODO 修改此处BUG creatorProfitMapper.batchUpdateDownload(updateList); } if(insertList.size() > 0){ @@ -161,8 +159,8 @@ public class CreatorProfitServiceImpl implements CreatorProfitService { @Override @Transactional(rollbackFor = Exception.class) - public int updateCreatorProfitDownloadNum(Long creatorId, Long imgId, String appType, String platform,String type, String date) { - return creatorProfitMapper.updateDownloadNum(creatorId,imgId,appType,platform,type,date); + public int updateCreatorProfitDownloadNum(String mark) { + return creatorProfitMapper.updateDownloadNum(mark); } @Override diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/ProfitVerifyOrderServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/ProfitVerifyOrderServiceImpl.java index c099f8f..b569910 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/ProfitVerifyOrderServiceImpl.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/ProfitVerifyOrderServiceImpl.java @@ -1,8 +1,10 @@ package com.bnyer.img.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.StringUtils; import com.bnyer.common.redis.service.RedisService; +import com.bnyer.common.redis.service.RedissonService; import com.bnyer.img.constants.ProfitOrderConstant; import com.bnyer.img.constants.RedisKeyConstant; import com.bnyer.img.domain.Creator; @@ -12,13 +14,13 @@ import com.bnyer.img.dto.ProfitVerifyOrderDto; import com.bnyer.img.dto.ProfitVerifyOrderInsertDto; import com.bnyer.img.dto.ProfitVerifyOrderPageDto; import com.bnyer.img.dto.ProfitVerifyOrderUpdateDto; -import com.bnyer.img.mapper.CreatorMapper; import com.bnyer.img.mapper.ProfitVerifyOrderMapper; import com.bnyer.img.service.CreatorProfitService; import com.bnyer.img.service.CreatorService; import com.bnyer.img.service.ProfitVerifyOrderService; import com.bnyer.img.vo.ConfirmProfitVo; import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,6 +30,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.concurrent.TimeUnit; @Service @Slf4j @@ -46,7 +49,7 @@ public class ProfitVerifyOrderServiceImpl implements ProfitVerifyOrderService { private CreatorService creatorService; @Autowired - private CreatorMapper creatorMapper; + private RedissonService redissonService; @Override @Transactional(rollbackFor = Exception.class) @@ -104,59 +107,76 @@ public class ProfitVerifyOrderServiceImpl implements ProfitVerifyOrderService { @Transactional(rollbackFor = Exception.class) public boolean verify(ProfitVerifyOrderDto params) { if(params.getVerifyStatus().equals(ProfitOrderConstant.PASS)){ - //审核通过计算收益 - //昨日总收益的80%作为广告收益 - BigDecimal yesterdayTotalAdProfit = params.getAmt().multiply(BigDecimal.valueOf(0.8)); - //昨日总收益的10%作为邀请收益 - BigDecimal yesterdayTotalInviteProfit = params.getAmt().multiply(BigDecimal.valueOf(0.1)); - //获取昨日日期 - Date yesterday = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24); - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - String date = simpleDateFormat.format(yesterday); - String tiktokKey = RedisKeyConstant.TIKTOK_IMG_TOTAL_DOWNLOAD_NUM_KEY + date; - String hashKey = params.getAppType()+":"+ params.getPlatform(); - if(redisService.hasHashKey(tiktokKey, hashKey)){ - //存在昨日平台下载数量 - Integer platformDownloadNum = redisService.getCacheMapValue(tiktokKey, hashKey); - //广告单价 - BigDecimal adPrice = yesterdayTotalAdProfit.divide(BigDecimal.valueOf(platformDownloadNum), 3, BigDecimal.ROUND_DOWN); - //邀请单价 - BigDecimal invitePrice = yesterdayTotalInviteProfit.divide(BigDecimal.valueOf(platformDownloadNum), 3, BigDecimal.ROUND_DOWN); - //查出昨日对应平台的所有广告待入账信息 - List adProfits = creatorProfitService.queryPreProfit(params.getPlatform(), params.getAppType(), "0",date); - if(adProfits.size() > 0){ - for (CreatorProfit adProfit : adProfits) { - //设置广告收益 - adProfit.setProfit(BigDecimal.valueOf(adProfit.getDownloadNum()).multiply(adPrice)); - adProfit.setConfirmStatus("0"); - adProfit.setIncomeTime(new Date()); - adProfit.setStatus("1"); - creatorProfitService.update(adProfit); + //获取分布式锁 + RLock lock = redissonService.getRLock(RedisKeyConstant.VERIFY_PROFIT_LOCK_KEY + params.getId()); + try{ + if(lock.tryLock(0L, 30L, TimeUnit.SECONDS)){ + log.info("锁获取成功,开始执行审核收益操作"); + //审核通过计算收益 + //昨日总收益的80%作为广告收益 + BigDecimal yesterdayTotalAdProfit = params.getAmt().multiply(BigDecimal.valueOf(0.8)); + //昨日总收益的10%作为邀请收益 + BigDecimal yesterdayTotalInviteProfit = params.getAmt().multiply(BigDecimal.valueOf(0.1)); + //获取昨日日期 + Date yesterday = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String date = simpleDateFormat.format(yesterday); + String tiktokKey = RedisKeyConstant.TIKTOK_IMG_TOTAL_DOWNLOAD_NUM_KEY + date; + String hashKey = params.getAppType()+":"+ params.getPlatform(); + if(redisService.hasHashKey(tiktokKey, hashKey)){ + //存在昨日平台下载数量 + Integer platformDownloadNum = redisService.getCacheMapValue(tiktokKey, hashKey); + //广告单价 + BigDecimal adPrice = yesterdayTotalAdProfit.divide(BigDecimal.valueOf(platformDownloadNum), 3, BigDecimal.ROUND_DOWN); + //邀请单价 + BigDecimal invitePrice = yesterdayTotalInviteProfit.divide(BigDecimal.valueOf(platformDownloadNum), 3, BigDecimal.ROUND_DOWN); + //查出昨日对应平台的所有广告待入账信息 + List adProfits = creatorProfitService.queryPreProfit(params.getPlatform(), params.getAppType(), "0",date); + if(adProfits.size() > 0){ + for (CreatorProfit adProfit : adProfits) { + //设置广告收益 + adProfit.setProfit(BigDecimal.valueOf(adProfit.getDownloadNum()).multiply(adPrice)); + adProfit.setConfirmStatus("0"); + adProfit.setIncomeTime(new Date()); + adProfit.setStatus("1"); + creatorProfitService.update(adProfit); + } } - } - //查出昨日对应平台的所有邀请待入账信息 - List inviteProfits = creatorProfitService.queryPreProfit(params.getPlatform(), params.getAppType(), "1",date); - if(inviteProfits.size() > 0){ - //设置邀请收益 - for (CreatorProfit inviteProfit : inviteProfits) { - inviteProfit.setProfit(BigDecimal.valueOf(inviteProfit.getDownloadNum()).multiply(invitePrice)); - inviteProfit.setConfirmStatus("0"); - inviteProfit.setIncomeTime(new Date()); - inviteProfit.setStatus("1"); - creatorProfitService.update(inviteProfit); + //查出昨日对应平台的所有邀请待入账信息 + List inviteProfits = creatorProfitService.queryPreProfit(params.getPlatform(), params.getAppType(), "1",date); + if(inviteProfits.size() > 0){ + //设置邀请收益 + for (CreatorProfit inviteProfit : inviteProfits) { + inviteProfit.setProfit(BigDecimal.valueOf(inviteProfit.getDownloadNum()).multiply(invitePrice)); + inviteProfit.setConfirmStatus("0"); + inviteProfit.setIncomeTime(new Date()); + inviteProfit.setStatus("1"); + creatorProfitService.update(inviteProfit); + } } + //设置完结算收益,删除数量缓存 + redisService.deleteHashKey(tiktokKey,hashKey); + //更新审核单信息 + ProfitVerifyOrder order = new ProfitVerifyOrder(); + order.setId(params.getId()); + order.setReason(params.getReason()); + order.setVerifyAdminId(params.getVerifyAdminId()); + order.setVerifyStatus(params.getVerifyStatus()); + order.setVerifyTime(new Date()); + profitVerifyOrderMapper.updateById(order); + return true; } - //设置完结算收益,删除数量缓存 - redisService.deleteHashKey(tiktokKey,hashKey); - //更新审核单信息 - ProfitVerifyOrder order = new ProfitVerifyOrder(); - order.setId(params.getId()); - order.setReason(params.getReason()); - order.setVerifyAdminId(params.getVerifyAdminId()); - order.setVerifyStatus(params.getVerifyStatus()); - order.setVerifyTime(new Date()); - profitVerifyOrderMapper.updateById(order); - return true; + }else{ + throw new ServiceException("系统繁忙,请稍候重试!"); + } + }catch (Exception e){ + log.error("审核收益单失败!错误原因为【{}】",e.getMessage()); + }finally { + //释放锁 + if(lock.isHeldByCurrentThread()){ + lock.unlock(); + log.info("审核收益操作执行完毕,释放锁成功!"); + } } return false; }else{ diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitEndAmtVo.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitEndAmtVo.java index aef9fb3..68caa95 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitEndAmtVo.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitEndAmtVo.java @@ -40,7 +40,7 @@ public class CreatorProfitEndAmtVo implements Serializable { @ApiModelProperty(value="结算平台(0->抖音;1->快手;2->微信;3->uniapp)") private String platform; - @ApiModelProperty(value="应用类型(0->bnyer壁纸)") + @ApiModelProperty(value="应用类型(0->次元壁纸)") private String appType; @ApiModelProperty(value="收益类型(0->广告浏览;1->邀请;2->会员)") diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitInAmtVo.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitInAmtVo.java index d17fcef..d657c3e 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitInAmtVo.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitInAmtVo.java @@ -40,7 +40,7 @@ public class CreatorProfitInAmtVo implements Serializable { @ApiModelProperty(value="结算平台(0->抖音;1->快手;2->微信;3->uniapp)") private String platform; - @ApiModelProperty(value="应用类型(0->bnyer壁纸)") + @ApiModelProperty(value="应用类型(0->次元壁纸)") private String appType; @ApiModelProperty(value="收益类型(0->广告浏览;1->邀请;2->会员)") diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitPreVo.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitPreVo.java index 0e6824f..da2d3fd 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitPreVo.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitPreVo.java @@ -33,7 +33,7 @@ public class CreatorProfitPreVo implements Serializable { @ApiModelProperty(value="结算平台(0->抖音;1->快手;2->微信;3->uniapp)") private String platform; - @ApiModelProperty(value="应用类型(0->bnyer壁纸)") + @ApiModelProperty(value="应用类型(0->次元壁纸)") private String appType; @ApiModelProperty(value="收益类型(0->广告浏览;1->邀请;2->会员)") diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitVo.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitVo.java index b6ee5af..b74c008 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitVo.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorProfitVo.java @@ -36,7 +36,7 @@ public class CreatorProfitVo implements Serializable { @ApiModelProperty(value="结算平台(0->抖音;1->快手;2->微信;3->uniapp)") private String platform; - @ApiModelProperty(value="应用类型(0->bnyer壁纸)") + @ApiModelProperty(value="应用类型(0->次元壁纸)") private String appType; @ApiModelProperty(value="收益类型(0->广告浏览;1->邀请;2->会员)") diff --git a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/CreatorProfitMapper.xml b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/CreatorProfitMapper.xml index 127525e..5b9a30d 100644 --- a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/CreatorProfitMapper.xml +++ b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/CreatorProfitMapper.xml @@ -24,12 +24,13 @@ + id, order_no, creator_id,scan_code, img_id, profit, platform, app_type, `type`, `status`, confirm_type, confirm_status, download_num, is_show, create_time, income_time, confirm_time, - wallet_time, update_time, sort + wallet_time, update_time, sort, mark @@ -43,8 +44,7 @@ update img_creator_profit set download_num = download_num + 1, update_time = (select NOW()) - where creator_id = #{creatorId} and img_id = #{imgId} and app_type = #{appType} - and platform = #{platform} and type = #{type} and DATE_FORMAT(create_time,'%Y-%m-%d') = #{date} and status = '0' + where mark = #{mark} and status = '0' @@ -137,19 +136,17 @@ download_num = download_num + 1, update_time = (select NOW()) - where creator_id = #{item.creatorId} and img_id = #{item.imgId} and app_type = #{item.appType} - and platform = #{item.platform} and DATE_FORMAT(create_time,'%Y-%m-%d') = #{item.date} and type = #{item.type} - and status = '0' + where mark = #{item.mark} and status = '0' insert into img_creator_profit(creator_id,order_no,type,status,is_show,sort,download_num, - create_time,update_time,scan_code,img_id,platform,app_type) values + create_time,update_time,scan_code,img_id,platform,app_type,mark) values (#{item.creatorId},#{item.orderNo}, #{item.type}, #{item.status}, #{item.isShow},#{item.sort}, #{item.downloadNum},#{item.createTime},#{item.updateTime},#{item.scanCode},#{item.imgId}, - #{item.platform},#{item.appType}) + #{item.platform},#{item.appType},#{item.mark}) diff --git a/pom.xml b/pom.xml index e4e109a..0c1278d 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,9 @@ 2.12.2 1.18.12 5.8.0.M3 + 3.16.2 + 4.23.21.ALL + 4.2.0 @@ -190,6 +193,27 @@ ${transmittable-thread-local.version} + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + + + com.alipay.sdk + alipay-sdk-java + ${aliPay.version} + + + + + com.github.binarywang + weixin-java-pay + ${wePay.version} + + com.dimensionalnode