package com.yeshi.makemoney.app.service.impl.goldcorn;
|
|
import com.ks.lib.common.exception.ParamsException;
|
import com.yeshi.makemoney.app.dto.goldcorn.GoldCornMakeResultDTO;
|
import com.yeshi.makemoney.app.entity.config.SystemConfigKey;
|
import com.yeshi.makemoney.app.entity.goldcorn.*;
|
import com.yeshi.makemoney.app.entity.money.UserMoneyRecord;
|
import com.yeshi.makemoney.app.entity.user.UserInfo;
|
import com.yeshi.makemoney.app.exception.goldcorn.GoldCornGetFrequencyConfigException;
|
import com.yeshi.makemoney.app.exception.goldcorn.GoldCornGetPriceException;
|
import com.yeshi.makemoney.app.exception.goldcorn.GoldCornGetRecordException;
|
import com.yeshi.makemoney.app.exception.goldcorn.GoldCornMakeException;
|
import com.yeshi.makemoney.app.exception.user.UserInfoException;
|
import com.yeshi.makemoney.app.service.inter.config.SystemConfigService;
|
import com.yeshi.makemoney.app.service.inter.goldcorn.GoldCornGetFrequencyConfigService;
|
import com.yeshi.makemoney.app.service.inter.goldcorn.GoldCornGetPriceService;
|
import com.yeshi.makemoney.app.service.inter.goldcorn.GoldCornGetRecordService;
|
import com.yeshi.makemoney.app.service.inter.goldcorn.GoldCornMakeService;
|
import com.yeshi.makemoney.app.service.inter.money.UserMoneyRecordService;
|
import com.yeshi.makemoney.app.service.inter.team.TeamInviteRelationService;
|
import com.yeshi.makemoney.app.service.inter.user.UserInfoService;
|
import com.yeshi.makemoney.app.service.query.goldcorn.GoldCornGetRecordQuery;
|
import com.yeshi.makemoney.app.utils.factory.UserMoneyRecordFactory;
|
import com.yeshi.makemoney.app.utils.factory.goldcorn.GoldCornConsumeRecordFactory;
|
import com.yeshi.makemoney.app.utils.goldcorn.GoldCornUtil;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.yeshi.utils.TimeUtil;
|
import org.yeshi.utils.annotation.RequestSerializableByKey;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* @author hxh
|
* @title: GoldCornMakeServiceImpl
|
* @description: 挣金币服务
|
* @date 2022/4/6 16:56
|
*/
|
@Service
|
public class GoldCornMakeServiceImpl implements GoldCornMakeService {
|
|
@Resource
|
private GoldCornGetFrequencyConfigService goldCornGetFrequencyConfigService;
|
|
@Resource
|
private GoldCornGetRecordService goldCornGetRecordService;
|
|
@Resource
|
private RedisTemplate<String, Object> redisTemplate;
|
|
@Resource
|
private GoldCornGetPriceService goldCornGetPriceService;
|
|
@Resource
|
private UserInfoService userInfoService;
|
|
@Resource
|
private TeamInviteRelationService teamInviteRelationService;
|
|
@Resource
|
private SystemConfigService systemConfigService;
|
|
@Resource
|
private UserMoneyRecordService userMoneyRecordService;
|
|
|
/**
|
* @return int 当前时间段还剩余的事件数量
|
* @author hxh
|
* @description 频率限制
|
* @date 11:02 2022/4/28
|
* @param: user
|
* @param: type
|
* @param: time
|
**/
|
@Override
|
public long frequencyVerify(UserInfo user, GoldCornGetType type, Date time) throws GoldCornGetFrequencyConfigException, GoldCornMakeException {
|
GoldCornGetFrequencyConfig config = goldCornGetFrequencyConfigService.getConfig(user.getSystem(), type, time);
|
if (config == null) {
|
throw new GoldCornGetFrequencyConfigException(GoldCornGetFrequencyConfigException.CODE_NOT_EXIST, "频率配置不存在");
|
}
|
|
|
GoldCornGetRecordQuery query = new GoldCornGetRecordQuery();
|
query.setUid(user.getId());
|
query.setType(type);
|
|
//间隔判断
|
if (config.getMinSpaceTime() != null) {
|
List<GoldCornGetRecord> list = goldCornGetRecordService.list(query, 1, 1);
|
if (list != null && list.size() > 0 && time.getTime() - list.get(0).getCreateTime().getTime() < config.getMinSpaceTime() * 1000L) {
|
String msg = String.format("需要间隔%s秒以上", config.getMinSpaceTime());
|
throw new GoldCornMakeException(GoldCornMakeException.CODE_GET_FREQUENCY_TIME_LIMIT, msg);
|
}
|
}
|
|
Date startTime = null;
|
Date endTime = time;
|
if (config.getTimeUnit() == GoldCornGetFrequencyConfig.GoldCornGetFrequencyTimeUnit.minute) {
|
startTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(endTime.getTime(), "yyyyMMdd HHmm"), "yyyyMMdd HHmm"));
|
} else if (config.getTimeUnit() == GoldCornGetFrequencyConfig.GoldCornGetFrequencyTimeUnit.hour) {
|
startTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(endTime.getTime(), "yyyyMMdd HH"), "yyyyMMdd HH"));
|
} else if (config.getTimeUnit() == GoldCornGetFrequencyConfig.GoldCornGetFrequencyTimeUnit.day) {
|
startTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(endTime.getTime(), "yyyyMMdd"), "yyyyMMdd"));
|
} else if (config.getTimeUnit() == GoldCornGetFrequencyConfig.GoldCornGetFrequencyTimeUnit.week) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTimeInMillis(endTime.getTime());
|
int subDay = (Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 2 + 7) % 7;
|
startTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(endTime.getTime() - 1000 * 60 * 60 * 24L * subDay, "yyyyMMdd"), "yyyyMMdd"));
|
} else if (config.getTimeUnit() == GoldCornGetFrequencyConfig.GoldCornGetFrequencyTimeUnit.month) {
|
startTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(endTime.getTime(), "yyyyMM"), "yyyyMM"));
|
} else if (config.getTimeUnit() == GoldCornGetFrequencyConfig.GoldCornGetFrequencyTimeUnit.year) {
|
startTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(endTime.getTime(), "yyyy"), "yyyy"));
|
}
|
query.setFormat("yyyyMMdd HH:mm:ss");
|
query.setStartTime(TimeUtil.getGernalTime(startTime.getTime(), query.getFormat()));
|
//service里面有减去1天
|
query.setEndTime(TimeUtil.getGernalTime(endTime.getTime() - 1000 * 60 * 60 * 24L, query.getFormat()));
|
|
Map<GoldCornGetType, Long> countMap = goldCornGetRecordService.sumEventCount(query);
|
if (countMap.get(type) != null && (countMap.get(type) >= config.getLimitCount())) {
|
String msg = String.format("超出%s次/%s的限制", config.getLimitCount(), config.getTimeUnit().getName());
|
throw new GoldCornMakeException(GoldCornMakeException.CODE_GET_FREQUENCY_COUNT_LIMIT, msg);
|
}
|
return config.getLimitCount() - (countMap.get(type) != null ? countMap.get(type) : 0);
|
}
|
|
|
@RequestSerializableByKey(key = "'addgoldcorn-'+#uid+'-'+#type")
|
@Override
|
public GoldCornGetRecord addGoldCorn(Long uid, GoldCornGetType type, boolean isDouble, Date currentTime, Integer price, Long eventCount) throws UserInfoException, GoldCornGetFrequencyConfigException, GoldCornMakeException {
|
if (uid == null || type == null || currentTime == null) {
|
throw new GoldCornMakeException(GoldCornMakeException.CODE_PARAMS_NOT_ENOUGH, "参数不完整");
|
}
|
UserInfo user = userInfoService.get(uid);
|
if (user == null) {
|
throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在");
|
}
|
GoldCornGetPrice getPrice = goldCornGetPriceService.getPrice(user.getSystem(), GoldCornGetType.watchVideo, currentTime);
|
|
|
//单价由外面传入
|
int baseCornNum = price;
|
|
GoldCornGetRecord record = new GoldCornGetRecord();
|
record.setCornNum(baseCornNum);
|
record.setDay(TimeUtil.getGernalTime(currentTime.getTime(), "yyyy-MM-dd"));
|
record.setType(type);
|
record.setUid(uid);
|
record.setLevel(GoldCornGetRecord.LEVEL_OWN);
|
record.setCreateTime(currentTime);
|
record.setEventCount(eventCount);
|
GoldCornGetRecord recordD = null;
|
if (isDouble) {
|
recordD = new GoldCornGetRecord();
|
recordD.setCornNum(baseCornNum);
|
recordD.setDay(TimeUtil.getGernalTime(currentTime.getTime(), "yyyy-MM-dd"));
|
recordD.setType(type);
|
recordD.setUid(uid);
|
recordD.setLevel(GoldCornGetRecord.LEVEL_OWN);
|
recordD.setCreateTime(currentTime);
|
recordD.setDubble(true);
|
recordD.setEventCount(eventCount);
|
}
|
|
//允许上级提成
|
|
try {
|
goldCornGetRecordService.add(record);
|
if (recordD != null) {
|
goldCornGetRecordService.add(recordD);
|
}
|
//是否有上级
|
if (getPrice.getTeamDivide() != null && getPrice.getTeamDivide()) {
|
Long bossUid = teamInviteRelationService.getBossUid(user.getId());
|
if (bossUid != null) {
|
BigDecimal rate = new BigDecimal(systemConfigService.getValueCache(user.getSystem(), SystemConfigKey.teamFirstDivideRate));
|
GoldCornGetRecord cRecord = new GoldCornGetRecord();
|
cRecord.setDay(record.getDay());
|
cRecord.setType(type);
|
cRecord.setUid(bossUid);
|
cRecord.setCornNum(new BigDecimal(baseCornNum).multiply(rate).intValue());
|
cRecord.setFromId(record.getId());
|
cRecord.setFromUid(record.getUid());
|
cRecord.setLevel(GoldCornGetRecord.LEVEL_FIRST);
|
cRecord.setCreateTime(currentTime);
|
if (cRecord.getCornNum() > 0) {
|
goldCornGetRecordService.add(cRecord);
|
}
|
//是否有上上级
|
// bossUid = teamInviteRelationService.getBossUid(bossUid);
|
// if (bossUid != null) {
|
// rate = new BigDecimal(systemConfigService.getValueCache(user.getSystem(), SystemConfigKey.teamSecondDivideRate));
|
// GoldCornGetRecord ccRecord = new GoldCornGetRecord();
|
// ccRecord.setDay(record.getDay());
|
// ccRecord.setType(type);
|
// ccRecord.setUid(bossUid);
|
// ccRecord.setFromId(record.getId());
|
// ccRecord.setFromUid(record.getUid());
|
// ccRecord.setCornNum(new BigDecimal(baseCornNum).multiply(rate).intValue());
|
// ccRecord.setLevel(GoldCornGetRecord.LEVEL_SECOND);
|
// ccRecord.setCreateTime(currentTime);
|
// if (ccRecord.getCornNum() > 0) {
|
// goldCornGetRecordService.add(ccRecord);
|
// }
|
// }
|
}
|
}
|
} catch (GoldCornGetRecordException e) {
|
throw new GoldCornMakeException(GoldCornMakeException.CODE_ADD_RECORD_ERROR, e.getMsg());
|
}
|
|
return record;
|
}
|
|
@Override
|
public Long getGoldCornByDay(Long uid, Date day) {
|
//TODO redis缓存
|
return goldCornGetRecordService.getGoldCornByDay(uid, day);
|
}
|
|
@Override
|
public Long getExchangingGoldCorn(Long uid, int dayCount) {
|
long goldCornNum = 0;
|
long now = System.currentTimeMillis();
|
//查询最近3天未兑换的金币数量,
|
for (int i = 1; i <= dayCount; i++) {
|
Date date = new Date(now - 1000 * 60 * 60 * 24L * i);
|
long count = getGoldCornByDay(uid, date);
|
if (count == 0L) {
|
continue;
|
}
|
//获取兑换记录的主键ID
|
GoldCornConsumeRecord record = GoldCornConsumeRecordFactory.createExchange(uid, GoldCornUtil.getFormatDay(date), 0, new BigDecimal(0.1));
|
//查询资金记录是否有该记录
|
try {
|
UserMoneyRecord userMoneyRecord = UserMoneyRecordFactory.createGoldCornExchange(record);
|
//查询记录
|
userMoneyRecord = userMoneyRecordService.selectBySerialNo(userMoneyRecord.getSerialNo());
|
|
if (userMoneyRecord == null) {
|
//未兑换
|
goldCornNum += count;
|
}
|
|
} catch (ParamsException e) {
|
e.printStackTrace();
|
}
|
}
|
return goldCornNum;
|
}
|
|
@Override
|
public int getContinueSignDay(Long uid) {
|
Date now = new Date();
|
//查询今日是否已经签到
|
boolean isSignIn = isSignIn(uid, now);
|
Date deadDate = now;
|
if (!isSignIn) {
|
deadDate = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(now.getTime(), "yyyyMMdd"), "yyyyMMdd"));
|
}
|
|
//今日未签到的,查询连续签到次数应该从前一天开始计算
|
int continueDay = goldCornGetRecordService.getContinueDay(uid, GoldCornGetType.signIn, deadDate);
|
return continueDay;
|
}
|
|
@Override
|
public boolean isSignIn(Long uid, Date date) {
|
GoldCornGetRecordQuery query = new GoldCornGetRecordQuery();
|
query.setUid(uid);
|
query.setType(GoldCornGetType.signIn);
|
query.setDay(GoldCornUtil.getFormatDay(date));
|
long count = goldCornGetRecordService.count(query);
|
return count > 0L;
|
}
|
|
@Override
|
public GoldCornGetRecord signIn(Long uid) throws GoldCornGetFrequencyConfigException, UserInfoException, GoldCornGetPriceException, GoldCornMakeException {
|
|
UserInfo user = userInfoService.get(uid);
|
|
Date now = new Date();
|
//判断是否超出了次数限制
|
long leftCount = frequencyVerify(user, GoldCornGetType.signIn, now);
|
//获取连续签到次数
|
Integer price = goldCornGetPriceService.getSingInPrice(user.getSystem(), getContinueSignDay(uid) + 1);
|
return addGoldCorn(uid, GoldCornGetType.signIn, false, now, price, 1L);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public GoldCornMakeResultDTO watchVideo(Long uid, boolean isDouble, Date time, long timeSeconds) throws GoldCornGetPriceException, UserInfoException, GoldCornMakeException, GoldCornGetFrequencyConfigException {
|
UserInfo user = userInfoService.get(uid);
|
if (user == null) {
|
throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在");
|
}
|
|
//判断是否超出了次数限制
|
long leftCount = frequencyVerify(user, GoldCornGetType.watchVideo, time);
|
timeSeconds = timeSeconds > leftCount ? leftCount : timeSeconds;
|
|
Integer price = goldCornGetPriceService.getCountPrice(GoldCornGetType.watchVideo, user, user.getSystem(), time, timeSeconds);
|
//价格为0时不加入记录
|
if (price == 0) {
|
return new GoldCornMakeResultDTO(0, leftCount);
|
}
|
|
GoldCornGetRecord record = addGoldCorn(uid, GoldCornGetType.watchVideo, isDouble, time, price, (long) timeSeconds);
|
return new GoldCornMakeResultDTO(record.getCornNum() * (isDouble ? 2 : 1), leftCount - timeSeconds);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public GoldCornMakeResultDTO readNovel(Long uid, boolean isDouble, Date time, long timeSeconds) throws GoldCornGetPriceException, UserInfoException, GoldCornMakeException, GoldCornGetFrequencyConfigException {
|
|
String readNovelCacheKey = "task-n-" + uid + "-" + TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyyMMdd");
|
long readNovelNowSeconds = timeSeconds;
|
|
Integer start = (Integer) redisTemplate.opsForValue().get(readNovelCacheKey);
|
if (start == null) {
|
start = 0;
|
}
|
|
timeSeconds = timeSeconds - start;
|
|
UserInfo user = userInfoService.get(uid);
|
if (user == null) {
|
throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在");
|
}
|
|
//判断是否超出了次数限制
|
long leftCount = frequencyVerify(user, GoldCornGetType.readNovel, time);
|
timeSeconds = timeSeconds > leftCount ? leftCount : timeSeconds;
|
|
Integer price = goldCornGetPriceService.getCountPrice(GoldCornGetType.readNovel, user, user.getSystem(), time, timeSeconds);
|
//价格为0时不加入记录
|
if (price == 0) {
|
return new GoldCornMakeResultDTO(0, leftCount);
|
}
|
|
GoldCornGetRecord record = addGoldCorn(uid, GoldCornGetType.readNovel, isDouble, time, price, (long) timeSeconds);
|
|
//记录当天的实时阅读分钟数
|
redisTemplate.opsForValue().set(readNovelCacheKey, readNovelNowSeconds, 60 * 60 * 24, TimeUnit.SECONDS);
|
return new GoldCornMakeResultDTO(record.getCornNum() * (isDouble ? 2 : 1), leftCount - timeSeconds);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public GoldCornMakeResultDTO scanNews(Long uid, boolean isDouble, Date time, int num) throws GoldCornGetPriceException, UserInfoException, GoldCornMakeException, GoldCornGetFrequencyConfigException {
|
UserInfo user = userInfoService.get(uid);
|
if (user == null) {
|
throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在");
|
}
|
|
//判断是否超出了次数限制
|
long leftCount = frequencyVerify(user, GoldCornGetType.scanNews, time);
|
|
Integer price = goldCornGetPriceService.getCountPrice(GoldCornGetType.scanNews, user, user.getSystem(), time, num);
|
//价格为0时不加入记录
|
if (price == 0) {
|
return new GoldCornMakeResultDTO(0, leftCount);
|
}
|
|
GoldCornGetRecord record = addGoldCorn(uid, GoldCornGetType.scanNews, isDouble, time, price, (long) num);
|
return new GoldCornMakeResultDTO(record.getCornNum() * (isDouble ? 2 : 1), leftCount - num);
|
}
|
|
@Override
|
public GoldCornMakeResultDTO inviteFriends(Long uid, UserInfo friendInfo, Date time) throws UserInfoException, GoldCornGetPriceException, GoldCornMakeException, GoldCornGetFrequencyConfigException {
|
UserInfo user = userInfoService.get(uid);
|
if (user == null) {
|
throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在");
|
}
|
|
//判断是否超出了次数限制
|
long leftCount = frequencyVerify(user, GoldCornGetType.invite, time);
|
|
Integer price = goldCornGetPriceService.getCountPrice(GoldCornGetType.invite, user, user.getSystem(), time, 1);
|
//价格为0时不加入记录
|
if (price == 0) {
|
return new GoldCornMakeResultDTO(0, leftCount);
|
}
|
|
GoldCornGetRecord record = addGoldCorn(uid, GoldCornGetType.invite, false, time, price, (long) price);
|
return new GoldCornMakeResultDTO(record.getCornNum(), leftCount - 1);
|
}
|
|
@Override
|
public GoldCornMakeResultDTO extract(Long uid, Date time) throws UserInfoException, GoldCornGetPriceException, GoldCornMakeException, GoldCornGetFrequencyConfigException {
|
|
UserInfo user = userInfoService.get(uid);
|
if (user == null) {
|
throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在");
|
}
|
|
//判断是否超出了次数限制
|
long leftCount = frequencyVerify(user, GoldCornGetType.extract, time);
|
|
Integer price = goldCornGetPriceService.getCountPrice(GoldCornGetType.extract, user, user.getSystem(), time, 1);
|
//价格为0时不加入记录
|
if (price == 0) {
|
return new GoldCornMakeResultDTO(0, leftCount);
|
}
|
|
GoldCornGetRecord record = addGoldCorn(uid, GoldCornGetType.extract, false, time, price, (long) price);
|
return new GoldCornMakeResultDTO(record.getCornNum(), leftCount - 1);
|
}
|
|
|
}
|