From 207dc8655711cddac2653e18b51e58a88dba2084 Mon Sep 17 00:00:00 2001
From: yj <Administrator@192>
Date: 星期五, 06 三月 2020 18:14:36 +0800
Subject: [PATCH] 发圈处理

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/money/tb/TaoBaoWeiQuanDrawBackServiceImpl.java |  278 +++++++++++++++++++++++++++++++++---------------------
 1 files changed, 169 insertions(+), 109 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..271cde1 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
@@ -22,28 +22,32 @@
 import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanDrawBackMapper;
 import com.yeshi.fanli.entity.bus.user.HongBaoV2;
 import com.yeshi.fanli.entity.bus.user.UserInfo;
+import com.yeshi.fanli.entity.money.InviteOrderSubsidyDebt;
 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.order.InviteOrderSubsidy;
 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.money.InviteOrderSubsidyDebtException;
 import com.yeshi.fanli.exception.money.UserMoneyDebtException;
 import com.yeshi.fanli.exception.money.UserMoneyDetailException;
 import com.yeshi.fanli.exception.order.TaoBaoWeiQuanException;
 import com.yeshi.fanli.log.LogHelper;
+import com.yeshi.fanli.service.inter.money.InviteOrderSubsidyDebtService;
 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.InviteOrderSubsidyService;
+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 +84,22 @@
 	@Resource
 	private UserMoneyService userMoneyService;
 
+	@Resource
+	private InviteOrderSubsidyService inviteOrderSubsidyService;
+
+	@Resource
+	private InviteOrderSubsidyDebtService inviteOrderSubsidyDebtService;
+
+	@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 +127,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 +152,7 @@
 		}
 
 		if (mainHongBaoList == null || mainHongBaoList.size() == 0)
-			return;
+			return null;
 
 		// 涓荤敤鎴稩D
 		Map<Long, BigDecimal> fanMoneyMap = new HashMap<>();
@@ -185,6 +171,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 +226,126 @@
 
 			// 閫�娆鹃噾棰�
 			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);
+
+				// 鏂扮増閫氱煡
+				userMoneyMsgNotificationService.fanliOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO,
+						drawBackMoney, userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
+			} 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;
@@ -451,11 +471,11 @@
 			userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail);
 			userMoneyMsgNotificationService.shareOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney,
 
-					userInfoMapper.selectAvailableByPrimaryKey(uid).getMyHongBao());
+					userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
 		}
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void doWeiQuanInvite(String orderId) throws TaoBaoWeiQuanException {
 		if (StringUtil.isNullOrEmpty(orderId))
@@ -506,6 +526,9 @@
 					weiQuanDrawBack.setUser(child.getUserInfo());
 					taoBaoWeiQuanDrawBackMapper.insertSelective(weiQuanDrawBack);// 鍔犲叆杩旇繕璁板綍
 
+					// 鍔犲叆閭�璇疯ˉ璐磋繑杩樿褰�
+					doInviteOrderSubsidy(orderId, Constant.SOURCE_TYPE_TAOBAO, uid, settleMent, wqMoney);
+
 					// 濡傛灉璧勯噾澶т簬0鎵嶆墸闄�
 
 					if (drawBackMoney != null && drawBackMoney.compareTo(new BigDecimal(0)) > 0) {
@@ -545,6 +568,33 @@
 		}
 	}
 
+	/**
+	 * 閭�璇疯鍗曡ˉ璐寸淮鏉冨鐞�
+	 * 
+	 * @param orderId
+	 * @param sourceType
+	 */
+	private void doInviteOrderSubsidy(String orderId, int sourceType, Long uid, BigDecimal settleMent,
+			BigDecimal weiQuanMoney) throws TaoBaoWeiQuanException {
+		InviteOrderSubsidy subSidy = inviteOrderSubsidyService.getByOrderNoAndType(uid, orderId, sourceType);
+		if (subSidy != null)// 娣诲姞鍊熻捶鍏崇郴
+		{
+			BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, weiQuanMoney, subSidy.getOriginalMoney());
+			if (drawBackMoney.compareTo(new BigDecimal(0)) <= 0)
+				return;
+			InviteOrderSubsidyDebt debt = new InviteOrderSubsidyDebt();
+			debt.setBeiZhu("璁㈠崟鍞悗:" + orderId + "-" + sourceType);
+			debt.setOriginMoney(drawBackMoney);
+			debt.setUid(uid);
+			debt.setCreateTime(new Date());
+			try {
+				inviteOrderSubsidyDebtService.addDebt(debt);
+			} catch (InviteOrderSubsidyDebtException e) {
+				throw new TaoBaoWeiQuanException(101, "閭�璇疯鍗曡ˉ璐村紓甯�");
+			}
+		}
+	}
+
 	@Override
 	public TaoBaoWeiQuanDrawBack selectByOrderItemId(String orderItemId) {
 		List<TaoBaoWeiQuanDrawBack> list = taoBaoWeiQuanDrawBackMapper.selectByOrderItemId(orderItemId);
@@ -555,6 +605,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