admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsSourceManager.java
@@ -1,211 +1,211 @@
package com.yeshi.fanli.service.manger.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dto.order.UserTeamLevel;
import com.yeshi.fanli.dto.order.UserTeamRate;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrder;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrderUserMap;
import com.yeshi.fanli.exception.ParamsException;
import com.yeshi.fanli.exception.order.dividents.TeamDividentsSourceOrderException;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderService;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderUserMapService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.factory.order.dividents.TeamDividentsSourceOrderFactory;
import com.yeshi.fanli.util.factory.order.dividents.TeamDividentsSourceOrderUserMapFactory;
import com.yeshi.fanli.util.order.CommonOrderUtil;
import com.yeshi.fanli.util.user.UserLevelUtil;
/**
 * 团队分红来源管理
 *
 * @author Administrator
 */
@Component
public class TeamDividentsSourceManager {
    @Resource
    private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
    @Resource
    private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
    @Resource
    private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
    @Resource
    private CommonOrderService commonOrderService;
    @Resource
    private UserInfoService userInfoService;
    /**
     * @param commonOrderList
     * @param bossList        void 返回类型
     * @throws ParamsException 添加分红源
     * @throws
     * @Title: addSource
     * @Description:
     */
    @Transactional(rollbackFor = Exception.class)
    public void addSource(List<CommonOrder> commonOrderList, List<UserTeamLevel> bossList)
            throws TeamDividentsSourceOrderException, ParamsException {
        if (commonOrderList.get(0).getThirdCreateTime().getTime() < Constant.NEW_ORDER_FANLI_RULE_TIME)
            return;
        Date placeOrderTime = commonOrderList.get(0).getThirdCreateTime();
        UserLevelEnum level = UserLevelUtil.getByOrderRank(commonOrderList.get(0).getUrank());
        if (level == null)
            level = UserLevelEnum.daRen;
        TeamDividentsSourceOrder order = TeamDividentsSourceOrderFactory.create(commonOrderList);
        if (order == null)
            return;
        try {
            order = teamDividentsSourceOrderService.addTeamDividentsSourceOrder(order);
        } catch (ParamsException e) {
            throw new TeamDividentsSourceOrderException(101, "参数不完整");
        }
        if (order == null || order.getId() == null) {
            throw new TeamDividentsSourceOrderException(2, "添加源订单失败");
        }
        // 获取源订单分配的分红用户ID数量
        long count = teamDividentsSourceOrderUserMapService.countBySourceOrderId(order.getId());
        if (count > 0)// 已存在
            return;
        SystemEnum system = userInfoService.getUserSystem(order.getUid());
        // 计算团队分红比例
        List<UserTeamRate> rateList = orderHongBaoMoneyComputeService.getTeamDividentsRates(level, bossList,
                placeOrderTime, system);
        if (rateList != null)
            for (UserTeamRate rate : rateList) {
                BigDecimal money = MoneyBigDecimalUtil.div(rate.getRate().multiply(order.getMoney()),
                        new BigDecimal(100), 4);
                TeamDividentsSourceOrderUserMap map = TeamDividentsSourceOrderUserMapFactory.create(order,
                        rate.getUid(), rate.getRate(), money, TeamDividentsSourceOrderUserMap.TYPE_TEAM_DIVIDENTS);
                try {
                    teamDividentsSourceOrderUserMapService.addDividentsSourceOrderUserMap(map);
                } catch (ParamsException e) {
                    throw new TeamDividentsSourceOrderException(201, "参数不完整");
                }
            }
        // 计算二级外分红比例
        rateList = orderHongBaoMoneyComputeService.getTeamRewardMoreThan2LevelRates(level, bossList, placeOrderTime, system);
        if (rateList != null)
            for (UserTeamRate rate : rateList) {
                BigDecimal money = MoneyBigDecimalUtil.div(rate.getRate().multiply(order.getMoney()),
                        new BigDecimal(100), 4);
                TeamDividentsSourceOrderUserMap map = TeamDividentsSourceOrderUserMapFactory.create(order,
                        rate.getUid(), rate.getRate(), money, TeamDividentsSourceOrderUserMap.TYPE_MORE_THAN_2);
                try {
                    teamDividentsSourceOrderUserMapService.addDividentsSourceOrderUserMap(map);
                } catch (ParamsException e) {
                    throw new TeamDividentsSourceOrderException(301, "参数不完整");
                }
            }
    }
    /**
     * 订单失效
     *
     * @throws
     * @Title: invalidBySourceOrderId
     * @Description: void 返回类型
     */
    @Transactional(rollbackFor = Exception.class)
    public void invalidByOrder(String orderNo, int sourceType, String beiZhu) {
        teamDividentsSourceOrderService.invalidOrder(orderNo, sourceType, beiZhu);
        TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
        if (order != null) {
            teamDividentsSourceOrderUserMapService.invalidBySourceOrderId(order.getId());
        }
    }
    @Transactional(rollbackFor = Exception.class)
    public void invalidBySourceUid(Long sourceUid, String beiZhu) {
        // teamDividentsSourceOrderService.invalidOrderByUid(sourceUid, beiZhu);
        teamDividentsSourceOrderUserMapService.invalidOrderBySourceUid(sourceUid, beiZhu);
    }
    /**
     * 订单结算
     *
     * @throws
     * @Title: orderSettle
     * @Description: void 返回类型
     */
    @Transactional(rollbackFor = Exception.class)
    public void orderSettle(String orderNo, int sourceType) {
        TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
        if (order != null) {
            List<CommonOrder> commonOrderList = commonOrderService.listBySourceTypeAndOrderId(sourceType, orderNo);
            if (commonOrderList == null)
                return;
            TeamDividentsSourceOrder newOrder = TeamDividentsSourceOrderFactory.create(commonOrderList);
            if (newOrder == null || newOrder.getPreSendTime() == null)
                return;
            BigDecimal money = CommonOrderUtil.computeIncome(commonOrderList);
            teamDividentsSourceOrderService.orderSettle(orderNo, sourceType, newOrder.getPreSendTime(), money);
            teamDividentsSourceOrderUserMapService.orderSettle(order.getId(), newOrder.getPreSendTime(), money);
        }
    }
    @Transactional(rollbackFor = Exception.class)
    public void updateOrderMoney(String orderNo, int sourceType) {
        TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
        if (order != null) {
            List<CommonOrder> commonOrderList = commonOrderService.listBySourceTypeAndOrderId(sourceType, orderNo);
            if (commonOrderList == null)
                return;
            Integer state = CommonOrderUtil.getState(commonOrderList);
            BigDecimal money = null;
            switch (state) {
                case CommonOrder.STATE_FK:
                    money = CommonOrderUtil.computeEstimate(commonOrderList);
                    teamDividentsSourceOrderService.updateMoney(orderNo, sourceType, money);
                    teamDividentsSourceOrderUserMapService.updateMoney(order.getId(), money);
                    break;
                case CommonOrder.STATE_WQ:
                case CommonOrder.STATE_JS:
                    TeamDividentsSourceOrder newOrder = TeamDividentsSourceOrderFactory.create(commonOrderList);
                    if (newOrder == null || newOrder.getPreSendTime() == null)
                        return;
                    money = CommonOrderUtil.computeIncome(commonOrderList);
                    teamDividentsSourceOrderService.orderSettle(orderNo, sourceType, newOrder.getPreSendTime(), money);
                    teamDividentsSourceOrderUserMapService.orderSettle(order.getId(), newOrder.getPreSendTime(), money);
                    break;
                case CommonOrder.STATE_SX:
                    invalidByOrder(orderNo, sourceType, "订单失效");
                    break;
            }
        }
    }
}
package com.yeshi.fanli.service.manger.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dto.order.UserTeamLevel;
import com.yeshi.fanli.dto.order.UserTeamRate;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrder;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrderUserMap;
import com.yeshi.fanli.exception.ParamsException;
import com.yeshi.fanli.exception.order.dividents.TeamDividentsSourceOrderException;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderService;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderUserMapService;
import com.yeshi.fanli.util.Constant;
import org.yeshi.utils.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.factory.order.dividents.TeamDividentsSourceOrderFactory;
import com.yeshi.fanli.util.factory.order.dividents.TeamDividentsSourceOrderUserMapFactory;
import com.yeshi.fanli.util.order.CommonOrderUtil;
import com.yeshi.fanli.util.user.UserLevelUtil;
/**
 * 团队分红来源管理
 *
 * @author Administrator
 */
