package com.ks.lucky.service.impl.remote;
|
|
import com.ks.lucky.exception.LuckyActivityAwardException;
|
import com.ks.lucky.exception.LuckyActivityException;
|
import com.ks.lucky.mapper.LuckyActivityMapper;
|
import com.ks.lucky.pojo.DO.LuckyActivity;
|
import com.ks.lucky.pojo.DO.LuckyActivityAwards;
|
import com.ks.lucky.pojo.DO.LuckyActivityOpenInfo;
|
import com.ks.lucky.remote.service.LuckyActivityOpenService;
|
import com.ks.lucky.service.impl.LuckyActivityAwardManager;
|
import com.ks.lucky.service.impl.LuckyActivityAwardResultManager;
|
import com.ks.lucky.service.impl.LuckyActivityJoinManager;
|
import com.ks.lucky.service.impl.LuckyActivityOpenInfoManager;
|
import com.ks.lucky.util.LuckyRunUtil;
|
import org.apache.dubbo.config.annotation.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Set;
|
|
@Service(version = "1.0")
|
public class LuckyActivityOpenServiceImpl implements LuckyActivityOpenService {
|
|
@Resource
|
private LuckyActivityAwardManager luckyActivityAwardManager;
|
|
@Resource
|
private LuckyActivityMapper luckyActivityMapper;
|
|
@Resource
|
private LuckyActivityOpenInfoManager luckyActivityOpenInfoManager;
|
|
@Resource
|
private LuckyActivityJoinManager luckyActivityJoinManager;
|
|
@Resource
|
private LuckyActivityAwardResultManager luckyActivityAwardResultManager;
|
|
|
/**
|
* 是否可以开奖了
|
*
|
* @param activity
|
* @return
|
*/
|
private boolean canOpen(LuckyActivity activity) throws LuckyActivityException {
|
long now = System.currentTimeMillis();
|
|
if (activity.getState() != LuckyActivity.STATE_FINISH) {
|
throw new LuckyActivityException(1, "活动尚未结束");
|
}
|
|
LuckyActivityOpenInfo openInfo = luckyActivityOpenInfoManager.getOpenInfo(activity.getId());
|
|
//未达到最低开奖人数
|
if (activity.getCurrentPersonCount() < openInfo.getMinPersonCount()) {
|
throw new LuckyActivityException(2, "尚未达到最低开奖人数");
|
}
|
|
//到达最低开奖人数就开奖
|
if (activity.getPreOpenTime() != null) {
|
if (activity.getPreOpenTime().getTime() > now) {
|
throw new LuckyActivityException(2, "尚未达到开奖时间");
|
}
|
}
|
return true;
|
}
|
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void preOpenAward(Long activityId) throws LuckyActivityException, LuckyActivityAwardException {
|
//判断活动状态
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
if (activity == null) {
|
throw new LuckyActivityException(LuckyActivityException.CODE_NOT_EXIST, "活动不存在");
|
}
|
|
|
//判断是否达到开奖条件
|
canOpen(activity);
|
//------------计算开奖-------------
|
|
//获取奖项数据
|
List<LuckyActivityAwards> awardsList = luckyActivityAwardManager.getAwardList(activityId);
|
if (awardsList == null || awardsList.size() == 0) {
|
throw new LuckyActivityAwardException(LuckyActivityAwardException.CODE_NOT_EXIST, "无奖项信息");
|
}
|
|
//获取用户数据
|
Map<String, Integer> data = luckyActivityJoinManager.getJoinData(activityId);
|
for (LuckyActivityAwards awards : awardsList) {
|
//获取中奖用户ID
|
Set<String> uids = LuckyRunUtil.compute(data, awards.getCount());
|
//保存开奖结果
|
luckyActivityAwardResultManager.addRecord(uids, awards.getActivityId(), awards.getId());
|
}
|
|
|
//更新状态
|
LuckyActivity update = new LuckyActivity();
|
update.setId(activityId);
|
update.setState(LuckyActivity.STATE_PRE_OPENED);
|
update.setStateRemarks("预开奖成功");
|
update.setUpdateTime(new Date());
|
luckyActivityMapper.updateByPrimaryKeySelective(update);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void showOpenAward(Long activityId) throws LuckyActivityException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
if (activity.getState() != LuckyActivity.STATE_PRE_OPENED) {
|
throw new LuckyActivityException(1, "尚未开奖");
|
}
|
|
LuckyActivity update = new LuckyActivity();
|
update.setId(activityId);
|
update.setUpdateTime(new Date());
|
update.setState(LuckyActivity.STATE_OPENED);
|
update.setStateRemarks("已开奖");
|
luckyActivityMapper.updateByPrimaryKeySelective(update);
|
luckyActivityAwardResultManager.setResultShow(activityId);
|
}
|
|
|
}
|