From 7e7db2fa55a9a3af46d4fd8ede0dee147f101d64 Mon Sep 17 00:00:00 2001
From: yujian <yujian@163.com>
Date: 星期六, 09 五月 2020 21:41:27 +0800
Subject: [PATCH] 2.1需求

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/money/tb/TaoBaoWeiQuanDrawBackServiceImpl.java |  276 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 162 insertions(+), 114 deletions(-)

diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/money/tb/TaoBaoWeiQuanDrawBackServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/money/tb/TaoBaoWeiQuanDrawBackServiceImpl.java
index 7e523be..784d894 100644
--- a/fanli/src/main/java/com/yeshi/fanli/service/impl/money/tb/TaoBaoWeiQuanDrawBackServiceImpl.java
+++ b/fanli/src/main/java/com/yeshi/fanli/service/impl/money/tb/TaoBaoWeiQuanDrawBackServiceImpl.java
@@ -35,15 +35,14 @@
 import com.yeshi.fanli.exception.order.TaoBaoWeiQuanException;
 import com.yeshi.fanli.log.LogHelper;
 import com.yeshi.fanli.service.inter.money.UserMoneyDebtService;
+import com.yeshi.fanli.service.inter.money.UserMoneyDetailService;
 import com.yeshi.fanli.service.inter.money.UserMoneyService;
 import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
 import com.yeshi.fanli.service.inter.money.tb.TaoBaoWeiQuanDrawBackService;
-import com.yeshi.fanli.service.inter.taobao.TaoBaoWeiQuanOrderService;
+import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService;
 import com.yeshi.fanli.util.Constant;
-import com.yeshi.fanli.util.MoneyBigDecimalUtil;
 import com.yeshi.fanli.util.StringUtil;
 import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
