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.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.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.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.util.Date;
|
import java.util.List;
|
import java.util.Set;
|
|
/**
|
* 奖项管理
|
*/
|
@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;
|
|
|
/**
|
* 添加记录
|
*
|
* @param uids
|
* @param activityId
|
* @param awardId
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void addRecord(Set<String> uids, Long activityId, long awardId) {
|
|
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());
|
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 {
|
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);
|
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());
|
}
|
|
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 微信发红包
|
}
|
|
|
}
|
|
|
/**
|
* 发支付宝红包
|
*/
|
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));
|
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;
|
}
|
|
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));
|
}
|
|
}
|