package com.ks.lijin.service.remote;
|
|
import com.ks.lijin.exception.*;
|
import com.ks.lijin.mapper.LiJinExpendRecordMapper;
|
import com.ks.lijin.pojo.DO.LiJinExpendRecord;
|
import com.ks.lijin.pojo.DO.LiJinProviderTaoKeAccount;
|
import com.ks.lijin.pojo.DO.LiJinProviderNotice;
|
import com.ks.lijin.pojo.DTO.LiJinCreateParam;
|
import com.ks.lijin.pojo.DTO.MoneyInfo;
|
import com.ks.lijin.pojo.DTO.TaoLijinCreateResultDTO;
|
import com.ks.lijin.pojo.DTO.taobao.TaoKeAppInfo;
|
import com.ks.lijin.pojo.DTO.taobao.TaoLiJinDTO;
|
import com.ks.lijin.pojo.Enums.NoticeTypeEnum;
|
import com.ks.lijin.service.LiJinExpendRecordService;
|
import com.ks.lijin.service.LiJinProviderAccountService;
|
import com.ks.lijin.service.LiJinProviderNoticeService;
|
import com.ks.lijin.service.LijinCreateService;
|
import com.ks.lijin.service.manager.LiJinProviderTaoKeAccountManager;
|
import com.ks.lijin.service.manager.LijinGoodsManager;
|
import com.ks.lijin.util.Constant;
|
import com.ks.lijin.utils.taobao.TaoBaoUtil;
|
import com.ks.lijin.utils.taobao.TaoKeApiUtil;
|
import com.ks.vip.pojo.DO.VipGradePotence;
|
import com.ks.vip.pojo.Enums.VIPEnum;
|
import com.ks.vip.service.VipCenterService;
|
import com.ks.vip.service.VipGradePotenceService;
|
import com.ks.vip.service.VipGradeService;
|
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
|
import org.apache.dubbo.config.annotation.Reference;
|
import org.apache.dubbo.config.annotation.Service;
|
import org.springframework.core.task.TaskExecutor;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.yeshi.utils.MoneyBigDecimalUtil;
|
import org.yeshi.utils.StringUtil;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.concurrent.TimeUnit;
|
|
|
@Service(version = "1.0")
|
public class LijinCreateServiceImpl implements LijinCreateService {
|
|
@Resource(name = "taskExecutor")
|
private TaskExecutor executor;
|
|
@Resource
|
private LiJinExpendRecordMapper liJinExpendRecordMapper;
|
|
@Resource
|
private LiJinProviderNoticeService liJinProviderNoticeService;
|
|
@Resource
|
private LiJinProviderAccountService liJinProviderAccountService;
|
|
@Reference(version = "1.0")
|
private VipCenterService vipCenterService;
|
|
@Reference(version = "1.0")
|
private VipGradePotenceService vipGradePotenceService;
|
|
@Reference(version = "1.0")
|
private VipGradeService vipGradeService;
|
|
@Resource
|
private LiJinExpendRecordService liJinExpendRecordService;
|
|
@Resource
|
private LiJinProviderTaoKeAccountManager liJinProviderTaoKeAccountManager;
|
|
@Resource
|
private RedisTemplate redisTemplate;
|
|
@Resource
|
private LijinGoodsManager lijinGoodsManager;
|
|
@Override
|
public List<MoneyInfo> getMoneyInfo(String uid, List<TaoBaoGoodsBrief> goodsBriefList) {
|
VIPEnum vipRank = null;
|
if (!StringUtil.isNullOrEmpty(uid)) {
|
vipRank = vipCenterService.getVIPEnumByUid(uid);
|
}
|
if (vipRank == null) {
|
vipRank = vipGradeService.getDefaultGrade().getIdentity();
|
}
|
VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank);
|
List<MoneyInfo> list = new ArrayList<>();
|
for (TaoBaoGoodsBrief goods : goodsBriefList) {
|
MoneyInfo moneyInfo = new MoneyInfo();
|
moneyInfo.setGoodsId(goods.getAuctionId() + "");
|
moneyInfo.setGoodsType(1);
|
try {
|
moneyInfo.setLijinAmount(getTBLijinAmount(goods, vipRank));
|
} catch (LiJinGoodsException e) {
|
e.printStackTrace();
|
} catch (LiJinAmountException e) {
|
e.printStackTrace();
|
}
|
//计算返利比例
|
BigDecimal rebateRate = potence.getRebatePercent();
|
BigDecimal fanliMoney = TaoBaoUtil.getGoodsHongBaoMoney(goods, rebateRate, false);
|
moneyInfo.setFanliAmount(fanliMoney);
|
moneyInfo.setFirstOrderAmount(null);
|
list.add(moneyInfo);
|
}
|
|
//获取
|
return list;
|
}
|
|
@Override
|
public BigDecimal getTBLijinAmount(Long actionId, String uid) throws LiJinGoodsException, LiJinUserException, LiJinAmountException {
|
|
if (!lijinGoodsManager.todayCanCreate(actionId)) {
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_CREATED_FULL, "今日礼金创建次数已达上限");
|
}
|
|
|
// 获取用户等级
|
VIPEnum vipRank = vipCenterService.getVIPEnumByUid(uid);
|
if (vipRank == null) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
|
}
|
|
// 1、判断商品 并计算金额
|
BigDecimal money = getTBLijinAmount(actionId, vipRank);
|
|
if (!lijinGoodsManager.isLijinMoneyAvaiable(money)) {
|
throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金未在规定范围内");
|
}
|
|
// 2、判断用户
|
boolean result = userCanCreateTBLijin(uid, money);
|
if (result) {
|
return money;
|
}
|
return null;
|
}
|
|
|
@Override
|
public BigDecimal getTBLijinAmount(Long actionId, VIPEnum vipRank) throws LiJinGoodsException, LiJinAmountException {
|
if (!lijinGoodsManager.todayCanCreate(actionId)) {
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_CREATED_FULL, "今日礼金创建次数已达上限");
|
}
|
|
//获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(1.商品不支持礼金创建)
|
BigDecimal money = null;
|
// 1、判断商品
|
try {
|
TaoBaoGoodsBrief goods = TaoKeApiUtil.searchGoodsDetail(actionId);
|
if (goods == null) {
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
|
}
|
|
Integer materialLibType = goods.getMaterialLibType();
|
if (materialLibType == null || materialLibType.intValue() <= 0) {
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_NOT_SUPPORT, "商品不支持创建淘礼金");
|
}
|
|
//券后价 * 商品佣金比例 * 返利比例
|
VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank);
|
if (potence != null && potence.getTaolijinPercent() != null) {
|
money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getTaolijinPercent(), false);
|
}
|
} catch (TaoBaoGoodsDownException e) {
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
|
}
|
|
if (!lijinGoodsManager.isLijinMoneyAvaiable(money)) {
|
throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金未在规定范围内");
|
}
|
|
|
return money;
|
}
|
|
@Override
|
public boolean userCanCreateTBLijin(String uid) throws LiJinUserException {
|
VipGradePotence potence = vipCenterService.getVipPotence(uid);
|
if (potence == null) {
|
return false;
|
}
|
|
// 每日最大次数判断
|
Integer numMax = potence.getTaolijinMaxNumber();
|
if (numMax == null || numMax.intValue() <= 0) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
|
}
|
|
// 每日最大金额判断
|
BigDecimal moneyMax = potence.getTaolijinMaxMoney();
|
if (moneyMax == null || moneyMax.compareTo(BigDecimal.valueOf(0)) <= 0) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_MONEY_LIMIT, "用户创建淘礼金的金额超限");
|
}
|
|
// 使用次数已经超过最大次数
|
int numExpend = liJinExpendRecordService.countTodayNumByExpend(uid);
|
if (numMax.intValue() <= numExpend) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
|
}
|
|
// 统计已使用金额
|
BigDecimal moneyExpend = liJinExpendRecordService.countTodayMoneyByExpend(uid);
|
if (moneyExpend != null) {
|
moneyExpend = BigDecimal.valueOf(0);
|
}
|
// 消耗金额已经超过最大金额
|
if (moneyMax.compareTo(BigDecimal.valueOf(0)) <= 0) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_MONEY_LIMIT, "用户创建淘礼金的金额超限");
|
}
|
return true;
|
}
|
|
|
@Override
|
public boolean userCanCreateTBLijin(String uid, BigDecimal money) throws LiJinUserException {
|
VipGradePotence potence = vipCenterService.getVipPotence(uid);
|
if (potence == null) {
|
return false;
|
}
|
|
// 每日最大次数判断
|
Integer numMax = potence.getTaolijinMaxNumber();
|
if (numMax == null || numMax.intValue() <= 0) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
|
}
|
|
// 每日最大金额判断
|
BigDecimal moneyMax = potence.getTaolijinMaxMoney();
|
if (moneyMax == null || moneyMax.compareTo(BigDecimal.valueOf(0)) <= 0 || moneyMax.compareTo(money) <= 0) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_MONEY_LIMIT, "用户创建淘礼金的金额超限");
|
}
|
|
// 使用次数已经超过最大次数
|
int numExpend = liJinExpendRecordService.countTodayNumByExpend(uid);
|
if (numMax.intValue() < numExpend) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
|
}
|
|
// 统计已使用金额
|
BigDecimal moneyExpend = liJinExpendRecordService.countTodayMoneyByExpend(uid);
|
if (moneyExpend != null) {
|
moneyExpend = BigDecimal.valueOf(0);
|
}
|
// 加上本次需要使用金额
|
moneyExpend = MoneyBigDecimalUtil.add(moneyExpend, money);
|
|
// 消耗金额已经超过最大金额
|
if (moneyMax.compareTo(BigDecimal.valueOf(0)) <= 0) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_MONEY_LIMIT, "用户创建淘礼金的金额超限");
|
}
|
return true;
|
}
|
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public LiJinExpendRecord createTBLijin(String uid, Long goodsId) throws LiJinException, LiJinGoodsException, LiJinUserException, LiJinAmountException {
|
|
userCanCreateTBLijin(uid);
|
|
// 获取用户等级
|
VIPEnum vipRank = vipCenterService.getVIPEnumByUid(uid);
|
if (vipRank == null) {
|
vipRank = vipGradeService.getDefaultGrade().getIdentity();
|
}
|
|
if (vipRank == null) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
|
}
|
|
//淘礼金创建
|
TaoBaoGoodsBrief goods = null;
|
try {
|
goods = TaoKeApiUtil.searchGoodsDetail(goodsId);
|
} catch (TaoBaoGoodsDownException e) {
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
|
}
|
if (goods == null) {
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
|
}
|
|
// 创建的淘礼金-金额
|
BigDecimal lijinAmount = getTBLijinAmount(goods, vipRank);
|
|
// 执行创建淘礼金
|
LiJinCreateParam params = getLiJinCreateBaseParam();
|
|
//用户创建淘礼金为单线程操作
|
String key = "createtblijin-" + uid;
|
if (redisTemplate.opsForValue().setIfAbsent(key, "1", 120, TimeUnit.SECONDS)) {
|
Date now = new Date();
|
try {
|
TaoLijinCreateResultDTO taoLiJinDTO = executeTaoLiJin(goodsId, lijinAmount, params);
|
if (taoLiJinDTO == null) {
|
throw new LiJinException(1, "淘宝API推广红包创建失败");
|
}
|
//添加账号的
|
return addCreateSuccessRecord(uid, goodsId, lijinAmount, params.getTitle(), params.getNum(), taoLiJinDTO);
|
} catch (LiJinGoodsException e) {
|
if (e.getCode() == LiJinGoodsException.CODE_GOODS_CREATED_FULL) {
|
lijinGoodsManager.createdFullToday(goodsId, now);
|
}
|
throw e;
|
} finally {
|
redisTemplate.delete(key);
|
}
|
} else {
|
throw new LiJinException(LiJinException.CODE_SERVER_BUSY, "服务器繁忙,请稍后再试");
|
}
|
}
|
|
|
/**
|
* 添加创建记录
|
*
|
* @param uid
|
* @param goodsId
|
* @param lijinAmount
|
* @param title
|
* @param num
|
* @param taoLiJinDTO
|
*/
|
private LiJinExpendRecord addCreateSuccessRecord(String uid, Long goodsId, BigDecimal lijinAmount, String title, int num, TaoLijinCreateResultDTO taoLiJinDTO) {
|
Date now = new Date();
|
// 保存记录
|
LiJinExpendRecord record = new LiJinExpendRecord();
|
record.setUid(uid);
|
record.setGoodsId(goodsId + "");
|
record.setTitle(title);
|
record.setNum(num);
|
record.setMoney(lijinAmount);
|
record.setAccountId(taoLiJinDTO.getAccount().getId());
|
record.setRightsId(taoLiJinDTO.getTaoLiJin().getRightsId());
|
record.setSendUrl(taoLiJinDTO.getTaoLiJin().getSendUrl());
|
record.setCreateTime(new Date());
|
liJinExpendRecordMapper.insertSelective(record);
|
//添加
|
liJinProviderTaoKeAccountManager.createLijinSuccess(taoLiJinDTO.getAccount().getId(), goodsId, lijinAmount.multiply(new BigDecimal(num)), now);
|
return record;
|
}
|
|
|
/**
|
* 调用账号以及淘宝API
|
*
|
* @param goodsId
|
* @param lijinAmount
|
* @param params
|
* @return
|
* @throws LiJinGoodsException
|
* @throws LiJinException
|
*/
|
private TaoLijinCreateResultDTO executeTaoLiJin(Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinGoodsException, LiJinException, LiJinAmountException {
|
// 查询供应商账号信息
|
List<LiJinProviderTaoKeAccount> listAccount = liJinProviderAccountService.listValidByProviderId(Constant.PROVIDER_DEFAULT_ID, LiJinProviderTaoKeAccount.ERROR_CODE_NORMAL);
|
if (listAccount == null || listAccount.size() == 0) {
|
throw new LiJinException(1, "没有可用的供应商账号");
|
}
|
|
// 遍历账号 用可使用账号
|
for (LiJinProviderTaoKeAccount account : listAccount) {
|
params.setAppkey(account.getAppKey());
|
params.setAppsecret(account.getAppSecret());
|
params.setPid(account.getPid());
|
try {
|
//创建礼金
|
return new TaoLijinCreateResultDTO(account, executeTaoLiJinAPI(goodsId, lijinAmount, params));
|
} catch (LiJinAccountException e) {// 账号问题
|
//更新账号的错误信息
|
LiJinProviderTaoKeAccount update = new LiJinProviderTaoKeAccount();
|
update.setId(account.getId());
|
if (e.getCode() == LiJinAccountException.CODE_TLJ_NO_MONEY) {
|
//资金不足
|
update.setErrorCode(LiJinProviderTaoKeAccount.ERROR_CODE_MONEY_NOT_ENOUGH);
|
} else if (e.getCode() == LiJinAccountException.CODE_TLJ_NO_GOODS) {
|
//商品数量不足
|
update.setErrorCode(LiJinProviderTaoKeAccount.ERROR_CODE_GOODS_NOT_ENOUGH);
|
} else {
|
//账号异常
|
update.setErrorCode(LiJinProviderTaoKeAccount.ERROR_CODE_OTHER);
|
}
|
update.setErrorMsg(e.getMsg());
|
update.setUpdateTime(new Date());
|
liJinProviderAccountService.updateByPrimaryKeySelective(update);
|
|
// 通知相应供应商 TODO
|
executor.execute(new Runnable() {
|
@Override
|
public void run() {
|
LiJinProviderNotice notice = new LiJinProviderNotice();
|
notice.setRead(false);
|
notice.setProviderId(account.getProviderId());
|
if (e.getCode() == LiJinAccountException.CODE_TLJ_NO_MONEY) {
|
// 官方玩法钱包余额不足
|
notice.setTitle("玩法钱包余额不足");
|
notice.setContent("账号:" + account.getAccountName() + "官方玩法钱包余额不足");
|
notice.setType(NoticeTypeEnum.noMoney.name());
|
liJinProviderNoticeService.save(notice);
|
} else if (e.getCode() == LiJinAccountException.CODE_TLJ_UN_PAID) {
|
// 未创建账户
|
}
|
}
|
});
|
}
|
}
|
throw new LiJinException(1, "没有可用的供应商账号");
|
}
|
|
|
private TaoLiJinDTO executeTaoLiJinAPI(Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinException, LiJinGoodsException, LiJinAccountException, LiJinAmountException {
|
return TaoKeApiUtil.createTaoLiJin(goodsId, params.getTitle(), lijinAmount,
|
params.getNum(), params.getSendStartTime(), params.getSendEndTime(),
|
params.getUseStartTime(), params.getUseEndTime(), new TaoKeAppInfo(params.getAppkey(), params.getAppsecret(), params.getPid()));
|
}
|
|
|
/**
|
* 获取商品可创建的礼金金额
|
*
|
* @param goods 商品
|
* @param vipRank 会员等级
|
* @return
|
* @throws LiJinGoodsException
|
* @throws LiJinAmountException
|
*/
|
private BigDecimal getTBLijinAmount(TaoBaoGoodsBrief goods, VIPEnum vipRank) throws
|
LiJinGoodsException, LiJinAmountException {
|
if (!lijinGoodsManager.todayCanCreate(goods.getAuctionId())) {
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_CREATED_FULL, "今日礼金创建次数已达上限");
|
}
|
//获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(1.商品不支持礼金创建)
|
BigDecimal money = null;
|
|
Integer materialLibType = goods.getMaterialLibType();
|
if (materialLibType == null || materialLibType.intValue() <= 0) {
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_NOT_SUPPORT, "商品不支持创建淘礼金");
|
}
|
|
//券后价 * 商品佣金比例 * 返利比例
|
VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank);
|
if (potence != null && potence.getTaolijinPercent() != null) {
|
money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getTaolijinPercent(), false);
|
}
|
|
if (!lijinGoodsManager.isLijinMoneyAvaiable(money)) {
|
throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金未在规定范围内");
|
}
|
|
return money;
|
}
|
|
/**
|
* 创建淘礼金基本参数
|
*
|
* @return
|
*/
|
private LiJinCreateParam getLiJinCreateBaseParam() {
|
Date date = new Date();
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
SimpleDateFormat formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
String date_str = format.format(date);
|
String sendEndTime_str = date_str + " 23:59:59";
|
String useEndTime_str = date_str + " 23:59:59";
|
|
/* 创建淘礼金 */
|
String name = "自购淘礼金红包";
|
// 发放开始时间
|
Date sendStartTime = date;
|
// 发放截止时间 - 当日23:59
|
Date sendEndTime = null;
|
// 使用结束日期 - 当日 23:59
|
Date useEndTime = null;
|
|
try {
|
sendEndTime = formatStr.parse(sendEndTime_str);
|
useEndTime = formatStr.parse(useEndTime_str);
|
} catch (ParseException e2) {
|
e2.printStackTrace();
|
}
|
|
LiJinCreateParam params = new LiJinCreateParam();
|
params.setTitle("淘礼金红包");
|
params.setUseEndTime(useEndTime);
|
params.setSendStartTime(sendStartTime);
|
params.setSendEndTime(sendEndTime);
|
params.setNum(1);
|
return params;
|
}
|
|
}
|