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.LiJinProviderAccount;
|
import com.ks.lijin.pojo.DO.LiJinProviderNotice;
|
import com.ks.lijin.pojo.DTO.LiJinCreateParam;
|
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.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.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
|
import org.apache.dubbo.config.annotation.Service;
|
import org.springframework.core.task.TaskExecutor;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.yeshi.utils.MoneyBigDecimalUtil;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
|
|
@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;
|
|
@Resource
|
private VipCenterService vipCenterService;
|
|
@Resource
|
private VipGradePotenceService vipGradePotenceService;
|
|
@Resource
|
private LiJinExpendRecordService liJinExpendRecordService;
|
|
|
@Override
|
public BigDecimal getTBLijinAmount(Long actionId, String uid) throws LiJinGoodsException, LiJinUserException, LiJinAmountException {
|
// 获取用户等级
|
VIPEnum vipRank = vipCenterService.getVIPEnumByUid(uid);
|
if (vipRank == null) {
|
throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
|
}
|
|
// 1、判断商品 并计算金额
|
BigDecimal money = getTBLijinAmount(actionId, vipRank);
|
|
// 2、判断用户
|
boolean result = userCanCreateTBLijin(uid, money);
|
if (result) {
|
return money;
|
}
|
return null;
|
}
|
|
|
@Override
|
public BigDecimal getTBLijinAmount(Long actionId, VIPEnum vipRank) throws LiJinGoodsException,LiJinAmountException {
|
//获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(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.getRebatePercent()!= null) {
|
money = TaoBaoUtil.getGoodsHongBaoMoney(goods,potence.getRebatePercent(),false);
|
}
|
} catch (TaoBaoGoodsDownException e){
|
throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
|
}
|
|
// 金额为空 或者小于零 则抛出异常
|
if (money == null || money.compareTo(BigDecimal.valueOf(0)) <= 0) {
|
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 {
|
// 获取用户等级
|
VIPEnum vipRank = vipCenterService.getVIPEnumByUid(uid);
|
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 = getLiJinCreateParam();
|
|
// TODO
|
// params.setAppkey();
|
// params.setAppsecret();
|
|
|
TaoLiJinDTO taoLiJinDTO = executeTaoLiJinAPI(uid, goodsId, lijinAmount, params);
|
if (taoLiJinDTO == null) {
|
throw new LiJinException(1, "淘宝API推广红包创建失败");
|
}
|
|
|
// 保存记录
|
LiJinExpendRecord record = new LiJinExpendRecord();
|
record.setUid(uid);
|
record.setGoodsId(goodsId + "");
|
record.setTitle(params.getTitle());
|
record.setNum(params.getNum());
|
record.setMoney(lijinAmount);
|
record.setRightsId(taoLiJinDTO.getRightsId());
|
record.setSendUrl(taoLiJinDTO.getSendUrl());
|
record.setCreateTime(new Date());
|
liJinExpendRecordMapper.insertSelective(record);
|
return record;
|
}
|
|
|
// 创建淘礼金
|
private TaoLiJinDTO executeTaoLiJinAPI(String uid, Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinGoodsException {
|
String appkey =params.getAppkey();
|
String appsecret = params.getAppsecret();
|
|
// 创建淘礼金红包
|
TaoLiJinDTO taoLiJinDTO = null;
|
try {
|
taoLiJinDTO = TaoKeApiUtil.createTaoLiJin(goodsId, params.getTitle(), lijinAmount,
|
params.getNum(), params.getSendStartTime(), params.getSendEndTime(),
|
params.getUseStartTime(), params.getUseEndTime(), new TaoKeAppInfo(appkey, appsecret, params.getPid()));
|
} catch (LiJinException e) {
|
// 通知相应供应商 TODO
|
executor.execute(new Runnable() {
|
@Override
|
public void run() {
|
LiJinProviderAccount account = liJinProviderAccountService.getByAppInfo(appkey, appsecret);
|
if (account == null) {
|
return;
|
}
|
LiJinProviderNotice notice = new LiJinProviderNotice();
|
notice.setRead(false);
|
notice.setProviderId(account.getProviderId());
|
|
if (e.getCode() == LiJinException.CODE_TLJ_FORBIDDEN) {
|
// 该商品不支持创建淘礼金红包
|
} else if (e.getCode() == LiJinException.CODE_TLJ_NO_MONEY) {
|
// 官方玩法钱包余额不足
|
notice.setTitle("玩法钱包余额不足");
|
notice.setContent("账号:"+ appkey +"官方玩法钱包余额不足");
|
notice.setType(NoticeTypeEnum.noMoney.name());
|
liJinProviderNoticeService.save(notice);
|
} else if (e.getCode() == LiJinException.CODE_TLJ_UN_PAID) {
|
// 未创建账户
|
}
|
}
|
});
|
}
|
return taoLiJinDTO;
|
}
|
|
|
private BigDecimal getTBLijinAmount(TaoBaoGoodsBrief goods, VIPEnum vipRank) throws LiJinGoodsException,LiJinAmountException {
|
//获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(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.getRebatePercent()!= null) {
|
money = TaoBaoUtil.getGoodsHongBaoMoney(goods,potence.getRebatePercent(),false);
|
}
|
|
// 金额为空 或者小于零 则抛出异常
|
if (money == null || money.compareTo(BigDecimal.valueOf(0)) <= 0) {
|
throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE,"礼金创建的金额超出规定范围");
|
}
|
return money;
|
}
|
|
/**
|
* 创建淘礼金基本参数
|
* @return
|
*/
|
private LiJinCreateParam getLiJinCreateParam() {
|
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;
|
}
|
|
}
|