| | |
| | | * @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); |
| | | } |
New file |
| | |
| | | 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;
|
| | | }
|
| | | }
|
New file |
| | |
| | | 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;
|
| | | }
|
| | | }
|
| | |
| | |
|
| | | 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");
|
| | |
| | | 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;
|
New file |
| | |
| | | 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;
|
| | | }
|
| | |
|
| | | }
|
| | |
| | | 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;
|
| | |
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceUserService teamDividentsSourceUserService;
|
| | |
| | |
|
| | | 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);
|
| | | }
|
| | |
| | | </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> |
| | |
| | | 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;
|
| | |
| | | return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
|
| | | else
|
| | | return null;
|
| | |
|
| | | }
|
| | |
|
| | | @Override
|
| | |
| | | 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;
|
| | | }
|
| | |
|
| | | }
|
| | |
| | | package com.yeshi.fanli.service.impl.order.dividents;
|
| | |
|
| | | import java.math.BigDecimal;
|
| | | import java.util.Date;
|
| | | import java.util.List;
|
| | |
|
| | | import javax.annotation.Resource;
|
| | |
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
| | |
|
| | | }
|
| | |
|
| | | @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);
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | }
|
New file |
| | |
| | | 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
|
| | |
|
| | | }
|
| | |
|
| | | }
|
| | |
| | | return teamDividentsSourceUserMapper.countTargetUidByDay(day);
|
| | | }
|
| | |
|
| | | @Override
|
| | | public TeamDividentsSourceUser selectBySourceUidAndDayAndUid(Long sourceUid, Long targetUid, String day) {
|
| | | return teamDividentsSourceUserMapper.selectBySourceUidAndDayAndUid(sourceUid, targetUid, day);
|
| | | }
|
| | |
|
| | | }
|
| | |
| | |
|
| | | 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;
|
| | |
|
| | |
| | | public BigDecimal computeSecondTeamSubsidy(BigDecimal fanLiMoney, Date placeOrderTime, UserLevelEnum buyerUserLevel,
|
| | | UserLevelEnum userLevel);
|
| | |
|
| | |
|
| | | /**
|
| | | * 计算团队补贴
|
| | | * @param date 下单时间
|
| | |
| | | * @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);
|
| | |
|
| | | }
|
| | |
| | | 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;
|
| | |
| | | * 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;
|
| | |
|
| | | /**
|
| | | * 根据主键查询
|
| | |
| | | */
|
| | | public void send(Long id);
|
| | |
|
| | | |
| | | /**
|
| | | * 根据订单查询
|
| | | * @Title: selectByOrderNoSourceType
|
| | |
| | | */
|
| | | 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);
|
| | |
|
| | | }
|
New file |
| | |
| | | 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);
|
| | |
|
| | | }
|
| | |
| | | * @throws
|
| | | */
|
| | | public List<TeamDividentsSourceUser> listBySourceUidAndDay(Long sourceUid, String day);
|
| | | |
| | | |
| | | |
| | | public TeamDividentsSourceUser selectBySourceUidAndDayAndUid(Long sourceUid,Long targetUid, String day);
|
| | |
|
| | | /**
|
| | | * 计算用户数量
|
| | |
| | | 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;
|
| | |
|
| | | /**
|
| | | * 团队分红管理
|
| | |
| | | public class TeamDividentsManager {
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceManager teamDividentsSourceManager;
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceUserService teamDividentsSourceUserService;
|
| | |
| | | @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
|
| | |
| | | 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);
|
| | |
| | | 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;
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | */
|
| | | 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;
|
| | | }
|
| | |
|
| | |
| | | @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);
|
| | | 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(su.getTargetUid());
|
| | | debt.setUid(map.getTargetUid());
|
| | | // 加入待偿还记录
|
| | | teamDividentsDebtService.addDebt(debt);
|
| | | }
|
| | | } else if (sourceOrder.getState() == TeamDividentsSourceOrder.STATE_CAN_SEND) {
|
| | | teamDividentsSourceOrderService.invalidOrder(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);
|
| | | } else if (order.getState() == TeamDividentsSourceOrderUserMap.STATE_JS
|
| | | || order.getState() == TeamDividentsSourceOrderUserMap.STATE_FK) {
|
| | | teamDividentsSourceManager.invalidByOrder(orderNo, sourceType, "订单维权");
|
| | | }
|
| | | }
|
| | |
|
| | | }
|
New file |
| | |
| | | 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;
|
| | | }
|
| | |
|
| | | }
|
| | | }
|
| | |
|
| | | }
|
| | |
| | | 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);
|
| | | }
|
| | |
| | | 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) {
|
| | | num = new BigDecimal(num.toString().substring(0, num.toString().length() - 1));
|
| | |
| | |
|
| | | 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());
|
| | |
|
| | | if (orderState == CommonOrder.STATE_JS || orderState == CommonOrder.STATE_WQ) {
|
| | | sourceOrder.setState(TeamDividentsSourceOrder.STATE_CAN_SEND);
|
| | | sourceOrder.setUid(commonOrderList.get(0).getUserInfo().getId());
|
| | | Date settlementTime = CommonOrderUtil.getSettlementTime(commonOrderList);
|
| | | if (settlementTime == null)
|
| | | return null;
|
| | |
|
| | | Calendar calendar = Calendar.getInstance();
|
| | | calendar.setTime(commonOrderList.get(0).getSettleTime());
|
| | | 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;
|
| | | }
|
New file |
| | |
| | | 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;
|
| | | }
|
| | |
|
| | | }
|
New file |
| | |
| | | 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;
|
| | | }
|
| | |
|
| | | }
|
| | |
| | | package com.yeshi.fanli.util.rocketmq.consumer.order;
|
| | |
|
| | | import java.math.BigDecimal;
|
| | | import java.util.ArrayList;
|
| | | import java.util.List;
|
| | |
|
| | | import javax.annotation.Resource;
|
| | |
| | | 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;
|
| | |
|
| | | /**
|
| | |
| | |
|
| | | @Resource
|
| | | private TeamDividentsManager teamDividentsManager;
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceManager teamDividentsSourceManager;
|
| | |
|
| | | @Resource
|
| | | private ThreeSaleSerivce threeSaleSerivce;
|
| | |
|
| | | @Resource
|
| | | private TeamUserLevelStatisticService teamUserLevelStatisticService;
|
| | |
|
| | | public OrderDividentsMessageListener() {
|
| | |
|
| | |
| | | }
|
| | | }
|
| | | } 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 {
|