admin
2020-04-13 457265eb82265650cf6c87519803975f23bd2fd3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
package com.yeshi.fanli.service.manger.order;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
import javax.annotation.Resource;
 
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
 
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.money.InviteOrderSubsidyDebt;
import com.yeshi.fanli.entity.order.HongBaoOrder;
import com.yeshi.fanli.entity.order.HongBaoV2SettleTemp;
import com.yeshi.fanli.entity.order.InviteOrderSubsidy;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.ParamsException;
import com.yeshi.fanli.exception.money.InviteOrderSubsidyDebtException;
import com.yeshi.fanli.exception.money.OrderMoneySettleException;
import com.yeshi.fanli.exception.money.TeamEincomeRecordException;
import com.yeshi.fanli.exception.order.CommonOrderException;
import com.yeshi.fanli.exception.order.InviteOrderSubsidyException;
import com.yeshi.fanli.exception.order.TaoBaoOrderException;
import com.yeshi.fanli.service.inter.hongbao.HongBaoV2SettleTempService;
import com.yeshi.fanli.service.inter.money.InviteOrderSubsidyDebtService;
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
import com.yeshi.fanli.service.inter.order.InviteOrderSubsidyService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService;
import com.yeshi.fanli.service.manger.money.TeamEincomeManager;
import com.yeshi.fanli.util.Constant;
 
/**
 * 团队分红管理
 * @author Administrator
 *
 */
@Component
public class TeamSubsidyManager {
 
    @Resource
    private InviteOrderSubsidyService inviteOrderSubsidyService;
 
    @Resource
    private InviteOrderSubsidyDebtService inviteOrderSubsidyDebtService;
 
    @Resource
    private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
 
    @Resource
    private TaoBaoOrderService taoBaoOrderService;
 
    @Resource
    private HongBaoV2Service hongBaoV2Service;
 
    @Resource
    private HongBaoOrderService hongBaoOrderService;
 
    @Resource
    private HongBaoV2SettleTempService hongBaoV2SettleTempService;
 
    @Resource
    private TeamEincomeManager teamEincomeManager;
 
    public void addOrUpdateOrder(String orderNo, int sourceType)
            throws InviteOrderSubsidyException, CommonOrderException {
        inviteOrderSubsidyService.addOrUpdateByOrder(orderNo, sourceType);
    }
 
    private BigDecimal computeDrawBackMoney(BigDecimal settlement, BigDecimal wqMoney, BigDecimal hongBaoMoney) {
        BigDecimal money = (hongBaoMoney.multiply(wqMoney)).divide(settlement, 2, BigDecimal.ROUND_UP);
        if (money.compareTo(hongBaoMoney) > 0)
            money = hongBaoMoney;
        return money;
    }
 
    public void weiQuan(String orderNo, int sourceType, String tradeId)
            throws TaoBaoOrderException, InviteOrderSubsidyDebtException {
        if (sourceType == Constant.SOURCE_TYPE_TAOBAO) {// 只处理淘宝的维权
            TaoBaoWeiQuanOrder taoBaoWeiQuanOrder = taoBaoWeiQuanOrderService.selectByTradeId(tradeId);
 
            // 只处理维权成功
            if (!taoBaoWeiQuanOrder.getState().startsWith("维权成功"))
                return;
            TaoBaoOrder taoBaoOrder = taoBaoOrderService.selectByTradeId(tradeId);
            if (taoBaoOrder == null)
                return;
 
            if (taoBaoOrder.getSettlement() == null)
                throw new TaoBaoOrderException(1, "订单未更新");
 
            List<InviteOrderSubsidy> subSidyList = inviteOrderSubsidyService.listByOrderNoAndType(orderNo, sourceType);
            for (InviteOrderSubsidy subSidy : subSidyList) {
                if (subSidy != null)// 添加借贷关系
                {
                    BigDecimal drawBackMoney = computeDrawBackMoney(taoBaoOrder.getSettlement(),
                            taoBaoWeiQuanOrder.getMoney(), subSidy.getOriginalMoney());
                    if (drawBackMoney.compareTo(new BigDecimal(0)) <= 0)
                        return;
                    InviteOrderSubsidyDebt debt = new InviteOrderSubsidyDebt();
                    debt.setBeiZhu("订单售后:" + orderNo + "-" + sourceType);
                    debt.setOriginMoney(drawBackMoney);
                    debt.setUid(subSidy.getUid());
                    debt.setCreateTime(new Date());
                    debt.setSourceId(subSidy.getId());
                    debt.setTradeId(tradeId);
                    inviteOrderSubsidyDebtService.addDebt(debt);
                }
            }
        }
    }
 