-import com.yeshi.fanli.vo.order.CommonOrderVO;
 
 @Service
 public class TaoBaoWeiQuanDrawBackServiceImpl implements TaoBaoWeiQuanDrawBackService {
@@ -80,13 +79,17 @@
 	@Resource
 	private UserMoneyService userMoneyService;
 
+
+	@Resource
+	private UserMoneyDetailService userMoneyDetailService;
+
 	@Override
 	public void addWeiQuanDrawBack(TaoBaoWeiQuanDrawBack taoBaoWeiQuanDrawBack) {
 		taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(taoBaoWeiQuanDrawBack.getOrderItemId(),
 				taoBaoWeiQuanDrawBack.getUser().getId());
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	private void addDebt(Long uid, Long hbId, BigDecimal money) throws UserMoneyDebtException {
 		UserMoneyDebt debt = new UserMoneyDebt();
 		debt.setBeiZhu(null);
@@ -114,49 +117,22 @@
 		return money;
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
-	public void doWeiQuanFanli(String orderId) throws TaoBaoWeiQuanException {
+	public Map<Long, BigDecimal> doWeiQuanFanli(String orderId, boolean subMoneySync) throws TaoBaoWeiQuanException {
 		if (StringUtil.isNullOrEmpty(orderId))
 			throw new TaoBaoWeiQuanException(1, "璁㈠崟鍙蜂负绌哄��");
 		// 鏌ヨ鏄惁涓虹淮鏉冭鍗�
 		List<TaoBaoWeiQuanOrder> list = taoBaoWeiQuanOrderService.getWeiQuanSuccessOrders(orderId);
 		if (list == null || list.size() == 0)
-			return;
-		// 鑾峰彇鍜岃璁㈠崟鍙锋湁鍏宠仈鐨勭敤鎴�
-		// 鑾峰彇涓荤孩鍖�(鍚屼竴涓鍗曞彿鐨勫崟鍙細瀵瑰簲鍚屼竴涓敤鎴�)
-		List<CommonOrderVO> typeList = new ArrayList<>();
-		CommonOrderVO cv = new CommonOrderVO();
-		cv.setSourceType(Constant.SOURCE_TYPE_TAOBAO);
-		cv.setOrderNo(orderId);
-		typeList.add(cv);
+			return null;
+		List<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId);
 
-		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;
+			return null;
 		for (int i = 0; i < mainHongBaoList.size(); i++) {
-			HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKey(mainHongBaoList.get(i).getId());
+			// 閿佽锛岄槻姝㈤噸澶� 鎿嶄綔
+			HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKeyForUpdate(mainHongBaoList.get(i).getId());
 			mainHongBaoList.set(i, hb);
 			// 鍙鐞嗚繑鍒╄鍗�
 			if (hb.getType() != HongBaoV2.TYPE_ZIGOU) {
@@ -166,7 +142,7 @@
 		}
 
 		if (mainHongBaoList == null || mainHongBaoList.size() == 0)
-			return;
+			return null;
 
 		// 涓荤敤鎴稩D
 		Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
@@ -185,6 +161,7 @@
 
 		// 璁$畻姣忎釜鐢ㄦ埛鐨勮繑鍒╂瘮渚�
 		Iterator<Long> its = fanMoneyMap.keySet().iterator();
+		Map<Long, BigDecimal> userSubMoneyMap = new HashMap<>();
 		while (its.hasNext()) {
 			Long uid = its.next();
 			BigDecimal userGetMoney = fanMoneyMap.get(uid);
@@ -239,93 +216,142 @@
 
 			// 閫�娆鹃噾棰�
 			BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney);
-
-			// 璁$畻璧勯噾鏄惁鍏呰冻
-			UserInfo user = userInfoMapper.selectByPrimaryKey(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, "璧勯噾鍊熻捶寮傚父");
+			userSubMoneyMap.put(uid, drawBackMoney);
+			if (subMoneySync) {
+				// 璁$畻璧勯噾鏄惁鍏呰冻
+				UserInfo user = userInfoMapper.selectByPrimaryKey(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;
 				}
-				continue;
-			}
 
-			UserMoneyDetail userMoneyDetail = null;
-			// 鏂扮増璧勯噾璁板綍
-			try {
-				userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
-			} catch (UserMoneyDetailException e) {
+				UserMoneyDetail userMoneyDetail = null;
+				// 鏂扮増璧勯噾璁板綍
 				try {
-					LogHelper.errorDetailInfo(e);
-				} catch (Exception e1) {
-					e1.printStackTrace();
+					userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
+				} catch (UserMoneyDetailException e) {
+					try {
+						LogHelper.errorDetailInfo(e);
+					} catch (Exception e1) {
+						e1.printStackTrace();
+					}
+				}
+				if (userMoneyDetail == null)
+					throw new TaoBaoWeiQuanException(110, "璧勯噾璁板綍鐢熸垚澶辫触");
+				userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
+
+				// 鏂扮増閫氱煡
+				List<CommonOrder> orderList = commonOrderMapper.listBySourceTypeAndOrderNo(Constant.SOURCE_TYPE_TAOBAO,
+						orderId);
+				int goodsCount = 0;
+				for (CommonOrder co : orderList) {
+					if (co.getState() != CommonOrder.STATE_SX)
+						goodsCount += co.getCount();
+				}
+
+				BigDecimal fanliMoney = new BigDecimal(0);
+				List<HongBaoOrder> hongBaoOrderList = hongBaoOrderMapper.listDetailByOrderIdAndSourceType(orderId,
+						Constant.SOURCE_TYPE_TAOBAO);
+				for (HongBaoOrder hb : hongBaoOrderList) {
+					fanliMoney = fanliMoney.add(hb.getHongBaoV2().getMoney());
+				}
+
+				userMoneyMsgNotificationService.fanliOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO,
+						drawBackMoney, fanliMoney, goodsCount, orderList.get(0).getThirdCreateTime());
+
+			} else {// 璁板綍璧勯噾璁板綍锛屼絾鏄笉鏄剧ず缁欑敤鎴�
+
+				UserMoneyDetail userMoneyDetail = null;
+				// 鏂扮増璧勯噾璁板綍
+				try {
+					userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack, drawBackMoney);
+				} catch (UserMoneyDetailException e) {
+					try {
+						LogHelper.errorDetailInfo(e);
+					} catch (Exception e1) {
+						e1.printStackTrace();
+					}
+				}
+				if (userMoneyDetail == null)
+					throw new TaoBaoWeiQuanException(110, "璧勯噾璁板綍鐢熸垚澶辫触");
+				userMoneyDetail.setShow(false);
+				try {
+					userMoneyDetailService.addUserMoneyDetail(userMoneyDetail);
+				} catch (UserMoneyDetailException e) {
+					throw new TaoBaoWeiQuanException(111, "鎻掑叆璁板綍鐢熸垚澶辫触");
 				}
 			}
-			userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
-
-			// 鏂扮増閫氱煡
-			userMoneyMsgNotificationService.fanliOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
-					userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
 		}
+		return userSubMoneyMap;
 	}
 
-	@Transactional
+	private List<HongBaoV2> getWeiQuanMainHongBao(List<TaoBaoWeiQuanOrder> list, String orderId) {
+		// 鏌ヨ鏄惁涓虹淮鏉冭鍗�
+		if (list == null || list.size() == 0)
+			return null;
+		// 鑾峰彇鍜岃璁㈠崟鍙锋湁鍏宠仈鐨勭敤鎴�
+		// 鏌ヨ杩樻湭鎵f鐨勪富绾㈠寘
+		List<HongBaoV2> mainHongBaoList = new ArrayList<>();
+		for (TaoBaoWeiQuanOrder weiQuanOrder : list) {
+			List<CommonOrder> orderList = commonOrderMapper.listBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
+					weiQuanOrder.getOrderItemId());
+			if (orderList != null && orderList.size() > 0)
+				for (CommonOrder commonOrder : orderList) {
+					// 淇敼璁㈠崟鐘舵�佷负缁存潈
+					CommonOrder co = new CommonOrder(commonOrder.getId());
+					co.setState(CommonOrder.STATE_WQ);
+					co.setUpdateTime(new Date());
+					commonOrderMapper.updateByPrimaryKeySelective(co);
+
+					HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.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());
+					}
+				}
+		}
+		return mainHongBaoList;
+	}
+
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void doWeiQuanShare(String orderId) throws TaoBaoWeiQuanException {
 		if (StringUtil.isNullOrEmpty(orderId))
 			throw new TaoBaoWeiQuanException(1, "璁㈠崟鍙蜂负绌哄��");
-		// 鏌ヨ鏄惁涓虹淮鏉冭鍗�
+
 		List<TaoBaoWeiQuanOrder> list = taoBaoWeiQuanOrderService.getWeiQuanSuccessOrders(orderId);
 		if (list == null || list.size() == 0)
 			return;
-		// 鑾峰彇鍜岃璁㈠崟鍙锋湁鍏宠仈鐨勭敤鎴�
-		// 鑾峰彇涓荤孩鍖�(鍚屼竴涓鍗曞彿鐨勫崟鍙細瀵瑰簲鍚屼竴涓敤鎴�)
-		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());
-				}
-			}
+		List<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId);
 
 		if (mainHongBaoList == null || mainHongBaoList.size() == 0)
 			return;
