From d8359ddb48dab5cc797a9d552e11fde571f4920c Mon Sep 17 00:00:00 2001
From: yujian <yujian@123.com>
Date: 星期二, 27 八月 2019 12:32:46 +0800
Subject: [PATCH] Merge branch 'div' of ssh://193.112.35.168:29418/fanli-server into div

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoWeiQuanDrawBackServiceImpl.java |  530 +++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 356 insertions(+), 174 deletions(-)

diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoWeiQuanDrawBackServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoWeiQuanDrawBackServiceImpl.java
index 9420e0e..6c2ad62 100644
--- a/fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoWeiQuanDrawBackServiceImpl.java
+++ b/fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoWeiQuanDrawBackServiceImpl.java
@@ -1,6 +1,7 @@
 package com.yeshi.fanli.service.impl.taobao;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -12,37 +13,42 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.yeshi.fanli.dao.mybatis.AccountDetailsMapper;
+import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper;
 import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
-import com.yeshi.fanli.dao.mybatis.hongbao.HongBaoMapper;
 import com.yeshi.fanli.dao.mybatis.money.UserMoneyDetailMapper;
+import com.yeshi.fanli.dao.mybatis.order.CommonOrderMapper;
+import com.yeshi.fanli.dao.mybatis.order.HongBaoOrderMapper;
 import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderMapper;
 import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanDrawBackMapper;
-import com.yeshi.fanli.entity.bus.user.AccountDetails;
-import com.yeshi.fanli.entity.bus.user.HongBao;
+import com.yeshi.fanli.entity.bus.user.HongBaoV2;
 import com.yeshi.fanli.entity.bus.user.UserInfo;
+import com.yeshi.fanli.entity.money.UserMoneyDebt;
+import com.yeshi.fanli.entity.money.UserMoneyDebt.UserMoneyDebtTypeEnum;
 import com.yeshi.fanli.entity.money.UserMoneyDetail;
+import com.yeshi.fanli.entity.order.CommonOrder;
+import com.yeshi.fanli.entity.order.HongBaoOrder;
 import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
 import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanDrawBack;
 import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
 import com.yeshi.fanli.exception.TaoBaoWeiQuanException;
+import com.yeshi.fanli.exception.money.UserMoneyDebtException;
 import com.yeshi.fanli.exception.money.UserMoneyDetailException;
 import com.yeshi.fanli.log.LogHelper;
+import com.yeshi.fanli.service.inter.money.UserMoneyDebtService;
+import com.yeshi.fanli.service.inter.msg.UserMoneyMsgNotificationService;
 import com.yeshi.fanli.service.inter.taobao.TaoBaoWeiQuanDrawBackService;
 import com.yeshi.fanli.service.inter.taobao.TaoBaoWeiQuanOrderService;
-import com.yeshi.fanli.service.inter.user.UserNotificationService;
+import com.yeshi.fanli.service.inter.user.UserMoneyService;
+import com.yeshi.fanli.util.Constant;
 import com.yeshi.fanli.util.MoneyBigDecimalUtil;
 import com.yeshi.fanli.util.StringUtil;
-import com.yeshi.fanli.util.factory.AccountDetailsFactory;
 import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
+import com.yeshi.fanli.vo.order.CommonOrderVO;
 
 @Service
 public class TaoBaoWeiQuanDrawBackServiceImpl implements TaoBaoWeiQuanDrawBackService {
 	@Resource
 	private TaoBaoWeiQuanDrawBackMapper taoBaoWeiQuanDrawBackMapper;
-
-	@Resource
-	private HongBaoMapper hongBaoMapper;
 
 	@Resource
 	private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
@@ -57,15 +63,55 @@
 	private UserMoneyDetailMapper userMoneyDetailMapper;
 
 	@Resource
-	private AccountDetailsMapper accountDetailsMapper;
+	private CommonOrderMapper commonOrderMapper;
 
 	@Resource
-	private UserNotificationService userNotificationService;
+	private HongBaoV2Mapper hongBaoV2Mapper;
+
+	@Resource
+	private HongBaoOrderMapper hongBaoOrderMapper;
+
+	@Resource
+	private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
+
+	@Resource
+	private UserMoneyDebtService userMoneyDebtService;
+
+	@Resource
+	private UserMoneyService userMoneyService;
 
 	@Override
 	public void addWeiQuanDrawBack(TaoBaoWeiQuanDrawBack taoBaoWeiQuanDrawBack) {
 		taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(taoBaoWeiQuanDrawBack.getOrderItemId(),
 				taoBaoWeiQuanDrawBack.getUser().getId());
+	}
+
+	@Transactional
+	private void addDebt(Long uid, Long hbId, BigDecimal money) throws UserMoneyDebtException {
+		UserMoneyDebt debt = new UserMoneyDebt();
+		debt.setBeiZhu(null);
+		debt.setCreateTime(new Date());
+		debt.setLeftMoney(money);
+		debt.setOriginMoney(money);
+		debt.setSourceId(hbId);
+		debt.setType(UserMoneyDebtTypeEnum.order);
+		debt.setUid(uid);
+		userMoneyDebtService.addUserMoneyDebt(debt);
+	}
+
+	/**
+	 * 璁$畻閫�娆鹃噾棰�
+	 * 
+	 * @param settlement
+	 * @param wqMoney
+	 * @param hongBaoMoney
+	 * @return
+	 */
+	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;
 	}
 
 	@Transactional
