package com.ks.lucky.service.impl.remote;
|
|
import com.ks.daylucky.exception.LuckySponsorMoneyRecordException;
|
import com.ks.lib.common.exception.ParamsException;
|
import com.ks.lucky.exception.*;
|
import com.ks.lucky.mapper.LuckyActivityMapper;
|
import com.ks.lucky.pojo.DO.*;
|
import com.ks.lucky.query.ActivityDaoQuery;
|
import com.ks.lucky.remote.service.LuckyActivityService;
|
import com.ks.lucky.service.LuckyActivityImageService;
|
import com.ks.lucky.service.LuckyMQService;
|
import com.ks.lucky.service.LuckySponsorMoneyService;
|
import com.ks.lucky.service.impl.*;
|
import com.ks.lucky.util.annotation.RedisCache;
|
import com.ks.lucky.util.annotation.RedisCacheEvict;
|
import com.ks.lucky.util.mq.LuckyMQFactory;
|
import org.apache.dubbo.config.annotation.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.validation.annotation.Validated;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
|
@Service(version = "1.0.0")
|
public class LuckyActivityServiceImpl implements LuckyActivityService {
|
|
@Resource
|
private LuckyActivityMapper luckyActivityMapper;
|
|
@Resource
|
private LuckyActivityManager luckyActivityManager;
|
|
@Resource
|
private LuckyActivityOpenInfoManager luckyActivityOpenInfoManager;
|
|
@Resource
|
private LuckyActivitySponsorInfoManager luckyActivitySponsorInfoManager;
|
|
@Resource
|
private LuckyActivityAwardManager luckyActivityAwardManager;
|
|
@Resource
|
private AppManager appManager;
|
|
@Resource
|
private LuckyMQService luckyMQService;
|
|
@Resource
|
private LuckyActivityImageService luckyActivityImageService;
|
|
@Resource
|
private LuckySponsorMoneyService luckySponsorMoneyService;
|
|
private void notNull(LuckyActivity activity) throws LuckyActivityException {
|
if (activity == null) {
|
throw new LuckyActivityException(LuckyActivityException.CODE_NOT_EXIST, "活动不存在");
|
}
|
}
|
|
@Validated
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public Long addActivity(LuckyActivity activity) throws ParamsException, LuckyActivityException, LuckyActivitySponsorInfoException, LuckyActivityAwardException, LuckyActivityOpenInfoException, LuckySponsorAdException, LuckyActivityAwardMaterialException {
|
Long activityId = createActivity(activity);
|
//添加banner图片
|
if (activity.getBannerList() != null) {
|
for (LuckyActivityImage image : activity.getBannerList()) {
|
image.setActivityId(activityId);
|
luckyActivityImageService.add(image);
|
}
|
}
|
|
//添加赞助活动
|
activity.getSponsorInfo().setActivityId(activityId);
|
luckyActivitySponsorInfoManager.addSponsorInfo(activity.getSponsorInfo());
|
//添加奖项
|
for (LuckyActivityAwards awards : activity.getAwardsList()) {
|
awards.setActivityId(activityId);
|
luckyActivityAwardManager.addAward(awards);
|
}
|
|
//添加开奖信息
|
activity.getOpenInfo().setActivityId(activityId);
|
luckyActivityOpenInfoManager.addOpenInfo(activity.getOpenInfo());
|
return activityId;
|
}
|
|
@Override
|
public List<LuckyActivity> getActivityList(Long appId, Long sponsorId, List<Integer> stateList, String key, int page, int pageSize) {
|
ActivityDaoQuery query = new ActivityDaoQuery();
|
query.stateList = stateList;
|
query.key = key;
|
query.sponsorId = sponsorId;
|
query.appId = appId;
|
query.start = (page - 1) * pageSize;
|
query.count = pageSize;
|
query.sortList = Arrays.asList(new String[]{"actual_start_time desc"});
|
return luckyActivityMapper.list(query);
|
}
|
|
@Override
|
public List<LuckyActivity> getActivityList(Long appId, Long sponsorId, List<Integer> stateList, List<Long> excludeActivityIds, String key, int page, int pageSize) {
|
|
|
ActivityDaoQuery query = new ActivityDaoQuery();
|
query.stateList = stateList;
|
query.key = key;
|
query.sponsorId = sponsorId;
|
query.excludeActivityIds = excludeActivityIds;
|
query.appId = appId;
|
query.start = (page - 1) * pageSize;
|
query.count = pageSize;
|
query.sortList = Arrays.asList(new String[]{"actual_start_time desc"});
|
return luckyActivityMapper.list(query);
|
}
|
|
@Override
|
public long countActivity(Long appId, Long sponsorId, List<Integer> stateList, String key) {
|
ActivityDaoQuery query = new ActivityDaoQuery();
|
query.stateList = stateList;
|
query.key = key;
|
query.sponsorId = sponsorId;
|
query.appId = appId;
|
|
return luckyActivityMapper.count(query);
|
}
|
|
@Override
|
public long countActivity(Long appId, Long sponsorId, List<Integer> stateList, String key, List<Long> excludeActivityIds) {
|
ActivityDaoQuery query = new ActivityDaoQuery();
|
query.stateList = stateList;
|
query.key = key;
|
query.sponsorId = sponsorId;
|
query.appId = appId;
|
query.excludeActivityIds = excludeActivityIds;
|
|
return luckyActivityMapper.count(query);
|
}
|
|
|
@Validated
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public Long createActivity(LuckyActivity activity) throws ParamsException, LuckyActivityException {
|
|
activity.setState(LuckyActivity.STATE_NOT_SUBMIT_VERIFY);
|
activity.setStateRemarks("未提交审核");
|
|
if (activity.getCreateTime() == null) {
|
activity.setCreateTime(new Date());
|
}
|
|
luckyActivityMapper.insertSelective(activity);
|
return activity.getId();
|
}
|
|
@Override
|
public void submitVerify(Long activityId) throws LuckyActivityException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
notNull(activity);
|
if (activity.getState() != LuckyActivity.STATE_NOT_SUBMIT_VERIFY && activity.getState() != LuckyActivity.STATE_VERIFY_REJECT) {
|
throw new LuckyActivityException(1, "活动未处于审核被拒绝/未提交审核状态");
|
}
|
|
luckyActivityManager.setState(activityId, LuckyActivity.STATE_WAITING_VERIFY, "等待审核");
|
}
|
|
|
/**
|
* 检查要发布的活动
|
*
|
* @param activity
|
*/
|
private void checkActivityForPublish(LuckyActivity activity) throws LuckyActivityException {
|
notNull(activity);
|
if (activity.getPreStartTime() == null) {
|
throw new LuckyActivityException(1, "活动开始时间未设置");
|
}
|
|
if (activity.getPreStartTime().getTime() < System.currentTimeMillis()) {
|
throw new LuckyActivityException(1, "活动开始时间不能小于当前时间");
|
}
|
|
if (activity.getPreFinishTime() != null && activity.getPreStartTime().getTime() >= activity.getPreFinishTime().getTime()) {
|
throw new LuckyActivityException(1, "活动开始结束时间不能小于开始时间");
|
}
|
|
//TODO 检查更多参数
|
|
|
//检查活动状态
|
if (activity.getState() != LuckyActivity.STATE_NOT_PUBLISH) {
|
throw new LuckyActivityException(1, "活动未处于审核成功状态");
|
}
|
//检查开奖信息
|
LuckyActivityOpenInfo openInfo = luckyActivityOpenInfoManager.getOpenInfo(activity.getId());
|
if (openInfo == null) {
|
throw new LuckyActivityException(2, "不存在开奖信息");
|
}
|
|
LuckyActivitySponsorInfo sponsorInfo = luckyActivitySponsorInfoManager.getSponsorInfo(activity.getId());
|
if (sponsorInfo == null) {
|
throw new LuckyActivityException(2, "不存在赞助信息");
|
}
|
|
List<LuckyActivityAwards> awardsList = luckyActivityAwardManager.getAwardList(activity.getId());
|
if (awardsList == null || awardsList.size() == 0) {
|
throw new LuckyActivityException(2, "不存在奖项信息");
|
}
|
|
|
}
|
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void publishActivity(Long activityId) throws LuckyActivityException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
checkActivityForPublish(activity);
|
BigDecimal money = luckyActivityAwardManager.computeAwardsMoney(activityId);
|
|
if (money.compareTo(new BigDecimal(0)) > 0) {
|
try {
|
luckySponsorMoneyService.publishActivity(activity.getSponsorId(), activityId, money);
|
} catch (LuckySponsorException e) {
|
throw new LuckyActivityException(e.getCode(), e.getMsg());
|
} catch (LuckySponsorMoneyRecordException e) {
|
throw new LuckyActivityException(e.getCode(), e.getMsg());
|
} catch (ParamsException e) {
|
throw new LuckyActivityException(e.getCode(), e.getMsg());
|
}
|
}
|
luckyActivityManager.setState(activityId, LuckyActivity.STATE_NOT_STARTED, "已发布");
|
|
|
//加入代发消息列表
|
try {
|
luckyMQService.addMQ(LuckyMQFactory.createStartUpActivity(activity));
|
} catch (LuckyMQException e) {
|
throw new LuckyActivityException(10, "消息投递失败");
|
}
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void publishActivity(Long activityId, Date startTime, Date finishTime) throws LuckyActivityException {
|
//设置开始时间与结束时间
|
LuckyActivity activity = new LuckyActivity();
|
activity.setId(activityId);
|
activity.setPreStartTime(startTime);
|
activity.setPreFinishTime(finishTime);
|
activity.setUpdateTime(new Date());
|
luckyActivityManager.updateSelectiveByPrimaryKey(activity);
|
//设置开奖时间
|
LuckyActivityOpenInfo openInfo = luckyActivityOpenInfoManager.getOpenInfo(activityId);
|
if (openInfo != null && openInfo.getPreOpenTime() == null) {
|
LuckyActivityOpenInfo updateOpenInfo = new LuckyActivityOpenInfo();
|
updateOpenInfo.setId(openInfo.getId());
|
//结束后5分钟开奖
|
updateOpenInfo.setPreOpenTime(new Date(finishTime.getTime() + 1000 * 60 * 5));
|
try {
|
luckyActivityOpenInfoManager.updateOpenInfo(updateOpenInfo, activityId);
|
} catch (LuckyActivityOpenInfoException e) {
|
}
|
}
|
|
publishActivity(activityId);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void startActivity(Long activityId, String remarks) throws LuckyActivityException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
if (activity.getState() != LuckyActivity.STATE_NOT_STARTED) {
|
throw new LuckyActivityException(2, "活动尚未处于已发布状态");
|
}
|
|
try {
|
luckyActivityManager.startUpActivity(activityId);
|
} catch (LuckyMQException e) {
|
throw new LuckyActivityException(e.getCode(), e.getMsg());
|
}
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void verifyActivity(Long activityId, boolean pass, String remarks) throws LuckyActivityException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
notNull(activity);
|
if (activity.getState() != LuckyActivity.STATE_WAITING_VERIFY) {
|
throw new LuckyActivityException(2, "活动尚未处于审核状态");
|
}
|
|
//审核活动
|
if (pass) {
|
//审核通过
|
luckyActivityManager.setState(activityId, LuckyActivity.STATE_NOT_PUBLISH, remarks);
|
} else {
|
//审核未通过
|
luckyActivityManager.setState(activityId, LuckyActivity.STATE_VERIFY_REJECT, remarks);
|
}
|
|
}
|
|
@Override
|
public void forceFinishActivity(Long activityId, String remarks) throws LuckyActivityException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKey(activityId);
|
notNull(activity);
|
try {
|
luckyActivityManager.finishActivity(activityId, true, remarks);
|
} catch (LuckyMQException e) {
|
throw new LuckyActivityException(e.getCode(), e.getMsg());
|
}
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void cancelPublish(Long activityId, String remarks) throws LuckyActivityException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
notNull(activity);
|
|
if (activity.getState() != LuckyActivity.STATE_NOT_STARTED) {
|
throw new LuckyActivityException(1, "活动未处于已发布状态");
|
}
|
|
//设置活动为未发布状态
|
luckyActivityManager.setState(activityId, LuckyActivity.STATE_NOT_PUBLISH, remarks);
|
//删除相关的消息
|
LuckyMQ mq = LuckyMQFactory.createStartUpActivity(activity);
|
|
try {
|
luckyMQService.removeUnSendMsg(mq.getTaskId());
|
} catch (LuckyMQException e) {
|
throw new LuckyActivityException(2, e.getMsg());
|
}
|
|
}
|
|
@Override
|
public void cancelVerify(Long activityId) throws LuckyActivityException {
|
LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
|
notNull(activity);
|
if (activity.getState() != LuckyActivity.STATE_WAITING_VERIFY) {
|
throw new LuckyActivityException(1, "活动未处于等待审核状态");
|
}
|
|
luckyActivityManager.setState(activityId, LuckyActivity.STATE_NOT_SUBMIT_VERIFY, "主动取消审核");
|
}
|
|
@Override
|
public LuckyActivity getActivity(Long id) {
|
return luckyActivityManager.selectByPrimaryKey(id);
|
}
|
|
@Override
|
public LuckyActivity getActivityDetail(Long id) {
|
return luckyActivityManager.getActivityDetail(id);
|
}
|
|
@Override
|
public List<LuckyActivity> getActivityDetail(List<Long> ids) {
|
List<LuckyActivity> activityList = new ArrayList<>();
|
for (Long id : ids) {
|
LuckyActivity luckyActivity = luckyActivityManager.getActivityDetail(id);
|
activityList.add(luckyActivity);
|
}
|
return activityList;
|
}
|
|
@Override
|
public void updateActivity(LuckyActivity activity) throws LuckyActivityException {
|
if (activity.getState() != null) {
|
throw new LuckyActivityException(1, "不能更改活动状态");
|
}
|
if (!luckyActivityManager.canUpdate(activity.getId())) {
|
throw new LuckyActivityException(1, "当前活动不能修改");
|
}
|
|
activity.setUpdateTime(new Date());
|
luckyActivityManager.updateSelectiveByPrimaryKey(activity);
|
}
|
|
@Override
|
public List<LuckyActivity> getRecommendActivity(Long appId, String uid, int page, int pageSize) {
|
ActivityDaoQuery query = new ActivityDaoQuery();
|
query.appId = appId;
|
query.start = (page - 1) * pageSize;
|
query.count = pageSize;
|
query.sortList = Arrays.asList(new String[]{"actual_start_time desc"});
|
|
query.stateList = Arrays.asList(new Integer[]{
|
LuckyActivity.STATE_STARTED,
|
LuckyActivity.STATE_FINISH,
|
LuckyActivity.STATE_PRE_OPENED,
|
LuckyActivity.STATE_OPENED,
|
});
|
|
List<LuckyActivity> list = luckyActivityMapper.list(query);
|
return list;
|
}
|
|
@Override
|
public Long getRecommendActivityCount(Long appId, String uid) {
|
ActivityDaoQuery query = new ActivityDaoQuery();
|
query.appId = appId;
|
|
query.stateList = Arrays.asList(new Integer[]{
|
LuckyActivity.STATE_STARTED,
|
LuckyActivity.STATE_FINISH,
|
LuckyActivity.STATE_PRE_OPENED,
|
LuckyActivity.STATE_OPENED,
|
});
|
|
|
return luckyActivityMapper.count(query);
|
}
|
|
|
}
|