@@ -449,13 +475,29 @@
 				}
 			}
 			userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
-			userMoneyMsgNotificationService.shareOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
 
-					userInfoMapper.selectAvailableByPrimaryKey(uid).getMyHongBao());
+			// 鏂扮増閫氱煡
+			List<CommonOrder> orderList = commonOrderMapper.listBySourceTypeAndOrderNo(Constant.SOURCE_TYPE_TAOBAO,
+					orderId);
+			int goodsCount = 0;
+			for (CommonOrder co : orderList) {
+				if (co.getState() != CommonOrder.STATE_SX)
+					goodsCount += co.getCount();
+			}
+
+			BigDecimal fanliMoney = new BigDecimal(0);
+			List<HongBaoOrder> hongBaoOrderList = hongBaoOrderMapper.listDetailByOrderIdAndSourceType(orderId,
+					Constant.SOURCE_TYPE_TAOBAO);
+			for (HongBaoOrder hb : hongBaoOrderList) {
+				fanliMoney = fanliMoney.add(hb.getHongBaoV2().getMoney());
+			}
+
+			userMoneyMsgNotificationService.shareOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
+					fanliMoney, goodsCount, orderList.get(0).getThirdCreateTime());
 		}
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void doWeiQuanInvite(String orderId) throws TaoBaoWeiQuanException {
 		if (StringUtil.isNullOrEmpty(orderId))
@@ -505,7 +547,6 @@
 					weiQuanDrawBack.setOrderItemId(weiQuanOrder.getOrderItemId());
 					weiQuanDrawBack.setUser(child.getUserInfo());
 					taoBaoWeiQuanDrawBackMapper.insertSelective(weiQuanDrawBack);// 鍔犲叆杩旇繕璁板綍
-
 					// 濡傛灉璧勯噾澶т簬0鎵嶆墸闄�
 
 					if (drawBackMoney != null && drawBackMoney.compareTo(new BigDecimal(0)) > 0) {
@@ -537,9 +578,6 @@
 
 						userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
 
-						// 鏂扮増閫氱煡
-						userMoneyMsgNotificationService.inviteOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO,
-								drawBackMoney, userInfoMapper.selectAvailableByPrimaryKey(uid).getMyHongBao());
 					}
 				}
 		}
@@ -555,6 +593,16 @@
 	}
 
 	@Override
+	public List<TaoBaoWeiQuanDrawBack> getByOrderItemId(String orderItemId) {
+		return taoBaoWeiQuanDrawBackMapper.selectByOrderItemId(orderItemId);
+	}
+
+	@Override
+	public TaoBaoWeiQuanDrawBack selectByOrderItemIdAndUid(String orderItemId, Long uid) {
+		return taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(orderItemId, uid);
+	}
+
+	@Override
 	public TaoBaoWeiQuanDrawBack selectByHongBaoId(Long hbId) {
 		Long uid = null;
 		HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKey(hbId);

--
Gitblit v1.8.0