@@ -77,21 +123,43 @@
 		List<TaoBaoWeiQuanOrder> list = taoBaoWeiQuanOrderService.getWeiQuanSuccessOrders(orderId);
 		if (list == null || list.size() == 0)
 			return;
-		// 鏌ヨ璁㈠崟搴�
-		List<TaoBaoOrder> orderList = taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId);
-		// 璁$畻娣樺疂鑱旂洘杩旂粰骞冲彴鐨勮祫閲�
-		BigDecimal sumFee = new BigDecimal("0");
-		for (TaoBaoOrder order : orderList)
-			if (order.getOrderState().equalsIgnoreCase("璁㈠崟缁撶畻"))
-				sumFee = sumFee.add(order.geteIncome());
 		// 鑾峰彇鍜岃璁㈠崟鍙锋湁鍏宠仈鐨勭敤鎴�
 		// 鑾峰彇涓荤孩鍖�(鍚屼竴涓鍗曞彿鐨勫崟鍙細瀵瑰簲鍚屼竴涓敤鎴�)
-		List<HongBao> mainHongBaoList = hongBaoMapper.selectByOrderIdWithoutChild(orderId);
+		List<CommonOrderVO> typeList = new ArrayList<>();
+		CommonOrderVO cv = new CommonOrderVO();
+		cv.setSourceType(Constant.SOURCE_TYPE_TAOBAO);
+		cv.setOrderNo(orderId);
+		typeList.add(cv);
+
+		List<CommonOrderVO> commonOrderList = commonOrderMapper.listOrderGoodsInfo(typeList);
+		List<HongBaoV2> mainHongBaoList = new ArrayList<>();
+		if (commonOrderList != null)
+			for (CommonOrderVO vo : commonOrderList) {
+				// 淇敼璁㈠崟鐘舵�佷负缁存潈
+				CommonOrder co = new CommonOrder(vo.getId());
+				co.setState(CommonOrder.STATE_WQ);
+				co.setUpdateTime(new Date());
+				commonOrderMapper.updateByPrimaryKeySelective(co);
+
+				HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(vo.getId());
+				if (hongBaoOrder.getCommonOrder() != null
+						&& !StringUtil.isNullOrEmpty(hongBaoOrder.getCommonOrder().getTradeId()))
+				// 鏌ヨ鏄惁宸茬粡缁存潈
+				{
+					TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(
+							hongBaoOrder.getCommonOrder().getTradeId(),
+							hongBaoOrder.getHongBaoV2().getUserInfo().getId());
+					if (drawBack == null)// 娣诲姞杩樻湭鎵f鐨勫瓙璁㈠崟
+						mainHongBaoList.add(hongBaoOrder.getHongBaoV2());
+				}
+			}
 		if (mainHongBaoList == null || mainHongBaoList.size() == 0)
 			return;
 		for (int i = 0; i < mainHongBaoList.size(); i++) {
+			HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKey(mainHongBaoList.get(i).getId());
+			mainHongBaoList.set(i, hb);
 			// 鍙鐞嗚繑鍒╄鍗�
-			if (mainHongBaoList.get(i).getType() != HongBao.TYPE_TAOBAO) {
+			if (hb.getType() != HongBaoV2.TYPE_ZIGOU) {
 				mainHongBaoList.remove(i);
 				i--;
 			}
@@ -104,8 +172,8 @@
 		Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
 
 		if (mainHongBaoList != null)
-			for (HongBao hongBao : mainHongBaoList) {
-				if (hongBao.getState() == HongBao.STATE_SHIXIAO)
+			for (HongBaoV2 hongBao : mainHongBaoList) {
+				if (hongBao.getState() != HongBaoV2.STATE_YILINGQU)
 					continue;
 				// 绱涓荤孩鍖呯殑閲戦
 				if (fanMoneyMap.get(hongBao.getUserInfo().getId()) == null) {
@@ -120,43 +188,91 @@
 		while (its.hasNext()) {
 			Long uid = its.next();
 			BigDecimal userGetMoney = fanMoneyMap.get(uid);
-			BigDecimal fanMoney = new BigDecimal("0");
+			BigDecimal wqMoney = new BigDecimal("0");
 			// 缁熻鐢ㄦ埛鍦ㄨ繖涓崟涓渶瑕佹墸闄ょ殑璧勯噾
 			TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
+			List<TaoBaoWeiQuanDrawBack> newWeiQuanDrawBackList = new ArrayList<>();
+			BigDecimal settleMent = new BigDecimal(0);
 			for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
 				weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
 						uid);
 				if (weiQuanDrawBack != null)
 					continue;
+				// 璁$畻缁撶畻閲戦
+				TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId());
+				if (taoBaoOrder == null)
+					throw new TaoBaoWeiQuanException(101, "鏈壘鍒板瓙璁㈠崟鐩稿叧鏁版嵁");
+
+				if (taoBaoOrder.getSettlement() == null)
+					throw new TaoBaoWeiQuanException(102, "娣樺疂缁撶畻閲戦涓虹┖");
+
+				settleMent = settleMent.add(taoBaoOrder.getSettlement());
+
 				// 閫�娆剧殑璧勯噾
-				fanMoney = fanMoney.add(weiQuanOrder.getFanMoney());
-				// 鎻掑叆璁板綍
+				wqMoney = wqMoney.add(weiQuanOrder.getMoney());
 				weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
 				weiQuanDrawBack.setCreateTime(new Date());
-				// 鏆傛椂璁句负0
-				weiQuanDrawBack.setDrawBackMoney(new BigDecimal(0));
+
+				CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
+						weiQuanOrder.getOrderItemId());
+				HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
+				// 璁$畻閫�娆剧殑璧勯噾
+				BigDecimal drawBack = null;
+				if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null)
+					drawBack = computeDrawBackMoney(commonOrder.getSettlement(), weiQuanOrder.getMoney(),
+							hongBaoOrder.getHongBaoV2().getMoney());
+
+				weiQuanDrawBack.setDrawBackMoney(drawBack);
 				weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
 				weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
 				weiQuanDrawBack.setUser(new UserInfo(uid));
-				taoBaoWeiQuanDrawBackMapper.insertSelective(weiQuanDrawBack);
+				newWeiQuanDrawBackList.add(weiQuanDrawBack);
 			}
 
-			if (fanMoney.compareTo(new BigDecimal("0")) <= 0)
+			if (wqMoney.compareTo(new BigDecimal("0")) <= 0)
 				continue;
 
+			// 鎻掑叆璁板綍
+			for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) {
+				taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack);
+			}
+
 			// 閫�娆鹃噾棰�
