admin
2020-04-22 f5d2e7e2d1ad3309e8bd3c2b93468be1bfc93ae5
新的分红规则修改
15个文件已修改
8个文件已添加
1601 ■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/order/dividents/TeamDividentsSourceUserMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dto/order/UserTeamLevel.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dto/order/UserTeamRate.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/bus/user/vip/UserLevelEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/order/dividents/TeamDividentsSourceOrder.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/order/dividents/TeamDividentsSourceOrderUserMap.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/job/order/OrderTeamDividentsJob.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/mapping/order/dividents/TeamDividentsSourceUserMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderHongBaoMoneyComputeServiceImpl.java 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/dividents/TeamDividentsSourceOrderServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/dividents/TeamDividentsSourceOrderUserMapServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/dividents/TeamDividentsSourceUserServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/OrderHongBaoMoneyComputeService.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/dividents/TeamDividentsSourceOrderService.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/dividents/TeamDividentsSourceOrderUserMapService.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/dividents/TeamDividentsSourceUserService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsManager.java 260 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsSourceManager.java 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/MoneyBigDecimalUtil.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/factory/order/dividents/TeamDividentsSourceOrderFactory.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/factory/order/dividents/TeamDividentsSourceOrderUserMapFactory.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/order/CommonOrderUtil.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/rocketmq/consumer/order/OrderDividentsMessageListener.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/order/dividents/TeamDividentsSourceUserMapper.java
@@ -57,4 +57,18 @@
     * @throws
     */
    List<TeamDividentsSourceUser> listBySourceUidAndDay(@Param("sourceUid") Long sourceUid, @Param("day") String day);
    /**
     * 根据日期与源用户ID,目标用户ID查询
     * @Title: selectBySourceUidAndDayAndUid
     * @Description:
     * @param sourceUid
     * @param targetUid
     * @param day
     * @return
     * TeamDividentsSourceUser 返回类型
     * @throws
     */
    TeamDividentsSourceUser selectBySourceUidAndDayAndUid(@Param("sourceUid") Long sourceUid,
            @Param("targetUid") Long targetUid, @Param("day") String day);
}
fanli/src/main/java/com/yeshi/fanli/dto/order/UserTeamLevel.java
New file
@@ -0,0 +1,30 @@
package com.yeshi.fanli.dto.order;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
public class UserTeamLevel {
    Long uid;
    UserLevelEnum level;
    public UserTeamLevel(Long uid, UserLevelEnum level) {
        super();
        this.uid = uid;
        this.level = level;
    }
    public Long getUid() {
        return uid;
    }
    public void setUid(Long uid) {
        this.uid = uid;
    }
    public UserLevelEnum getLevel() {
        return level;
    }
    public void setLevel(UserLevelEnum level) {
        this.level = level;
    }
}
fanli/src/main/java/com/yeshi/fanli/dto/order/UserTeamRate.java
New file
@@ -0,0 +1,31 @@
package com.yeshi.fanli.dto.order;
import java.math.BigDecimal;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
public class UserTeamRate extends UserTeamLevel {
    BigDecimal rate;
    public UserTeamRate(Long uid, UserLevelEnum level) {
        super(uid, level);
    }
    public UserTeamRate(Long uid, UserLevelEnum level, BigDecimal rate) {
        super(uid, level);
        this.rate = rate;
    }
    public UserTeamRate(UserTeamLevel level, BigDecimal rate) {
        super(level.getUid(), level.getLevel());
        this.rate = rate;
    }
    public BigDecimal getRate() {
        return rate;
    }
    public void setRate(BigDecimal rate) {
        this.rate = rate;
    }
}
fanli/src/main/java/com/yeshi/fanli/entity/bus/user/vip/UserLevelEnum.java
@@ -2,6 +2,7 @@
public enum UserLevelEnum {
    daRen(0, 0, "快省达人", "actived", "http://apph5.banliapp.com/AppInside/vipNew/supvip.html"),
    normalVIP(3, 30, "普通会员", "actived", "http://apph5.banliapp.com/AppInside/vipNew/supvip.html"),//老机制过渡使用
    highVIP(7, 70, "高级会员", "vipPre2", "http://apph5.banliapp.com/AppInside/vipNew/supvip.html"),
    superVIP(10, 100, "超级会员", "vip", "http://apph5.banliapp.com/AppInside/vipNew/supvip.html"),
    tearcher(11, 101, "资深导师", "tearcher", "http://apph5.banliapp.com/AppInside/vipNew/supvip.html");
fanli/src/main/java/com/yeshi/fanli/entity/order/dividents/TeamDividentsSourceOrder.java
@@ -15,11 +15,14 @@
public class TeamDividentsSourceOrder {
    // 已经发送
    public final static int STATE_ALREADY_SEND = 2;
    public final static int STATE_ALREADY_SEND = 3;
    // 可以发送
    public final static int STATE_CAN_SEND = 1;
    public final static int STATE_CAN_SEND = 2;
    // 无效
    public final static int STATE_INVALID = 0;
    public final static int STATE_INVALID = 4;
    // 尚不可知
    public final static int STATE_UNKOWN = 1;
    @Column(name = "tdo_id")
    private Long id;
fanli/src/main/java/com/yeshi/fanli/entity/order/dividents/TeamDividentsSourceOrderUserMap.java
New file
@@ -0,0 +1,129 @@
package com.yeshi.fanli.entity.order.dividents;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 分红源订单对应用户ID
 * @author Administrator
 *
 */
public class TeamDividentsSourceOrderUserMap {
    public final static int TYPE_MORE_THAN_2 = 1;// 二级外分红
    public final static int TYPE_TEAM_DIVIDENTS = 2;// 团队分红
    public final static int STATE_SX = 4;
    public final static int STATE_FK = 1;
    public final static int STATE_JS = 2;
    public final static int STATE_YILINGQU = 3;
    private Long id;
    private TeamDividentsSourceOrder sourceOrder;
    private Long sourceUid;
    private Long targetUid;
    private Integer state;
    private Integer type;
    private BigDecimal rate;
    private BigDecimal money;
    private Date preSendTime;
    private Date createTime;
    private Date updateTime;
    private String beiZhu;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public TeamDividentsSourceOrder getSourceOrder() {
        return sourceOrder;
    }
    public void setSourceOrder(TeamDividentsSourceOrder sourceOrder) {
        this.sourceOrder = sourceOrder;
    }
    public Long getSourceUid() {
        return sourceUid;
    }
    public void setSourceUid(Long sourceUid) {
        this.sourceUid = sourceUid;
    }
    public Long getTargetUid() {
        return targetUid;
    }
    public void setTargetUid(Long targetUid) {
        this.targetUid = targetUid;
    }
    public Integer getState() {
        return state;
    }
    public void setState(Integer state) {
        this.state = state;
    }
    public Integer getType() {
        return type;
    }
    public void setType(Integer type) {
        this.type = type;
    }
    public BigDecimal getRate() {
        return rate;
    }
    public void setRate(BigDecimal rate) {
        this.rate = rate;
    }
    public BigDecimal getMoney() {
        return money;
    }
    public void setMoney(BigDecimal money) {
        this.money = money;
    }
    public Date getPreSendTime() {
        return preSendTime;
    }
    public void setPreSendTime(Date preSendTime) {
        this.preSendTime = preSendTime;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
    public String getBeiZhu() {
        return beiZhu;
    }
    public void setBeiZhu(String beiZhu) {
        this.beiZhu = beiZhu;
    }
}
fanli/src/main/java/com/yeshi/fanli/job/order/OrderTeamDividentsJob.java
@@ -14,6 +14,7 @@
import com.yeshi.fanli.entity.money.TeamEincomeRecord;
import com.yeshi.fanli.service.inter.money.TeamEincomeRecordService;
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.manger.money.TeamEincomeManager;
import com.yeshi.fanli.service.manger.order.TeamDividentsManager;
@@ -30,6 +31,9 @@
    @Resource
    private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
    @Resource
    private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
    @Resource
    private TeamDividentsSourceUserService teamDividentsSourceUserService;
@@ -54,11 +58,12 @@
        Date preSendTime = new Date(TimeUtil.convertToTimeTemp(day, "yyyy-MM-dd"));
        long count = teamDividentsSourceOrderService.countCanSendUidByPreSendTime(preSendTime);
        long count = teamDividentsSourceOrderUserMapService.countCanSendSourceUidByPreSendTime(preSendTime);
        int pageSize = 500;
        int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
        for (int i = 0; i < totalPage; i++) {
            List<Long> list = teamDividentsSourceOrderService.listCanSendUidByPreSendTime(preSendTime, i + 1, pageSize);
            List<Long> list = teamDividentsSourceOrderUserMapService.listCanSendSourceUidByPreSendTime(preSendTime,
                    i + 1, pageSize);
            for (Long uid : list) {
                teamDividentsManager.startDividents(uid, preSendTime);
            }
@@ -104,7 +109,7 @@
        int pageSize = 500;
        int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
        for (int i = 0; i < totalPage; i++) {
            List<Long> list = teamEincomeRecordService.listCanRecieveUid(preSendTime, typeList, i +1, pageSize);
            List<Long> list = teamEincomeRecordService.listCanRecieveUid(preSendTime, typeList, i + 1, pageSize);
            for (Long uid : list) {
                TeamOrderCMQManager.getInstance().addTeamDividentsMsg(new UidDateDTO(uid, preSendTime));
            }
fanli/src/main/java/com/yeshi/fanli/mapping/order/dividents/TeamDividentsSourceUserMapper.xml
@@ -119,5 +119,14 @@
    </select>
    <select id="selectBySourceUidAndDayAndUid" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        FROM
        yeshi_ec_team_dividents_source_user WHERE
        `tdsu_source_uid`=#{sourceUid} and tdsu_day=#{day} and
        tdsu_target_uid=#{targetUid}
    </select>
</mapper>
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderHongBaoMoneyComputeServiceImpl.java
@@ -1,12 +1,16 @@
package com.yeshi.fanli.service.impl.order;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
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.service.inter.order.OrderHongBaoMoneyComputeService;
@@ -75,7 +79,6 @@
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        else
            return null;
    }
    @Override
@@ -202,4 +205,199 @@
        return rate;
    }
    private BigDecimal getRateByLevel(UserLevelEnum level) {
        if (level == UserLevelEnum.daRen)
            return new BigDecimal(58);
        else if (level == UserLevelEnum.normalVIP)
            return new BigDecimal(66);
        else if (level == UserLevelEnum.highVIP)
            return new BigDecimal(78);
        else if (level == UserLevelEnum.superVIP)
            return new BigDecimal(85);
        else if (level == UserLevelEnum.tearcher)
            return new BigDecimal(86);
        return null;
    }
    @Override
    public UserTeamRate getTeamRewardRate(UserLevelEnum buyerLevel, List<UserTeamLevel> bossLevelList,
            int deep) {
        if (deep == 1) {// 直接邀请人奖金
            UserTeamLevel boss = bossLevelList.get(0);
            BigDecimal rate = null;
            if (bossLevelList == null || bossLevelList.size() < 1)
                return null;
            if (buyerLevel == UserLevelEnum.daRen && boss.getLevel() == UserLevelEnum.daRen) {
                rate = new BigDecimal(9);
            } else if (buyerLevel == UserLevelEnum.normalVIP && boss.getLevel() == UserLevelEnum.normalVIP) {
                rate = new BigDecimal(9);
            } else {
                BigDecimal bossRate = getRateByLevel(boss.getLevel());
                BigDecimal buyerRate = getRateByLevel(buyerLevel);
                rate = bossRate.subtract(buyerRate);
                if (rate.compareTo(new BigDecimal(0)) < 0)
                    rate = new BigDecimal(0);
            }
            return new UserTeamRate(boss.getUid(), boss.getLevel(), rate);
        } else if (deep == 2) {// 间接邀请人奖金
            if (bossLevelList == null || bossLevelList.size() < 2)
                return null;
            BigDecimal buyerRate = getRateByLevel(buyerLevel);
            BigDecimal firstRate = getTeamRewardRate(buyerLevel, bossLevelList, 1).getRate();
            UserTeamLevel boss = bossLevelList.get(1);
            UserTeamLevel firstBoss = bossLevelList.get(0);
            BigDecimal rate = null;
            if (buyerLevel == UserLevelEnum.daRen && firstBoss.getLevel() == UserLevelEnum.daRen) {
                if (boss.getLevel() == UserLevelEnum.daRen)
                    rate = new BigDecimal(1);
                else {
                    rate = null;
                }
            } else if (buyerLevel == UserLevelEnum.normalVIP && firstBoss.getLevel() == UserLevelEnum.normalVIP) {
                if (boss.getLevel() == UserLevelEnum.normalVIP)
                    rate = new BigDecimal(1);
                else {
                    rate = null;
                }
            }
            // 极差计算法
            if (rate == null) {
                rate = getRateByLevel(boss.getLevel()).subtract(buyerRate).subtract(firstRate);
                if (rate.compareTo(new BigDecimal(0)) < 0)
                    rate = new BigDecimal(0);
            }
            return new UserTeamRate(boss.getUid(), boss.getLevel(), rate);
        } else
            return null;
    }
    @Override
    public List<UserTeamRate> getTeamRewardMoreThan2LevelRates(UserLevelEnum buyerLevel,
            List<UserTeamLevel> bossLevelList) {
        if (bossLevelList == null || bossLevelList.size() < 3)
            return null;
        UserTeamRate firstBoss = getTeamRewardRate(buyerLevel, bossLevelList, 1);
        if (firstBoss == null)
            return null;
        UserTeamRate secondBoss = getTeamRewardRate(buyerLevel, bossLevelList, 2);
        if (secondBoss == null)
            return null;
        BigDecimal buyerRate = getRateByLevel(buyerLevel);
        BigDecimal totalRate = firstBoss.getRate().add(secondBoss.getRate()).add(buyerRate);
        List<UserTeamRate> rateList = new ArrayList<>();
        for (int i = 2; i < bossLevelList.size(); i++) {
            BigDecimal rate = getRateByLevel(bossLevelList.get(i).getLevel());
            if (rate.compareTo(totalRate) > 0) {
                BigDecimal subRate = rate.subtract(totalRate);
                totalRate = subRate.add(totalRate);// 累计分成比例
                rateList.add(new UserTeamRate(bossLevelList.get(i).getUid(), bossLevelList.get(i).getLevel(), subRate));
            }
        }
        return rateList;
    }
    // 团队分红
    @Override
    public List<UserTeamRate> getTeamDividentsRates(UserLevelEnum buyerLevel,
            List<UserTeamLevel> bossLevelList) {
        List<UserTeamRate> rateList = new ArrayList<>();
        List<UserTeamLevel> levelList = new ArrayList<>();
        levelList.add(new UserTeamLevel(null, buyerLevel));
        levelList.addAll(bossLevelList);
        UserLevelEnum maxLevel = buyerLevel;
        List<UserTeamLevel> vipList = new ArrayList<>();
        List<UserTeamLevel> highList = new ArrayList<>();
        for (int i = 1; i < levelList.size(); i++) {
            if (maxLevel.getLevel() <= levelList.get(i).getLevel().getLevel()) {
                maxLevel = levelList.get(i).getLevel();
                if (levelList.get(i).getLevel() == UserLevelEnum.highVIP)
                    highList.add(levelList.get(i));
                else if (levelList.get(i).getLevel() == UserLevelEnum.superVIP) {
                    vipList.add(levelList.get(i));
                }
            }
        }
        if (vipList.size() >= 4) {// 最多分4级
            vipList = vipList.subList(0, 4);
        }
        if (highList.size() >= 4) {// 最多分4级
            highList = highList.subList(0, 4);
        }
        BigDecimal highTotalRate = new BigDecimal("0.9");
        BigDecimal vipTotalRate = new BigDecimal("1.5");
        if (vipList.size() > 0 && highList.size() > 0) {
        } else if (vipList.size() == 0) {
            highTotalRate = highTotalRate.add(vipTotalRate);
        } else {
            vipTotalRate = highTotalRate.add(vipTotalRate);
        }
        // 高级会员分红
        if (highList.size() > 0) {
            int count = 0;
            for (int i = 0; i < highList.size(); i++) {
                count += (4 - i);
            }
            BigDecimal per = MoneyBigDecimalUtil.div(highTotalRate, new BigDecimal(count), 4);
            for (int i = 0; i < highList.size(); i++) {
                BigDecimal rate = MoneyBigDecimalUtil.mul(per, new BigDecimal(4 - i), 4);
                rateList.add(new UserTeamRate(highList.get(i), rate));
            }
        }
        // 超级会员分红
        if (vipList.size() > 0) {
            int count = 0;
            for (int i = 0; i < vipList.size(); i++) {
                count += (4 - i);
            }
            BigDecimal per = MoneyBigDecimalUtil.div(vipTotalRate, new BigDecimal(count), 4);
            for (int i = 0; i < vipList.size(); i++) {
                BigDecimal rate = MoneyBigDecimalUtil.mul(per, new BigDecimal(4 - i), 4);
                rateList.add(new UserTeamRate(vipList.get(i), rate));
            }
        }
        // 导师分红
        for (UserTeamLevel level : bossLevelList) {
            if (level.getLevel() == UserLevelEnum.tearcher) {
                rateList.add(new UserTeamRate(level, new BigDecimal("0.6")));
                break;
            }
        }
        return rateList;
    }
    @Override
    public UserTeamRate getTearcherSubsidy(UserLevelEnum buyerLevel, BigDecimal money,
            List<UserTeamLevel> bossLevelList) {
        // TODO Auto-generated method stub
        return null;
    }
}
fanli/src/main/java/com/yeshi/fanli/service/impl/order/dividents/TeamDividentsSourceOrderServiceImpl.java
@@ -1,7 +1,7 @@
package com.yeshi.fanli.service.impl.order.dividents;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
@@ -22,7 +22,7 @@
    private TeamDividentsSourceOrderMapper teamDividentsSourceOrderMapper;
    @Override
    public void addTeamDividentsSourceOrder(TeamDividentsSourceOrder order)
    public TeamDividentsSourceOrder addTeamDividentsSourceOrder(TeamDividentsSourceOrder order)
            throws TeamDividentsSourceOrderException, ParamsException {
        if (order == null || order.getMoney() == null || StringUtil.isNullOrEmpty(order.getOrderNo())
                || order.getSourceType() == null || order.getState() == null || order.getUid() == null
@@ -36,31 +36,8 @@
        if (order.getCreateTime() == null)
            order.setCreateTime(new Date());
        teamDividentsSourceOrderMapper.insertSelective(order);
    }
    @Override
    public List<TeamDividentsSourceOrder> listCanSendByUidAndPreSendTime(Long uid, Date preSendTime, int page,
            int pageSize) {
        return teamDividentsSourceOrderMapper.lisByUidAndPreSendTimeAndState(uid, preSendTime,
                TeamDividentsSourceOrder.STATE_CAN_SEND, (page - 1) * pageSize, pageSize);
    }
    @Override
    public long countCanSendByUidAndPreSendTime(Long uid, Date preSendTime) {
        return teamDividentsSourceOrderMapper.countByUidAndPreSendTimeAndState(uid, preSendTime,
                TeamDividentsSourceOrder.STATE_CAN_SEND);
    }
    @Override
    public List<Long> listCanSendUidByPreSendTime(Date preSendTime, int page, int pageSize) {
        return teamDividentsSourceOrderMapper.listUidByPreSendTimeAndState(preSendTime,
                TeamDividentsSourceOrder.STATE_CAN_SEND, (page - 1) * pageSize, pageSize);
    }
    @Override
    public Long countCanSendUidByPreSendTime(Date preSendTime) {
        return teamDividentsSourceOrderMapper.countUidByPreSendTimeAndState(preSendTime,
                TeamDividentsSourceOrder.STATE_CAN_SEND);
        return order;
    }
    @Override
@@ -112,4 +89,38 @@
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void orderSettle(String orderNo, int sourceType, Date preSendTime, BigDecimal income) {
        TeamDividentsSourceOrder order = selectByOrderNoSourceType(orderNo, sourceType);
        if (order == null)
            return;
        if (order.getState() == TeamDividentsSourceOrder.STATE_UNKOWN) {
            TeamDividentsSourceOrder update = new TeamDividentsSourceOrder();
            update.setId(order.getId());
            update.setMoney(income);
            update.setState(TeamDividentsSourceOrder.STATE_CAN_SEND);
            update.setPreSendTime(preSendTime);
            update.setUpdateTime(new Date());
            teamDividentsSourceOrderMapper.updateByPrimaryKeySelective(update);
        }
    }
    @Override
    public void updateMoney(String orderNo, int sourceType, BigDecimal money) {
        TeamDividentsSourceOrder order = selectByOrderNoSourceType(orderNo, sourceType);
        if (order == null)
            return;
        if (order.getState() == TeamDividentsSourceOrder.STATE_UNKOWN) {
            TeamDividentsSourceOrder update = new TeamDividentsSourceOrder();
            update.setId(order.getId());
            update.setMoney(money);
            update.setUpdateTime(new Date());
            teamDividentsSourceOrderMapper.updateByPrimaryKeySelective(update);
        }
    }
}
fanli/src/main/java/com/yeshi/fanli/service/impl/order/dividents/TeamDividentsSourceOrderUserMapServiceImpl.java
New file
@@ -0,0 +1,89 @@
package com.yeshi.fanli.service.impl.order.dividents;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrderUserMap;
import com.yeshi.fanli.exception.ParamsException;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderUserMapService;
@Service
public class TeamDividentsSourceOrderUserMapServiceImpl implements TeamDividentsSourceOrderUserMapService {
    @Override
    public TeamDividentsSourceOrderUserMap selectByPrimaryKeyForUpdate(Long id) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void send(Long id) {
        // TODO Auto-generated method stub
    }
    @Override
    public void addDividentsSourceOrderUserMap(TeamDividentsSourceOrderUserMap map) throws ParamsException {
        // TODO Auto-generated method stub
    }
    @Override
    public List<TeamDividentsSourceOrderUserMap> listCanSend(Long sourceUid, Date maxPreSendTime, int page,
            int pageSize) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public long countCanSend(Long sourceUid, Date maxPreSendTime) {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public long countBySourceOrderId(Long sourceOrderId) {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public List<TeamDividentsSourceOrderUserMap> listBySourceOrderId(Long sourceOrderId) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public List<Long> listCanSendSourceUidByPreSendTime(Date preSendTime, int page, int count) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public Long countCanSendSourceUidByPreSendTime(Date preSendTime) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void invalidBySourceOrderId(Long sourceOrderId) {
        // TODO Auto-generated method stub
    }
    @Override
    public void orderSettle(Long sourceOrderId, Date preSendTime, BigDecimal income) {
        // TODO Auto-generated method stub
    }
    @Override
    public void updateMoney(Long sourceOrderId, BigDecimal income) {
        // TODO Auto-generated method stub
    }
}
fanli/src/main/java/com/yeshi/fanli/service/impl/order/dividents/TeamDividentsSourceUserServiceImpl.java
@@ -54,4 +54,9 @@
        return teamDividentsSourceUserMapper.countTargetUidByDay(day);
    }
    @Override
    public TeamDividentsSourceUser selectBySourceUidAndDayAndUid(Long sourceUid, Long targetUid, String day) {
        return teamDividentsSourceUserMapper.selectBySourceUidAndDayAndUid(sourceUid, targetUid, day);
    }
}
fanli/src/main/java/com/yeshi/fanli/service/inter/order/OrderHongBaoMoneyComputeService.java
@@ -2,7 +2,10 @@
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
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;
@@ -110,7 +113,6 @@
    public BigDecimal computeSecondTeamSubsidy(BigDecimal fanLiMoney, Date placeOrderTime, UserLevelEnum buyerUserLevel,
            UserLevelEnum userLevel);
    /**
     * 计算团队补贴
     * @param date 下单时间
@@ -119,6 +121,65 @@
     * @param direct 是否直接邀请关系
     * @return
     */
    public BigDecimal getTeamSubsidyRate(Date date, UserLevelEnum buyerUserLevel, UserLevelEnum userLevel, boolean direct);
    public BigDecimal getTeamSubsidyRate(Date date, UserLevelEnum buyerUserLevel, UserLevelEnum userLevel,
            boolean direct);
    /**
     * 获取团队奖金
     * @Title: getTeamReward
     * @Description:
     * @param buyerLevel
     * @param money
     * @param levelList
     * @param deep 1-直接奖金  2-间接奖金
     * @return
     * BigDecimal 返回类型
     * @throws
     */
    public UserTeamRate getTeamRewardRate(UserLevelEnum buyerLevel, List<UserTeamLevel> bossLevelList,
            int deep);
    /**
     * 获取二级外的团队奖金
     * @Title: getTeamRewardMoreThan2Level
     * @Description:
     * @param buyerLevel
     * @param money
     * @param bossLevelList
     * @param deep
     * @return
     * UserTeamMoney 返回类型
     * @throws
     */
    public List<UserTeamRate> getTeamRewardMoreThan2LevelRates(UserLevelEnum buyerLevel,
            List<UserTeamLevel> bossLevelList);
    /**
     * 获取分红
     * @Title: getTeamDividents
     * @Description:
     * @param buyerLevel
     * @param money
     * @param bossLevelList
     * @return
     * List<UserTeamMoney> 返回类型
     * @throws
     */
    public List<UserTeamRate> getTeamDividentsRates(UserLevelEnum buyerLevel,
            List<UserTeamLevel> bossLevelList);
    /**
     * 获取资深导师 补贴
     * @Title: getTearcherSubsidy
     * @Description:
     * @param buyerLevel
     * @param money
     * @param bossLevelList
     * @return
     * UserTeamMoney 返回类型
     * @throws
     */
    public UserTeamRate getTearcherSubsidy(UserLevelEnum buyerLevel, BigDecimal rate,
            List<UserTeamLevel> bossLevelList);
}
fanli/src/main/java/com/yeshi/fanli/service/inter/order/dividents/TeamDividentsSourceOrderService.java
@@ -1,7 +1,7 @@
package com.yeshi.fanli.service.inter.order.dividents;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrder;
import com.yeshi.fanli.exception.ParamsException;
@@ -17,56 +17,8 @@
     * void 返回类型
     * @throws
     */
    public void addTeamDividentsSourceOrder(TeamDividentsSourceOrder order) throws TeamDividentsSourceOrderException,ParamsException;
    /**
     *
     * @Title: listCanSendByUidAndPreSendTime
     * @Description:
     * @param uid
     * @param preSendTime
     * @return
     * List<TeamDividentsSourceOrder> 返回类型
     * @throws
     */
    public List<TeamDividentsSourceOrder> listCanSendByUidAndPreSendTime(Long uid, Date preSendTime, int page,
            int pageSize);
    /**
     *
     * @Title: countCanSendByUidAndPreSendTime
     * @Description:
     * @param uid
     * @param preSendTime
     * @return
     * long 返回类型
     * @throws
     */
    public long countCanSendByUidAndPreSendTime(Long uid, Date preSendTime);
    /**
     * 获取能够分红的订单源用户ID列表
     * @Title: listCanSendUidByPreSendTime
     * @Description:
     * @param preSendTime
     * @param page
     * @param count
     * @return
     * List<Long> 返回类型
     * @throws
     */
    public List<Long> listCanSendUidByPreSendTime(Date preSendTime, int page, int count);
    /**
     * 获取能够分红的订单源用户ID数量
     * @Title: countCanSendUidByPreSendTime
     * @Description:
     * @param preSendTime
     * @return
     * Long 返回类型
     * @throws
     */
    public Long countCanSendUidByPreSendTime(Date preSendTime);
    public TeamDividentsSourceOrder addTeamDividentsSourceOrder(TeamDividentsSourceOrder order)
            throws TeamDividentsSourceOrderException, ParamsException;
    /**
     * 根据主键查询
@@ -111,8 +63,7 @@
     * @throws
     */
    public void send(Long id);
    /**
     * 根据订单查询
     * @Title: selectByOrderNoSourceType
@@ -123,6 +74,30 @@
     * TeamDividentsSourceOrder 返回类型
     * @throws
     */
    public TeamDividentsSourceOrder selectByOrderNoSourceType(String orderNo,int sourceType);
    public TeamDividentsSourceOrder selectByOrderNoSourceType(String orderNo, int sourceType);
    /**
     * 订单结算
     * @Title: orderSettle
     * @Description:
     * @param orderNo
     * @param sourceType
     * @param income
     * void 返回类型
     * @throws
     */
    public void orderSettle(String orderNo, int sourceType,Date preSendTime, BigDecimal income);
    /**
     * 更新资金
     * @Title: updateMoney
     * @Description:
     * @param orderNo
     * @param sourceType
     * @param money
     * void 返回类型
     * @throws
     */
    public void updateMoney(String orderNo, int sourceType, BigDecimal money);
}
fanli/src/main/java/com/yeshi/fanli/service/inter/order/dividents/TeamDividentsSourceOrderUserMapService.java
New file
@@ -0,0 +1,145 @@
package com.yeshi.fanli.service.inter.order.dividents;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrderUserMap;
import com.yeshi.fanli.exception.ParamsException;
/**
 * 分红源订单与参与分红用户的对应关系
 * @author Administrator
 *
 */
