package com.ks.daylucky.job;
|
|
import com.ks.daylucky.pojo.DO.UserInfo;
|
import com.ks.daylucky.query.UserInfoQuery;
|
import com.ks.daylucky.service.UserInfoService;
|
import com.ks.lucky.exception.LuckyActivityException;
|
import com.ks.lucky.exception.LuckyActivityJoinException;
|
import com.ks.lucky.pojo.DO.LuckyActivity;
|
import com.ks.lucky.pojo.DO.LuckyActivityJoinRecord;
|
import com.ks.lucky.pojo.DO.LuckyActivityOpenInfo;
|
import com.ks.lucky.pojo.DTO.JoinInfo;
|
import com.ks.lucky.remote.service.LuckyActivityJoinService;
|
import com.ks.lucky.remote.service.LuckyActivityOpenInfoService;
|
import com.ks.lucky.remote.service.LuckyActivityService;
|
import com.xxl.job.core.biz.model.ReturnT;
|
import com.xxl.job.core.handler.annotation.XxlJob;
|
import org.apache.dubbo.config.annotation.Reference;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.util.*;
|
|
@Component
|
public class VirtualJoinJob {
|
|
|
@Reference(version = "1.0.0")
|
private LuckyActivityJoinService luckyActivityJoinService;
|
|
@Reference(version = "1.0.0")
|
private LuckyActivityOpenInfoService luckyActivityOpenInfoService;
|
|
@Reference(version = "1.0.0")
|
private LuckyActivityService luckyActivityService;
|
|
@Resource
|
private UserInfoService userInfoService;
|
|
|
@XxlJob("join-virtual")
|
public ReturnT<String> join(String param) throws Exception {
|
Long appId = Long.parseLong(param);
|
//获取正在进行中的活动
|
List<LuckyActivity> activityList = luckyActivityService.getActivityList(appId, null, Arrays.asList(new Integer[]{LuckyActivity.STATE_STARTED}), null, 1, 10);
|
for (LuckyActivity activity : activityList) {
|
join(activity);
|
}
|
return ReturnT.SUCCESS;
|
}
|
|
|
public void join(LuckyActivity activity) {
|
//查询最小开奖人数
|
LuckyActivityOpenInfo opneInfo = luckyActivityOpenInfoService.getOpenInfo(activity.getId());
|
int minPersonCount = opneInfo.getMinPersonCount();
|
int nowCount = (int) luckyActivityJoinService.countJoiner(activity.getId(), null);
|
//已经达到开奖条件
|
if (nowCount >= minPersonCount) {
|
return;
|
}
|
Date preOpenTime = opneInfo.getPreOpenTime();
|
long diff = preOpenTime.getTime() - System.currentTimeMillis();
|
//距离开奖剩余的分钟数
|
int diffMinute = (int) (diff / (1000 * 60));
|
|
//平均每分钟需要加入的用户
|
int percentMinutePerson = (minPersonCount - nowCount) / diffMinute + 1;
|
|
if (percentMinutePerson > 0) {
|
UserInfoQuery query = new UserInfoQuery();
|
query.appId = activity.getAppId();
|
query.type = UserInfo.TYPE_VIRTUAL;
|
long count = userInfoService.countUser(query);
|
|
List<UserInfo> userList = getRandomPerson(activity.getAppId(), (int) count, percentMinutePerson);
|
for (UserInfo userInfo : userList) {
|
JoinInfo joinInfo = JoinInfo.JoinInfoFactory.createAlipay(UUID.randomUUID().toString());
|
try {
|
luckyActivityJoinService.join(activity.getId(), activity.getAppId(), userInfo.getId() + "", 1, joinInfo, LuckyActivityJoinRecord.USER_TYPE_VIRTUAL);
|
} catch (LuckyActivityException e) {
|
e.printStackTrace();
|
} catch (LuckyActivityJoinException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
}
|
|
private List<UserInfo> getRandomPerson(Long appId, int totalCount, int count) {
|
List<UserInfo> userInfoList = new ArrayList<>();
|
Set<Integer> pset = new HashSet<>();
|
while (pset.size() < count) {
|
pset.add((int) (totalCount * Math.random()));
|
}
|
|
for (Integer p : pset) {
|
UserInfoQuery query = new UserInfoQuery();
|
query.appId = appId;
|
query.type = UserInfo.TYPE_VIRTUAL;
|
query.count = 1;
|
query.start = p;
|
List<UserInfo> userList = userInfoService.getUserList(query, null, null);
|
if (userList.size() > 0) {
|
userInfoList.add(userList.get(0));
|
}
|
}
|
return userInfoList;
|
}
|
|
|
}
|