@Component
public class TeamDividentsSourceManager {
    @Resource
    private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
    @Resource
    private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
    @Resource
    private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
    @Resource
    private CommonOrderService commonOrderService;
    @Resource
    private UserInfoService userInfoService;
    /**
     * @param commonOrderList
     * @param bossList        void 返回类型
     * @throws ParamsException 添加分红源
     * @throws
     * @Title: addSource
     * @Description:
     */
    @Transactional(rollbackFor = Exception.class)
    public void addSource(List<CommonOrder> commonOrderList, List<UserTeamLevel> bossList)
            throws TeamDividentsSourceOrderException, ParamsException {
        if (commonOrderList.get(0).getThirdCreateTime().getTime() < Constant.NEW_ORDER_FANLI_RULE_TIME)
            return;
        Date placeOrderTime = commonOrderList.get(0).getThirdCreateTime();
        UserLevelEnum level = UserLevelUtil.getByOrderRank(commonOrderList.get(0).getUrank());
        if (level == null)
            level = UserLevelEnum.daRen;
        TeamDividentsSourceOrder order = TeamDividentsSourceOrderFactory.create(commonOrderList);
        if (order == null)
            return;
        try {
            order = teamDividentsSourceOrderService.addTeamDividentsSourceOrder(order);
        } catch (ParamsException e) {
            throw new TeamDividentsSourceOrderException(101, "参数不完整");
        }
        if (order == null || order.getId() == null) {
            throw new TeamDividentsSourceOrderException(2, "添加源订单失败");
        }
        // 获取源订单分配的分红用户ID数量
        long count = teamDividentsSourceOrderUserMapService.countBySourceOrderId(order.getId());
        if (count > 0)// 已存在
            return;
        SystemEnum system = userInfoService.getUserSystem(order.getUid());
        // 计算团队分红比例
        List<UserTeamRate> rateList = orderHongBaoMoneyComputeService.getTeamDividentsRates(level, bossList,
                placeOrderTime, system);
        if (rateList != null)
            for (UserTeamRate rate : rateList) {
                BigDecimal money = MoneyBigDecimalUtil.div(rate.getRate().multiply(order.getMoney()),
                        new BigDecimal(100), 4);
                TeamDividentsSourceOrderUserMap map = TeamDividentsSourceOrderUserMapFactory.create(order,
                        rate.getUid(), rate.getRate(), money, TeamDividentsSourceOrderUserMap.TYPE_TEAM_DIVIDENTS);
                try {
                    teamDividentsSourceOrderUserMapService.addDividentsSourceOrderUserMap(map);
                } catch (ParamsException e) {
                    throw new TeamDividentsSourceOrderException(201, "参数不完整");
                }
            }
        // 计算二级外分红比例
        rateList = orderHongBaoMoneyComputeService.getTeamRewardMoreThan2LevelRates(level, bossList, placeOrderTime, system);
        if (rateList != null)
            for (UserTeamRate rate : rateList) {
                BigDecimal money = MoneyBigDecimalUtil.div(rate.getRate().multiply(order.getMoney()),
                        new BigDecimal(100), 4);
                TeamDividentsSourceOrderUserMap map = TeamDividentsSourceOrderUserMapFactory.create(order,
                        rate.getUid(), rate.getRate(), money, TeamDividentsSourceOrderUserMap.TYPE_MORE_THAN_2);
                try {
                    teamDividentsSourceOrderUserMapService.addDividentsSourceOrderUserMap(map);
                } catch (ParamsException e) {
                    throw new TeamDividentsSourceOrderException(301, "参数不完整");
                }
            }
    }
    /**
     * 订单失效
     *
     * @throws
     * @Title: invalidBySourceOrderId
     * @Description: void 返回类型
     */
    @Transactional(rollbackFor = Exception.class)
    public void invalidByOrder(String orderNo, int sourceType, String beiZhu) {
        teamDividentsSourceOrderService.invalidOrder(orderNo, sourceType, beiZhu);
        TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
        if (order != null) {
            teamDividentsSourceOrderUserMapService.invalidBySourceOrderId(order.getId());
        }
    }
    @Transactional(rollbackFor = Exception.class)
    public void invalidBySourceUid(Long sourceUid, String beiZhu) {
        // teamDividentsSourceOrderService.invalidOrderByUid(sourceUid, beiZhu);
        teamDividentsSourceOrderUserMapService.invalidOrderBySourceUid(sourceUid, beiZhu);
    }
    /**
     * 订单结算
     *
     * @throws
     * @Title: orderSettle
     * @Description: void 返回类型
     */
    @Transactional(rollbackFor = Exception.class)
    public void orderSettle(String orderNo, int sourceType) {
        TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
        if (order != null) {
            List<CommonOrder> commonOrderList = commonOrderService.listBySourceTypeAndOrderId(sourceType, orderNo);
            if (commonOrderList == null)
                return;
            TeamDividentsSourceOrder newOrder = TeamDividentsSourceOrderFactory.create(commonOrderList);
            if (newOrder == null || newOrder.getPreSendTime() == null)
                return;
            BigDecimal money = CommonOrderUtil.computeIncome(commonOrderList);
            teamDividentsSourceOrderService.orderSettle(orderNo, sourceType, newOrder.getPreSendTime(), money);
            teamDividentsSourceOrderUserMapService.orderSettle(order.getId(), newOrder.getPreSendTime(), money);
        }
    }
    @Transactional(rollbackFor = Exception.class)
    public void updateOrderMoney(String orderNo, int sourceType) {
        TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
        if (order != null) {
            List<CommonOrder> commonOrderList = commonOrderService.listBySourceTypeAndOrderId(sourceType, orderNo);
            if (commonOrderList == null)
                return;
            Integer state = CommonOrderUtil.getState(commonOrderList);
            BigDecimal money = null;
            switch (state) {
                case CommonOrder.STATE_FK:
                    money = CommonOrderUtil.computeEstimate(commonOrderList);
                    teamDividentsSourceOrderService.updateMoney(orderNo, sourceType, money);
                    teamDividentsSourceOrderUserMapService.updateMoney(order.getId(), money);
                    break;
                case CommonOrder.STATE_WQ:
                case CommonOrder.STATE_JS:
                    TeamDividentsSourceOrder newOrder = TeamDividentsSourceOrderFactory.create(commonOrderList);
                    if (newOrder == null || newOrder.getPreSendTime() == null)
                        return;
                    money = CommonOrderUtil.computeIncome(commonOrderList);
                    teamDividentsSourceOrderService.orderSettle(orderNo, sourceType, newOrder.getPreSendTime(), money);
                    teamDividentsSourceOrderUserMapService.orderSettle(order.getId(), newOrder.getPreSendTime(), money);
                    break;
                case CommonOrder.STATE_SX:
                    invalidByOrder(orderNo, sourceType, "订单失效");
                    break;
            }
        }
    }
}