-			BigDecimal drawBackMoney = MoneyBigDecimalUtil.div(userGetMoney.multiply(fanMoney), sumFee);
-			userInfoMapper.subHongBaoByUid(uid, drawBackMoney);
-			// 娣诲姞璧勯噾璁板綍
-			AccountDetails accountDetails = AccountDetailsFactory.create("-" + drawBackMoney,
-					AccountDetailsFactory.SHARE_GOODS_DRAWBACK, null, null, new UserInfo(uid));
-			accountDetailsMapper.insertSelective(accountDetails);
+			BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney);
+
+			// 璁$畻璧勯噾鏄惁鍏呰冻
+			UserInfo user = userInfoMapper.selectByPKey(uid);
+			if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 璧勯噾涓嶈冻
+			{
+				// 娣诲姞鍊哄姟
+				for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) {
+					TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(drawBack.getOrderItemId());
+					if (taoBaoOrder != null) {
+						TaoBaoWeiQuanOrder weiQuanOrder = taoBaoWeiQuanOrderService
+								.selectByTradeId(drawBack.getOrderItemId());
+						CommonOrder co = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
+								drawBack.getOrderItemId());
+						if (co != null) {
+							HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId());
+							if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null) {
+								BigDecimal drawback = computeDrawBackMoney(taoBaoOrder.getSettlement(),
+										weiQuanOrder.getMoney(), hongBaoOrder.getHongBaoV2().getMoney());
+								try {
+									addDebt(uid, hongBaoOrder.getHongBaoV2().getId(), drawback);
+								} catch (UserMoneyDebtException e) {
+									throw new TaoBaoWeiQuanException(101, "璧勯噾鍊熻捶寮傚父");
+								}
+							}
+						}
+					}
+				}
+				continue;
+			}
+
+			UserMoneyDetail userMoneyDetail = null;
 			// 鏂扮増璧勯噾璁板綍
 			try {
-				UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack,
-						drawBackMoney);
-				userMoneyDetail.setId(accountDetails.getId());
-				userMoneyDetailMapper.insert(userMoneyDetail);
+				userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
 			} catch (UserMoneyDetailException e) {
 				try {
 					LogHelper.errorDetailInfo(e);
@@ -164,8 +280,11 @@
 					e1.printStackTrace();
 				}
 			}