public interface TeamDividentsSourceOrderUserMapService {
    public TeamDividentsSourceOrderUserMap selectByPrimaryKeyForUpdate(Long id);
    /**
     * 发送到用户分红表
     * @Title: send
     * @Description:
     * @param id
     * void 返回类型
     * @throws
     */
    public void send(Long id);
    /**
     * 添加映射
     * @Title: addDividentsSourceOrderUserMap
     * @Description:
     * @param map
     * @throws ParamsException
     * void 返回类型
     * @throws
     */
    public void addDividentsSourceOrderUserMap(TeamDividentsSourceOrderUserMap map) throws ParamsException;
    /**
     * 获取可以发送的列表
     * @Title: listCanSend
     * @Description:
     * @param sourceUid
     * @param maxPreSendTime
     * @param page
     * @param pageSize
     * @return
     * List<TeamDividentsSourceOrderUserMap> 返回类型
     * @throws
     */
    public List<TeamDividentsSourceOrderUserMap> listCanSend(Long sourceUid, Date maxPreSendTime, int page,
            int pageSize);
    /**
     * 获取可以发送的列表数量
     * @Title: countCanSend
     * @Description:
     * @param sourceUid
     * @param maxPreSendTime
     * @return
     * long 返回类型
     * @throws
     */
    public long countCanSend(Long sourceUid, Date maxPreSendTime);
    /**
     * 根据源订单主键查询
     * @Title: countBySourceOrderId
     * @Description:
     * @param sourceOrderId
     * @return
     * long 返回类型
     * @throws
     */
    public long countBySourceOrderId(Long sourceOrderId);
    /**
     * 根据源订单主键查询
     * @Title: listBySourceOrderId
     * @Description:
     * @param sourceOrderId
     * @return
     * List<TeamDividentsSourceOrderUserMap> 返回类型
     * @throws
     */
    public List<TeamDividentsSourceOrderUserMap> listBySourceOrderId(Long sourceOrderId);
    /**
     * 获取能够分红的订单源用户列表
     * @Title: listCanSendSourceUidByPreSendTime
     * @Description:
     * @param preSendTime
     * @param page
     * @param count
     * @return
     * List<Long> 返回类型
     * @throws
     */
    public List<Long> listCanSendSourceUidByPreSendTime(Date preSendTime, int page, int count);
    /**
     * 获取能够分红的订单源用户ID数量
     * @Title: countCanSendUidByPreSendTime
     * @Description:
     * @param preSendTime
     * @return
     * Long 返回类型
     * @throws
     */
    public Long countCanSendSourceUidByPreSendTime(Date preSendTime);
    /**
     * 订单失效
     * @Title: invalidBySourceOrderId
     * @Description:
     * @param sourceOrderId
     * void 返回类型
     * @throws
     */
    public void invalidBySourceOrderId(Long sourceOrderId);
    /**
     * 订单结算
     * @Title: orderSettle
     * @Description:
     * @param sourceOrderId
     * @param income
     * void 返回类型
     * @throws
     */
    public void orderSettle(Long sourceOrderId, Date preSendTime, BigDecimal income);
    /**
     * 订单变化更新资金
     * @Title: updateMoney
     * @Description:
     * @param sourceOrderId
     * @param income
     * void 返回类型
     * @throws
     */
    public void updateMoney(Long sourceOrderId, BigDecimal income);
}
fanli/src/main/java/com/yeshi/fanli/service/inter/order/dividents/TeamDividentsSourceUserService.java
@@ -53,6 +53,10 @@
     * @throws
     */
    public List<TeamDividentsSourceUser> listBySourceUidAndDay(Long sourceUid, String day);
    public TeamDividentsSourceUser selectBySourceUidAndDayAndUid(Long sourceUid,Long targetUid, String day);
    /**
     * 计算用户数量
fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsManager.java
@@ -13,34 +13,27 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.vip.TeamUserLevelStatistic;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.order.CommonOrder;
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.exception.order.dividents.TeamDividentsSourceOrderException;
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.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.factory.order.dividents.TeamDividentsSourceOrderFactory;
import com.yeshi.fanli.util.user.UserLevelUtil;
/**
 * 团队分红管理
@@ -51,7 +44,13 @@
public class TeamDividentsManager {
    @Resource
    private TeamDividentsSourceManager teamDividentsSourceManager;
    @Resource
    private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
    @Resource
    private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
    @Resource
    private TeamDividentsSourceUserService teamDividentsSourceUserService;
@@ -77,25 +76,6 @@
    @Resource
    private TeamEincomeManager teamEincomeManager;
    @Transactional(rollbackFor = Exception.class)
    public void addDividentsSourceOrder(List<CommonOrder> commonOrderList) throws TeamDividentsSourceOrderException {
        if (commonOrderList.get(0).getThirdCreateTime().getTime() < Constant.NEW_ORDER_FANLI_RULE_TIME)
            return;
        UserLevelEnum level = UserLevelUtil.getByOrderRank(commonOrderList.get(0).getUrank());
        if (level == null)
            level = UserLevelEnum.daRen;
        BigDecimal rate = getSourceOrderDividentsRate(level);
        TeamDividentsSourceOrder order = TeamDividentsSourceOrderFactory.create(commonOrderList, rate);
        if (order == null)
            return;
        try {
            teamDividentsSourceOrderService.addTeamDividentsSourceOrder(order);
        } catch (ParamsException e) {
            throw new TeamDividentsSourceOrderException(101, "参数不完整");
        }
    }
    /**
     *  开始分红
     * @Title: startDividents
@@ -111,107 +91,38 @@
        startDividents(sourceUid, preSendTime);
    }
    // 是否可以分红
    private boolean isCanDividents(TeamUserLevelStatistic tus) {
//        if (Constant.IS_TEST && tus.getLevel() != UserLevelEnum.daRen && tus.getLevel() != UserLevelEnum.normalVIP)
//            return true;
        if (tus != null && (tus.getLevel() == UserLevelEnum.highVIP || tus.getLevel() == UserLevelEnum.superVIP
                || tus.getLevel() == UserLevelEnum.tearcher)) {
            if (tus.getLevel() == UserLevelEnum.tearcher) {
                int firstCount = tus.getSuperFirstCount() + tus.getTearcherFirstCount();
                int secondCount = tus.getHighSecondCount() + tus.getSuperSecondCount() + tus.getTearcherSecondCount();
                if (firstCount >= 3 && secondCount >= 3) {// 直接粉丝超级会员等级以上的用户>=3
                    // 间接粉丝普通会员以上等级>=3
                    return true;
                } else {
                    // 如果导师不满足条件就需要降级为超级会员
                    tus.setLevel(UserLevelEnum.superVIP);
                }
            }
            if (tus.getLevel() == UserLevelEnum.superVIP) {
                int firstCount = tus.getSuperFirstCount() + tus.getTearcherFirstCount();
                int secondCount = tus.getNormalSecondCount() + tus.getHighSecondCount() + tus.getSuperSecondCount()
                        + tus.getTearcherSecondCount();
                if (firstCount >= 3 && secondCount >= 3) {// 直接粉丝超级会员等级以上的用户>=3
                                                            // 间接粉丝普通会员以上等级>=3
                    return true;
                } else {
                    // 如果超级会员不满足条件就需要降级为高级会员
                    tus.setLevel(UserLevelEnum.highVIP);
                }
            }
            if (tus.getLevel() == UserLevelEnum.highVIP) {
                int vipFirstCount = tus.getNormalFirstCount() + tus.getHighFirstCount() + tus.getSuperFirstCount()
                        + tus.getTearcherFirstCount();
                if (vipFirstCount >= 3)// 直接粉丝普通会员等级以上的用户>=3
                    return true;
            }
        }
        return false;
    }
    @Transactional(rollbackFor = Exception.class)
    public void startDividents(Long sourceUid, Date preSendTime) throws ParamsException {
        String day = TimeUtil.getGernalTime(preSendTime.getTime(), "yyyy-MM-dd");
        // 查询出可用于分红的用户的总金额
        long count = teamDividentsSourceOrderService.countCanSendByUidAndPreSendTime(sourceUid, preSendTime);
        long count = teamDividentsSourceOrderUserMapService.countCanSend(sourceUid, preSendTime);
        int pageSize = 1000;
        int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
        List<TeamDividentsSourceOrder> totalList = new ArrayList<>();
        List<TeamDividentsSourceOrderUserMap> totalList = new ArrayList<>();
        for (int p = 0; p < page; p++) {
            List<TeamDividentsSourceOrder> list = teamDividentsSourceOrderService
                    .listCanSendByUidAndPreSendTime(sourceUid, preSendTime, p + 1, pageSize);
            List<TeamDividentsSourceOrderUserMap> list = teamDividentsSourceOrderUserMapService.listCanSend(sourceUid,
                    preSendTime, p + 1, pageSize);
            if (list != null && list.size() > 0)
                totalList.addAll(list);
        }
        BigDecimal totalMoney = new BigDecimal(0);
        Map<Long, BigDecimal> moneyMap = new HashMap<>();
        for (TeamDividentsSourceOrder order : totalList) {
            TeamDividentsSourceOrder sourceOrder = teamDividentsSourceOrderService
        for (TeamDividentsSourceOrderUserMap order : totalList) {
            TeamDividentsSourceOrderUserMap map = teamDividentsSourceOrderUserMapService
                    .selectByPrimaryKeyForUpdate(order.getId());
            if (sourceOrder != null && sourceOrder.getState() == TeamDividentsSourceOrder.STATE_CAN_SEND) {
                totalMoney = totalMoney.add(sourceOrder.getMoney());
                teamDividentsSourceOrderService.send(sourceOrder.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());
            }
        }
        // 分红金额为0的不参与
        if (totalMoney.compareTo(new BigDecimal(0)) <= 0)
            return;
        // 查询出可以参与分红的用户
        List<ThreeSale> threeSalesList = threeSaleSerivce.getMyBossDeepList(sourceUid);
        if (threeSalesList == null)
            return;
        Map<Long, UserLevelEnum> uidLevelMap = new HashMap<Long, UserLevelEnum>();
        for (ThreeSale ts : threeSalesList) {
            if (ts.getBoss() != null) {
                TeamUserLevelStatistic tus = teamUserLevelStatisticService.selectByUid(ts.getBoss().getId());
                if (tus == null)
                    teamUserLevelStatisticService.initData(ts.getBoss().getId());
                tus = teamUserLevelStatisticService.selectByUid(ts.getBoss().getId());
                if (isCanDividents(tus)) {
                    uidLevelMap.put(tus.getId(), tus.getLevel());
                }
            }
        }
        // 没有参与分红的用户
        if (uidLevelMap == null || uidLevelMap.size() == 0) {
            return;
        }
        BigDecimal perDivident = computePerDivident(uidLevelMap, totalMoney);
        for (Iterator<Long> its = uidLevelMap.keySet().iterator(); its.hasNext();) {
        for (Iterator<Long> its = moneyMap.keySet().iterator(); its.hasNext();) {
            Long uid = its.next();
            BigDecimal dividents = computeUserDivident(perDivident, uidLevelMap.get(uid));
            BigDecimal dividents = moneyMap.get(uid).setScale(2, BigDecimal.ROUND_DOWN);
            // 将资金分配到参与分红的用户
            TeamDividentsSourceUser teamDividentsSourceUser = new TeamDividentsSourceUser();
            teamDividentsSourceUser.setDay(day);
@@ -220,33 +131,6 @@
            teamDividentsSourceUser.setTargetUid(uid);
            teamDividentsSourceUserService.addTeamDividentsSourceUser(teamDividentsSourceUser);
        }
    }
    // 计算平均分红
    private BigDecimal computePerDivident(Map<Long, UserLevelEnum> uidLevels, BigDecimal totalMoney) {
        BigDecimal count = new BigDecimal(0);
        for (Iterator<Long> its = uidLevels.keySet().iterator(); its.hasNext();) {
            Long uid = its.next();
            if (uidLevels.get(uid) == UserLevelEnum.highVIP) {
                count = count.add(new BigDecimal(1));
            } else if (uidLevels.get(uid) == UserLevelEnum.superVIP) {
                count = count.add(new BigDecimal(2));
            } else if (uidLevels.get(uid) == UserLevelEnum.tearcher) {
                count = count.add(new BigDecimal(2.5));
            }
        }
        return MoneyBigDecimalUtil.div(totalMoney, count);
    }
    private BigDecimal computeUserDivident(BigDecimal perDivident, UserLevelEnum userLevel) {
        if (userLevel == UserLevelEnum.highVIP) {
            return perDivident;
        } else if (userLevel == UserLevelEnum.superVIP) {
            return MoneyBigDecimalUtil.mul(perDivident, new BigDecimal(2));
        } else if (userLevel == UserLevelEnum.tearcher) {
            return MoneyBigDecimalUtil.mul(perDivident, new BigDecimal(2.5));
        }
        return null;
    }
    /**
@@ -259,7 +143,7 @@
     */
    public boolean isSourceUserComupteFinish(String day) {
        Date preSendTime = new Date(TimeUtil.convertToTimeTemp(day, "yyyy-MM-dd"));
        long count = teamDividentsSourceOrderService.countCanSendByUidAndPreSendTime(null, preSendTime);
        long count = teamDividentsSourceOrderUserMapService.countCanSend(null, preSendTime);
        return count == 0;
    }
