admin
2019-07-15 be44007f1ffdd4d391fd360dce24a3423e37bcc6
修复订单异常处理中产生的bug
17个文件已修改
664 ■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/ShareController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/UserOrderController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/order/OrderRepairHistoryMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/bus/msg/MsgMoneyDetail.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/job/TaoLiJinJob.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/mapping/order/OrderRepairHistoryMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/msg/MsgMoneyDetailServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/msg/UserMoneyMsgNotificationServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderRepairServiceImpl.java 403 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TLJBuyGoodsServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/msg/UserMoneyMsgNotificationService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/OrderRepairService.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/StringUtil.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/factory/UserMoneyDetailFactory.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/factory/msg/MsgMoneyDetailFactory.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/factory/msg/UserMsgVOFactory.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/taobao/TaoKeApiUtil.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/ShareController.java
@@ -205,8 +205,7 @@
            data.put("clickUrl", url);
            data.put("token", taoBaoLink.getTaoToken());
            data.put("rule",
                    "http://apph5.yeshitv.com/apppage/all_help_content.html?id=148&from=singlemessage&isappinstalled=0");
            data.put("rule", configService.getConfig("share_single_goods_rule"));
            data.put("pictUrl", TbImgUtil.getTBSizeImg(taoBaoLink.getGoods().getPictUrl(), 500));
            String shareText = "";
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/UserOrderController.java
@@ -112,6 +112,9 @@
            String orderNo, String startTime, String endTime, Integer slotTime, boolean needCount, Integer dateType,
            PrintWriter out) {
        if (Constant.IS_TEST)
            uid = 389677L;
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/order/OrderRepairHistoryMapper.java
@@ -1,9 +1,17 @@
package com.yeshi.fanli.dao.mybatis.order;
import java.util.List;
import com.yeshi.fanli.dao.BaseMapper;
import com.yeshi.fanli.entity.order.OrderRepairHistory;
public interface OrderRepairHistoryMapper extends BaseMapper<OrderRepairHistory> {
    /**
     * 根据用户ID检索
     * @param uid
     * @return
     */
    List<OrderRepairHistory> listByUid(Long uid);
}
fanli/src/main/java/com/yeshi/fanli/entity/bus/msg/MsgMoneyDetail.java
@@ -20,7 +20,7 @@
public class MsgMoneyDetail {
    public enum MsgTypeMoneyTypeEnum {
        share("分享奖金"), invite("邀请奖金"), fanli("返利到账"), extract("提现"), extractValid("提现账号验证"), shareWeiQuan(
                "分享奖金扣除"), inviteWeiQuan("邀请奖金扣除"), fanliWeiQuan("返利扣除"),orderReward("返利奖励");
                "分享奖金扣除"), inviteWeiQuan("邀请奖金扣除"), fanliWeiQuan("返利扣除"), orderReward("返利奖励"), systemEqualize("系统补齐");
        private final String desc;
        private MsgTypeMoneyTypeEnum(String desc) {
fanli/src/main/java/com/yeshi/fanli/job/TaoLiJinJob.java
@@ -78,7 +78,7 @@
    /**
     * 每天凌晨过5分钟验证
     */
    @Scheduled(cron = "0 5 0 * * ?")
    @Scheduled(cron = "0 2 0 * * ?")
    public void updateShareTLJGoods() {
        if (!Constant.IS_TASK)
            return;
fanli/src/main/java/com/yeshi/fanli/mapping/order/OrderRepairHistoryMapper.xml
@@ -22,6 +22,14 @@
        <include refid="Base_Column_List" />
        from yeshi_ec_order_repair_history where id = #{id,jdbcType=BIGINT}
    </select>
    <select id="listByUid" resultMap="BaseResultMap" parameterType="java.lang.Long">
        select
        <include refid="Base_Column_List" />
        from yeshi_ec_order_repair_history where uid = #{0}
    </select>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">delete from
        yeshi_ec_order_repair_history where id = #{id,jdbcType=BIGINT}
    </delete>
fanli/src/main/java/com/yeshi/fanli/service/impl/msg/MsgMoneyDetailServiceImpl.java
@@ -100,6 +100,13 @@
            detail.setUpdateTime(new Date());
            detail.setRead(false);
            msgMoneyDetailMapper.insertSelective(detail);
        } else if (detail.getMsgType() == MsgTypeMoneyTypeEnum.systemEqualize) {
            if (detail.getMoney() == null || detail.getOrderId() == null || detail.getBalance() == null)
                throw new MsgMoneyDetailException(2, "消息信息不全");
            detail.setCreateTime(new Date());
            detail.setUpdateTime(new Date());
            detail.setRead(false);
            msgMoneyDetailMapper.insertSelective(detail);
        }
        userMsgReadStateService.addMoneyMsgUnReadCount(detail.getUser().getId(), 1);
fanli/src/main/java/com/yeshi/fanli/service/impl/msg/UserMoneyMsgNotificationServiceImpl.java
@@ -139,7 +139,16 @@
        } catch (MsgMoneyDetailException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void systemEqualize(Long uid, String reason, BigDecimal money, BigDecimal balance) {
        MsgMoneyDetail detail = MsgMoneyDetailFactory.createSystemEqualizeMsg(uid, reason, money, balance, null);
        try {
            msgMoneyDetailService.addMsgMoneyDetail(detail);
        } catch (MsgMoneyDetailException e) {
            e.printStackTrace();
        }
    }
}
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderRepairServiceImpl.java
@@ -1,5 +1,7 @@
package com.yeshi.fanli.service.impl.order;
import java.io.File;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
@@ -7,10 +9,13 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import javax.annotation.Resource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper;
@@ -18,9 +23,11 @@
import com.yeshi.fanli.dao.mybatis.order.CommonOrderMapper;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderTradeIdMapMapper;
import com.yeshi.fanli.dao.mybatis.order.HongBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.order.OrderRepairHistoryMapper;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.CommonOrderGoods;
import com.yeshi.fanli.entity.order.CommonOrderTradeIdMap;
@@ -29,32 +36,40 @@
import com.yeshi.fanli.entity.order.ShareGoodsActivityOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.HongBaoException;
import com.yeshi.fanli.exception.money.UserMoneyDetailException;
import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.goods.CommonGoodsService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoV2Service;
import com.yeshi.fanli.service.inter.hongbao.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
import com.yeshi.fanli.service.inter.order.OrderRepairHistoryService;
import com.yeshi.fanli.service.inter.order.OrderRepairService;
import com.yeshi.fanli.service.inter.order.ShareGoodsActivityOrderService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoOrderService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoWeiQuanOrderService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserMoneyService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponRecordService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.factory.CommonOrderGoodsFactory;
import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
import com.yeshi.fanli.util.taobao.TaoBaoOrderUtil;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
@Service
public class OrderRepairServiceImpl implements OrderRepairService {
    @Resource
    private OrderRepairHistoryMapper orderRepairHistoryMapper;
    @Resource
    private TaoBaoOrderService taoBaoOrderService;
@@ -104,19 +119,34 @@
    @Resource
    private OrderRepairHistoryService orderRepairHistoryService;
    @Resource
    private DataSourceTransactionManager dataSourceTransactionManager;
    @Resource
    private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
    @Resource
    private UserMoneyService userMoneyService;
    @Transactional
    @Override
    public void repairOrder(String orderId) {
    public void repairOrder(String orderId) throws Exception {
        // 比较CommonOrder与TaoBaoOrder的预估收益
        List<TaoBaoOrder> orderList = taoBaoOrderService.getTaoBaoOrderByOrderId(orderId);
        // 统计
        BigDecimal sumMoney = new BigDecimal("0");
        for (TaoBaoOrder order : orderList) {
            // if (order.getOrderState().equalsIgnoreCase("订单付款") ||
            // order.getOrderState().equalsIgnoreCase("订单成功"))
            // return;
            if (order.getSubsidy() == null)
                order.setSubsidy(new BigDecimal(0));
            if (order.geteIncome() == null)
                order.seteIncome(new BigDecimal(0));
            BigDecimal money = order.geteIncome().add(order.getSubsidy());
            sumMoney = sumMoney.add(money);
            if (order.getOrderState().equalsIgnoreCase("订单付款") || order.getOrderState().equalsIgnoreCase("订单成功"))
                return;
        }
        List<CommonOrder> commonOrderList = commonOrderService.listBySourceTypeAndOrderId(Constant.SOURCE_TYPE_TAOBAO,
                orderId);
@@ -125,11 +155,12 @@
            commonSumMoney = commonSumMoney.add(commonOrder.geteIncome());
        }
        try {
            processLessFanOrder(orderId);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 不处理维权过的订单
        List<TaoBaoWeiQuanOrder> weiQuanOrderList = taoBaoWeiQuanOrderService.getWeiQuanSuccessOrders(orderId);
        if (weiQuanOrderList != null && weiQuanOrderList.size() > 0)
            return;
        processLessFanOrder(orderId);
        // if (sumMoney.compareTo(commonSumMoney) > 0) {
        // // 少返了
@@ -140,14 +171,15 @@
    }
    @Transactional
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    private void processLessFanOrder(String orderId) throws Exception {
        List<CommonOrder> commonOrderList = commonOrderService.listBySourceTypeAndOrderId(Constant.SOURCE_TYPE_TAOBAO,
        List<CommonOrder> commonOrderList = commonOrderMapper.listBySourceTypeAndOrderNo(Constant.SOURCE_TYPE_TAOBAO,
                orderId);
        // 确定是自购还是分享赚
        if (commonOrderList.size() <= 0)
            return;
        HongBaoOrder hongBaoOrder = hongBaoOrderService.selectDetailByCommonOrderId(commonOrderList.get(0).getId());
        HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrderList.get(0).getId());
        // 统计原来的上下级关系及返利的资金
        Map<Long, BigDecimal> oldMoney = new HashMap<>();
        Long firstUid = null;
@@ -155,7 +187,7 @@
        Long mainUid = null;
        // 统计返利的资金
        for (CommonOrder co : commonOrderList) {
            HongBaoOrder tempHongBaoOrder = hongBaoOrderService.selectDetailByCommonOrderId(co.getId());
            HongBaoOrder tempHongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId());
            if (tempHongBaoOrder == null || tempHongBaoOrder.getHongBaoV2() == null)
                continue;
            hongBaoOrder = tempHongBaoOrder;
@@ -166,7 +198,7 @@
            if (hongBaoOrder.getHongBaoV2().getState() == HongBaoV2.STATE_YILINGQU)
                oldMoney.put(mainUid, oldMoney.get(mainUid).add(hongBaoOrder.getHongBaoV2().getMoney()));
            // 查询是否有下级
            List<HongBaoV2> childrenList = hongBaoV2Service.listChildrenById(hongBaoOrder.getHongBaoV2().getId());
            List<HongBaoV2> childrenList = hongBaoV2Mapper.listChildrenById(hongBaoOrder.getHongBaoV2().getId());
            for (HongBaoV2 child : childrenList) {
                if (child.getType() == HongBaoV2.TYPE_YIJI || child.getType() == HongBaoV2.TYPE_SHARE_YIJI) {
                    firstUid = child.getUserInfo().getId();
@@ -184,6 +216,29 @@
                }
            }
        }
        // FileWriter fw = null;
        // try {
        // // 如果文件存在,则追加内容;如果文件不存在,则创建文件
        // File f = new File("D:\\three_sale.txt");
        // fw = new FileWriter(f, true);
        // } catch (IOException e) {
        // e.printStackTrace();
        // }
        // PrintWriter pw = new PrintWriter(fw);
        // pw.println(orderId+"#"+firstUid+"-"+oldMoney.get(firstUid)+"#"+secondUid+"-"+(secondUid!=null?
        // oldMoney.get(secondUid):""));
        // pw.flush();
        // try {
        // fw.flush();
        // pw.close();
        // fw.close();
        // } catch (IOException e) {
        // e.printStackTrace();
        // }
        //
        // if (1 > 0)
        // return;
        List<TaoBaoOrder> taoBaoOrderList = taoBaoOrderService.getTaoBaoOrderByOrderId(orderId);
@@ -244,12 +299,18 @@
        if (newCommonOrderList != null)
            for (CommonOrder co : newCommonOrderList) {
                HongBaoOrder newHongBaoOrder = hongBaoOrderService.selectDetailByCommonOrderId(co.getId());
                if (newHongBaoOrder == null)
                    continue;
                HongBaoV2 hongBao = newHongBaoOrder.getHongBaoV2();
                if (hongBao.getState() == HongBaoV2.STATE_YILINGQU) {
                    Long uid = hongBao.getUserInfo().getId();
                    if (newMap.get(uid) == null)
                        newMap.put(uid, new BigDecimal(0));
                    newMap.put(uid, newMap.get(uid).add(hongBao.getMoney()));
                } else {
                    Long uid = hongBao.getUserInfo().getId();
                    if (newMap.get(uid) == null)
                        newMap.put(uid, new BigDecimal(0));
                }
                List<HongBaoV2> children = hongBaoV2Service.listChildrenById(hongBao.getId());
                if (children != null)
@@ -518,6 +579,7 @@
        }
    }
    @Transactional
    public void addOrder(CommonOrder commonOrder, int type, Long firstUid, Long secondUid) throws Exception {
        // 增加commonOrder
        commonOrder.setCreateTime(commonOrder.getThirdCreateTime());
@@ -620,7 +682,7 @@
            if (mianDanMoney != null)
                hongBao.setMoney(mianDanMoney);
            UserInfo user = userInfoService.getUserById(commonOrder.getUserInfo().getId());
            UserInfo user = userInfoService.getUserByIdWithMybatis(commonOrder.getUserInfo().getId());
            hongBao.setUrank(user.getRank());
            hongBaoV2Mapper.insertSelective(hongBao);
            // 添加红包与订单的映射
@@ -651,7 +713,10 @@
                firstHongbao.setVersion(2);
                firstHongbao.setState(hongBao.getState());
                if (hongBao.getState() == HongBaoV2.STATE_KELINGQU) {
                if (hongBao.getState() == HongBaoV2.STATE_KELINGQU) {// ||
                                                                        // hongBao.getState()
                                                                        // ==
                                                                        // HongBaoV2.STATE_YILINGQU
                    firstHongbao.setMoney(
                            MoneyBigDecimalUtil.mul(hongBao.getMoney(), firstRate.divide(new BigDecimal(100))));
                    Calendar calendar = Calendar.getInstance();
@@ -694,7 +759,10 @@
                    secondHongbao.setType(HongBaoV2.TYPE_ERJI);
                    secondHongbao.setVersion(2);
                    secondHongbao.setState(hongBao.getState());
                    if (hongBao.getState() == HongBaoV2.STATE_KELINGQU) {
                    if (hongBao.getState() == HongBaoV2.STATE_KELINGQU) {// ||
                                                                            // hongBao.getState()
                                                                            // ==
                                                                            // HongBaoV2.STATE_YILINGQU
                        secondHongbao.setMoney(
                                MoneyBigDecimalUtil.mul(hongBao.getMoney(), secondRate.divide(new BigDecimal(100))));
                        Calendar calendar = Calendar.getInstance();
@@ -751,7 +819,7 @@
                    hongBao.setState(HongBaoV2.STATE_YILINGQU);
                }
            }
            UserInfo user = userInfoService.getUserById(commonOrder.getUserInfo().getId());
            UserInfo user = userInfoService.getUserByIdWithMybatis(commonOrder.getUserInfo().getId());
            hongBao.setUrank(user.getRank());
            hongBao.setUserInfo(user);
            hongBaoV2Mapper.insertSelective(hongBao);
@@ -810,19 +878,302 @@
    }
    @Transactional
    @Transactional(propagation = Propagation.REQUIRED)
    private void deleteByCommonOrderId(Long commonOrderId) {
        HongBaoOrder hongBaoOrder = hongBaoOrderService.selectDetailByCommonOrderId(commonOrderId);
        HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrderId);
        if (hongBaoOrder == null || hongBaoOrder.getHongBaoV2() == null)
            return;
        List<HongBaoV2> children = hongBaoV2Service.listChildrenById(hongBaoOrder.getHongBaoV2().getId());
        List<HongBaoV2> children = hongBaoV2Mapper.listChildrenById(hongBaoOrder.getHongBaoV2().getId());
        if (children != null)
            for (HongBaoV2 hongBao : children) {
                hongBaoV2Service.deleteByPrimaryKey(hongBao.getId());
                hongBaoV2Mapper.deleteByPrimaryKey(hongBao.getId());
            }
        hongBaoV2Service.deleteByPrimaryKey(hongBaoOrder.getHongBaoV2().getId());
        hongBaoOrderService.deleteByPrimaryKey(hongBaoOrder.getId());
        commonOrderService.deleteByPrimaryKey(commonOrderId);
        hongBaoV2Mapper.deleteByPrimaryKey(hongBaoOrder.getHongBaoV2().getId());
        hongBaoOrderMapper.deleteByPrimaryKey(hongBaoOrder.getId());
        commonOrderMapper.deleteByPrimaryKey(commonOrderId);
    }
    @Transactional
    @Override
    public void testTransaction() {
        hongBaoV2Mapper.selectByPrimaryKey(1L);
    }
    private static Map<String, OrderInfo> orderInfoMap;
    private OrderInfo getOrderInfo(String orderId) {
        if (orderInfoMap == null) {
            orderInfoMap = new HashMap<>();
            Scanner scanner = null;
            try {
                scanner = new Scanner(new File("C:\\Users\\Administrator\\Desktop\\订单集中排查\\three_sale.txt"));
                while (scanner.hasNext()) {
                    OrderInfo orderInfo = new OrderInfo();
                    String info = scanner.next();
                    if (StringUtil.isNullOrEmpty(info))
                        continue;
                    String[] sts = info.split("#");
                    String orderid = sts[0];
                    orderInfo.setOrderId(orderid);
                    String firstUid = sts[1].split("-")[0];
                    String firstUidMoney = sts[1].split("-")[1];
                    orderInfo.setFirstUid(Long.parseLong(firstUid));
                    orderInfo.setFirstUidMoney(new BigDecimal(firstUidMoney));
                    String secondUid = sts[2].split("-")[0];
                    String secondUidMoney = null;
                    if (sts[2].split("-").length > 1)
                        secondUidMoney = sts[2].split("-")[1];
                    if (!StringUtil.isNullOrEmpty(secondUid))
                        orderInfo.setSecondUid(Long.parseLong(secondUid));
                    if (!StringUtil.isNullOrEmpty(secondUidMoney))
                        orderInfo.setSecondUidMoney(new BigDecimal(secondUidMoney));
                    orderInfoMap.put(orderInfo.getOrderId(), orderInfo);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            scanner.close();
        }
        return orderInfoMap.get(orderId);
    }
    @Override
    public void repireFirstAndSecondLevel(String orderId) throws Exception {
        OrderInfo info = getOrderInfo(orderId);
        Map<Long, BigDecimal> oldMoneyMap = new HashMap<>();
        if (info.getFirstUid() != null)
            oldMoneyMap.put(info.getFirstUid(), info.getFirstUidMoney());
        if (info.getSecondUid() != null)
            oldMoneyMap.put(info.getSecondUid(), info.getSecondUidMoney());
        if (info != null) {
            List<CommonOrder> list = commonOrderMapper.listBySourceTypeAndOrderNo(Constant.SOURCE_TYPE_TAOBAO,
                    info.getOrderId());
            // 查询是否有子红包
            for (CommonOrder commonOrder : list) {
                HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
                if (hongBaoOrder == null)
                    continue;
                List<HongBaoV2> hongBaoList = hongBaoV2Mapper.listChildrenById(hongBaoOrder.getHongBaoV2().getId());
                if (hongBaoList != null && hongBaoList.size() > 0)// 有子红包就不处理了
                    return;
            }
            for (CommonOrder commonOrder : list) {
                HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
                HongBaoV2 hongBao = hongBaoOrder.getHongBaoV2();
                Long firstUid = info.getFirstUid();
                Long secondUid = info.getSecondUid();
                // 加入子红包
                UserInfo boss = null;
                if (firstUid != null)
                    boss = userInfoService.selectByPKey(firstUid);
                if (boss != null && hongBao.getState() != HongBaoV2.STATE_SHIXIAO) {// 1级BOSS存在且红包未失效,免单不支持多级分销
                    // 插入一级子红包
                    BigDecimal firstRate = hongBaoManageService
                            .getFirstInviteRate(boss.getRank() == null ? 0 : boss.getRank());
                    if (firstRate.compareTo(new BigDecimal(0)) <= 0)
                        return;
                    HongBaoV2 firstHongbao = new HongBaoV2();
                    firstHongbao.setBeizhu("2019年7月批量修改");
                    firstHongbao.setUserInfo(boss);
                    firstHongbao.setUrank(boss.getRank());
                    firstHongbao.setParent(hongBao);
                    firstHongbao.setCreateTime(new Date());
                    firstHongbao.setType(HongBaoV2.TYPE_YIJI);
                    firstHongbao.setVersion(2);
                    firstHongbao.setState(hongBao.getState());
                    if (hongBao.getState() == HongBaoV2.STATE_KELINGQU
                            || hongBao.getState() == HongBaoV2.STATE_YILINGQU) {
                        firstHongbao.setMoney(
                                MoneyBigDecimalUtil.mul(hongBao.getMoney(), firstRate.divide(new BigDecimal(100))));
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime(commonOrder.getSettleTime());
                        calendar.add(Calendar.MONTH, 1);
                        firstHongbao.setPreGetTime(new Date(TimeUtil.convertToTimeTemp(
                                calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25",
                                "yyyy-M-dd")));
                        if (firstHongbao.getPreGetTime().getTime() < System.currentTimeMillis()) {
                            firstHongbao.setGetTime(firstHongbao.getPreGetTime());
                            firstHongbao.setState(HongBaoV2.STATE_YILINGQU);
                        }
                    } else if (hongBao.getState() == HongBaoV2.STATE_BUKELINGQU) {
                        firstHongbao.setMoney(
                                MoneyBigDecimalUtil.mul(hongBao.getMoney(), firstRate.divide(new BigDecimal(100))));
                    }
                    // 返利为0的不通知
                    if (firstHongbao.getMoney() == null || firstHongbao.getMoney().compareTo(new BigDecimal(0)) <= 0)
                        continue;
                    hongBaoV2Mapper.insertSelective(firstHongbao);
                    // 插入二级子红包
                    if (secondUid == null)
                        boss = null;
                    else
                        boss = userInfoService.selectByPKey(secondUid);
                    if (boss != null) {// 二级BOSS存在
                        BigDecimal secondRate = hongBaoManageService
                                .getSecondInviteRate(boss.getRank() == null ? 0 : boss.getRank());
                        if (secondRate.compareTo(new BigDecimal(0)) <= 0)
                            return;
                        HongBaoV2 secondHongbao = new HongBaoV2();
                        secondHongbao.setBeizhu("2019年7月批量修改");
                        secondHongbao.setUserInfo(boss);
                        secondHongbao.setUrank(boss.getRank());
                        secondHongbao.setParent(hongBao);
                        secondHongbao.setCreateTime(new Date());
                        secondHongbao.setType(HongBaoV2.TYPE_ERJI);
                        secondHongbao.setVersion(2);
                        secondHongbao.setState(hongBao.getState());
                        if (hongBao.getState() == HongBaoV2.STATE_KELINGQU
                                || hongBao.getState() == HongBaoV2.STATE_YILINGQU) {
                            secondHongbao.setMoney(MoneyBigDecimalUtil.mul(hongBao.getMoney(),
                                    secondRate.divide(new BigDecimal(100))));
                            Calendar calendar = Calendar.getInstance();
                            calendar.setTime(commonOrder.getSettleTime());
                            calendar.add(Calendar.MONTH, 1);
                            secondHongbao.setPreGetTime(new Date(TimeUtil.convertToTimeTemp(
                                    calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25",
                                    "yyyy-M-dd")));
                            if (secondHongbao.getPreGetTime().getTime() < System.currentTimeMillis()) {
                                secondHongbao.setGetTime(secondHongbao.getPreGetTime());
                                secondHongbao.setState(HongBaoV2.STATE_YILINGQU);
                            }
                        } else if (hongBao.getState() == HongBaoV2.STATE_BUKELINGQU) {
                            secondHongbao.setMoney(MoneyBigDecimalUtil.mul(hongBao.getMoney(),
                                    secondRate.divide(new BigDecimal(100))));
                        }
                        // 返利为0的不统计
                        if (secondHongbao.getMoney() == null
                                || secondHongbao.getMoney().compareTo(new BigDecimal(0)) <= 0)
                            continue;
                        hongBaoV2Mapper.insertSelective(secondHongbao);
                    }
                }
            }
        }
        // 统计修改后的资金
        List<CommonOrder> newCommonOrderList = commonOrderMapper.listBySourceTypeAndOrderNo(Constant.SOURCE_TYPE_TAOBAO,
                orderId);
        Map<Long, BigDecimal> newMap = new HashMap<>();
        if (newCommonOrderList != null)
            for (CommonOrder co : newCommonOrderList) {
                HongBaoOrder newHongBaoOrder = hongBaoOrderService.selectDetailByCommonOrderId(co.getId());
                if (newHongBaoOrder == null)
                    continue;
                HongBaoV2 hongBao = newHongBaoOrder.getHongBaoV2();
                List<HongBaoV2> children = hongBaoV2Service.listChildrenById(hongBao.getId());
                if (children != null)
                    for (HongBaoV2 child : children) {
                        if (newMap.get(child.getUserInfo().getId()) == null)
                            newMap.put(child.getUserInfo().getId(), new BigDecimal(0));
                        if (child.getState() == HongBaoV2.STATE_YILINGQU)
                            newMap.put(child.getUserInfo().getId(),
                                    newMap.get(child.getUserInfo().getId()).add(child.getMoney()));
                    }
            }
        for (Iterator<Long> its = newMap.keySet().iterator(); its.hasNext();) {
            Long uid = its.next();
            BigDecimal beforeGetMoney = oldMoneyMap.get(uid);
            BigDecimal afterGetMoney = newMap.get(uid);
            OrderRepairHistory history = new OrderRepairHistory();
            history.setAfterGetMoney(afterGetMoney);
            history.setBeforeGetMoney(beforeGetMoney);
            history.setOrderId(orderId);
            history.setUid(uid);
            orderRepairHistoryService.addOrderRepairHistory(history);
        }
    }
    class OrderInfo {
        private String orderId;
        private Long firstUid;
        private BigDecimal firstUidMoney;
        private Long secondUid;
        private BigDecimal secondUidMoney;
        public String getOrderId() {
            return orderId;
        }
        public void setOrderId(String orderId) {
            this.orderId = orderId;
        }
        public Long getFirstUid() {
            return firstUid;
        }
        public void setFirstUid(Long firstUid) {
            this.firstUid = firstUid;
        }
        public BigDecimal getFirstUidMoney() {
            return firstUidMoney;
        }
        public void setFirstUidMoney(BigDecimal firstUidMoney) {
            this.firstUidMoney = firstUidMoney;
        }
        public Long getSecondUid() {
            return secondUid;
        }
        public void setSecondUid(Long secondUid) {
            this.secondUid = secondUid;
        }
        public BigDecimal getSecondUidMoney() {
            return secondUidMoney;
        }
        public void setSecondUidMoney(BigDecimal secondUidMoney) {
            this.secondUidMoney = secondUidMoney;
        }
    }
    @Override
    public List<OrderRepairHistory> listByUid(Long uid) {
        return orderRepairHistoryMapper.listByUid(uid);
    }
    @Transactional
    @Override
    public void doMoney(Long uid) {
        List<OrderRepairHistory> historyList = listByUid(uid);
        BigDecimal money = new BigDecimal(0);
        for (OrderRepairHistory history : historyList) {
            money.add(history.getAfterGetMoney().subtract(history.getBeforeGetMoney()));
        }
        if (money.compareTo(new BigDecimal(0)) > 0)// 资金需要增加
        {
            try {
                UserMoneyDetail detail = UserMoneyDetailFactory.createSystemEqualize(null, money, new UserInfo(uid));
                // 系统补齐
                userMoneyService.addUserMoney(uid, money, detail);
            } catch (UserMoneyDetailException e) {
                e.printStackTrace();
            }
        } else {// 资金需要减少
        }
    }
}
fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TLJBuyGoodsServiceImpl.java
@@ -129,9 +129,7 @@
        try {
            taoLiJinDTO = TaoKeApiUtil.createTaoLiJin(auctionId, "淘礼金验证", new BigDecimal("1.00"), 1, new Date(),
                    new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 6), new Date(),
                    new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 6),
                    new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY, TaoBaoConstant.TAOBAO_AUTH_APPSECRET,
                            TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT));
                    new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 6), TaoBaoConstant.ownBuyApp);
        } catch (TaoKeApiException e) {
            if (e.getCode() == TaoKeApiException.CODE_TLJ_FORBIDDEN) {
                // 该商品不支持创建淘礼金红包
fanli/src/main/java/com/yeshi/fanli/service/inter/msg/UserMoneyMsgNotificationService.java
@@ -116,4 +116,14 @@
     */
    public void orderReward(Long uid, String orderId, BigDecimal money, BigDecimal balance);
    /**
     * 系统补齐
     *
     * @param uid
     * @param reason
     * @param money
     * @param balance
     */
    public void systemEqualize(Long uid, String reason, BigDecimal money, BigDecimal balance);
}
fanli/src/main/java/com/yeshi/fanli/service/inter/order/OrderRepairService.java
@@ -1,7 +1,12 @@
package com.yeshi.fanli.service.inter.order;
import java.util.List;
import com.yeshi.fanli.entity.order.OrderRepairHistory;
/**
 * 订单修复服务
 *
 * @author Administrator
 *
 *
@@ -11,8 +16,31 @@
    /**
     * 修复订单
     */
    public void repairOrder(String orderId);
    public void repairOrder(String orderId) throws Exception;
    /**
     * 修复一级,二级订单订单
     *
     * @param orderId
     * @throws Exception
     */
    public void repireFirstAndSecondLevel(String orderId) throws Exception;
    public void testTransaction();
    /**
     * 根据用户ID检索
     *
     * @param uid
     * @return
     */
    List<OrderRepairHistory> listByUid(Long uid);
    /**
     * 处理资金
     *
     * @param uid
     */
    public void doMoney(Long uid);
}
fanli/src/main/java/com/yeshi/fanli/util/StringUtil.java
@@ -303,4 +303,22 @@
            str = str.substring(0, str.length() - sperator.length());
        return str;
    }
    /**
     * 淘口令提取
     *
     * @param str
     * @return
     */
    public static String picUpTaoToken(String str) {
        String pattern = "(₳{1}[A-Za-z0-9]+₳{1})|(¥{1}[A-Za-z0-9]+¥{1})|(¥{1}[A-Za-z0-9]+¥{1})";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(str);
        while (m.find()) {
            String group = m.group(0);
            if (!StringUtil.isNullOrEmpty(group))
                return group;
        }
        return null;
    }
}
fanli/src/main/java/com/yeshi/fanli/util/factory/UserMoneyDetailFactory.java
@@ -467,4 +467,26 @@
        return detail;
    }
    public static UserMoneyDetail createSystemEqualize(String desc, BigDecimal money, UserInfo user)
            throws UserMoneyDetailException {
        if (user == null)
            throw new UserMoneyDetailException(1, "UID不能为空");
        if (money == null)
            throw new UserMoneyDetailException(1, "金额不能为空");
        UserMoneyDetail detail = new UserMoneyDetail();
        detail.setCreateTime(new Date());
        detail.setIdentifyCode(StringUtil.Md5(
                UserMoneyDetailTypeEnum.systemEqualize.name() + "-" + System.currentTimeMillis() + "-" + user.getId()));
        detail.setMoney(money);
        detail.setTitle(UserMoneyDetailTypeEnum.systemEqualize.getDesc());
        detail.setType(UserMoneyDetailTypeEnum.systemEqualize);
        detail.setUpdateTime(new Date());
        detail.setUserInfo(user);
        if (!StringUtil.isNullOrEmpty(desc)) {
            detail.setDescInfo(desc);
        }
        return detail;
    }
}
fanli/src/main/java/com/yeshi/fanli/util/factory/msg/MsgMoneyDetailFactory.java
@@ -278,8 +278,7 @@
        detail.setUser(new UserInfo(uid));
        return detail;
    }
    public static MsgMoneyDetail createOrderRewardMsg(Long uid, String orderId, BigDecimal money, BigDecimal balance,
            String beiZhu) {
        if (money == null || orderId == null || money == null || uid == null)
@@ -297,4 +296,21 @@
        return detail;
    }
    public static MsgMoneyDetail createSystemEqualizeMsg(Long uid, String reason, BigDecimal money, BigDecimal balance,
            String beiZhu) {
        if (money == null || money == null || uid == null)
            return null;
        MsgMoneyDetail detail = new MsgMoneyDetail();
        detail.setBalance(balance);
        detail.setBeiZhu(beiZhu);
        detail.setCreateTime(new Date());
        detail.setMoney(money);
        detail.setMsgType(MsgTypeMoneyTypeEnum.systemEqualize);
        detail.setOrderId(reason);
        detail.setRead(false);
        detail.setUser(new UserInfo(uid));
        return detail;
    }
}
fanli/src/main/java/com/yeshi/fanli/util/factory/msg/UserMsgVOFactory.java
@@ -385,6 +385,27 @@
            return new UserMsgVO("http://img.flqapp.com/resource/msg/icon_msg_order_reward.png",
                    msg.getMsgType().getDesc(), msg.getUpdateTime() == null ? msg.getCreateTime() : msg.getUpdateTime(),
                    items);
        }else if (msg.getMsgType() == MsgTypeMoneyTypeEnum.systemEqualize ) {// 奖励订单
            contentList = new ArrayList<>();
            contentList.add(new ClientTextStyleVO("¥" + filterMoney(msg.getMoney()) + "", COLOR_HIGHLIGHT_CONTENT));
            items.add(new CommonMsgItemVO(new ClientTextStyleVO("补齐金额", COLOR_TITLE), contentList));
            contentList = new ArrayList<>();
            contentList.add(new ClientTextStyleVO(msg.getOrderId()+ "", COLOR_CONTENT));
            items.add(new CommonMsgItemVO(new ClientTextStyleVO("补齐原因", COLOR_TITLE), contentList));
            contentList = new ArrayList<>();
            contentList.add(new ClientTextStyleVO("¥" + filterMoney(msg.getBalance()) + "", COLOR_CONTENT));
            items.add(new CommonMsgItemVO(new ClientTextStyleVO("账户余额", COLOR_TITLE), contentList));
            contentList = new ArrayList<>();
            contentList.add(new ClientTextStyleVO(StringUtil.isNullOrEmpty(msg.getBeiZhu()) ? "无" : msg.getBeiZhu(),
                    COLOR_CONTENT));
            items.add(new CommonMsgItemVO(new ClientTextStyleVO("备注", COLOR_TITLE), contentList));
            return new UserMsgVO("http://img.flqapp.com/resource/money_detail/icon_system.png",
                    msg.getMsgType().getDesc(), msg.getUpdateTime() == null ? msg.getCreateTime() : msg.getUpdateTime(),
                    items);
        }
        return null;