+			userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
 
-			userNotificationService.weiQuanFanli(uid, orderId, drawBackMoney);
+			// 鏂扮増閫氱煡
+			userMoneyMsgNotificationService.fanliOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
+					userInfoMapper.selectByPKey(uid).getMyHongBao());
 		}
 	}
 
@@ -178,16 +297,36 @@
 		List<TaoBaoWeiQuanOrder> list = taoBaoWeiQuanOrderService.getWeiQuanSuccessOrders(orderId);
 		if (list == null || list.size() == 0)
 			return;
-		// 鏌ヨ璁㈠崟搴�
-		List<TaoBaoOrder> orderList = taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId);
-		// 璁$畻娣樺疂鑱旂洘杩旂粰骞冲彴鐨勮祫閲�
-		BigDecimal sumFee = new BigDecimal("0");
-		for (TaoBaoOrder order : orderList)
-			if (order.getOrderState().equalsIgnoreCase("璁㈠崟缁撶畻"))
-				sumFee = sumFee.add(order.geteIncome());
 		// 鑾峰彇鍜岃璁㈠崟鍙锋湁鍏宠仈鐨勭敤鎴�
 		// 鑾峰彇涓荤孩鍖�(鍚屼竴涓鍗曞彿鐨勫崟鍙細瀵瑰簲鍚屼竴涓敤鎴�)
-		List<HongBao> mainHongBaoList = hongBaoMapper.selectByOrderIdWithoutChild(orderId);
+		List<CommonOrderVO> typeList = new ArrayList<>();
+		CommonOrderVO cv = new CommonOrderVO();
+		cv.setSourceType(Constant.SOURCE_TYPE_TAOBAO);
+		cv.setOrderNo(orderId);
+		typeList.add(cv);
+
+		List<CommonOrderVO> commonOrderList = commonOrderMapper.listOrderGoodsInfo(typeList);
+		List<HongBaoV2> mainHongBaoList = new ArrayList<>();
+		if (commonOrderList != null)
+			for (CommonOrderVO vo : commonOrderList) {
+				// 鏇存敼璁㈠崟鐘舵��
+				CommonOrder co = new CommonOrder(vo.getId());
+				co.setState(CommonOrder.STATE_WQ);
+				co.setUpdateTime(new Date());
+				commonOrderMapper.updateByPrimaryKeySelective(co);
+				HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(vo.getId());
+				if (hongBaoOrder.getCommonOrder() != null
+						&& !StringUtil.isNullOrEmpty(hongBaoOrder.getCommonOrder().getTradeId()))
+				// 鏌ヨ鏄惁宸茬粡缁存潈
+				{
+					TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(
+							hongBaoOrder.getCommonOrder().getTradeId(),
+							hongBaoOrder.getHongBaoV2().getUserInfo().getId());
+					if (drawBack == null)// 娣诲姞杩樻湭鎵f鐨勫瓙璁㈠崟
+						mainHongBaoList.add(hongBaoOrder.getHongBaoV2());
+				}
+			}
+
 		if (mainHongBaoList == null || mainHongBaoList.size() == 0)
 			return;
 
@@ -195,11 +334,13 @@
 		Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
 
 		if (mainHongBaoList != null)
