admin
2021-01-19 8f1b5245c592cd6dc5eb5a73f9a0ceb2a85f2048
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityAwardResultManager.java
@@ -4,14 +4,28 @@
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;
@@ -21,19 +35,22 @@
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.util.Date;
import java.util.Set;
import java.math.RoundingMode;
import java.util.*;
/**
 * 奖项管理
 */
@Component
public class LuckyActivityAwardResultManager {
    Logger logger = LoggerFactory.getLogger(LuckyActivityAwardResultManager.class);
    @Resource
    private LuckyActivityAwardManager luckyActivityAwardManager;
@@ -47,6 +64,12 @@
    @Resource
    private LuckyActivityAwardResultExtraMapper luckyActivityAwardResultExtraMapper;
    @Resource
    private LuckyMQService luckyMQService;
    @Resource
    private LuckyActivityAwardResultManager luckyActivityAwardResultManager;
    /**
     * 添加记录
@@ -57,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]);
@@ -75,7 +121,15 @@
            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) {
            }
        }
@@ -90,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) {
@@ -109,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();
@@ -121,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 微信发红包
        }
        //删除通知
    }
@@ -139,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);
@@ -156,9 +205,82 @@
    }
    @Transactional
    public void setResultShow(Long activityId) {
        luckyActivityAwardResultMapper.setStateByActivityId(activityId, LuckyActivityAwardResult.STATE_NOT_RECIEVE, "等待领取", new Date());
    @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));
    }
}