fanli/src/main/java/com/yeshi/fanli/util/taobao/TaoKeApiUtil.java
@@ -1392,7 +1392,7 @@
        map.put("page_no", page + "");
        map.put("page_size", pageSize + "");
        map.put("material_id", materialId + "");
//        map.put("content_id", "561388751621");
        // map.put("content_id", "561388751621");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println(resultStr);
@@ -1946,9 +1946,38 @@
    }
    /**
     * 淘口令转商品ID
     *
     * @param token
     * @return
     */
    public static Long tokenConvertAuctionId(String token) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.tpwd.convert");
        map.put("password_content", token);
        map.put("adzone_id", TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT.split("_")[3]);
        TaoKeAppInfo app = new TaoKeAppInfo();
        app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
        app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
        try {
            JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
            try {
                return json.optJSONObject("tbk_tpwd_convert_response").optJSONObject("data").optLong("num_iid");
            } catch (Exception e) {
                return null;
            }
        } catch (TaoKeApiException e) {
            e.printStackTrace();
        }
        return null;
    }
    // 淘礼金创建
    public static TaoLiJinDTO createTaoLiJin(Long auctionId, String name, BigDecimal perface, int totalNum,
            Date sendStartTime, Date sendEndTime, Date useStartTime, Date useEndTime,TaoKeAppInfo app) throws TaoKeApiException{
            Date sendStartTime, Date sendEndTime, Date useStartTime, Date useEndTime, TaoKeAppInfo app)
            throws TaoKeApiException {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.vegas.tlj.create");
        map.put("adzone_id", app.getPid().split("_")[3]);
@@ -1959,17 +1988,16 @@
        map.put("security_switch", "false");
        map.put("per_face", perface.toString());
        map.put("send_start_time", TimeUtil.getGernalTime(sendStartTime.getTime(), "yyyy-MM-dd HH:mm:ss"));
        if(sendEndTime != null)
        if (sendEndTime != null)
            map.put("send_end_time", TimeUtil.getGernalTime(sendEndTime.getTime(), "yyyy-MM-dd HH:mm:ss"));
        if(useEndTime != null) {
        if (useEndTime != null) {
            map.put("use_end_time", TimeUtil.getGernalTime(useEndTime.getTime(), "yyyy-MM-dd"));
            map.put("use_end_time_mode", "2");
        }
        if(useStartTime != null)
        if (useStartTime != null)
            map.put("use_start_time", TimeUtil.getGernalTime(useStartTime.getTime(), "yyyy-MM-dd"));
        try {
            String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
@@ -1977,40 +2005,39 @@
            System.out.println(json);
            JSONObject root = json.optJSONObject("tbk_dg_vegas_tlj_create_response");
            if (root != null && root.optJSONObject("result") != null) {
                if (root.optJSONObject("result").optBoolean("success")) {
                    JSONObject modelJson = root.optJSONObject("result").optJSONObject("model");
                    TaoLiJinDTO dto = new TaoLiJinDTO();
                    dto.setRightsId(modelJson.optString("rights_id"));
                    dto.setSendUrl(modelJson.optString("send_url"));
                    return dto;
                }else{
                } else {
                    LogHelper.error(json);
                }
                // 接口返回异常
                String msgCode = root.optJSONObject("result").optString("msg_code");
                if (!StringUtil.isNullOrEmpty(msgCode)) {
                     switch(msgCode){
                     case "FAIL_BIZ_ITEM_FORBIDDEN":
                         throw new TaoKeApiException(TaoKeApiException.CODE_TLJ_FORBIDDEN, "该商品不支持创建淘礼金红包");
                     case "FAIL_BIZ_ACCOUNT_UN_PAID":
                     case "PRE_FREEZE_ASSET_ACCOUNT_ERROR":
                         throw new TaoKeApiException(TaoKeApiException.CODE_TLJ_NO_MONEY, "官方玩法钱包余额不足");
                     default:
                         return null;
                   }
                    switch (msgCode) {
                    case "FAIL_BIZ_ITEM_FORBIDDEN":
                        throw new TaoKeApiException(TaoKeApiException.CODE_TLJ_FORBIDDEN, "该商品不支持创建淘礼金红包");
                    case "FAIL_BIZ_ACCOUNT_UN_PAID":
                    case "PRE_FREEZE_ASSET_ACCOUNT_ERROR":
                        throw new TaoKeApiException(TaoKeApiException.CODE_TLJ_NO_MONEY, "官方玩法钱包余额不足");
                    default:
                        return null;
                    }
                }
            }
        } catch (TaoKeApiException e) {
             throw e;
            throw e;
        } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
        }
        return null;
    }
    // 淘礼金报告
    public static UserTaoLiJinReport getTaoLiJinEffective(String rightsId) {
@@ -2021,19 +2048,18 @@
        TaoKeAppInfo app = new TaoKeAppInfo();
        app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
        app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
        try {
            String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
            JSONObject json = JSONObject.fromObject(result);
            System.out.println(json);
            JSONObject root = json.optJSONObject("tbk_dg_vegas_tlj_instance_report_response");
            if (root != null && root.optJSONObject("result") != null) {
                if (root.optJSONObject("result").optBoolean("success")) {
                    JSONObject modelJson = root.optJSONObject("result").optJSONObject("model");
                    if (modelJson != null && modelJson.size() > 0) {
                        UserTaoLiJinReport report = new UserTaoLiJinReport();
                        report.setId(rightsId);
@@ -2048,7 +2074,7 @@
                        report.setWinNum(modelJson.optInt("win_num"));
                        report.setPreCommissionAmount(new BigDecimal(modelJson.optString("pre_commission_amount")));
                        return report;
                    }
                    }
                }
            }
        } catch (Exception e) {