admin
2021-01-19 8f1b5245c592cd6dc5eb5a73f9a0ceb2a85f2048
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityAwardResultManager.java
@@ -4,6 +4,7 @@
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;
@@ -14,10 +15,13 @@
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;
@@ -37,9 +41,8 @@
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.math.RoundingMode;
import java.util.*;
/**
 * 奖项管理
@@ -64,6 +67,9 @@
    @Resource
    private LuckyMQService luckyMQService;
    @Resource
    private LuckyActivityAwardResultManager luckyActivityAwardResultManager;
    /**
     * 添加记录
@@ -74,6 +80,29 @@
     */
    @Transactional(rollbackFor = Exception.class)
    public void addRecord(Set<String> uids, Long activityId, long awardId) {
        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]);
@@ -92,6 +121,7 @@
            LuckyActivityAwardResultExtra extra = new LuckyActivityAwardResultExtra();
            extra.setAwardResultId(result.getId());
            extra.setCreateTime(new Date());
            extra.setRedPackage(moneyMap.get(uidStr));
            luckyActivityAwardResultExtraMapper.insertSelective(extra);
            //添加通知
@@ -114,12 +144,14 @@
     */
    @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 = new Gson().fromJson(paramsStr, ActivityAwardParams.class);
        ActivityAwardParams params = ActivityAwardParams.getBean(paramsStr);
        AppInfo app = appManager.getAppDetail(result.getAppId());
        if (params.getType() == ActivityAwardParams.ActivityAwardTypeEnum.alipayRedPackage) {
@@ -133,7 +165,6 @@
                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();
@@ -145,15 +176,13 @@
            } catch (AlipayApiException e) {
                throw new LuckyActivityAwardResultException(1, e.getErrMsg());
            }
            luckyActivityAwardResultManager.setResultReceived(result.getId());
            LuckyActivityAwardResult update = new LuckyActivityAwardResult();
            update.setId(result.getId());
            update.setState(LuckyActivityAwardResult.STATE_RECIEVED);
            update.setStateDesc("已领取");
            update.setUpdateTime(new Date());
        } else if (params.getType() == ActivityAwardParams.ActivityAwardTypeEnum.wxRedPackage) {
            //TODO 微信发红包
        }
        //删除通知
    }
@@ -163,11 +192,7 @@
     * 发支付宝红包
     */
    private void sendAlipayRedPackage(String outBizNo, String alipayUid, String orderTitle, BigDecimal money, AppAlipayInfoWithBLOBs alipayInfo) throws AlipayTransferException, AlipayApiException {
        InputStream appCert = new ByteArrayInputStream(alipayInfo.getAlipayAppCertPublicKey());
        InputStream publicCert = new ByteArrayInputStream(alipayInfo.getAlipayPublicCert());
        InputStream rootCert = new ByteArrayInputStream(alipayInfo.getAlipayRootCert());
        AlipayAppInfo appInfo = new AlipayAppInfo(alipayInfo.getAlipayAppId(), alipayInfo.getAlipayPrivateKey(), new AlipayCertInfo(appCert, publicCert, rootCert));
        AlipayAppInfo appInfo = AlipayAppUtil.getAlipayAppInfo(alipayInfo);
        AlipayTransferInfo transferInfo = new AlipayTransferInfo();
        transferInfo.setAccount(new AlipayTransferAccount(alipayUid));
        transferInfo.setMoney(money);
@@ -217,6 +242,7 @@
        if (result.getState() != LuckyActivityAwardResult.STATE_NOT_RECIEVE) {
            return;
        }
        LoggerUtil.activityJoinLogger.info("设置中奖过期未领开始:awardResultId-{}",id);
        LuckyActivityAwardResult update = new LuckyActivityAwardResult();
        update.setId(id);
@@ -229,6 +255,32 @@
        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));
    }
}