-			for (HongBao hongBao : mainHongBaoList) {
-				if (hongBao.getState() == HongBao.STATE_SHIXIAO)
+			for (HongBaoV2 hongBao : mainHongBaoList) {// 缁熻璁㈠崟涓嬬殑鎵�鏈変富绾㈠寘
+				hongBao = hongBaoV2Mapper.selectByPrimaryKey(hongBao.getId());
+				if (hongBao.getState() != HongBaoV2.STATE_YILINGQU)
 					continue;
-				// 杩斿埄绾㈠寘涓嶈鍏�
-				if (hongBao.getType() != HongBao.TYPE_TAOBAO) {
+
+				// 鍙鍏ュ垎浜禋鐨勭孩鍖�
+				if (hongBao.getType() == HongBaoV2.TYPE_SHARE_GOODS) {
 					// 绱涓荤孩鍖呯殑閲戦
 					if (fanMoneyMap.get(hongBao.getUserInfo().getId()) == null) {
 						fanMoneyMap.put(hongBao.getUserInfo().getId(), hongBao.getMoney());
@@ -207,62 +348,99 @@
 						fanMoneyMap.put(hongBao.getUserInfo().getId(),
 								fanMoneyMap.get(hongBao.getUserInfo().getId()).add(hongBao.getMoney()));
 				}
-				// 绱瀛愮孩鍖呯殑閲戦
-				List<HongBao> childHongBaoList = hongBaoMapper.selectChildHongBaoByPid(hongBao.getId());
-				if (childHongBaoList != null)
-					for (HongBao child : childHongBaoList) {
-						if (child.getState() == HongBao.STATE_SHIXIAO)
-							continue;
-						if (fanMoneyMap.get(child.getUserInfo().getId()) == null) {
-							fanMoneyMap.put(child.getUserInfo().getId(), child.getMoney());
-						} else
-							fanMoneyMap.put(child.getUserInfo().getId(),
-									fanMoneyMap.get(child.getUserInfo().getId()).add(child.getMoney()));
-					}
 			}
 
-		// 璁$畻姣忎釜鐢ㄦ埛鐨勮繑鍒╂瘮渚�
 		Iterator<Long> its = fanMoneyMap.keySet().iterator();
+		// 鏌ヨ鍜岃繖涓鍗曟湁鍏崇殑鐢ㄦ埛锛堜富璁㈠崟锛�
 		while (its.hasNext()) {
 			Long uid = its.next();
 			BigDecimal userGetMoney = fanMoneyMap.get(uid);
-			BigDecimal fanMoney = new BigDecimal("0");
+			BigDecimal wqMoney = new BigDecimal("0");
+			BigDecimal settleMent = new BigDecimal("0");
 			// 缁熻鐢ㄦ埛鍦ㄨ繖涓崟涓渶瑕佹墸闄ょ殑璧勯噾
 			TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
+
+			List<TaoBaoWeiQuanDrawBack> newWeiQuanDrawBackList = new ArrayList<>();
 			for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
 				weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
 						uid);
 				if (weiQuanDrawBack != null)
 					continue;
+				// 璁$畻缁撶畻閲戦
+				TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId());
+				if (taoBaoOrder == null)
+					throw new TaoBaoWeiQuanException(101, "鏈壘鍒板瓙璁㈠崟鐩稿叧鏁版嵁");
+
+				if (taoBaoOrder.getSettlement() == null)
+					throw new TaoBaoWeiQuanException(102, "娣樺疂缁撶畻閲戦涓虹┖");
+
+				settleMent = settleMent.add(taoBaoOrder.getSettlement());
+
 				// 閫�娆剧殑璧勯噾
-				fanMoney = fanMoney.add(weiQuanOrder.getFanMoney());
+				wqMoney = wqMoney.add(weiQuanOrder.getMoney());
 				// 鎻掑叆璁板綍
 				weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
 				weiQuanDrawBack.setCreateTime(new Date());
-				// TODO 鏆傛椂璁句负0
-				weiQuanDrawBack.setDrawBackMoney(new BigDecimal(0));
+				// 璁$畻閫�娆捐祫閲�
+				CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
+						weiQuanOrder.getOrderItemId());
+				HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
+				// 璁$畻閫�娆剧殑璧勯噾
+				BigDecimal drawBack = null;
+				if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null)
+					drawBack = computeDrawBackMoney(commonOrder.getSettlement(), weiQuanOrder.getMoney(),
+							hongBaoOrder.getHongBaoV2().getMoney());
+
+				weiQuanDrawBack.setDrawBackMoney(drawBack);
+
 				weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
 				weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
 				weiQuanDrawBack.setUser(new UserInfo(uid));