    /**
     * 添加到临时结算
     * @Title: addToTeamEincome
     * @Description: 
     * @param uid
     * @param taskKey
     * @throws OrderMoneySettleException
     * @throws TeamEincomeRecordException
     * @throws ParamsException 
     * void 返回类型
     * @throws
     */
    @Transactional(rollbackFor=Exception.class)
    public void addToTeamEincome(Long uid, String taskKey,Date preGetTime)
            throws OrderMoneySettleException, TeamEincomeRecordException, ParamsException {
        // 查询key
        List<HongBaoV2SettleTemp> list = hongBaoV2SettleTempService.listByKey(taskKey);
        if (list != null && list.size() > 0) {
            Integer sourceType = null;
            List<InviteOrderSubsidy> subsidyList = new ArrayList<>();
            for (HongBaoV2SettleTemp temp : list) {
                Long hongBaoId = temp.getHongBaoId();
                HongBaoV2 hongBao = hongBaoV2Service.selectByPrimaryKey(hongBaoId);
                if (hongBao != null)
                    sourceType = hongBao.getOrderType();
                if (hongBao.getParent() != null)
                    hongBao = hongBao.getParent();
                HongBaoOrder order = hongBaoOrderService.selectDetailByHongBaoId(hongBao.getId());
                if (order != null && order.getCommonOrder() != null) {
                    InviteOrderSubsidy subSidy = inviteOrderSubsidyService.getByOrderNoAndTypeForUpdate(uid,
                            order.getCommonOrder().getOrderNo(), order.getCommonOrder().getSourceType());
                    if (subSidy != null && subSidy.getState() == InviteOrderSubsidy.STATE_VALID) {
                        subsidyList.add(subSidy);
                    }
                }
            }
 
            if (sourceType == null)
                throw new OrderMoneySettleException(1, "订单类型未获取到");
 
            if (subsidyList.size() > 0) {
                BigDecimal debtMoney = inviteOrderSubsidyDebtService.getTotalDebtMoney(uid, preGetTime);
                BigDecimal originalDebtMoney = new BigDecimal(debtMoney.toString());// 总的欠款
                List<InviteOrderSubsidy> copySubsidyList = new ArrayList<>();
                copySubsidyList.addAll(subsidyList);
                while (debtMoney.compareTo(new BigDecimal(0)) > 0 && copySubsidyList.size() > 0) {// 有欠款,还有还的
                    debtMoney = kouKuan(copySubsidyList, debtMoney);
                }
                // 还款
                BigDecimal repayMoney = originalDebtMoney.subtract(debtMoney);
                BigDecimal bannce = null;
                if (repayMoney.compareTo(new BigDecimal(0)) > 0) {
                    try {
                        bannce = inviteOrderSubsidyDebtService.repayDebtByUid(uid, preGetTime, repayMoney);
                        // 剩余的补贴金额
                    } catch (InviteOrderSubsidyDebtException e) {
                        throw new OrderMoneySettleException(2, "还款异常");
                    }
                }
                if (bannce != null && bannce.compareTo(new BigDecimal(0)) > 0) {
                    // 如果有还剩下的钱就加到第一个上面
                    subsidyList.get(0).setMoney(subsidyList.get(0).getMoney().add(bannce));
                }
 
                BigDecimal totalMoney = new BigDecimal(0);
                for (InviteOrderSubsidy subsidy : subsidyList) {
                    inviteOrderSubsidyService.settleById(subsidy.getId(), subsidy.getMoney());
                    totalMoney = totalMoney.add(subsidy.getMoney());
                }
 
                // 加入团队收益中间表
                teamEincomeManager.addTeamSubsidy(uid, preGetTime, totalMoney, sourceType);
            }
        }
    }
 
    private BigDecimal kouKuan(List<InviteOrderSubsidy> subsidyList, BigDecimal debtMoney) {
        BigDecimal average = debtMoney.divide(new BigDecimal(subsidyList.size()), 2, RoundingMode.UP);
        for (int i = 0; i < subsidyList.size(); i++) {
            InviteOrderSubsidy sidy = subsidyList.get(i);
            BigDecimal subMoney = null;
            if (average.compareTo(sidy.getMoney()) >= 0) {
                subMoney = sidy.getMoney();
            } else {
                subMoney = average;
            }
            if (subMoney.compareTo(debtMoney) > 0)
                subMoney = debtMoney;
            debtMoney = debtMoney.subtract(subMoney);
            sidy.setMoney(sidy.getMoney().subtract(subMoney));
 
            if (sidy.getMoney().compareTo(new BigDecimal(0)) == 0) {
                subsidyList.remove(i);
                i--;
            }
        }
        return debtMoney;
    }
 
}