package com.yeshi.fanli.service.manger.order;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
|
import javax.annotation.Resource;
|
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
|
import com.yeshi.fanli.entity.money.InviteOrderSubsidyDebt;
|
import com.yeshi.fanli.entity.order.HongBaoOrder;
|
import com.yeshi.fanli.entity.order.HongBaoV2SettleTemp;
|
import com.yeshi.fanli.entity.order.InviteOrderSubsidy;
|
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
|
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
|
import com.yeshi.fanli.exception.ParamsException;
|
import com.yeshi.fanli.exception.money.InviteOrderSubsidyDebtException;
|
import com.yeshi.fanli.exception.money.OrderMoneySettleException;
|
import com.yeshi.fanli.exception.money.TeamEincomeRecordException;
|
import com.yeshi.fanli.exception.order.CommonOrderException;
|
import com.yeshi.fanli.exception.order.InviteOrderSubsidyException;
|
import com.yeshi.fanli.exception.order.TaoBaoOrderException;
|
import com.yeshi.fanli.service.inter.hongbao.HongBaoV2SettleTempService;
|
import com.yeshi.fanli.service.inter.money.InviteOrderSubsidyDebtService;
|
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
|
import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
|
import com.yeshi.fanli.service.inter.order.InviteOrderSubsidyService;
|
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
|
import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService;
|
import com.yeshi.fanli.service.manger.money.TeamEincomeManager;
|
import com.yeshi.fanli.util.Constant;
|
|
/**
|
* 团队分红管理
|
* @author Administrator
|
*
|
*/
|
@Component
|
public class TeamSubsidyManager {
|
|
@Resource
|
private InviteOrderSubsidyService inviteOrderSubsidyService;
|
|
@Resource
|
private InviteOrderSubsidyDebtService inviteOrderSubsidyDebtService;
|
|
@Resource
|
private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
|
|
@Resource
|
private TaoBaoOrderService taoBaoOrderService;
|
|
@Resource
|
private HongBaoV2Service hongBaoV2Service;
|
|
@Resource
|
private HongBaoOrderService hongBaoOrderService;
|
|
@Resource
|
private HongBaoV2SettleTempService hongBaoV2SettleTempService;
|
|
@Resource
|
private TeamEincomeManager teamEincomeManager;
|
|
public void addOrUpdateOrder(String orderNo, int sourceType)
|
throws InviteOrderSubsidyException, CommonOrderException {
|
inviteOrderSubsidyService.addOrUpdateByOrder(orderNo, sourceType);
|
}
|
|
private BigDecimal computeDrawBackMoney(BigDecimal settlement, BigDecimal wqMoney, BigDecimal hongBaoMoney) {
|
BigDecimal money = (hongBaoMoney.multiply(wqMoney)).divide(settlement, 2, BigDecimal.ROUND_UP);
|
if (money.compareTo(hongBaoMoney) > 0)
|
money = hongBaoMoney;
|
return money;
|
}
|
|
public void weiQuan(String orderNo, int sourceType, String tradeId)
|
throws TaoBaoOrderException, InviteOrderSubsidyDebtException {
|
if (sourceType == Constant.SOURCE_TYPE_TAOBAO) {// 只处理淘宝的维权
|
TaoBaoWeiQuanOrder taoBaoWeiQuanOrder = taoBaoWeiQuanOrderService.selectByTradeId(tradeId);
|
|
// 只处理维权成功
|
if (!taoBaoWeiQuanOrder.getState().startsWith("维权成功"))
|
return;
|
TaoBaoOrder taoBaoOrder = taoBaoOrderService.selectByTradeId(tradeId);
|
if (taoBaoOrder == null)
|
return;
|
|
if (taoBaoOrder.getSettlement() == null)
|
throw new TaoBaoOrderException(1, "订单未更新");
|
|
List<InviteOrderSubsidy> subSidyList = inviteOrderSubsidyService.listByOrderNoAndType(orderNo, sourceType);
|
for (InviteOrderSubsidy subSidy : subSidyList) {
|
if (subSidy != null)// 添加借贷关系
|
{
|
BigDecimal drawBackMoney = computeDrawBackMoney(taoBaoOrder.getSettlement(),
|
taoBaoWeiQuanOrder.getMoney(), subSidy.getOriginalMoney());
|
if (drawBackMoney.compareTo(new BigDecimal(0)) <= 0)
|
return;
|
InviteOrderSubsidyDebt debt = new InviteOrderSubsidyDebt();
|
debt.setBeiZhu("订单售后:" + orderNo + "-" + sourceType);
|
debt.setOriginMoney(drawBackMoney);
|
debt.setUid(subSidy.getUid());
|
debt.setCreateTime(new Date());
|
debt.setSourceId(subSidy.getId());
|
debt.setTradeId(tradeId);
|
inviteOrderSubsidyDebtService.addDebt(debt);
|
}
|
}
|
}
|
}
|
|
/**
|
* 添加到临时结算
|
* @Title: addToTeamEincome
|
* @Description:
|
* @param uid
|
* @param taskKey
|
* @throws OrderMoneySettleException
|
* @throws TeamEincomeRecordException
|
* @throws ParamsException
|
* void 返回类型
|
* @throws
|
*/
|
@Transactional(rollbackFor=Exception.class)
|
public void addToTeamEincome(Long uid, String taskKey,Date preGetTime)
|
throws OrderMoneySettleException, TeamEincomeRecordException, ParamsException {
|
// 查询key
|
List<HongBaoV2SettleTemp> list = hongBaoV2SettleTempService.listByKey(taskKey);
|
if (list != null && list.size() > 0) {
|
Integer sourceType = null;
|
List<InviteOrderSubsidy> subsidyList = new ArrayList<>();
|
for (HongBaoV2SettleTemp temp : list) {
|
Long hongBaoId = temp.getHongBaoId();
|
HongBaoV2 hongBao = hongBaoV2Service.selectByPrimaryKey(hongBaoId);
|
if (hongBao != null)
|
sourceType = hongBao.getOrderType();
|
if (hongBao.getParent() != null)
|
hongBao = hongBao.getParent();
|
HongBaoOrder order = hongBaoOrderService.selectDetailByHongBaoId(hongBao.getId());
|
if (order != null && order.getCommonOrder() != null) {
|
InviteOrderSubsidy subSidy = inviteOrderSubsidyService.getByOrderNoAndTypeForUpdate(uid,
|
order.getCommonOrder().getOrderNo(), order.getCommonOrder().getSourceType());
|
if (subSidy != null && subSidy.getState() == InviteOrderSubsidy.STATE_VALID) {
|
subsidyList.add(subSidy);
|
}
|
}
|
}
|
|
if (sourceType == null)
|
throw new OrderMoneySettleException(1, "订单类型未获取到");
|
|
if (subsidyList.size() > 0) {
|
BigDecimal debtMoney = inviteOrderSubsidyDebtService.getTotalDebtMoney(uid, preGetTime);
|
BigDecimal originalDebtMoney = new BigDecimal(debtMoney.toString());// 总的欠款
|
List<InviteOrderSubsidy> copySubsidyList = new ArrayList<>();
|
copySubsidyList.addAll(subsidyList);
|
while (debtMoney.compareTo(new BigDecimal(0)) > 0 && copySubsidyList.size() > 0) {// 有欠款,还有还的
|
debtMoney = kouKuan(copySubsidyList, debtMoney);
|
}
|
// 还款
|
BigDecimal repayMoney = originalDebtMoney.subtract(debtMoney);
|
BigDecimal bannce = null;
|
if (repayMoney.compareTo(new BigDecimal(0)) > 0) {
|
try {
|
bannce = inviteOrderSubsidyDebtService.repayDebtByUid(uid, preGetTime, repayMoney);
|
// 剩余的补贴金额
|
} catch (InviteOrderSubsidyDebtException e) {
|
throw new OrderMoneySettleException(2, "还款异常");
|
}
|
}
|
if (bannce != null && bannce.compareTo(new BigDecimal(0)) > 0) {
|
// 如果有还剩下的钱就加到第一个上面
|
subsidyList.get(0).setMoney(subsidyList.get(0).getMoney().add(bannce));
|
}
|
|
BigDecimal totalMoney = new BigDecimal(0);
|
for (InviteOrderSubsidy subsidy : subsidyList) {
|
inviteOrderSubsidyService.settleById(subsidy.getId(), subsidy.getMoney());
|
totalMoney = totalMoney.add(subsidy.getMoney());
|
}
|
|
// 加入团队收益中间表
|
teamEincomeManager.addTeamSubsidy(uid, preGetTime, totalMoney, sourceType);
|
}
|
}
|
}
|
|
private BigDecimal kouKuan(List<InviteOrderSubsidy> subsidyList, BigDecimal debtMoney) {
|
BigDecimal average = debtMoney.divide(new BigDecimal(subsidyList.size()), 2, RoundingMode.UP);
|
for (int i = 0; i < subsidyList.size(); i++) {
|
InviteOrderSubsidy sidy = subsidyList.get(i);
|
BigDecimal subMoney = null;
|
if (average.compareTo(sidy.getMoney()) >= 0) {
|
subMoney = sidy.getMoney();
|
} else {
|
subMoney = average;
|
}
|
if (subMoney.compareTo(debtMoney) > 0)
|
subMoney = debtMoney;
|
debtMoney = debtMoney.subtract(subMoney);
|
sidy.setMoney(sidy.getMoney().subtract(subMoney));
|
|
if (sidy.getMoney().compareTo(new BigDecimal(0)) == 0) {
|
subsidyList.remove(i);
|
i--;
|
}
|
}
|
return debtMoney;
|
}
|
|
}
|