@@ -320,57 +204,65 @@
    @Transactional(rollbackFor = Exception.class)
    public void weiQuan(String orderNo, int sourceType) throws TeamDividentsDebtException {
        // 查询订单是否已经分红
        TeamDividentsSourceOrder sourceOrder = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo,
                sourceType);
        if (sourceOrder == null)
            return;
        if (sourceOrder.getState() == TeamDividentsSourceOrder.STATE_INVALID)
        TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
        if (order == null)
            return;
        if (sourceOrder.getState() == TeamDividentsSourceOrder.STATE_ALREADY_SEND) {// 已经发送,需要参与分红的人分摊
            BigDecimal money = sourceOrder.getMoney();
            // 查询参与这一单分红的人
            String day = TimeUtil.getGernalTime(sourceOrder.getSendTime().getTime(), "yyyy-MM-dd");
            if (Constant.IS_TEST)
                day = TimeUtil.getGernalTime(sourceOrder.getPreSendTime().getTime(), "yyyy-MM-dd");
        List<TeamDividentsSourceOrderUserMap> mapList = teamDividentsSourceOrderUserMapService
                .listBySourceOrderId(order.getId());
        if (mapList == null || mapList.size() == 0)
            return;
            List<TeamDividentsSourceUser> list = teamDividentsSourceUserService
                    .listBySourceUidAndDay(sourceOrder.getUid(), day);
            // 计算每个人的比例
            BigDecimal total = new BigDecimal(0);
            for (TeamDividentsSourceUser su : list) {
                total = total.add(su.getMoney());
        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 (TeamDividentsSourceUser su : list) {
                BigDecimal debtMoney = MoneyBigDecimalUtil.divUp(money.multiply(su.getMoney()), total);
                // 需要偿还的资金
                TeamDividentsDebt debt = new TeamDividentsDebt();
                debt.setLeftMoney(debtMoney);
                debt.setOriginMoney(debtMoney);
                debt.setOrderNo(orderNo);
                debt.setSourceType(sourceType);
                debt.setUid(su.getTargetUid());
                // 加入待偿还记录
                teamDividentsDebtService.addDebt(debt);
            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 (sourceOrder.getState() == TeamDividentsSourceOrder.STATE_CAN_SEND) {
            teamDividentsSourceOrderService.invalidOrder(orderNo, sourceType, "订单维权");
        } else if (order.getState() == TeamDividentsSourceOrderUserMap.STATE_JS
                || order.getState() == TeamDividentsSourceOrderUserMap.STATE_FK) {
            teamDividentsSourceManager.invalidByOrder(orderNo, sourceType, "订单维权");
        }
    }
    /**
     * 获取源订单需要参与分红的比例
     * @Title: getSourceOrderDividentsRate
     * @Description:
     * @param level
     * @return
     * BigDecimal 返回类型
     * @throws
     */
    public BigDecimal getSourceOrderDividentsRate(UserLevelEnum level) {
        String rate = hongBaoManageService.get("team_source_order_dividents_" + level.getLevel());
        return new BigDecimal(rate);
    }
}
fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsSourceManager.java
New file
@@ -0,0 +1,199 @@
package com.yeshi.fanli.service.manger.order;
import java.math.BigDecimal;
import java.util.List;
import javax.annotation.Resource;
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;
    /**
     * @throws ParamsException
     * 添加分红源
     * @Title: addSource
     * @Description:
     * @param commonOrderList
     * @param bossList
     * void 返回类型
     * @throws
     */
    @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;
        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;
        // 计算团队分红比例
        List<UserTeamRate> rateList = orderHongBaoMoneyComputeService.getTeamDividentsRates(level, bossList);
        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);
        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, "参数不完整");
                }
            }
    }
    /**
     * 订单失效
     * @Title: invalidBySourceOrderId
     * @Description:
     * @param sourceOrderId
     * void 返回类型
     * @throws
     */
    @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());
        }
    }
    /**
     * 订单结算
     * @Title: orderSettle
     * @Description:
     * @param sourceOrderId
     * @param income
     * void 返回类型
     * @throws
     */
    @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;
            }
        }
    }
}
fanli/src/main/java/com/yeshi/fanli/util/MoneyBigDecimalUtil.java
@@ -19,6 +19,10 @@
    public static BigDecimal mul2(BigDecimal d1, BigDecimal d2) { // 进行乘法运算
        return d1.multiply(d2).setScale(2, BigDecimal.ROUND_DOWN);
    }
    public static BigDecimal mul(BigDecimal d1, BigDecimal d2,int scale) { // 进行乘法运算
        return d1.multiply(d2).setScale(scale, BigDecimal.ROUND_DOWN);
    }
    public static BigDecimal div(BigDecimal d1, BigDecimal d2) {// 进行除法运算
        return d1.divide(d2, 2, BigDecimal.ROUND_DOWN);
@@ -31,6 +35,10 @@
    public static BigDecimal div3(BigDecimal d1, BigDecimal d2) {// 进行除法运算
        return d1.divide(d2, 3, BigDecimal.ROUND_DOWN);
    }
    public static BigDecimal div(BigDecimal d1, BigDecimal d2,int scale) {// 进行除法运算
        return d1.divide(d2, scale, BigDecimal.ROUND_DOWN);
    }
    public static BigDecimal getWithNoZera(BigDecimal num) {// 进行除法运算
        while (num.toString().endsWith("0") && num.toString().indexOf(".") > -1) {
fanli/src/main/java/com/yeshi/fanli/util/factory/order/dividents/TeamDividentsSourceOrderFactory.java
@@ -7,41 +7,40 @@
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrder;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.order.CommonOrderUtil;
public class TeamDividentsSourceOrderFactory {
    public static TeamDividentsSourceOrder create(List<CommonOrder> commonOrderList,
            BigDecimal rate) {
    public static TeamDividentsSourceOrder create(List<CommonOrder> commonOrderList) {
        BigDecimal money = new BigDecimal(0);
        int invalidCount = 0;
        for (CommonOrder commonOrder : commonOrderList) {
            if (commonOrder.geteIncome() != null)
                money = money.add(commonOrder.geteIncome());
            if (commonOrder.getState() == CommonOrder.STATE_SX)
                invalidCount++;
        }
        if (invalidCount >= commonOrderList.size())
        int orderState = CommonOrderUtil.getState(commonOrderList);
        if (orderState == CommonOrder.STATE_SX)
            return null;
        if (money.compareTo(new BigDecimal(0)) <= 0)
            return null;
        BigDecimal dividents = MoneyBigDecimalUtil.div(money.multiply(rate), new BigDecimal(100));
        TeamDividentsSourceOrder sourceOrder = new TeamDividentsSourceOrder();
        sourceOrder.setMoney(dividents);
        sourceOrder.setMoney(money);
        sourceOrder.setOrderNo(commonOrderList.get(0).getOrderNo());
        sourceOrder.setSourceType(commonOrderList.get(0).getSourceType());
        sourceOrder.setState(TeamDividentsSourceOrder.STATE_CAN_SEND);
        sourceOrder.setUid(commonOrderList.get(0).getUserInfo().getId());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(commonOrderList.get(0).getSettleTime());
        calendar.add(Calendar.MONTH, 1);
        sourceOrder.setPreSendTime(new Date(TimeUtil.convertToTimeTemp(
                calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25", "yyyy-M-dd")));
        if (orderState == CommonOrder.STATE_JS || orderState == CommonOrder.STATE_WQ) {
            sourceOrder.setState(TeamDividentsSourceOrder.STATE_CAN_SEND);
            Date settlementTime = CommonOrderUtil.getSettlementTime(commonOrderList);
            if (settlementTime == null)
                return null;
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(settlementTime);
            calendar.add(Calendar.MONTH, 1);
            sourceOrder.setPreSendTime(new Date(TimeUtil.convertToTimeTemp(
                    calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25", "yyyy-M-dd")));
        } else {
            sourceOrder.setState(TeamDividentsSourceOrder.STATE_UNKOWN);
        }
        sourceOrder.setUid(commonOrderList.get(0).getUserInfo().getId());
        return sourceOrder;
    }
fanli/src/main/java/com/yeshi/fanli/util/factory/order/dividents/TeamDividentsSourceOrderUserMapFactory.java
New file
@@ -0,0 +1,24 @@
package com.yeshi.fanli.util.factory.order.dividents;
import java.math.BigDecimal;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrder;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrderUserMap;
public class TeamDividentsSourceOrderUserMapFactory {
    public static TeamDividentsSourceOrderUserMap create(TeamDividentsSourceOrder sourceOrder, Long targetUid,
            BigDecimal rate, BigDecimal money, int type) {
        TeamDividentsSourceOrderUserMap map = new TeamDividentsSourceOrderUserMap();
        map.setMoney(money);
        map.setPreSendTime(sourceOrder.getPreSendTime());
        map.setRate(rate);
        map.setSourceOrder(sourceOrder);
        map.setSourceUid(sourceOrder.getUid());
        map.setState(sourceOrder.getState());
        map.setTargetUid(targetUid);
        map.setType(type);
        return map;
    }
}
fanli/src/main/java/com/yeshi/fanli/util/order/CommonOrderUtil.java
New file
@@ -0,0 +1,99 @@
package com.yeshi.fanli.util.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.yeshi.fanli.entity.order.CommonOrder;
public class CommonOrderUtil {
    /**
     * 就算收益
     * @Title: computeIncome
     * @Description:
     * @param orderList
     * @return
     * BigDecimal 返回类型
     * @throws
     */
    public static BigDecimal computeIncome(List<CommonOrder> orderList) {
        if (orderList == null || orderList.size() == 0)
            return null;
        BigDecimal money = new BigDecimal(0);
        for (CommonOrder commonOrder : orderList)
            if (commonOrder.getState() != CommonOrder.STATE_SX && commonOrder.geteIncome() != null)
                money = money.add(commonOrder.geteIncome());
        return money;
    }
    /**
     * 计算预估收益
     * @Title: computeEstimate
     * @Description:
     * @param orderList
     * @return
     * BigDecimal 返回类型
     * @throws
     */
    public static BigDecimal computeEstimate(List<CommonOrder> orderList) {
        if (orderList == null || orderList.size() == 0)
            return null;
        BigDecimal money = new BigDecimal(0);
        for (CommonOrder commonOrder : orderList)
            if (commonOrder.getState() != CommonOrder.STATE_SX && commonOrder.getEstimate() != null)
                money = money.add(commonOrder.getEstimate());
        return money;
    }
    public static Integer getState(List<CommonOrder> orderList) {
        if (orderList == null || orderList.size() == 0)
            return null;
        int sxCount = 0;
        int wqCount = 0;
        int fkCount = 0;
        int jsCount = 0;
        for (CommonOrder order : orderList) {
            switch (order.getState()) {
            case CommonOrder.STATE_FK:
                fkCount++;
                break;
            case CommonOrder.STATE_JS:
                jsCount++;
                break;
            case CommonOrder.STATE_SX:
                sxCount++;
                break;
            case CommonOrder.STATE_WQ:
                wqCount++;
                break;
            }
        }
        if (sxCount == orderList.size())
            return CommonOrder.STATE_SX;
        if (wqCount + sxCount == orderList.size())
            return CommonOrder.STATE_WQ;
        if (wqCount + sxCount + jsCount == orderList.size())
            return CommonOrder.STATE_JS;
        return CommonOrder.STATE_FK;
    }
    public static Date getSettlementTime(List<CommonOrder> orderList) {
        if (orderList == null)
            return null;
        for (CommonOrder order : orderList) {
            switch (order.getState()) {
            case CommonOrder.STATE_JS:
            case CommonOrder.STATE_WQ:
                return order.getSettleTime();
            }
        }
        return null;
    }
}
fanli/src/main/java/com/yeshi/fanli/util/rocketmq/consumer/order/OrderDividentsMessageListener.java
@@ -1,6 +1,6 @@
package com.yeshi.fanli.util.rocketmq.consumer.order;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
@@ -14,18 +14,25 @@
import com.google.gson.Gson;
import com.yeshi.fanli.dto.mq.order.OrderTopicTagEnum;
import com.yeshi.fanli.dto.mq.order.body.OrderConfirmMQMsg;
import com.yeshi.fanli.dto.mq.order.body.OrderMQMsg;
import com.yeshi.fanli.dto.mq.order.body.OrderWeiQuanMQMsg;
import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum;
import com.yeshi.fanli.dto.mq.user.body.UserForbiddenMQMsg;
import com.yeshi.fanli.dto.order.UserTeamLevel;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.vip.TeamUserLevelStatistic;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.ParamsException;
import com.yeshi.fanli.exception.money.TeamDividentsDebtException;
import com.yeshi.fanli.exception.order.dividents.TeamDividentsSourceOrderException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.vip.TeamUserLevelStatisticService;
import com.yeshi.fanli.service.manger.order.TeamDividentsManager;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.service.manger.order.TeamDividentsSourceManager;
import com.yeshi.fanli.util.order.CommonOrderUtil;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
/**
@@ -44,6 +51,15 @@
    @Resource
    private TeamDividentsManager teamDividentsManager;
    @Resource
    private TeamDividentsSourceManager teamDividentsSourceManager;
    @Resource
    private ThreeSaleSerivce threeSaleSerivce;
    @Resource
    private TeamUserLevelStatisticService teamUserLevelStatisticService;
    public OrderDividentsMessageListener() {
@@ -65,31 +81,45 @@
                }
            }
        } else if (MQTopicName.TOPIC_ORDER.name().equalsIgnoreCase(message.getTopic())) {
            // 订单确认收货
            if (tag.equalsIgnoreCase(OrderTopicTagEnum.orderConfirm.name())) {
            if (tag.equalsIgnoreCase(OrderTopicTagEnum.orderStatistic.name())) {
                OrderMQMsg dto = new Gson().fromJson(new String(message.getBody()), OrderMQMsg.class);
                if (dto.getHandleType() == OrderMQMsg.HANDLE_TYPE_ADD) {
                    List<CommonOrder> commonOrderList = commonOrderService.listBySourceTypeAndOrderId(dto.getType(),
                            dto.getOrderId());
                    int state = CommonOrderUtil.getState(commonOrderList);
                    if (commonOrderList.size() > 0 && state != CommonOrder.STATE_SX) {
                        List<UserTeamLevel> bossList = new ArrayList<>();
                        List<ThreeSale> threeSalesList = threeSaleSerivce.getMyBossDeepList(dto.getUid(), 100);
                        if (threeSalesList != null)
                            for (ThreeSale ts : threeSalesList) {
                                TeamUserLevelStatistic levelStatistic = teamUserLevelStatisticService
                                        .selectByUid(ts.getBoss().getId());
                                if (levelStatistic == null) {
                                    teamUserLevelStatisticService.initData(ts.getBoss().getId());
                                    levelStatistic = teamUserLevelStatisticService.selectByUid(ts.getBoss().getId());
                                }
                                bossList.add(new UserTeamLevel(ts.getBoss().getId(), levelStatistic.getLevel()));
                            }
                        try {
                            teamDividentsSourceManager.addSource(commonOrderList, bossList);
                            return Action.CommitMessage;
                        } catch (TeamDividentsSourceOrderException e) {
                            if (e.getCode() == TeamDividentsSourceOrderException.CODE_EXIST) {
                                return Action.CommitMessage;
                            }
                        } catch (ParamsException e) {
                            e.printStackTrace();
                        }
                    }
                } else {
                    teamDividentsSourceManager.updateOrderMoney(dto.getOrderId(), dto.getType());
                }
            } else if (tag.equalsIgnoreCase(OrderTopicTagEnum.orderConfirm.name())) {// 订单确认收货
                // 插入分红
                OrderConfirmMQMsg dto = new Gson().fromJson(new String(message.getBody()), OrderConfirmMQMsg.class);
                List<CommonOrder> commonOrderList = commonOrderService.listBySourceTypeAndOrderId(dto.getSourceType(),
                        dto.getOrderNo());
                BigDecimal eincome = new BigDecimal(0);
                for (CommonOrder order : commonOrderList) {
                    if (order.getState() == CommonOrder.STATE_JS)
                        eincome = eincome.add(order.geteIncome());
                }
                try {
                    teamDividentsManager.addDividentsSourceOrder(commonOrderList);
                }
                catch (TeamDividentsSourceOrderException e) {
                    if (e.getCode() == TeamDividentsSourceOrderException.CODE_EXIST)
                        return Action.CommitMessage;
                    else {
                        e.printStackTrace();
                        return Action.ReconsumeLater;
                    }
                }
                teamDividentsSourceManager.orderSettle(dto.getOrderNo(), dto.getSourceType());
            } else if (tag.equalsIgnoreCase(OrderTopicTagEnum.taoBaoOrderWeiQuan.name())) {
                OrderWeiQuanMQMsg dto = new Gson().fromJson(new String(message.getBody()), OrderWeiQuanMQMsg.class);
                try {