package com.ks.lucky.service.impl;
|
|
import com.alipay.api.AlipayApiException;
|
import com.google.gson.Gson;
|
import com.ks.app.entity.AppAlipayInfoWithBLOBs;
|
import com.ks.app.entity.AppInfo;
|
import com.ks.app.util.AlipayAppUtil;
|
import com.ks.lucky.exception.LuckyActivityAwardException;
|
import com.ks.lucky.exception.LuckyActivityAwardResultException;
|
import com.ks.lucky.exception.LuckyMQException;
|
import com.ks.lucky.mapper.LuckyActivityAwardResultExtraMapper;
|
import com.ks.lucky.mapper.LuckyActivityAwardResultMapper;
|
import com.ks.lucky.pojo.DO.LuckyActivityAwardResult;
|
import com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra;
|
import com.ks.lucky.pojo.DO.LuckyActivityAwards;
|
import com.ks.lucky.pojo.DO.LuckyMQ;
|
import com.ks.lucky.pojo.DTO.ActivityAwardParams;
|
import com.ks.lucky.pojo.DTO.RedPackage;
|
import com.ks.lucky.pojo.DTO.mq.ActivityDrawnMsgDTO;
|
import com.ks.lucky.query.ActivityAwardResultQuery;
|
import com.ks.lucky.service.LuckyMQService;
|
import com.ks.lucky.util.Constant;
|
import com.ks.lucky.util.LoggerUtil;
|
import com.ks.lucky.util.RedPackageUtil;
|
import com.ks.lucky.util.mq.CMQManager;
|
import com.ks.lucky.util.mq.LuckyMQFactory;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.yeshi.utils.StringUtil;
|
import org.yeshi.utils.alipay.AlipayUtil;
|
import org.yeshi.utils.entity.alipay.AlipayAppInfo;
|
import org.yeshi.utils.entity.alipay.AlipayCertInfo;
|
import org.yeshi.utils.entity.alipay.AlipayTransferAccount;
|
import org.yeshi.utils.entity.alipay.AlipayTransferInfo;
|
import org.yeshi.utils.exception.AlipayTransferException;
|
import org.yeshi.utils.generater.entity.ExceptionData;
|
|
import javax.annotation.Resource;
|
import java.io.ByteArrayInputStream;
|
import java.io.InputStream;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.*;
|
|
/**
|
* 奖项管理
|
*/
|
@Component
|
public class LuckyActivityAwardResultManager {
|
|
Logger logger = LoggerFactory.getLogger(LuckyActivityAwardResultManager.class);
|
|
@Resource
|
private LuckyActivityAwardManager luckyActivityAwardManager;
|
|
@Resource
|
private AppManager appManager;
|
|
@Resource
|
private LuckyActivityAwardResultMapper luckyActivityAwardResultMapper;
|
|
@Resource
|
private LuckyActivityAwardResultExtraMapper luckyActivityAwardResultExtraMapper;
|
|
@Resource
|
private LuckyMQService luckyMQService;
|
|
@Resource
|
private LuckyActivityAwardResultManager luckyActivityAwardResultManager;
|
|
|
/**
|
* 添加记录
|
*
|
* @param uids
|
* @param activityId
|
* @param awardId
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void addRecord(Set<String> uids, Long activityId, long awardId) {
|
if (uids == null || uids.size() == 0) {
|
return;
|
}
|
LuckyActivityAwards award = luckyActivityAwardManager.getAwardDetail(awardId);
|
Map<String, BigDecimal> moneyMap = new HashMap<>();
|
//计算每个人的支付宝红包金额
|
if (award.getActivityAwardParams().getType() == ActivityAwardParams.ActivityAwardTypeEnum.alipayRedPackage) {
|
switch (award.getAwardWay()) {
|
//随机
|
case LuckyActivityAwards.AWARD_WAY_RANDOM:
|
RedPackage redPackage = new RedPackage(award.getActivityAwardParams().getRedPackage().doubleValue(), award.getCount());
|
for (String uid : uids) {
|
double money = RedPackageUtil.getRandomPackage(redPackage);
|
moneyMap.put(uid, new BigDecimal(money));
|
}
|
break;
|
//平分
|
case LuckyActivityAwards.AWARD_WAY_DIVIDE:
|
BigDecimal permoney = award.getActivityAwardParams().getRedPackage().divide(new BigDecimal(award.getCount()), 2, RoundingMode.FLOOR);
|
for (String uid : uids) {
|
moneyMap.put(uid, permoney);
|
}
|
break;
|
}
|
}
|
|
|
for (String uidStr : uids) {
|
long appId = Long.parseLong(uidStr.split("#")[0]);
|
String uid = uidStr.split("#")[1];
|
LuckyActivityAwardResult result = new LuckyActivityAwardResult();
|
result.setState(LuckyActivityAwardResult.STATE_NOT_SHOW);
|
result.setStateDesc("未显示");
|
result.setActivityId(activityId);
|
result.setAwardId(awardId);
|
result.setAppId(appId);
|
result.setUid(uid);
|
result.setCreateTime(new Date());
|
|
luckyActivityAwardResultMapper.insertSelective(result);
|
|
LuckyActivityAwardResultExtra extra = new LuckyActivityAwardResultExtra();
|
extra.setAwardResultId(result.getId());
|
extra.setCreateTime(new Date());
|
extra.setRedPackage(moneyMap.get(uidStr));
|
luckyActivityAwardResultExtraMapper.insertSelective(extra);
|
|
//添加通知
|
try {
|
CMQManager.getInstance().publishActivityDrawnMsg(ActivityDrawnMsgDTO.create(result));
|
} catch (Exception e) {
|
|
}
|
}
|
|
|
}
|
|
|
/**
|
* 发奖
|
*
|
* @param result
|
* @throws LuckyActivityAwardException
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void sendAward(LuckyActivityAwardResult result, LuckyActivityAwardResultExtra extra) throws LuckyActivityAwardException, LuckyActivityAwardResultException {
|
//加行锁
|
luckyActivityAwardResultMapper.selectByPrimaryKeyForUpdate(result.getId());
|
LuckyActivityAwards awards = luckyActivityAwardManager.getAwardDetail(result.getAwardId());
|
if (awards == null) {
|
throw new LuckyActivityAwardException(LuckyActivityAwardException.CODE_NOT_EXIST, "奖项不存在");
|
}
|
String paramsStr = awards.getAwardParams();
|
ActivityAwardParams params = ActivityAwardParams.getBean(paramsStr);
|
AppInfo app = appManager.getAppDetail(result.getAppId());
|
|
if (params.getType() == ActivityAwardParams.ActivityAwardTypeEnum.alipayRedPackage) {
|
//发支付宝红包
|
AppAlipayInfoWithBLOBs alipayInfo = app.getAlipayInfo();
|
if (alipayInfo == null) {
|
throw new LuckyActivityAwardResultException(LuckyActivityAwardResultException.CODE_NOT_EXIST, "支付宝信息不存在");
|
}
|
//参数不完整
|
if (extra == null || extra.getRedPackage() == null || StringUtil.isNullOrEmpty(extra.getAlipyUid())) {
|
throw new LuckyActivityAwardResultException(LuckyActivityAwardResultException.CODE_PARAMS_NOT_ENOUGH, "参数不完整,缺少alipayUid与redPackage参数");
|
}
|
|
String orderId = alipayInfo.getAlipayAppId() + "_award_" + result.getId();
|
BigDecimal money = extra.getRedPackage();
|
String alipayUid = extra.getAlipyUid();
|
|
try {
|
sendAlipayRedPackage(orderId, alipayUid, "", money, alipayInfo);
|
} catch (AlipayTransferException e) {
|
throw new LuckyActivityAwardResultException(e.getCode(), e.getMsg());
|
} catch (AlipayApiException e) {
|
throw new LuckyActivityAwardResultException(1, e.getErrMsg());
|
}
|
luckyActivityAwardResultManager.setResultReceived(result.getId());
|
|
} else if (params.getType() == ActivityAwardParams.ActivityAwardTypeEnum.wxRedPackage) {
|
//TODO 微信发红包
|
}
|
|
//删除通知
|
|
|
}
|
|
|
/**
|
* 发支付宝红包
|
*/
|
private void sendAlipayRedPackage(String outBizNo, String alipayUid, String orderTitle, BigDecimal money, AppAlipayInfoWithBLOBs alipayInfo) throws AlipayTransferException, AlipayApiException {
|
AlipayAppInfo appInfo = AlipayAppUtil.getAlipayAppInfo(alipayInfo);
|
AlipayTransferInfo transferInfo = new AlipayTransferInfo();
|
transferInfo.setAccount(new AlipayTransferAccount(alipayUid));
|
transferInfo.setMoney(money);
|
transferInfo.setOrderTitle(orderTitle);
|
transferInfo.setPayerName("*");
|
transferInfo.setOutBizNo(outBizNo);
|
transferInfo.setProductCode(AlipayTransferInfo.AlipayProductCodeEnum.STD_RED_PACKET);
|
transferInfo.setBizScene(AlipayTransferInfo.AlipayBizSceneEnum.DIRECT_TRANSFER);
|
AlipayUtil.alipayFundTransUniTransfer(appInfo, transferInfo);
|
}
|
|
|
@Transactional(rollbackFor = Exception.class)
|
public void setResultShow(Long activityId) throws LuckyMQException {
|
Date date = new Date();
|
luckyActivityAwardResultMapper.setStateByActivityId(activityId, LuckyActivityAwardResult.STATE_NOT_RECIEVE, "等待领取", date);
|
ActivityAwardResultQuery query = new ActivityAwardResultQuery();
|
query.activityId = activityId;
|
long count = luckyActivityAwardResultMapper.count(query);
|
query.count = (int) count;
|
|
List<LuckyActivityAwardResult> resultList = luckyActivityAwardResultMapper.list(query);
|
if (resultList != null && resultList.size() > 0) {
|
for (LuckyActivityAwardResult result : resultList) {
|
//添加过期领取通知
|
LuckyMQ mq = LuckyMQFactory.createActivityDrawnOutDate(result.getId(), new Date(date.getTime() + Constant.ACTIVITY_DRAWN_RECIEVE_VALID_TIME));
|
luckyMQService.addMQ(mq);
|
|
//添加通知
|
try {
|
CMQManager.getInstance().publishActivityDrawnMsg(ActivityDrawnMsgDTO.create(result));
|
} catch (Exception e) {
|
logger.error("发布活动中奖的订阅消息出错:", result.getId(), e.getMessage());
|
}
|
}
|
}
|
}
|
|
/**
|
* 使中奖过期
|
*
|
* @param id
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void setResultOutDate(Long id) {
|
LuckyActivityAwardResult result = luckyActivityAwardResultMapper.selectByPrimaryKeyForUpdate(id);
|
if (result.getState() != LuckyActivityAwardResult.STATE_NOT_RECIEVE) {
|
return;
|
}
|
LoggerUtil.activityJoinLogger.info("设置中奖过期未领开始:awardResultId-{}", id);
|
|
LuckyActivityAwardResult update = new LuckyActivityAwardResult();
|
update.setId(id);
|
update.setState(LuckyActivityAwardResult.STATE_OUT_OF_DATE);
|
update.setStateDesc("过期未领取");
|
update.setUpdateTime(new Date());
|
luckyActivityAwardResultMapper.updateByPrimaryKeySelective(update);
|
|
result.setStateDesc(update.getStateDesc());
|
result.setState(update.getState());
|
//发布消息
|
CMQManager.getInstance().publishActivityDrawnMsg(ActivityDrawnMsgDTO.create(result));
|
LoggerUtil.activityJoinLogger.info("设置中奖过期未领成功:awardResultId-{}", id);
|
}
|
|
/**
|
* 领取
|
*
|
* @param resultId
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void setResultReceived(Long resultId) {
|
LuckyActivityAwardResult result = luckyActivityAwardResultMapper.selectByPrimaryKeyForUpdate(resultId);
|
if (result.getState() != LuckyActivityAwardResult.STATE_NOT_RECIEVE) {
|
return;
|
}
|
|
LuckyActivityAwardResult update = new LuckyActivityAwardResult();
|
update.setId(resultId);
|
update.setState(LuckyActivityAwardResult.STATE_RECIEVED);
|
update.setStateDesc("已领取");
|
update.setUpdateTime(new Date());
|
luckyActivityAwardResultMapper.updateByPrimaryKeySelective(update);
|
|
result.setStateDesc(update.getStateDesc());
|
result.setState(update.getState());
|
//发布消息
|
CMQManager.getInstance().publishActivityDrawnMsg(ActivityDrawnMsgDTO.create(result));
|
}
|
|
}
|