-				taoBaoWeiQuanDrawBackMapper.insertSelective(weiQuanDrawBack);
+				newWeiQuanDrawBackList.add(weiQuanDrawBack);
 			}
 
-			if (fanMoney.compareTo(new BigDecimal("0")) <= 0)
+			if (wqMoney.compareTo(new BigDecimal("0")) <= 0)
 				continue;
 
 			// 閫�娆鹃噾棰�
-			BigDecimal drawBackMoney = MoneyBigDecimalUtil.div(userGetMoney.multiply(fanMoney), sumFee);
-			userInfoMapper.subHongBaoByUid(uid, drawBackMoney);
-			// 娣诲姞璧勯噾璁板綍
-			AccountDetails accountDetails = AccountDetailsFactory.create("-" + drawBackMoney,
-					AccountDetailsFactory.SHARE_GOODS_DRAWBACK, null, null, new UserInfo(uid));
-			accountDetailsMapper.insertSelective(accountDetails);
+			BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney);
+			if (drawBackMoney.compareTo(userGetMoney) > 0)
+				drawBackMoney = userGetMoney;
+
+			for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList)
+				taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack);
+			// 璁$畻璧勯噾鏄惁鍏呰冻
+			UserInfo user = userInfoMapper.selectByPKey(uid);
+			if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 璧勯噾涓嶈冻
+			{
+				// 娣诲姞鍊哄姟
+				for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) {
+					TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(drawBack.getOrderItemId());
+					if (taoBaoOrder != null) {
+						TaoBaoWeiQuanOrder weiQuanOrder = taoBaoWeiQuanOrderService
+								.selectByTradeId(drawBack.getOrderItemId());
+						BigDecimal settleMentMoney = taoBaoOrder.getSettlement();
+						CommonOrder co = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
+								weiQuanOrder.getOrderItemId());
+						if (co != null) {
+							HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId());
+							BigDecimal drawback = computeDrawBackMoney(settleMentMoney, weiQuanOrder.getMoney(),
+									hongBaoOrder.getHongBaoV2().getMoney());
+							try {
+								addDebt(uid, hongBaoOrder.getHongBaoV2().getId(), drawback);
+							} catch (UserMoneyDebtException e) {
+								throw new TaoBaoWeiQuanException(101, "璧勯噾鍊熻捶寮傚父");
+							}
+						}
+					}
+				}
+				continue;
+			}
+
+			UserMoneyDetail userMoneyDetail = null;
 			// 鏂扮増璧勯噾璁板綍
 			try {
-				UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createShareWeiQuan(uid, weiQuanDrawBack,
-						drawBackMoney);
-				userMoneyDetail.setId(accountDetails.getId());
-				userMoneyDetailMapper.insert(userMoneyDetail);
+				userMoneyDetail = UserMoneyDetailFactory.createShareWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
 			} catch (UserMoneyDetailException e) {
 				try {
 					LogHelper.errorDetailInfo(e);
@@ -270,10 +448,11 @@
 					e1.printStackTrace();
 				}
 			}
+			userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
+			userMoneyMsgNotificationService.shareOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
 
-			userNotificationService.weiQuanTiCheng(uid, orderId, drawBackMoney);
+					userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
 		}
-
 	}
 
 	@Transactional
@@ -286,104 +465,107 @@
 		if (list == null || list.size() == 0)
 			return;
 		// 鏌ヨ璁㈠崟搴�
-		List<TaoBaoOrder> orderList = taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId);
-		// 璁$畻娣樺疂鑱旂洘杩旂粰骞冲彴鐨勮祫閲�
-		BigDecimal sumFee = new BigDecimal("0");
-		for (TaoBaoOrder order : orderList)
-			if (order.getOrderState().equalsIgnoreCase("璁㈠崟缁撶畻"))
-				sumFee = sumFee.add(order.geteIncome());
-		// 鑾峰彇鍜岃璁㈠崟鍙锋湁鍏宠仈鐨勭敤鎴�
-		// 鑾峰彇涓荤孩鍖�(鍚屼竴涓鍗曞彿鐨勫崟鍙細瀵瑰簲鍚屼竴涓敤鎴�)
-		List<HongBao> mainHongBaoList = hongBaoMapper.selectByOrderIdWithoutChild(orderId);
-		if (mainHongBaoList == null || mainHongBaoList.size() == 0)
-			return;
+		for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
+			TaoBaoOrder taoBaoOrder = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(weiQuanOrder.getOrderItemId());
+			BigDecimal wqMoney = weiQuanOrder.getMoney();
+			if (taoBaoOrder == null)
+				throw new TaoBaoWeiQuanException(1, "鏉ユ簮浜ゆ槗ID鏈夎");
+			BigDecimal settleMent = new BigDecimal("0");
+			if (taoBaoOrder.getOrderState().equalsIgnoreCase("璁㈠崟缁撶畻")) {
+				settleMent = settleMent.add(taoBaoOrder.getSettlement());
+			}
 
