package com.yeshi.fanli.service.manger.order;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.Iterator;
|
import java.util.List;
|
import java.util.Map;
|
|
import javax.annotation.Resource;
|
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import com.yeshi.fanli.entity.order.dividents.TeamDividentsDebt;
|
import com.yeshi.fanli.entity.order.dividents.TeamDividentsRecord;
|
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrder;
|
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrderUserMap;
|
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceUser;
|
import com.yeshi.fanli.exception.ParamsException;
|
import com.yeshi.fanli.exception.money.TeamDividentsDebtException;
|
import com.yeshi.fanli.exception.money.TeamEincomeRecordException;
|
import com.yeshi.fanli.exception.money.UserMoneyDetailException;
|
import com.yeshi.fanli.exception.order.dividents.TeamDividentsRecordException;
|
import com.yeshi.fanli.service.inter.money.TeamDividentsDebtService;
|
import com.yeshi.fanli.service.inter.money.UserMoneyService;
|
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
|
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsRecordService;
|
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderService;
|
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderUserMapService;
|
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceUserService;
|
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
|
import com.yeshi.fanli.service.inter.user.vip.TeamUserLevelStatisticService;
|
import com.yeshi.fanli.service.manger.money.TeamEincomeManager;
|
import com.yeshi.fanli.util.TimeUtil;
|
|
/**
|
* 团队分红管理
|
* @author Administrator
|
*
|
*/
|
@Component
|
public class TeamDividentsManager {
|
|
@Resource
|
private TeamDividentsSourceManager teamDividentsSourceManager;
|
|
@Resource
|
private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
|
|
@Resource
|
private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
|
|
@Resource
|
private TeamDividentsSourceUserService teamDividentsSourceUserService;
|
|
@Resource
|
private TeamDividentsRecordService teamDividentsRecordService;
|
|
@Resource
|
private ThreeSaleSerivce threeSaleSerivce;
|
|
@Resource
|
private TeamUserLevelStatisticService teamUserLevelStatisticService;
|
|
@Resource
|
private TeamDividentsDebtService teamDividentsDebtService;
|
|
@Resource
|
private UserMoneyService userMoneyService;
|
|
@Resource
|
private HongBaoManageService hongBaoManageService;
|
|
@Resource
|
private TeamEincomeManager teamEincomeManager;
|
|
/**
|
* 开始分红
|
* @Title: startDividents
|
* @Description:
|
* @param sourceUid -源用户
|
* void 返回类型
|
* @throws
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void startDividents(Long sourceUid) throws ParamsException {
|
String day = TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyy-MM-dd");
|
Date preSendTime = new Date(TimeUtil.convertToTimeTemp(day, "yyyy-MM-dd"));
|
startDividents(sourceUid, preSendTime);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
public void startDividents(Long sourceUid, Date preSendTime) throws ParamsException {
|
String day = TimeUtil.getGernalTime(preSendTime.getTime(), "yyyy-MM-dd");
|
// 查询出可用于分红的用户的总金额
|
long count = teamDividentsSourceOrderUserMapService.countCanSend(sourceUid, preSendTime);
|
int pageSize = 1000;
|
int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
|
List<TeamDividentsSourceOrderUserMap> totalList = new ArrayList<>();
|
for (int p = 0; p < page; p++) {
|
List<TeamDividentsSourceOrderUserMap> list = teamDividentsSourceOrderUserMapService.listCanSend(sourceUid,
|
preSendTime, p + 1, pageSize);
|
if (list != null && list.size() > 0)
|
totalList.addAll(list);
|
}
|
|
Map<Long, BigDecimal> moneyMap = new HashMap<>();
|
|
for (TeamDividentsSourceOrderUserMap order : totalList) {
|
TeamDividentsSourceOrderUserMap map = teamDividentsSourceOrderUserMapService
|
.selectByPrimaryKeyForUpdate(order.getId());
|
if (map != null && map.getState() == TeamDividentsSourceOrderUserMap.STATE_JS) {
|
// 计算分红对应的资金
|
if (moneyMap.get(map.getTargetUid()) == null)
|
moneyMap.put(map.getTargetUid(), new BigDecimal(0));
|
moneyMap.put(map.getTargetUid(), moneyMap.get(map.getTargetUid()).add(map.getMoney()));
|
teamDividentsSourceOrderUserMapService.send(map.getId());
|
}
|
}
|
|
for (Iterator<Long> its = moneyMap.keySet().iterator(); its.hasNext();) {
|
Long uid = its.next();
|
BigDecimal dividents = moneyMap.get(uid).setScale(2, BigDecimal.ROUND_DOWN);
|
// 将资金分配到参与分红的用户
|
TeamDividentsSourceUser teamDividentsSourceUser = new TeamDividentsSourceUser();
|
teamDividentsSourceUser.setDay(day);
|
teamDividentsSourceUser.setMoney(dividents);
|
teamDividentsSourceUser.setSourceUid(sourceUid);
|
teamDividentsSourceUser.setTargetUid(uid);
|
teamDividentsSourceUserService.addTeamDividentsSourceUser(teamDividentsSourceUser);
|
}
|
}
|
|
/**
|
* 分红计算是否完成
|
* @Title: isSourceUserComupteFinish
|
* @Description:
|
* @return
|
* boolean 返回类型
|
* @throws
|
*/
|
public boolean isSourceUserComupteFinish(String day) {
|
Date preSendTime = new Date(TimeUtil.convertToTimeTemp(day, "yyyy-MM-dd"));
|
long count = teamDividentsSourceOrderUserMapService.countCanSend(null, preSendTime);
|
return count == 0;
|
}
|
|
/**
|
* @throws TeamDividentsDebtException
|
* 添加分红记录
|
* @Title: addDividentsRecord
|
* @Description:
|
* @param uid -用户ID
|
* @param money -分红金额
|
* @param day -分红日期
|
* void 返回类型
|
* @throws
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void addToTeamEincome(Long uid, Date preSendTime) throws TeamDividentsRecordException,
|
TeamDividentsDebtException, UserMoneyDetailException, ParamsException, TeamEincomeRecordException {
|
String day = TimeUtil.getGernalTime(preSendTime.getTime(), "yyyy-MM-dd");
|
BigDecimal money = teamDividentsSourceUserService.sumMoneyByUidAndDay(uid, day);
|
// 查询需要扣除的资金
|
List<TeamDividentsDebt> list = teamDividentsDebtService.listNeedRepayDebt(uid, preSendTime, 1, 1000);
|
for (TeamDividentsDebt debt : list) {
|
if (money.subtract(debt.getLeftMoney()).compareTo(new BigDecimal(0)) >= 0) {// 还有钱还
|
money = money.subtract(debt.getLeftMoney());
|
teamDividentsDebtService.repayDebt(debt.getId(), debt.getLeftMoney());
|
} else if (money.compareTo(new BigDecimal(0)) > 0) {
|
teamDividentsDebtService.repayDebt(debt.getId(), money);
|
money = new BigDecimal(0);
|
} else// 没有钱还了
|
break;
|
}
|
|
// 统计资金
|
TeamDividentsRecord record = new TeamDividentsRecord();
|
record.setDay(day);
|
record.setMoney(money);
|
record.setState(TeamDividentsRecord.STATE_VALID);
|
record.setUid(uid);
|
teamDividentsRecordService.addTeamDividentsRecord(record);
|
|
// 有分红才显示资金明细
|
if (money.compareTo(new BigDecimal(0)) > 0) {
|
teamEincomeManager.addTeamDividents(uid, preSendTime, money);
|
}
|
}
|
|
/**
|
* @throws TeamDividentsDebtException
|
* 订单维权
|
* @Title: weiQuan
|
* @Description:
|
* @param orderNo
|
* @param tradeId
|
* @param sourceType
|
* void 返回类型
|
* @throws
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public void weiQuan(String orderNo, int sourceType) throws TeamDividentsDebtException {
|
// 查询订单是否已经分红
|
TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
|
if (order == null)
|
return;
|
|
List<TeamDividentsSourceOrderUserMap> mapList = teamDividentsSourceOrderUserMapService
|
.listBySourceOrderId(order.getId());
|
if (mapList == null || mapList.size() == 0)
|
return;
|
|
int state = mapList.get(0).getState();
|
|
if (state == TeamDividentsSourceOrderUserMap.STATE_SX)
|
return;
|
|
if (state == TeamDividentsSourceOrderUserMap.STATE_YILINGQU) {// 已经发送,需要参与分红的人分摊
|
|
// 按UID封装统计资金
|
Map<Long, TeamDividentsSourceOrderUserMap> orderUserMap = new HashMap<>();
|
for (TeamDividentsSourceOrderUserMap map : mapList) {
|
if (orderUserMap.get(map.getTargetUid()) == null)
|
orderUserMap.put(map.getTargetUid(), map);
|
else {
|
TeamDividentsSourceOrderUserMap oldMap = orderUserMap.get(map.getTargetUid());
|
oldMap.setMoney(map.getMoney().add(oldMap.getMoney()));
|
orderUserMap.put(map.getTargetUid(), oldMap);
|
}
|
}
|
|
for (Iterator<Long> its = orderUserMap.keySet().iterator(); its.hasNext();) {
|
Long uid = its.next();
|
TeamDividentsSourceOrderUserMap map = orderUserMap.get(uid);
|
|
String day = TimeUtil.getGernalTime(map.getPreSendTime().getTime(), "yyyy-MM-dd");
|
// 查询本次总共的返利
|
TeamDividentsSourceUser sourceUser = teamDividentsSourceUserService
|
.selectBySourceUidAndDayAndUid(map.getSourceUid(), map.getTargetUid(), day);
|
if (sourceUser != null) {
|
// 不能出现倒欠一分的情况
|
BigDecimal debtMoney = map.getMoney().setScale(2, BigDecimal.ROUND_UP);
|
if (debtMoney.compareTo(sourceUser.getMoney()) > 0)
|
debtMoney = sourceUser.getMoney();
|
|
// 需要偿还的资金
|
TeamDividentsDebt debt = new TeamDividentsDebt();
|
debt.setLeftMoney(debtMoney);
|
debt.setOriginMoney(debtMoney);
|
debt.setOrderNo(orderNo);
|
debt.setSourceType(sourceType);
|
debt.setUid(map.getTargetUid());
|
// 加入待偿还记录
|
teamDividentsDebtService.addDebt(debt);
|
}
|
|
}
|
|
} else if (order.getState() == TeamDividentsSourceOrderUserMap.STATE_JS
|
|| order.getState() == TeamDividentsSourceOrderUserMap.STATE_FK) {
|
teamDividentsSourceManager.invalidByOrder(orderNo, sourceType, "订单维权");
|
}
|
}
|
|
}
|