| | |
| | | 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.utils.factory.UserMoneyRecordFactory; |
| | | import com.yeshi.makemoney.app.utils.factory.goldcorn.GoldCornConsumeRecordFactory; |
| | | import com.yeshi.makemoney.app.utils.goldcorn.GoldCornUtil; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | import java.util.Calendar; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Service |
| | | public class GoldCornMakeServiceImpl implements GoldCornMakeService { |
| | | Logger taskLogger = LoggerFactory.getLogger("taskLog"); |
| | | |
| | | @Resource |
| | | private GoldCornGetFrequencyConfigService goldCornGetFrequencyConfigService; |
| | |
| | | private UserMoneyRecordService userMoneyRecordService; |
| | | |
| | | |
| | | private void frequencyVerify(UserInfo user, GoldCornGetType type, Date time) throws GoldCornGetFrequencyConfigException, GoldCornMakeException { |
| | | /** |
| | | * @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, "频率配置不存在"); |
| | |
| | | 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 && System.currentTimeMillis() - list.get(0).getCreateTime().getTime() < config.getMinSpaceTime() * 1000L) { |
| | | String msg = String.format("需要间隔%s秒以上", config.getMinSpaceTime()); |
| | | throw new GoldCornMakeException(GoldCornMakeException.CODE_GET_FREQUENCY_LIMIT, msg); |
| | | try { |
| | | //间隔判断 |
| | | 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())); |
| | | 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())); |
| | | |
| | | long count = goldCornGetRecordService.count(query); |
| | | if (count >= config.getLimitCount()) { |
| | | String msg = String.format("超出%s次/%s的限制", config.getLimitCount(), config.getTimeUnit().getName()); |
| | | throw new GoldCornMakeException(GoldCornMakeException.CODE_GET_FREQUENCY_LIMIT, msg); |
| | | 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); |
| | | |
| | | } catch (GoldCornMakeException e) { |
| | | //频率限制 |
| | | taskLogger.error("#频率受限# uid:{} type:{} time:{} msg:{}", user.getId(), type.name(), TimeUtil.getGernalTime(time.getTime(), "yyyy-MM-dd HH:mm:ss SSS"), e.getMsg()); |
| | | throw e; |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | @RequestSerializableByKey(key = "'addgoldcorn-'+#uid+'-'+#type") |
| | | @Override |
| | | public GoldCornGetRecord addGoldCorn(Long uid, GoldCornGetType type, boolean isDouble, Date currentTime, Integer price) throws UserInfoException, GoldCornGetFrequencyConfigException, GoldCornMakeException { |
| | | 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, "参数不完整"); |
| | | } |
| | |
| | | if (user == null) { |
| | | throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在"); |
| | | } |
| | | //判断是否超出了次数限制 |
| | | frequencyVerify(user, type, currentTime); |
| | | GoldCornGetPrice getPrice = goldCornGetPriceService.getPrice(user.getSystem(), GoldCornGetType.watchVideo, currentTime); |
| | | |
| | | |
| | |
| | | record.setDay(TimeUtil.getGernalTime(currentTime.getTime(), "yyyy-MM-dd")); |
| | | record.setType(type); |
| | | record.setUid(uid); |
| | | record.setSystem(user.getSystem()); |
| | | record.setLevel(GoldCornGetRecord.LEVEL_OWN); |
| | | record.setCreateTime(currentTime); |
| | | record.setEventCount(eventCount); |
| | | GoldCornGetRecord recordD = null; |
| | | if (isDouble) { |
| | | recordD = new GoldCornGetRecord(); |
| | | recordD.setCornNum(baseCornNum); |
| | | record.setSystem(user.getSystem()); |
| | | 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); |
| | | } |
| | | |
| | | //允许上级提成 |
| | |
| | | cRecord.setDay(record.getDay()); |
| | | cRecord.setType(type); |
| | | cRecord.setUid(bossUid); |
| | | record.setSystem(user.getSystem()); |
| | | cRecord.setCornNum(new BigDecimal(baseCornNum).multiply(rate).intValue()); |
| | | cRecord.setFromId(record.getId()); |
| | | cRecord.setFromUid(record.getUid()); |
| | |
| | | if (count == 0L) { |
| | | continue; |
| | | } |
| | | //获取兑换记录的主键ID |
| | | GoldCornConsumeRecord record = GoldCornConsumeRecordFactory.createExchange(uid, GoldCornUtil.getFormatDay(date), 0, new BigDecimal(0.1)); |
| | | //获取兑换记录的主键ID,不需要多余的数据 |
| | | GoldCornConsumeRecord record = GoldCornConsumeRecordFactory.createExchange(uid, GoldCornUtil.getFormatDay(date), 0, new BigDecimal(0.1), null); |
| | | //查询资金记录是否有该记录 |
| | | try { |
| | | UserMoneyRecord userMoneyRecord = UserMoneyRecordFactory.createGoldCornExchange(record); |
| | |
| | | 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, new Date(), price); |
| | | return addGoldCorn(uid, GoldCornGetType.signIn, false, now, price, 1L); |
| | | } |
| | | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Override |
| | | public Integer watchVideo(Long uid, boolean isDouble, Date time, int timeSeconds) throws GoldCornGetPriceException, UserInfoException, GoldCornMakeException, GoldCornGetFrequencyConfigException { |
| | | 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, "用户不存在"); |
| | | } |
| | | |
| | | Integer price = goldCornGetPriceService.getWatchVideoPrice(user, time, timeSeconds); |
| | | //判断是否超出了次数限制 |
| | | 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 0; |
| | | return new GoldCornMakeResultDTO(0, leftCount); |
| | | } |
| | | |
| | | GoldCornGetRecord record = addGoldCorn(uid, GoldCornGetType.watchVideo, isDouble, time, price); |
| | | return record.getCornNum() * (isDouble ? 2 : 1); |
| | | 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 Integer readNovel(Long uid, boolean isDouble, Date time, int timeSeconds) throws GoldCornGetPriceException, UserInfoException, GoldCornMakeException, GoldCornGetFrequencyConfigException { |
| | | 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"); |
| | | Integer readNovelNowSeconds = timeSeconds; |
| | | long readNovelNowSeconds = timeSeconds; |
| | | |
| | | Integer start = (Integer) redisTemplate.opsForValue().get(readNovelCacheKey); |
| | | if (start == null) { |
| | |
| | | throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在"); |
| | | } |
| | | |
| | | Integer price = goldCornGetPriceService.getReadNovelPrice(user, time, timeSeconds); |
| | | //判断是否超出了次数限制 |
| | | 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 0; |
| | | return new GoldCornMakeResultDTO(0, leftCount); |
| | | } |
| | | |
| | | GoldCornGetRecord record = addGoldCorn(uid, GoldCornGetType.readNovel, isDouble, time, price); |
| | | GoldCornGetRecord record = addGoldCorn(uid, GoldCornGetType.readNovel, isDouble, time, price, (long) timeSeconds); |
| | | |
| | | //记录当天的实时阅读分钟数 |
| | | redisTemplate.opsForValue().set(readNovelCacheKey, readNovelNowSeconds, 60 * 60 * 24, TimeUnit.SECONDS); |
| | | return record.getCornNum() * (isDouble ? 2 : 1); |
| | | return new GoldCornMakeResultDTO(record.getCornNum() * (isDouble ? 2 : 1), leftCount - timeSeconds); |
| | | } |
| | | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Override |
| | | public Integer scanNews(Long uid, boolean isDouble, Date time, int num) throws GoldCornGetPriceException, UserInfoException, GoldCornMakeException, GoldCornGetFrequencyConfigException { |
| | | public GoldCornMakeResultDTO scanNews(Long uid, boolean isDouble, Date time, int num) throws GoldCornGetPriceException, UserInfoException, GoldCornMakeException, GoldCornGetFrequencyConfigException { |
| | | //防刷机制 |
| | | if (num < 0) { |
| | | num = 0; |
| | | } |
| | | |
| | | //1个很大的数 |
| | | if (num > 20) { |
| | | num = 1; |
| | | } |
| | | |
| | | |
| | | UserInfo user = userInfoService.get(uid); |
| | | if (user == null) { |
| | | throw new UserInfoException(UserInfoException.CODE_NOT_EXIST, "用户不存在"); |
| | | } |
| | | |
| | | Integer price = goldCornGetPriceService.getScanNewsPrice(user, time, num); |
| | | //判断是否超出了次数限制 |
| | | long leftCount = frequencyVerify(user, GoldCornGetType.scanNews, time); |
| | | |
| | | Integer price = goldCornGetPriceService.getCountPrice(GoldCornGetType.scanNews, user, user.getSystem(), time, num); |
| | | //价格为0时不加入记录 |
| | | if (price == 0) { |
| | | return 0; |
| | | return new GoldCornMakeResultDTO(0, leftCount); |
| | | } |
| | | |
| | | GoldCornGetRecord record = addGoldCorn(uid, GoldCornGetType.scanNews, isDouble, time, price); |
| | | return record.getCornNum() * (isDouble ? 2 : 1); |
| | | 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); |
| | | } |
| | | |
| | | |