package com.ks.lucky.service.impl;
|
|
import com.ks.lucky.exception.LuckyActivityException;
|
import com.ks.lucky.exception.LuckyMQException;
|
import com.ks.lucky.mapper.LuckyActivityMapper;
|
import com.ks.lucky.pojo.DO.LuckyActivity;
|
import com.ks.lucky.pojo.DO.LuckyActivityOpenInfo;
|
import com.ks.lucky.pojo.DO.LuckyMQ;
|
import com.ks.lucky.pojo.DTO.ActivityMQMsg;
|
import com.ks.lucky.pojo.DTO.mq.ActivityStateChangeMsgDTO;
|
import com.ks.lucky.service.LuckyMQService;
|
import com.ks.lucky.util.mq.CMQManager;
|
import com.ks.lucky.util.mq.LuckyMQFactory;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.util.Date;
|
|
|
@Component
|
public class LuckyActivityManager {
|
|
@Resource
|
private LuckyActivityMapper luckyActivityMapper;
|
|
@Resource
|
private LuckyActivityOpenInfoManager luckyActivityOpenInfoManager;
|
|
@Resource
|
private LuckyMQService luckyMQService;
|
|
|
/**
|
* 活动是否还可以参加
|
*
|
* @param activityId
|
* @return
|
* @throws LuckyActivityException
|
*/
|
public boolean canJoin(Long activityId) throws LuckyActivityException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKey(activityId);
|
if (activity == null) {
|
throw new LuckyActivityException(LuckyActivityException.CODE_NOT_EXIST, "活动不存在");
|
}
|
|
|
if (activity.getState() != LuckyActivity.STATE_STARTED) {
|
throw new LuckyActivityException(1, "活动不可参与");
|
}
|
|
if (activity.getCurrentPersonCount() >= activity.getMaxPersonCount()) {
|
throw new LuckyActivityException(1, "参与人数已满");
|
}
|
|
return true;
|
}
|
|
|
/**
|
* 是否可以更改活动内容
|
*
|
* @param activityId
|
* @return
|
*/
|
public boolean canUpdate(Long activityId) {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKey(activityId);
|
if (activity != null) {
|
if (activity.getState() == LuckyActivity.STATE_VERIFY_REJECT || activity.getState() == LuckyActivity.STATE_NOT_SUBMIT_VERIFY) {
|
return true;
|
}
|
}
|
return false;
|
}
|
|
/**
|
* 添加参与数
|
*
|
* @param activityId
|
* @param count
|
* @throws LuckyActivityException
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void addJoinCount(Long activityId, int count) throws LuckyActivityException {
|
LuckyActivity luckyActivity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
if (luckyActivity == null) {
|
throw new LuckyActivityException(LuckyActivityException.CODE_NOT_EXIST, "活动不存在");
|
}
|
|
LuckyActivityOpenInfo openInfo = luckyActivityOpenInfoManager.getOpenInfo(activityId);
|
if (openInfo == null) {
|
throw new LuckyActivityException(1, "活动信息不完整");
|
}
|
|
int currentCount = luckyActivity.getCurrentPersonCount();
|
LuckyActivity update = new LuckyActivity();
|
update.setId(activityId);
|
update.setCurrentPersonCount(currentCount + count);
|
update.setUpdateTime(new Date());
|
luckyActivityMapper.updateByPrimaryKeySelective(update);
|
if (update.getCurrentPersonCount().intValue() >= openInfo.getMinPersonCount() && currentCount < openInfo.getMinPersonCount()) {
|
//达到最低开奖人数
|
CMQManager.getInstance().addActivityMsg(new ActivityMQMsg(activityId, ActivityMQMsg.TYPE_REACH_MIN_PERSON, new Date()));
|
}
|
|
if (update.getCurrentPersonCount().intValue() >= luckyActivity.getMaxPersonCount() && currentCount < luckyActivity.getMaxPersonCount()) {
|
//达到最大开奖人数
|
CMQManager.getInstance().addActivityMsg(new ActivityMQMsg(activityId, ActivityMQMsg.TYPE_REACH_MAX_PERSON, new Date()));
|
}
|
|
}
|
|
/**
|
* 启动活动
|
*
|
* @param activityId
|
*/
|
public void startUpActivity(Long activityId) throws LuckyActivityException, LuckyMQException {
|
LuckyActivity luckyActivity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
if (luckyActivity == null) {
|
throw new LuckyActivityException(LuckyActivityException.CODE_NOT_EXIST, "活动不存在");
|
}
|
|
if (luckyActivity.getState() != LuckyActivity.STATE_NOT_STARTED) {
|
throw new LuckyActivityException(1, "活动尚未处于待启动状态");
|
}
|
|
//启动活动
|
setState(activityId, LuckyActivity.STATE_STARTED, "已经启动");
|
//设置实际开始时间
|
LuckyActivity update = new LuckyActivity();
|
update.setId(activityId);
|
update.setActualStartTime(new Date());
|
update.setUpdateTime(new Date());
|
luckyActivityMapper.updateByPrimaryKeySelective(update);
|
|
//有预计结束时间
|
if (luckyActivity.getPreFinishTime() != null) {
|
//添加结束消息
|
LuckyMQ mq = LuckyMQFactory.createFinishActivity(luckyActivity);
|
luckyMQService.addMQ(mq);
|
}
|
|
//尝试删除消息
|
try {
|
LuckyMQ mq = LuckyMQFactory.createStartUpActivity(luckyActivity);
|
luckyMQService.removeUnSendMsg(mq.getTaskId());
|
} catch (LuckyMQException e) {
|
e.printStackTrace();
|
}
|
|
|
}
|
|
|
/**
|
* 结束活动
|
*
|
* @param activityId
|
* @param force 是否强制结束
|
* @param remarks
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void finishActivity(Long activityId, boolean force, String remarks) throws LuckyActivityException, LuckyMQException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
if (activity.getState() != LuckyActivity.STATE_STARTED) {
|
throw new LuckyActivityException(1, "活动未处于已开始状态");
|
}
|
|
//设置活动处于强制结束状态
|
if (force) {
|
setState(activityId, LuckyActivity.STATE_FOUCE_FINISH, remarks);
|
} else {
|
setState(activityId, LuckyActivity.STATE_FINISH, remarks);
|
}
|
LuckyActivity update = new LuckyActivity();
|
update.setId(activityId);
|
update.setActualFinishTime(new Date());
|
update.setUpdateTime(new Date());
|
luckyActivityMapper.updateByPrimaryKeySelective(update);
|
|
activity.setActualFinishTime(update.getActualFinishTime());
|
//强制结束的不开奖
|
if (!force) {
|
//添加开奖消息
|
LuckyMQ mq = LuckyMQFactory.createOpenActivity(activity);
|
luckyMQService.addMQ(mq);
|
}
|
//尝试删除消息
|
try {
|
LuckyMQ mq1 = LuckyMQFactory.createFinishActivity(activity);
|
luckyMQService.removeUnSendMsg(mq1.getTaskId());
|
} catch (LuckyMQException e) {
|
e.printStackTrace();
|
}
|
|
|
}
|
|
|
/**
|
* 按主键查询
|
*
|
* @param id
|
* @return
|
*/
|
public LuckyActivity selectByPrimaryKey(Long id) {
|
return luckyActivityMapper.selectByPrimaryKey(id);
|
}
|
|
|
/**
|
* 设置状态
|
*
|
* @param activityId
|
* @param state
|
* @param stateRemarks
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void setState(Long activityId, int state, String stateRemarks) {
|
LuckyActivity activity = new LuckyActivity();
|
activity.setId(activityId);
|
activity.setState(state);
|
activity.setStateRemarks(stateRemarks);
|
activity.setUpdateTime(new Date());
|
luckyActivityMapper.updateByPrimaryKeySelective(activity);
|
CMQManager.getInstance().publishActivityStateChangeMsg(new ActivityStateChangeMsgDTO(activityId, state, stateRemarks, activity.getUpdateTime()));
|
}
|
|
}
|