-		// 涓荤敤鎴稩D
-		Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
+			// 鏌ヨ涓嬬骇瀛愮敤鎴�
+			CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
+					weiQuanOrder.getOrderItemId());
+			if (commonOrder == null)
+				throw new TaoBaoWeiQuanException(2, "璁㈠崟鏈夎");
 
-		if (mainHongBaoList != null)
-			for (HongBao hongBao : mainHongBaoList) {
-				if (hongBao.getState() == HongBao.STATE_SHIXIAO)
-					continue;
-				// 杩斿埄绾㈠寘涓嶈鍏�
-				if (hongBao.getType() != HongBao.TYPE_TAOBAO) {
-					// 绱涓荤孩鍖呯殑閲戦
-					if (fanMoneyMap.get(hongBao.getUserInfo().getId()) == null) {
-						fanMoneyMap.put(hongBao.getUserInfo().getId(), hongBao.getMoney());
-					} else
-						fanMoneyMap.put(hongBao.getUserInfo().getId(),
-								fanMoneyMap.get(hongBao.getUserInfo().getId()).add(hongBao.getMoney()));
-				}
-				// 绱瀛愮孩鍖呯殑閲戦
-				List<HongBao> childHongBaoList = hongBaoMapper.selectChildHongBaoByPid(hongBao.getId());
-				if (childHongBaoList != null)
-					for (HongBao child : childHongBaoList) {
-						if (child.getState() == HongBao.STATE_SHIXIAO)
+			HongBaoOrder hongbaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
+
+			if (hongbaoOrder == null || hongbaoOrder.getHongBaoV2() == null)
+				throw new TaoBaoWeiQuanException(3, "绾㈠寘鏈夎");
+
+			List<HongBaoV2> childList = hongBaoV2Mapper.listChildrenById(hongbaoOrder.getHongBaoV2().getId());
+
+			if (childList != null)
+				for (HongBaoV2 child : childList) {
+					Long uid = child.getUserInfo().getId();
+					if (child.getState() != HongBaoV2.STATE_YILINGQU)
+						continue;
+					TaoBaoWeiQuanDrawBack weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper
+							.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(), child.getUserInfo().getId());
+					if (weiQuanDrawBack != null)
+						continue;
+					BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, child.getMoney());
+					weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
+					weiQuanDrawBack.setCreateTime(new Date());
+					weiQuanDrawBack.setDrawBackMoney(drawBackMoney);
+					weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
+					weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
+					weiQuanDrawBack.setUser(child.getUserInfo());
+					taoBaoWeiQuanDrawBackMapper.insertSelective(weiQuanDrawBack);// 鍔犲叆杩旇繕璁板綍
+
+					// 濡傛灉璧勯噾澶т簬0鎵嶆墸闄�
+
+					if (drawBackMoney != null && drawBackMoney.compareTo(new BigDecimal(0)) > 0) {
+
+						// 鍒ゆ柇璧勯噾鏄惁瓒冲鎵f
+						UserInfo user = userInfoMapper.selectByPKey(uid);
+						if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 璧勯噾涓嶈冻
+						{
+							try {
+								addDebt(uid, child.getId(), drawBackMoney);
+							} catch (UserMoneyDebtException e) {
+								throw new TaoBaoWeiQuanException(101, "璧勯噾鍊熻捶寮傚父");
+							}
 							continue;
-						if (fanMoneyMap.get(child.getUserInfo().getId()) == null) {
-							fanMoneyMap.put(child.getUserInfo().getId(), child.getMoney());
-						} else
-							fanMoneyMap.put(child.getUserInfo().getId(),
-									fanMoneyMap.get(child.getUserInfo().getId()).add(child.getMoney()));
+						}
+
+						UserMoneyDetail userMoneyDetail = null;
+						// 鏂扮増璧勯噾璁板綍
+						try {
+							userMoneyDetail = UserMoneyDetailFactory.createInviteWeiQuan(uid, weiQuanDrawBack,
+									drawBackMoney);
+						} catch (UserMoneyDetailException e) {
+							try {
+								LogHelper.errorDetailInfo(e);
+							} catch (Exception e1) {
+								e1.printStackTrace();
+							}
+						}
+
+						userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
+
+						// 鏂扮増閫氱煡
+						userMoneyMsgNotificationService.inviteOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO,
+								drawBackMoney, userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
 					}
-			}
-
-		// 璁$畻姣忎釜鐢ㄦ埛鐨勮繑鍒╂瘮渚�
-		Iterator<Long> its = fanMoneyMap.keySet().iterator();
-		while (its.hasNext()) {
-			Long uid = its.next();
-			BigDecimal userGetMoney = fanMoneyMap.get(uid);
-			BigDecimal fanMoney = new BigDecimal("0");
-			// 缁熻鐢ㄦ埛鍦ㄨ繖涓崟涓渶瑕佹墸闄ょ殑璧勯噾
-			TaoBaoWeiQuanDrawBack weiQuanDrawBack = null;
-			for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
-				weiQuanDrawBack = taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(weiQuanOrder.getOrderItemId(),
-						uid);
-				if (weiQuanDrawBack != null)
-					continue;
-				// 閫�娆剧殑璧勯噾
-				fanMoney = fanMoney.add(weiQuanOrder.getFanMoney());
-				// 鎻掑叆璁板綍
-				weiQuanDrawBack = new TaoBaoWeiQuanDrawBack();
-				weiQuanDrawBack.setCreateTime(new Date());
-				// TODO 鏆傛椂璁句负0
-				weiQuanDrawBack.setDrawBackMoney(new BigDecimal(0));
-				weiQuanDrawBack.setOrderId(weiQuanOrder.getOrderId());
-				weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
-				weiQuanDrawBack.setUser(new UserInfo(uid));
-				taoBaoWeiQuanDrawBackMapper.insertSelective(weiQuanDrawBack);
-			}
-
-			if (fanMoney.compareTo(new BigDecimal("0")) <= 0)
-				continue;
-
-			// 閫�娆鹃噾棰�
-			BigDecimal drawBackMoney = MoneyBigDecimalUtil.div(userGetMoney.multiply(fanMoney), sumFee);
-			userInfoMapper.subHongBaoByUid(uid, drawBackMoney);
-			// 娣诲姞璧勯噾璁板綍
-			AccountDetails accountDetails = AccountDetailsFactory.create("-" + drawBackMoney,
-					AccountDetailsFactory.SHARE_GOODS_DRAWBACK, null, null, new UserInfo(uid));
-			accountDetailsMapper.insertSelective(accountDetails);
-
-			// 鏂扮増璧勯噾璁板綍
-			try {
-				UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createInviteWeiQuan(uid, weiQuanDrawBack,
-						drawBackMoney);
-				userMoneyDetail.setId(accountDetails.getId());
-				userMoneyDetailMapper.insert(userMoneyDetail);
-			} catch (UserMoneyDetailException e) {
-				try {
-					LogHelper.errorDetailInfo(e);
-				} catch (Exception e1) {
-					e1.printStackTrace();
 				}
-			}
-
-			//
-
-			userNotificationService.weiQuanTiCheng(uid, orderId, drawBackMoney);
 		}
+	}
 
+	@Override
+	public TaoBaoWeiQuanDrawBack selectByOrderItemId(String orderItemId) {
+		List<TaoBaoWeiQuanDrawBack> list = taoBaoWeiQuanDrawBackMapper.selectByOrderItemId(orderItemId);
+		if (list != null && list.size() > 0)
+			return list.get(0);
+		else
+			return null;
+	}
+
+	@Override
+	public TaoBaoWeiQuanDrawBack selectByHongBaoId(Long hbId) {
+		Long uid = null;
+		HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKey(hbId);
+		uid = hb.getUserInfo().getId();
+		if (hb.getParent() != null)
+			hb = hb.getParent();
+		HongBaoOrder hbo = hongBaoOrderMapper.selectByHongBaoId(hb.getId());
+		if (hbo != null && hbo.getCommonOrder() != null) {
+			return taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(hbo.getCommonOrder().getTradeId(), uid);
+		}
+		return null;
 	}
 
 }

--
Gitblit v1.8.0