From 30d8e227e8d823b6c38c3b9c90ac2df03b63befe Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期二, 25 二月 2025 16:41:22 +0800 Subject: [PATCH] 淘宝转链接口更新 --- fanli/src/main/java/com/yeshi/fanli/service/impl/money/tb/TaoBaoWeiQuanDrawBackServiceImpl.java | 1223 +++++++++++++++++++++++++++++---------------------------- 1 files changed, 622 insertions(+), 601 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 378ae99..da26d57 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 @@ -1,601 +1,622 @@ -package com.yeshi.fanli.service.impl.money.tb; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import javax.annotation.Resource; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper; -import com.yeshi.fanli.dao.mybatis.UserInfoMapper; -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.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.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.order.InviteOrderSubsidyService; -import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService; -import com.yeshi.fanli.util.Constant; -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 { - @Resource - private TaoBaoWeiQuanDrawBackMapper taoBaoWeiQuanDrawBackMapper; - - @Resource - private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService; - - @Resource - private TaoBaoOrderMapper taoBaoOrderMapper; - - @Resource - private UserInfoMapper userInfoMapper; - - @Resource - private UserMoneyDetailMapper userMoneyDetailMapper; - - @Resource - private CommonOrderMapper commonOrderMapper; - - @Resource - private HongBaoV2Mapper hongBaoV2Mapper; - - @Resource - private HongBaoOrderMapper hongBaoOrderMapper; - - @Resource - private UserMoneyMsgNotificationService userMoneyMsgNotificationService; - - @Resource - private UserMoneyDebtService userMoneyDebtService; - - @Resource - private UserMoneyService userMoneyService; - - @Resource - private InviteOrderSubsidyService inviteOrderSubsidyService; - - @Resource - private InviteOrderSubsidyDebtService inviteOrderSubsidyDebtService; - - @Override - public void addWeiQuanDrawBack(TaoBaoWeiQuanDrawBack taoBaoWeiQuanDrawBack) { - taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(taoBaoWeiQuanDrawBack.getOrderItemId(), - taoBaoWeiQuanDrawBack.getUser().getId()); - } - - @Transactional(rollbackFor=Exception.class) - 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(rollbackFor=Exception.class) - @Override - public void doWeiQuanFanli(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<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId); - - if (mainHongBaoList == null || mainHongBaoList.size() == 0) - return; - for (int i = 0; i < mainHongBaoList.size(); i++) { - // 閿佽锛岄槻姝㈤噸澶� 鎿嶄綔 - HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKeyForUpdate(mainHongBaoList.get(i).getId()); - mainHongBaoList.set(i, hb); - // 鍙鐞嗚繑鍒╄鍗� - if (hb.getType() != HongBaoV2.TYPE_ZIGOU) { - mainHongBaoList.remove(i); - i--; - } - } - - if (mainHongBaoList == null || mainHongBaoList.size() == 0) - return; - - // 涓荤敤鎴稩D - Map<Long, BigDecimal> fanMoneyMap = new HashMap<>(); - - if (mainHongBaoList != null) - for (HongBaoV2 hongBao : mainHongBaoList) { - if (hongBao.getState() != HongBaoV2.STATE_YILINGQU) - continue; - // 绱涓荤孩鍖呯殑閲戦 - 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())); - } - - // 璁$畻姣忎釜鐢ㄦ埛鐨勮繑鍒╂瘮渚� - Iterator<Long> its = fanMoneyMap.keySet().iterator(); - while (its.hasNext()) { - Long uid = its.next(); - BigDecimal userGetMoney = fanMoneyMap.get(uid); - 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()); - - // 閫�娆剧殑璧勯噾 - wqMoney = wqMoney.add(weiQuanOrder.getMoney()); - weiQuanDrawBack = new TaoBaoWeiQuanDrawBack(); - weiQuanDrawBack.setCreateTime(new Date()); - - 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)); - newWeiQuanDrawBackList.add(weiQuanDrawBack); - } - - if (wqMoney.compareTo(new BigDecimal("0")) <= 0) - continue; - - // 鎻掑叆璁板綍 - for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) { - taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack); - } - - // 閫�娆鹃噾棰� - 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, "璧勯噾鍊熻捶寮傚父"); - } - } - } - } - } - continue; - } - - UserMoneyDetail userMoneyDetail = null; - // 鏂扮増璧勯噾璁板綍 - try { - userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, weiQuanDrawBack, drawBackMoney); - } catch (UserMoneyDetailException e) { - try { - LogHelper.errorDetailInfo(e); - } catch (Exception e1) { - e1.printStackTrace(); - } - } - userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail); - - // 鏂扮増閫氱煡 - userMoneyMsgNotificationService.fanliOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney, - userInfoMapper.selectByPrimaryKey(uid).getMyHongBao()); - } - } - - 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<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId); - - if (mainHongBaoList == null || mainHongBaoList.size() == 0) - return; - - // 涓荤敤鎴稩D - Map<Long, BigDecimal> fanMoneyMap = new HashMap<>(); - - if (mainHongBaoList != null) - for (HongBaoV2 hongBao : mainHongBaoList) {// 缁熻璁㈠崟涓嬬殑鎵�鏈変富绾㈠寘 - hongBao = hongBaoV2Mapper.selectByPrimaryKey(hongBao.getId()); - if (hongBao.getState() != HongBaoV2.STATE_YILINGQU) - continue; - - // 鍙鍏ュ垎浜禋鐨勭孩鍖� - if (hongBao.getType() == HongBaoV2.TYPE_SHARE_GOODS) { - // 绱涓荤孩鍖呯殑閲戦 - 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())); - } - } - - Iterator<Long> its = fanMoneyMap.keySet().iterator(); - // 鏌ヨ鍜岃繖涓鍗曟湁鍏崇殑鐢ㄦ埛锛堜富璁㈠崟锛� - while (its.hasNext()) { - Long uid = its.next(); - BigDecimal userGetMoney = fanMoneyMap.get(uid); - 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()); - - // 閫�娆剧殑璧勯噾 - wqMoney = wqMoney.add(weiQuanOrder.getMoney()); - // 鎻掑叆璁板綍 - weiQuanDrawBack = new TaoBaoWeiQuanDrawBack(); - weiQuanDrawBack.setCreateTime(new Date()); - // 璁$畻閫�娆捐祫閲� - 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)); - newWeiQuanDrawBackList.add(weiQuanDrawBack); - } - - if (wqMoney.compareTo(new BigDecimal("0")) <= 0) - continue; - - // 閫�娆鹃噾棰� - BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney); - if (drawBackMoney.compareTo(userGetMoney) > 0) - drawBackMoney = userGetMoney; - - for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) - taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack); - // 璁$畻璧勯噾鏄惁鍏呰冻 - 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()); - 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 = UserMoneyDetailFactory.createShareWeiQuan(uid, weiQuanDrawBack, drawBackMoney); - } catch (UserMoneyDetailException e) { - try { - LogHelper.errorDetailInfo(e); - } catch (Exception e1) { - e1.printStackTrace(); - } - } - userMoneyService.subUserMoney(uid, drawBackMoney, userMoneyDetail); - userMoneyMsgNotificationService.shareOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney, - - userInfoMapper.selectAvailableByPrimaryKey(uid).getMyHongBao()); - } - } - - @Transactional(rollbackFor=Exception.class) - @Override - public void doWeiQuanInvite(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; - // 鏌ヨ璁㈠崟搴� - 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()); - } - - // 鏌ヨ涓嬬骇瀛愮敤鎴� - CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, - weiQuanOrder.getOrderItemId()); - if (commonOrder == null) - throw new TaoBaoWeiQuanException(2, "璁㈠崟鏈夎"); - - 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);// 鍔犲叆杩旇繕璁板綍 - - // 鍔犲叆閭�璇疯ˉ璐磋繑杩樿褰� - doInviteOrderSubsidy(orderId, Constant.SOURCE_TYPE_TAOBAO, uid, settleMent, wqMoney); - - // 濡傛灉璧勯噾澶т簬0鎵嶆墸闄� - - if (drawBackMoney != null && drawBackMoney.compareTo(new BigDecimal(0)) > 0) { - - // 鍒ゆ柇璧勯噾鏄惁瓒冲鎵f - UserInfo user = userInfoMapper.selectByPrimaryKey(uid); - if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 璧勯噾涓嶈冻 - { - try { - addDebt(uid, child.getId(), drawBackMoney); - } catch (UserMoneyDebtException e) { - throw new TaoBaoWeiQuanException(101, "璧勯噾鍊熻捶寮傚父"); - } - continue; - } - - 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.selectAvailableByPrimaryKey(uid).getMyHongBao()); - } - } - } - } - - /** - * 閭�璇疯鍗曡ˉ璐寸淮鏉冨鐞� - * - * @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); - if (list != null && list.size() > 0) - return list.get(0); - else - return null; - } - - @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); - 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; - } - -} +package com.yeshi.fanli.service.impl.money.tb; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper; +import com.yeshi.fanli.dao.mybatis.UserInfoMapper; +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.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.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.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.order.tb.TaoBaoWeiQuanOrderService; +import com.yeshi.fanli.util.Constant; +import com.yeshi.fanli.util.StringUtil; +import com.yeshi.fanli.util.factory.UserMoneyDetailFactory; + +@Service +public class TaoBaoWeiQuanDrawBackServiceImpl implements TaoBaoWeiQuanDrawBackService { + @Resource + private TaoBaoWeiQuanDrawBackMapper taoBaoWeiQuanDrawBackMapper; + + @Resource + private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService; + + @Resource + private TaoBaoOrderMapper taoBaoOrderMapper; + + @Resource + private UserInfoMapper userInfoMapper; + + @Resource + private UserMoneyDetailMapper userMoneyDetailMapper; + + @Resource + private CommonOrderMapper commonOrderMapper; + + @Resource + private HongBaoV2Mapper hongBaoV2Mapper; + + @Resource + private HongBaoOrderMapper hongBaoOrderMapper; + + @Resource + private UserMoneyMsgNotificationService userMoneyMsgNotificationService; + + @Resource + private UserMoneyDebtService userMoneyDebtService; + + @Resource + private UserMoneyService userMoneyService; + + + @Resource + private UserMoneyDetailService userMoneyDetailService; + + @Override + public void addWeiQuanDrawBack(TaoBaoWeiQuanDrawBack taoBaoWeiQuanDrawBack) { + taoBaoWeiQuanDrawBackMapper.selectByOrderItemIdAndUid(taoBaoWeiQuanDrawBack.getOrderItemId(), + taoBaoWeiQuanDrawBack.getUser().getId()); + } + + @Transactional(rollbackFor = Exception.class) + 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(rollbackFor = Exception.class) + @Override + 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 null; + List<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId); + + if (mainHongBaoList == null || mainHongBaoList.size() == 0) + return null; + for (int i = 0; i < mainHongBaoList.size(); i++) { + // 閿佽锛岄槻姝㈤噸澶� 鎿嶄綔 + HongBaoV2 hb = hongBaoV2Mapper.selectByPrimaryKeyForUpdate(mainHongBaoList.get(i).getId()); + mainHongBaoList.set(i, hb); + // 鍙鐞嗚繑鍒╄鍗� + if (hb.getType() != HongBaoV2.TYPE_ZIGOU) { + mainHongBaoList.remove(i); + i--; + } + } + + if (mainHongBaoList == null || mainHongBaoList.size() == 0) + return null; + + // 涓荤敤鎴稩D + Map<Long, BigDecimal> fanMoneyMap = new HashMap<>(); + + if (mainHongBaoList != null) + for (HongBaoV2 hongBao : mainHongBaoList) { + if (hongBao.getState() != HongBaoV2.STATE_YILINGQU) + continue; + // 绱涓荤孩鍖呯殑閲戦 + 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())); + } + + // 璁$畻姣忎釜鐢ㄦ埛鐨勮繑鍒╂瘮渚� + Iterator<Long> its = fanMoneyMap.keySet().iterator(); + Map<Long, BigDecimal> userSubMoneyMap = new HashMap<>(); + while (its.hasNext()) { + Long uid = its.next(); + BigDecimal userGetMoney = fanMoneyMap.get(uid); + 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) { + 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()); + + // 閫�娆剧殑璧勯噾 + wqMoney = wqMoney.add(weiQuanOrder.getMoney()); + weiQuanDrawBack = new TaoBaoWeiQuanDrawBack(); + weiQuanDrawBack.setCreateTime(new Date()); + + 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)); + newWeiQuanDrawBackList.add(weiQuanDrawBack); + } + + if (wqMoney.compareTo(new BigDecimal("0")) <= 0) + continue; + + // 鎻掑叆璁板綍 + for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) { + taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack); + } + + // 閫�娆鹃噾棰� + BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney); + 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; + } + + UserMoneyDetail userMoneyDetail = null; + // 鏂扮増璧勯噾璁板綍 + try { + userMoneyDetail = UserMoneyDetailFactory.createFanLiWeiQuan(uid, orderId, newWeiQuanDrawBackList, 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, orderId, newWeiQuanDrawBackList, 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, "鎻掑叆璁板綍鐢熸垚澶辫触"); + } + } + } + return userSubMoneyMap; + } + + 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<HongBaoV2> mainHongBaoList = getWeiQuanMainHongBao(list, orderId); + + if (mainHongBaoList == null || mainHongBaoList.size() == 0) + return; + + // 涓荤敤鎴稩D + Map<Long, BigDecimal> fanMoneyMap = new HashMap<>(); + + if (mainHongBaoList != null) + for (HongBaoV2 hongBao : mainHongBaoList) {// 缁熻璁㈠崟涓嬬殑鎵�鏈変富绾㈠寘 + hongBao = hongBaoV2Mapper.selectByPrimaryKey(hongBao.getId()); + if (hongBao.getState() != HongBaoV2.STATE_YILINGQU) + continue; + + // 鍙鍏ュ垎浜禋鐨勭孩鍖� + if (hongBao.getType() == HongBaoV2.TYPE_SHARE_GOODS) { + // 绱涓荤孩鍖呯殑閲戦 + 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())); + } + } + + Iterator<Long> its = fanMoneyMap.keySet().iterator(); + // 鏌ヨ鍜岃繖涓鍗曟湁鍏崇殑鐢ㄦ埛锛堜富璁㈠崟锛� + while (its.hasNext()) { + Long uid = its.next(); + BigDecimal userGetMoney = fanMoneyMap.get(uid); + 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()); + + // 閫�娆剧殑璧勯噾 + wqMoney = wqMoney.add(weiQuanOrder.getMoney()); + // 鎻掑叆璁板綍 + weiQuanDrawBack = new TaoBaoWeiQuanDrawBack(); + weiQuanDrawBack.setCreateTime(new Date()); + // 璁$畻閫�娆捐祫閲� + 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)); + newWeiQuanDrawBackList.add(weiQuanDrawBack); + } + + if (wqMoney.compareTo(new BigDecimal("0")) <= 0) + continue; + + // 閫�娆鹃噾棰� + BigDecimal drawBackMoney = computeDrawBackMoney(settleMent, wqMoney, userGetMoney); + if (drawBackMoney.compareTo(userGetMoney) > 0) + drawBackMoney = userGetMoney; + + for (TaoBaoWeiQuanDrawBack drawBack : newWeiQuanDrawBackList) + taoBaoWeiQuanDrawBackMapper.insertSelective(drawBack); + // 璁$畻璧勯噾鏄惁鍏呰冻 + 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()); + 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 = UserMoneyDetailFactory.createShareWeiQuan(uid, weiQuanDrawBack, drawBackMoney); + } catch (UserMoneyDetailException e) { + try { + LogHelper.errorDetailInfo(e); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + 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.shareOrderWeiQuan(uid, orderId, Constant.SOURCE_TYPE_TAOBAO, drawBackMoney, + fanliMoney, goodsCount, orderList.get(0).getThirdCreateTime()); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void doWeiQuanInvite(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; + // 鏌ヨ璁㈠崟搴� + 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()); + } + + + CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, + weiQuanOrder.getOrderItemId()); + if (commonOrder == null) + throw new TaoBaoWeiQuanException(2, "璁㈠崟鏈夎"); + + 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.selectByPrimaryKey(uid); + if (user != null && user.getMyHongBao().compareTo(drawBackMoney) < 0)// 璧勯噾涓嶈冻 + { + try { + addDebt(uid, child.getId(), drawBackMoney); + } catch (UserMoneyDebtException e) { + throw new TaoBaoWeiQuanException(101, "璧勯噾鍊熻捶寮傚父"); + } + continue; + } + + 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); + + } + } + } + } + + @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 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); + 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