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/extract/ExtractServiceImpl.java | 2746 +++++++++++++++++++++++++++++-----------------------------
 1 files changed, 1,379 insertions(+), 1,367 deletions(-)

diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/money/extract/ExtractServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/money/extract/ExtractServiceImpl.java
index 9f34446..0e6a85c 100644
--- a/fanli/src/main/java/com/yeshi/fanli/service/impl/money/extract/ExtractServiceImpl.java
+++ b/fanli/src/main/java/com/yeshi/fanli/service/impl/money/extract/ExtractServiceImpl.java
@@ -1,1367 +1,1379 @@
-package com.yeshi.fanli.service.impl.money.extract;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.Resource;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.DocumentHelper;
-import org.dom4j.Element;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.yeshi.utils.DateUtil;
-import org.yeshi.utils.entity.wx.RedPackParams;
-import org.yeshi.utils.entity.wx.RedPackRecord;
-import org.yeshi.utils.wx.WXPayUtil;
-
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.response.AlipayFundTransUniTransferResponse;
-import com.google.gson.Gson;
-import com.yeshi.fanli.dao.mybatis.AccountMessageMapper;
-import com.yeshi.fanli.dao.mybatis.AlipayAccountValidNormalHistoryMapper;
-import com.yeshi.fanli.dao.mybatis.ExtractAuditRecordMapper;
-import com.yeshi.fanli.dao.mybatis.ExtractMapper;
-import com.yeshi.fanli.dao.mybatis.ExtractRecordMapper;
-import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper;
-import com.yeshi.fanli.dao.mybatis.PayInfoMapper;
-import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
-import com.yeshi.fanli.dao.mybatis.money.UserMoneyDetailMapper;
-import com.yeshi.fanli.dto.HongBao;
-import com.yeshi.fanli.dto.money.ExtractOrderStatisticDTO;
-import com.yeshi.fanli.entity.bus.user.AlipayTransferResultInfo;
-import com.yeshi.fanli.entity.bus.user.Extract;
-import com.yeshi.fanli.entity.bus.user.ExtractAuditRecord;
-import com.yeshi.fanli.entity.bus.user.ExtractRecord;
-import com.yeshi.fanli.entity.bus.user.ExtractWeiXinRecord;
-import com.yeshi.fanli.entity.bus.user.HongBaoV2;
-import com.yeshi.fanli.entity.bus.user.PayInfo;
-import com.yeshi.fanli.entity.bus.user.UserAccountBindingHistory;
-import com.yeshi.fanli.entity.bus.user.UserInfo;
-import com.yeshi.fanli.entity.common.AdminUser;
-import com.yeshi.fanli.entity.money.UserMoneyDetail;
-import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum;
-import com.yeshi.fanli.entity.system.ConfigKeyEnum;
-import com.yeshi.fanli.exception.ExtractException;
-import com.yeshi.fanli.exception.NotExistObjectException;
-import com.yeshi.fanli.exception.ObjectStateException;
-import com.yeshi.fanli.exception.money.UserMoneyDetailException;
-import com.yeshi.fanli.log.LogHelper;
-import com.yeshi.fanli.service.inter.config.ConfigService;
-import com.yeshi.fanli.service.inter.config.SystemConfigService;
-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.extract.ExtractRecordService;
-import com.yeshi.fanli.service.inter.money.extract.ExtractService;
-import com.yeshi.fanli.service.inter.money.extract.ExtractWeiXinRecordService;
-import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
-import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
-import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
-import com.yeshi.fanli.service.inter.order.OrderUserStatisticService;
-import com.yeshi.fanli.service.inter.push.PushService;
-import com.yeshi.fanli.service.inter.user.UserAccountBindingHistoryService;
-import com.yeshi.fanli.service.inter.user.UserInfoService;
-import com.yeshi.fanli.util.AlipayUtil;
-import com.yeshi.fanli.util.CMQManager;
-import com.yeshi.fanli.util.Constant;
-import com.yeshi.fanli.util.GsonUtil;
-import org.yeshi.utils.MoneyBigDecimalUtil;
-import com.yeshi.fanli.util.StringUtil;
-import com.yeshi.fanli.util.ThreadUtil;
-import org.yeshi.utils.TimeUtil;
-import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
-
-@Service
-public class ExtractServiceImpl implements ExtractService {
-
-    @Resource
-    private UserInfoService userInfoService;
-
-    @Resource
-    private ConfigService configService;
-
-    @Resource
-    private ExtractRecordService extractRecordService;
-
-    @Resource
-    private SystemConfigService systemConfigService;
-
-    @Resource
-    private ExtractMapper extractMapper;
-
-    @Resource
-    private ExtractAuditRecordMapper extractAuditRecordMapper;
-
-    @Resource
-    private UserInfoMapper userInfoMapper;
-
-    @Resource
-    private PayInfoMapper payInfoMapper;
-
-    @Resource
-    private AccountMessageMapper accountMessageMapper;
-
-    @Resource
-    private ExtractRecordMapper extractRecordMapper;
-
-    @Resource
-    private HongBaoV2Mapper hongBaoV2Mapper;
-
-    @Resource
-    private HongBaoV2Service hongBaoV2Service;
-
-    @Resource
-    private PushService pushService;
-
-    @Resource
-    private UserMoneyDetailMapper userMoneyDetailMapper;
-
-    @Resource
-    private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
-
-    @Resource
-    private AlipayAccountValidNormalHistoryMapper alipayAccountValidNormalHistoryMapper;
-
-    @Resource
-    private UserMoneyDetailService userMoneyDetailService;
-
-    @Resource
-    private UserAccountBindingHistoryService userAccountBindingHistoryService;
-
-    @Resource
-    private UserMoneyDebtService userMoneyDebtService;
-
-    @Resource
-    private UserMoneyService userMoneyService;
-
-    @Resource
-    private OrderUserStatisticService orderUserStatisticService;
-
-    @Resource
-    private ExtractWeiXinRecordService extractWeiXinRecordService;
-
-    @Resource
-    private CommonOrderCountService commonOrderCountService;
-
-    @Transactional
-    public Integer addExtract(Extract extract) {
-        Integer integer = extract(extract);
-        return integer;
-    }
-
-    @Transactional
-    public Integer passExtract(final long id, AdminUser admin) {
-        Extract find = extractMapper.selectByPrimaryKeyForUpdate(id);
-        if (find == null)
-            return Constant.NOT_EXIST_OBJACT;
-
-        if (find.getState() != Extract.STATE_NOT_PROCESS) {
-            return Constant.OBJECT_STATE_EXCEPTION;
-        }
-
-        // 鏇存敼鎻愮幇鐘舵�佷负澶勭悊涓�
-        Extract updateExtract = new Extract();
-        updateExtract.setId(id);
-        updateExtract.setState(Extract.STATE_PROCESSING);
-        extractMapper.updateByPrimaryKeySelective(updateExtract);
-        // 鏀瑰彉璧勯噾璁板綍鐘舵��
-        UserMoneyDetail detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
-                UserMoneyDetailTypeEnum.extract, find.getUserInfo().getId(), find.getId());
-        if (detail != null) {
-            UserMoneyDetail update = new UserMoneyDetail(detail.getId());
-            update.setShow(true);
-            update.setUpdateTime(new Date());
-            userMoneyDetailMapper.updateByPrimaryKeySelective(update);
-        }
-
-        transfer(find, admin); // 鎻愮幇閫氳繃锛屾敮浠樺疂杞处
-
-        return null;
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    public synchronized void rejectExtract(long id, String reason, AdminUser admin)
-            throws ObjectStateException, NotExistObjectException {
-        Extract find = extractMapper.selectByPrimaryKey(id);
-
-        if (find == null) {
-            throw new NotExistObjectException("涓嶅瓨鍦ㄨ瀵硅薄");
-        }
-
-        if (find.getState() != Constant.EXTRACT_DEFUALT) {
-            throw new ObjectStateException("璇ョ姸鎬佷笉绛変簬涓嶄负鍒濆鐘舵��");
-        }
-
-        UserInfo user = find.getUserInfo();
-
-        UserMoneyDetail userMoneyDetail = null;
-        try {
-            userMoneyDetail = UserMoneyDetailFactory.createExtractReject(find);
-        } catch (UserMoneyDetailException e1) {
-            e1.printStackTrace();
-        }
-
-        // 澧炲姞璧勯噾
-        userMoneyService.addUserMoney(user.getId(), find.getMoney(), userMoneyDetail);
-        // 鏇存柊鍘熸潵鐨勭姸鎬�
-        Extract updateExtract = new Extract();
-        updateExtract.setId(id);
-        updateExtract.setState(Constant.EXTRACT_REJECT);
-        updateExtract.setReason(reason);
-        extractMapper.updateByPrimaryKeySelective(updateExtract);
-
-        long auditTime = java.lang.System.currentTimeMillis();
-        // 鏇存柊瀹℃牳璁板綍
-        ExtractAuditRecord auditRecord = new ExtractAuditRecord();
-        List<ExtractAuditRecord> records = extractAuditRecordMapper.getbyExtractId(id);
-        if (records != null && records.size() > 0) {
-            auditRecord = records.get(0);
-        }
-
-        // 瑙掕壊榛樿锛氬鏈�
-        auditRecord.setAuditRole("瀹㈡湇");
-        // 瀹℃牳浜�
-        auditRecord.setAdminUser(admin);
-        // 鎻愮幇涔嬪悗閲戦 涓嶅彉
-        auditRecord.setAfterMoney(auditRecord.getBeforeMoney());
-        // 瀹℃牳鏃堕棿
-        auditRecord.setAuditTime(auditTime);
-
-        // 鍘嗗彶鎻愮幇閲戦
-        Long uid = user.getId();
-        double countSuccessMoneys = extractMapper.countSuccessMoneysByUid(uid);
-        auditRecord.setCountMoney(new BigDecimal(countSuccessMoneys));
-
-        // 鍘嗗彶鎻愮幇娆℃暟
-        long countSuccess = extractMapper.countSuccessByUid(uid);
-        auditRecord.setCountNum(countSuccess);
-
-        // 鏇存柊鎻愮幇璁板綍瀹℃牳琛�
-        extractAuditRecordMapper.updateByPrimaryKeySelective(auditRecord);
-        // 鏂扮増璧勯噾璇︽儏
-
-        // 鏂扮増閫氱煡
-        userMoneyMsgNotificationService.extractFail(find, reason);
-    }
-
-    /**
-     * 鎻愮幇鐢宠
-     *
-     * @param extract
-     * @return
-     */
-    @Transactional
-    private Integer extract(Extract extract) {
-        UserAccountBindingHistory history = userAccountBindingHistoryService
-                .getLatestHistory(extract.getUserInfo().getId(), UserAccountBindingHistory.TYPE_PHONE);
-        // 鎵嬫満鍙锋洿鎹㈢粦瀹氱殑7澶╁唴涓嶈兘鎻愮幇
-        if (history != null && !history.getFirst()
-                && (System.currentTimeMillis() - history.getCreateTime().getTime()) < 1000 * 60 * 60 * 24 * 7L)
-            return 111;
-
-
-        UserInfo user = userInfoMapper.selectByPrimaryKeyForUpdate(extract.getUserInfo().getId());
-        // 浣欓涓嶈冻
-        if (user.getMyHongBao().compareTo(extract.getMoney()) < 0) {
-            return 3;
-        }
-
-        // 鏈夊�熻捶鍏崇郴
-        boolean isHaveToReplay = userMoneyDebtService.isHaveDebtToRepay(extract.getUserInfo().getId());
-        if (isHaveToReplay) {
-            return 110;
-        }
-
-        final String autoExtract = configService.getValue(ConfigKeyEnum.extractWay.getKey(), user.getSystem()); // 鏄惁鑷姩杞处
-        final String maxCount = configService.getValue(ConfigKeyEnum.extractDayCount.getKey(), user.getSystem());
-        final String maxMoney = configService.getValue(ConfigKeyEnum.extractMoneyDay.getKey(), user.getSystem());
-
-
-        Integer type = setExtractRecord(extract, maxCount, maxMoney);
-        if (type != 0) {
-            return type;
-        }
-
-        extractMapper.insertSelective(extract);
-
-        final ExtractAuditRecord auditRecord = new ExtractAuditRecord();
-        auditRecord.setBeforeMoney(user.getMyHongBao());
-        auditRecord.setExtract(extract);
-
-        Date minTime = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 180L);
-
-        extractAuditRecordMapper.insertSelective(auditRecord);
-
-        ThreadUtil.run(new Runnable() {
-
-            @Override
-            public void run() {
-                // 缁熻鏁版嵁
-                int less10Count = commonOrderCountService.countOderByUidAndLess10(user.getId());
-                ExtractAuditRecord update = new ExtractAuditRecord();
-                update.setId(auditRecord.getId());
-                int orderCount50More = orderUserStatisticService.countOrderCount100MoreByUidAndMinTime(user.getId(),
-                        minTime);
-                BigDecimal weiQuanOrderFanAmount = orderUserStatisticService.sumWeiQuanOrderFanAmountByUid(user.getId(),
-                        minTime);
-                int weiQuanOrderCount = orderUserStatisticService.countWeiQuanOrderByUid(user.getId(), minTime);
-                update.setExtraInfoStr(new Gson().toJson(new ExtractOrderStatisticDTO(orderCount50More,
-                        weiQuanOrderCount, weiQuanOrderFanAmount, 0, less10Count)));
-                extractAuditRecordMapper.updateByPrimaryKeySelective(update);
-            }
-        });
-
-        // 鏂扮増璧勯噾璇︽儏
-        UserMoneyDetail userMoneyDetail = null;
-        try {
-            userMoneyDetail = UserMoneyDetailFactory.createExtract(extract, null);
-        } catch (UserMoneyDetailException e2) {
-            try {
-                LogHelper.errorDetailInfo(e2);
-            } catch (Exception e1) {
-                e1.printStackTrace();
-            }
-        }
-
-        // 鍑忓幓璐︽埛璧勯噾
-        userMoneyService.subUserMoney(extract.getUserInfo().getId(), extract.getMoney(), userMoneyDetail);
-
-        // 娣诲姞鏂扮増閫氱煡
-        userMoneyMsgNotificationService.extractApplay(extract);
-
-        if ("鏄�".equals(autoExtract)) {
-            LogHelper.userInfo("uid=" + user.getId() + ",鎻愪氦杞处鐢宠!");
-        } else {// 鏆傛椂涓嶈嚜鍔ㄦ彁鐜�
-            // transfer(extract, null);
-        }
-        return null;
-    }
-
-    /**
-     * 杞处
-     *
-     * @param extract
-     * @param session
-     */
-    @Transactional
-    private void transfer(Extract extract, AdminUser adminUser) {
-        Integer type = extract.getType();
-        if (Constant.ZHIFUBAO == type) {
-            extractByZhiFuBao(extract, adminUser);
-        } else {
-            LogHelper.userInfo("鎻愮幇绫诲瀷閿欒锛�" + type);
-        }
-    }
-
-    /**
-     * 澧炲姞鎻愮幇璁板綍
-     *
-     * @param extract
-     * @param maxCount 鏈�澶氭彁鐜版鏁�
-     * @param maxMoney 鏈�澶ф彁鐜伴噾棰�
-     * @param session
-     * @return 濡傛灉涓�0锛屽垯澧炲姞鎴愬姛銆備负1锛屽垯瓒呰繃姣忔棩鏈�澶氭彁鐜版鏁般�備负2锛屽垯瓒呰繃姣忔棩鏈�澶氭彁鐜伴噾棰�
-     */
-    @Transactional
-    public Integer setExtractRecord(Extract extract, String maxCount, String maxMoney) {
-        long uid = extract.getUserInfo().getId();
-        BigDecimal money = extract.getMoney();
-
-        List<ExtractRecord> extractRecordList = extractRecordMapper.selectByUidAndToday(uid);
-
-        if (extractRecordList.size() == 0) {
-            ExtractRecord er = new ExtractRecord();
-            er.setCount(1);
-            er.setMoney(money);
-            er.setUserInfo(new UserInfo(uid));
-            er.setCreateTime(java.lang.System.currentTimeMillis());
-            extractRecordMapper.insertSelective(er);
-        } else {
-            ExtractRecord er = extractRecordList.get(0);
-            int count = er.getCount();
-            int maxCountInt = Integer.parseInt(maxCount);
-            if (count >= maxCountInt) {
-                return 1;
-            }
-            BigDecimal oldMoney = er.getMoney();
-            BigDecimal sumMoney = MoneyBigDecimalUtil.add(money, oldMoney);
-            BigDecimal maxMoneyDou = new BigDecimal(maxMoney);
-            if (maxMoneyDou.compareTo(sumMoney) == -1) {
-                return 2;
-            }
-
-            ExtractRecord updateER = new ExtractRecord();
-            updateER.setId(er.getId());
-            updateER.setCount(count + 1);
-            updateER.setMoney(sumMoney);
-            er.setCreateTime(java.lang.System.currentTimeMillis());
-            extractRecordMapper.updateByPrimaryKeySelective(updateER);
-        }
-        return 0;
-    }
-
-    /**
-     * 鎻愮幇鍒版敮浠樺疂
-     *
-     * @param extract
-     * @param session
-     */
-    // TODO 杞处閫昏緫闇�瑕佹敼鍙橈紝鍥哄畾IP
-    @Transactional
-    private void extractByZhiFuBao(Extract extract, AdminUser adminUser) {
-        LogHelper.userErrorInfo("鎻愮幇:寮�濮嬮�氳繃鎻愮幇-" + extract.getId());
-        AlipayFundTransUniTransferResponse response = null;
-        try {
-            response = AlipayUtil.transferNoThrowException("widthdraw_" + extract.getId(), extract.getAccount(), extract.getName(), extract.getMoney(), "鏉挎牀蹇渷鎻愮幇鍒拌处", "鏉ヨ嚜鏉挎牀蹇渷鐨勬彁鐜�");
-            LogHelper.userErrorInfo("鎻愮幇:鏀粯瀹濋�氳繃鎻愮幇鎴愬姛-" + extract.getId());
-        } catch (AlipayApiException e) {
-            LogHelper.errorDetailInfo(e, "鏀粯瀹濊浆璐﹀紓甯�:" + extract.getId(), "");
-            LogHelper.userErrorInfo("鎻愮幇:鏀粯瀹濇彁鐜板紓甯革細" + response + ",鎻愮幇淇℃伅" + GsonUtil.toJson(extract));
-        }
-
-        try {
-            CMQManager.getInstance().addExtractResultMsg(extract, response, adminUser);
-            LogHelper.userErrorInfo("鎻愮幇:娣诲姞澶勭悊闃熷垪鎴愬姛-" + extract.getId());
-        } catch (Exception e) {
-            LogHelper
-                    .userErrorInfo("鎻愮幇:鏀粯瀹濇彁鐜癈MQ寮傚父锛�" + new Gson().toJson(response) + ",鎻愮幇淇℃伅" + GsonUtil.toJson(extract));
-        }
-    }
-
-    /**
-     * 鎻愮幇澶辫触
-     *
-     * @param extract
-     * @param msg
-     * @param session
-     */
-    @Transactional
-    private void extractFail(Extract extract, String msg) {
-        UserInfo user = extract.getUserInfo();
-        // MoneyRecord moneyRecord = new MoneyRecord(user, null, extract
-        // .getMoney(), "鎻愮幇", "鎻愮幇澶辫触", new Date().getTime(), 3);
-        if ("浠樻鏂逛綑棰濅笉瓒�".equals(msg)) {
-            Extract updateExtract = new Extract();
-            updateExtract.setId(extract.getId());
-            updateExtract.setState(Constant.EXTRACT_DEFUALT);
-            updateExtract.setReason(msg);
-            extractMapper.updateByPrimaryKeySelective(updateExtract);
-        } else {
-            // 鑰佺増鏈姛鑳�
-            // List<MoneyRecord> list = moneyRecordDao.list("from MoneyRecord mr
-            // where mr.extract.id =" + extract.getId());
-            // if (list.size() > 0) {
-            // MoneyRecord moneyRecord = list.get(0);
-            // moneyRecordMapper.deleteByPrimaryKey(moneyRecord.getId());
-            // }
-
-            Extract updateExtract = new Extract();
-            updateExtract.setId(extract.getId());
-            updateExtract.setState(Constant.EXTRACT_REJECT);
-            updateExtract.setReason(msg);
-            extractMapper.updateByPrimaryKeySelective(updateExtract);
-
-            UserMoneyDetail userMoneyDetail = null;
-            // 鏂扮増璧勯噾璇︽儏
-            try {
-                userMoneyDetail = UserMoneyDetailFactory.createExtractReject(extract);
-            } catch (UserMoneyDetailException e2) {
-                try {
-                    LogHelper.errorDetailInfo(e2);
-                } catch (Exception e1) {
-                    e1.printStackTrace();
-                }
-            }
-            // 澧炲姞璧勯噾
-            userMoneyService.addUserMoney(user.getId(), extract.getMoney(), userMoneyDetail);
-
-            try {
-                LogHelper.userInfo("鏀粯瀹濊浆璐﹀け璐�:[鎻愮幇IP锛�" + extract.getIp() + ",鎵�杞处鍙�:" + extract.getAccount() + ",鐪熷疄濮撳悕锛�"
-                        + extract.getName() + ",鎵�杞噾棰濓細" + extract.getMoney() + ",澶辫触鍘熷洜" + extract.getReason() + "]");
-
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-
-            // 鏂扮増鎻愮幇
-            userMoneyMsgNotificationService.extractFail(extract, null);
-        }
-    }
-
-    /**
-     * 鎻愮幇鎴愬姛
-     *
-     * @param extract
-     * @param session
-     */
-    @Transactional
-    private void extractSuccess(Extract extract, String alipayNo) {
-        // 鑰佺増鏈姛鑳�
-        // List<MoneyRecord> list = moneyRecordDao.list("from MoneyRecord mr
-        // where mr.extract.id = " + extract.getId());
-        // MoneyRecord moneyRecord = list.get(0);
-        // moneyRecord.setType(3);
-        // MoneyRecord updateMoneyRecord = new MoneyRecord();
-        // updateMoneyRecord.setId(moneyRecord.getId());
-        // updateMoneyRecord.setType(3);
-        // moneyRecordMapper.updateByPrimaryKeySelective(updateMoneyRecord);
-        Extract updateExtract = new Extract();
-        updateExtract.setId(extract.getId());
-        updateExtract.setState(Constant.EXTRACT_PASS);
-        updateExtract.setReceiveTime(new Date());
-        updateExtract.setReason("鎻愮幇鎴愬姛");
-        extractMapper.updateByPrimaryKeySelective(updateExtract);
-
-        try {
-            LogHelper.userInfo("鏀粯瀹濊浆璐︽垚鍔�:[鎻愮幇IP锛�" + extract.getIp() + ",鎵�杞处鍙�:" + extract.getAccount() + ",鐪熷疄濮撳悕锛�"
-                    + extract.getName() + ",鎵�杞噾棰濓細" + extract.getMoney() + "]");
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        UserMoneyDetail detailNew = null;
-        try {
-            detailNew = UserMoneyDetailFactory.createExtract(extract, alipayNo);
-        } catch (UserMoneyDetailException e) {
-            e.printStackTrace();
-        }
-
-        // 澶栨樉璐︽埛鏄庣粏
-        UserMoneyDetail userMoneyDetail = userMoneyDetailMapper.selectByTypeAndUidAndIdentifyCode(
-                UserMoneyDetailTypeEnum.extractNew, extract.getUserInfo().getId(), extract.getId());
-        if (userMoneyDetail != null) {
-            UserMoneyDetail detail = new UserMoneyDetail(userMoneyDetail.getId());
-            detail.setShow(true);
-            detail.setUpdateTime(new Date());
-            if (detailNew != null)
-                detail.setDescInfo(detailNew.getDescInfo());
-            userMoneyDetailMapper.updateByPrimaryKeySelective(detail);
-        }
-        // 鏂扮増閫氱煡
-        userMoneyMsgNotificationService.extractSuccess(extract, alipayNo);
-    }
-
-    /**
-     * 鏍规嵁鎻愮幇璁板綍id鑾峰彇鐢ㄦ埛uid
-     */
-    @Override
-    public Extract getExtractById(long id) {
-        return extractMapper.selectByPrimaryKey(id);
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public void checkExtract(Long uid) throws ExtractException {
-        BigDecimal compensateMoney = extractMapper.computeCompensateByUid(uid);
-        if (compensateMoney == null)
-            compensateMoney = new BigDecimal(0);
-        // 涓嶅垽瀹氬埌璐︾孩鍖呴棶棰�
-        Long count = hongBaoV2Mapper.countByUidAndState(uid, HongBao.STATE_YILINGQU);
-        if ((count == null || count == 0) && compensateMoney.compareTo(new BigDecimal(0)) == 0) {
-            throw new ExtractException(1, "娌℃湁宸插埌璐︾殑绾㈠寘");
-        }
-        // 鏌ヨ鏄惁鏈夋瑺璐�
-        boolean isDebt = userMoneyDebtService.isHaveDebtToRepay(uid);
-        if (isDebt)
-            throw new ExtractException(3, "鏈夋瑺璐︽湭杩�");
-        // 鑾峰彇鎵�鏈夋敹鍏ユ墍寰�
-        BigDecimal hongBaoMoney = hongBaoV2Service.computeMoneyByUidAndState(uid, HongBaoV2.STATE_YILINGQU);
-
-        Date now = new Date();
-        //鑾峰彇鍥㈤槦鍒嗙孩
-        List<UserMoneyDetailTypeEnum> typeList = new ArrayList<>();
-        typeList.add(UserMoneyDetailTypeEnum.teamDividents);
-        BigDecimal teamDividents = userMoneyDetailService.statisticUserTypeMoneyWithDate(uid, typeList, new Date(0),
-                now);
-
-        //绾㈠寘鎻愮幇鏀跺叆
-        typeList = new ArrayList<>();
-        typeList.add(UserMoneyDetailTypeEnum.redPackExchange);
-        BigDecimal redPackExchange = userMoneyDetailService.statisticUserTypeMoneyWithDate(uid, typeList, new Date(0),
-                now);
-
-
-        //----------鎵�鏈夋敮鍑哄紑濮�------------
-
-        // 鑾峰彇鎻愮幇锛岃幏鍙栨彁鐜伴獙璇�
-        typeList = new ArrayList<>();
-        typeList.add(UserMoneyDetailTypeEnum.extract);
-        typeList.add(UserMoneyDetailTypeEnum.extractNew);
-        typeList.add(UserMoneyDetailTypeEnum.extractReject);
-        typeList.add(UserMoneyDetailTypeEnum.extractVerify);
-        typeList.add(UserMoneyDetailTypeEnum.extractVerifyNew);
-        BigDecimal extractMoney = userMoneyDetailService.statisticUserTypeMoneyWithDate(uid, typeList, new Date(0),
-                now);
-        extractMoney = extractMoney.abs();
-        // 鑾峰彇缁存潈
-        typeList = new ArrayList<>();
-        typeList.add(UserMoneyDetailTypeEnum.weiQuan);
-        typeList.add(UserMoneyDetailTypeEnum.fanliWeiQuan);
-        typeList.add(UserMoneyDetailTypeEnum.inviteWeiQuan);
-        typeList.add(UserMoneyDetailTypeEnum.shareWeiQuan);
-        typeList.add(UserMoneyDetailTypeEnum.hongbaoDeduct);
-        //鏂扮増缁存潈锛堝埌璐︽椂鍑忓幓浜嗙淮鏉冭祫閲戯紝浣嗘槸鍦ㄨ祫閲戞槑缁嗛噷闈㈠姞鍏ヤ簡缁存潈閲戦锛屼絾骞舵湭澶栨樉锛�
-        typeList.add(UserMoneyDetailTypeEnum.fanliWeiQuanNew);
-
-        BigDecimal weiqaunMoney = userMoneyDetailService.statisticUserTypeMoneyWithDate(uid, typeList, new Date(0),
-                now);
-        weiqaunMoney = weiqaunMoney.abs();
-
-
-        //--------------鎵�鏈夋敮鍑虹粨鏉�------------
-
-        BigDecimal balance = userInfoService.selectByPKey(uid).getMyHongBao();
-
-        BigDecimal after = hongBaoMoney.add(teamDividents).add(redPackExchange).subtract(extractMoney.add(weiqaunMoney).add(balance).add(compensateMoney));
-
-        if (after.compareTo(new BigDecimal("0")) != 0)
-            throw new ExtractException(2, "缁撶畻璧勯噾寮傚父锛�" + after);
-    }
-
-    @Override
-    public Extract selectByPrimaryKey(Long id) {
-        return extractMapper.selectByPrimaryKey(id);
-    }
-
-    @Override
-    public Extract getMyTaskInfo(Long adminId) {
-        return extractMapper.getMyTaskInfo(adminId);
-    }
-
-    @Override
-    public Extract getNewTaskInfo() {
-        return extractMapper.getNewTaskInfo();
-    }
-
-    @Override
-    public List<Map<String, Object>> getFinishRecord(int pageIndex, int pageSize, String key, String startTime,
-                                                     String endTime) {
-        return extractMapper.getFinishRecord((pageIndex - 1) * pageSize, pageSize, key, startTime, endTime);
-    }
-
-    @Override
-    public int updateByPrimaryKeySelective(Extract record) {
-        return extractMapper.updateByPrimaryKeySelective(record);
-    }
-
-    @Transactional
-    @Override
-    public void processExtractResult(AlipayTransferResultInfo info) {
-        if (info == null)
-            return;
-        AlipayFundTransUniTransferResponse response = info.getAlipayFundTransUniTransferResponse();
-        Extract extract = info.getExtract();
-        AdminUser admin = info.getAdminUser();
-        if (response == null)
-            return;
-        if (extract == null)
-            return;
-
-        extract = extractMapper.selectByPrimaryKey(info.getExtract().getId());
-
-        LogHelper.test("鎻愮幇缁撴灉:code-" + response.getCode() + " 淇℃伅:" + response.getMsg());
-        long uid = extract.getUserInfo().getId();
-        if (response.isSuccess()) {
-            String code = response.getCode();
-            if ("10000".equals(code)) {
-                extractSuccess(extract, response.getOrderId());
-            } else {
-                extractFail(extract, response.getSubMsg());
-            }
-        } else {
-            extractFail(extract, response.getSubMsg());
-        }
-        PayInfo payInfo = new PayInfo();
-        payInfo.setBizno(response.getOutBizNo());
-        payInfo.setCreatetime(new Date());
-        payInfo.setExtract(extract);
-        if ("10000".equals(response.getCode())) {
-            payInfo.setState(1);
-        } else {
-            payInfo.setState(2);
-        }
-        payInfo.setOrderId(response.getOrderId());
-        payInfo.setOrdertime(response.getTransDate());
-        payInfo.setInfo(response.getSubMsg());
-        payInfoMapper.insertSelective(payInfo);
-
-        // 鏇存柊瀹℃牳璁板綍
-        ExtractAuditRecord auditRecord = null;
-        List<ExtractAuditRecord> records = extractAuditRecordMapper.getbyExtractId(extract.getId());
-        if (records != null && records.size() > 0) {
-            auditRecord = records.get(0);
-        }
-
-        if (auditRecord != null) {
-
-            // 鎻愮幇浠樻璁板綍
-            List<PayInfo> paylist = payInfoMapper.getListbyExtractId(extract.getId());
-
-            if (paylist != null && paylist.size() > 0) {
-                // 鎻愮幇鎴愬姛 锛� 鎻愮幇涔嬪墠鎬婚噾棰濓細鎻愮幇鏃堕噾棰濆噺鍘绘彁鐜伴噾棰�
-                BigDecimal exceedMoney = MoneyBigDecimalUtil.sub(auditRecord.getBeforeMoney(), extract.getMoney());
-                // 鎻愮幇涔嬪悗閲戦
-                auditRecord.setAfterMoney(exceedMoney);
-            } else {
-                // 鎻愮幇澶辫触锛氫粯娆炬柟浣欓涓嶈冻銆佽处鎴蜂俊鎭敊璇� 鎻愮幇涔嬪悗閲戦 涓嶅彉
-                auditRecord.setAfterMoney(auditRecord.getBeforeMoney());
-            }
-
-            // 鍘嗗彶鎻愮幇閲戦
-            double countSuccessMoneys = extractMapper.countSuccessMoneysByUid(uid);
-            auditRecord.setCountMoney(new BigDecimal(countSuccessMoneys));
-
-            // 鍘嗗彶鎻愮幇娆℃暟
-            long countSuccess = extractMapper.countSuccessByUid(uid);
-            auditRecord.setCountNum(countSuccess);
-
-            // 瑙掕壊榛樿锛氬鏈�
-            auditRecord.setAuditRole("瀹㈡湇");
-            // 瀹℃牳浜�
-            auditRecord.setAdminUser(admin);
-            // 瀹℃牳鏃堕棿
-            auditRecord.setAuditTime(java.lang.System.currentTimeMillis());
-
-            // 鏇存柊鎻愮幇璁板綍瀹℃牳琛�
-            extractAuditRecordMapper.updateByPrimaryKeySelective(auditRecord);
-        }
-
-    }
-
-    @Transactional
-    @Override
-    public void testExtractSuccess(Long id) {
-        Extract extract = extractMapper.selectByPrimaryKey(id);
-        extractSuccess(extract, null);
-        Long uid = extract.getUserInfo().getId();
-
-        // 鏇存柊瀹℃牳璁板綍
-        ExtractAuditRecord auditRecord = null;
-        List<ExtractAuditRecord> records = extractAuditRecordMapper.getbyExtractId(extract.getId());
-        if (records != null && records.size() > 0) {
-            auditRecord = records.get(0);
-        }
-
-        if (auditRecord != null) {
-            // 鎻愮幇浠樻璁板綍
-            List<PayInfo> paylist = payInfoMapper.getListbyExtractId(extract.getId());
-            if (paylist != null && paylist.size() > 0) {
-                // 鎻愮幇鎴愬姛 锛� 鎻愮幇涔嬪墠鎬婚噾棰濓細鎻愮幇鏃堕噾棰濆噺鍘绘彁鐜伴噾棰�
-                BigDecimal exceedMoney = MoneyBigDecimalUtil.sub(auditRecord.getBeforeMoney(), extract.getMoney());
-                // 鎻愮幇涔嬪悗閲戦
-                auditRecord.setAfterMoney(exceedMoney);
-            } else {
-                // 鎻愮幇澶辫触锛氫粯娆炬柟浣欓涓嶈冻銆佽处鎴蜂俊鎭敊璇� 鎻愮幇涔嬪悗閲戦 涓嶅彉
-                auditRecord.setAfterMoney(auditRecord.getBeforeMoney());
-            }
-
-            // 鍘嗗彶鎻愮幇閲戦
-            double countSuccessMoneys = extractMapper.countSuccessMoneysByUid(uid);
-            auditRecord.setCountMoney(new BigDecimal(countSuccessMoneys));
-
-            // 鍘嗗彶鎻愮幇娆℃暟
-            long countSuccess = extractMapper.countSuccessByUid(uid);
-            auditRecord.setCountNum(countSuccess);
-
-            // 瑙掕壊榛樿锛氬鏈�
-            auditRecord.setAuditRole("瀹㈡湇");
-            // 瀹℃牳浜�
-            auditRecord.setAdminUser(new AdminUser(3L));
-            // 瀹℃牳鏃堕棿
-            auditRecord.setAuditTime(java.lang.System.currentTimeMillis());
-
-            // 鏇存柊鎻愮幇璁板綍瀹℃牳琛�
-            extractAuditRecordMapper.updateByPrimaryKeySelective(auditRecord);
-        }
-
-    }
-
-    @Override
-    public BigDecimal sumTodayApplyMoney(Long uid, String day) {
-        return extractMapper.sumToadyApplyByUid(uid, day);
-    }
-
-    @Override
-    public BigDecimal sumVerifyingMoney(Long uid) {
-        List<Integer> stateList = new ArrayList<>();
-        stateList.add(Extract.STATE_NOT_PROCESS);
-        stateList.add(Extract.STATE_PROCESSING);
-        BigDecimal money = extractMapper.sumMoneyByUidAndState(uid, stateList);
-        if (money == null)
-            return new BigDecimal(0);
-        else
-            return money;
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public void autoExtract(UserInfo user) {
-        if (user == null || user.getWxOpenId() == null || user.getWxUnionId() == null
-                || user.getState() != UserInfo.STATE_NORMAL)
-            return;
-
-        Date date = new Date();
-        BigDecimal money = new BigDecimal(Constant.AUTO_EXTRACT_MONEY);
-
-        // 1銆佹彃鍏ヨ褰�
-        ExtractWeiXinRecord extractRecord = new ExtractWeiXinRecord();
-        extractRecord.setUid(user.getId());
-        extractRecord.setOpenId(user.getWxOpenId());
-        extractRecord.setUnionId(user.getWxUnionId());
-        extractRecord.setMoney(money);
-        extractRecord.setCreateTime(date);
-        extractRecord.setUpdateTime(date);
-        extractWeiXinRecordService.insertSelective(extractRecord);
-
-        // 浜ゆ槗鍙�
-        Long recordId = extractRecord.getId();
-        String billno = "BanLiExtract" + recordId;
-
-        // 鏇存柊璁板綍
-        ExtractWeiXinRecord updeteRecord = null;
-
-        String mchId = "1520950211";
-        String appId = "wx5c0d167c6e3ad726";
-        String key = "XYJkJ2018FAfaodCCx899mLl138rfGVd";
-
-        // 2銆佸彂鏀惧井淇$孩鍖�
-        RedPackParams redPackParams = new RedPackParams();
-        redPackParams.setBillno(billno);
-        redPackParams.setMchId(mchId);
-        redPackParams.setWxappId(appId);
-        redPackParams.setSendName("鏉挎牀蹇渷");
-        redPackParams.setOpenid(user.getWxOpenId());
-        redPackParams.setMoney(money);
-        redPackParams.setTotalNum(1);
-        redPackParams.setWishing("璐︽埛涓墿浣欎綑棰濊鍦ㄦ湰App鍐呭畬鎴愭彁鐜�");
-        redPackParams.setClientIp("106.80.118.163");
-        redPackParams.setActName("鑷姩鎻愮幇");
-        redPackParams.setKey(key);
-        redPackParams.setRemark("寰俊鑷姩鎻愮幇");
-        // redPackParams.setSceneId(null);
-        // redPackParams.setRiskInfo(null);
-
-        // 鍙戠敓绾㈠寘鐘舵��
-        boolean stateRedPack = false;
-
-        String pwd = "1520950211";
-        InputStream cert = ExtractServiceImpl.class.getClassLoader()
-                .getResourceAsStream("certificate/apiclient_cert.p12"); // 璇诲彇.p12鏂囦欢
-        // 鎵ц鍙戞斁绾㈠寘
-        try {
-            String result = WXPayUtil.redPackToOpenId(redPackParams, pwd, cert);
-            if (!StringUtil.isNullOrEmpty(result)) {
-                stateRedPack = parseSendResult(result);
-            }
-
-            if (!stateRedPack) {
-                String redPackRecord = WXPayUtil.getRedPackRecord(billno, mchId, appId, key, pwd, cert);
-                if (!StringUtil.isNullOrEmpty(redPackRecord)) {
-                    updeteRecord = parseDTO(redPackRecord);
-                }
-            }
-        } catch (Exception e) {
-            String redPackRecord = WXPayUtil.getRedPackRecord(billno, mchId, appId, key, pwd, cert);
-            if (!StringUtil.isNullOrEmpty(redPackRecord)) {
-                updeteRecord = parseDTO(redPackRecord);
-            }
-            LogHelper.errorDetailInfo(e);
-        }
-        try {
-            cert.close();
-        } catch (IOException e1) {
-            e1.printStackTrace();
-        }
-
-        // 鏇存柊淇℃伅
-        if (updeteRecord == null) {
-            updeteRecord = new ExtractWeiXinRecord();
-        } else {
-            stateRedPack = true;
-        }
-
-        updeteRecord.setId(recordId);
-        updeteRecord.setStatus(ExtractWeiXinRecord.SENDING);
-        updeteRecord.setBillno(billno);
-        extractWeiXinRecordService.updateByPrimaryKeySelective(updeteRecord);
-
-        // 绾㈠寘鍙戞斁澶辫触
-        if (!stateRedPack)
-            return;
-
-        // 3銆佸姞鍏ヨ祫閲戞槑缁�
-        UserMoneyDetail detail = new UserMoneyDetail();
-        detail.setCreateTime(new Date());
-        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extractAutoWX.name() + ":" + recordId));
-        detail.setMoney(money);
-        detail.setTitle(UserMoneyDetailTypeEnum.extractAutoWX.getDesc());
-        detail.setType(UserMoneyDetailTypeEnum.extractAutoWX);
-        detail.setUpdateTime(new Date());
-        detail.setUserInfo(user);
-        try {
-            userMoneyDetailService.addUserMoneyDetail(detail);
-        } catch (UserMoneyDetailException e) {
-            LogHelper.errorDetailInfo(e);
-        }
-
-    }
-
-    private boolean parseSendResult(String result) {
-        try {
-            Document document = DocumentHelper.parseText(result);
-            // 鑾峰彇鏍硅妭鐐瑰厓绱犲璞�
-            Element root = document.getRootElement();
-            Element returnCode = root.element("return_code");
-
-            if (!"SUCCESS".equalsIgnoreCase(returnCode.getText())) {
-                Element returnMsg = root.element("return_msg");
-                System.out.println(returnMsg.getText());
-                return false;
-            }
-
-            Element resultCode = root.element("result_code");
-            if (!"SUCCESS".equalsIgnoreCase(resultCode.getText())) {
-                Element errCode = root.element("err_code");
-                Element errCodeDes = root.element("err_code_des");
-                System.out.println(errCode.getText() + ":" + errCodeDes.getText());
-                return false;
-            }
-            return true;
-        } catch (DocumentException e) {
-            e.printStackTrace();
-            LogHelper.errorDetailInfo(e);
-        }
-        return false;
-    }
-
-    private ExtractWeiXinRecord parseDTO(String result) {
-        try {
-
-            Document document = DocumentHelper.parseText(result);
-            // 鑾峰彇鏍硅妭鐐瑰厓绱犲璞�
-            Element root = document.getRootElement();
-            Element returnCode = root.element("return_code");
-
-            if (!"SUCCESS".equalsIgnoreCase(returnCode.getText())) {
-                Element returnMsg = root.element("return_msg");
-                System.out.println(returnMsg.getText());
-                return null;
-            }
-
-            Element resultCode = root.element("result_code");
-            if (!"SUCCESS".equalsIgnoreCase(resultCode.getText())) {
-                Element errCode = root.element("err_code");
-                Element errCodeDes = root.element("err_code_des");
-                System.out.println(errCode.getText() + ":" + errCodeDes.getText());
-            }
-
-            ExtractWeiXinRecord resultRecord = new ExtractWeiXinRecord();
-            resultRecord.setBillno(root.element("result_code").getText());
-            resultRecord.setDetailno(root.element("detail_id").getText());
-            resultRecord.setStatus(root.element("status").getText());
-            resultRecord.setSendType(root.element("send_type").getText());
-            resultRecord.setHbType(root.element("result_code").getText());
-
-            String totalNum = root.element("total_num").getText();
-            resultRecord.setTotalNum(Integer.parseInt(totalNum));
-
-            String sendTime = root.element("send_time").getText();
-            resultRecord.setSendTime(new Date(TimeUtil.convertDateToTemp2(sendTime)));
-
-            Element element = root.element("hblist");
-            Iterator<?> iterator = element.elementIterator();
-            while (iterator.hasNext()) {
-                Element childElement = (Element) iterator.next();
-                Element rcvTime = childElement.element("rcv_time");
-                resultRecord.setRcvTime(new Date(TimeUtil.convertDateToTemp2(rcvTime.getText())));
-                break;
-            }
-            return resultRecord;
-
-        } catch (DocumentException e) {
-            e.printStackTrace();
-            LogHelper.errorDetailInfo(e);
-        }
-        return null;
-    }
-
-    @Override
-    public List<UserInfo> preAutoUser() throws Exception {
-        int page = 0;
-        int pageSize = 100;
-        int maxSize = 300;
-        Date nowDate = new Date();
-        // 涓�銆佽嚜鍔ㄦ彁鐜伴拡瀵圭殑鐢ㄦ埛缇わ細 鍓嶆彁鏉′欢:鐢ㄦ埛鍦ㄨ窛浠�60澶╁埌90澶╁唴鏈椿璺冭繃鐨勭敤鎴�
-        String beganDate = DateUtil.reduceDayTostring(90, nowDate);
-        String endDate = DateUtil.reduceDayTostring(60, nowDate);
-        // 鏉′欢3锛氳窛绂讳笂涓�娆℃垚鍔熼鍙栧井淇$孩鍖呭凡缁忚秴杩囦簡30澶╂椂闂达紝鍙湪绗�31澶╁啀娆′笅鍙戯紱
-        String receivedDate = DateUtil.reduceDayTostring(30, nowDate);
-        // 鏉′欢4锛氳窛绂讳笂涓�娆℃湭鎴愬姛棰嗗彇寰俊绾㈠寘宸茬粡瓒呰繃浜�15澶╂椂闂达紝鍙湪绗�16澶╁啀娆′笅鍙戯紱
-        String refundDate = DateUtil.reduceDayTostring(15, nowDate);
-
-        // 浣欓鏈�浣庨檺鍒�
-        BigDecimal minSurplus = BigDecimal.valueOf(Constant.AUTO_EXTRACT_MIN_SURPLUS);
-
-        List<UserInfo> list = new ArrayList<UserInfo>();
-
-        while (true) {
-            // 鏌ヨ婊¤冻鏉′欢 1銆�2 鐨剈id
-            List<UserInfo> listUser = userInfoService.getAutoExtractUser(page * pageSize, pageSize, minSurplus,
-                    beganDate, endDate);
-            if (listUser == null || listUser.isEmpty())
-                break;
-
-            List<Long> listId = new ArrayList<Long>();
-            for (UserInfo userInfo : listUser) {
-                listId.add(userInfo.getId());
-            }
-
-            // 鏌ヨ璁板綍鏄惁婊¤冻
-            List<Long> listValid = extractWeiXinRecordService.getValidUsers(listId, receivedDate, refundDate);
-            if (listValid == null || listValid.isEmpty()) {
-                page++;
-                continue;
-            }
-
-            for (Long uid : listValid) {
-                if (list.size() >= maxSize)
-                    break;
-                for (UserInfo userInfo : listUser) {
-                    if (list.size() >= maxSize)
-                        break;
-
-                    if (userInfo.getId().longValue() == uid.longValue()) {
-                        list.add(userInfo);
-                        break;
-                    }
-                }
-            }
-
-            if (list.size() >= maxSize)
-                break;
-
-            page++;
-        }
-        return list;
-    }
-
-    @Override
-    public List<String> getAutoExtractOpenIds() throws Exception {
-        int page = 0;
-        int pageSize = 100;
-        int maxSize = 301; // appId + 瀹為檯openid300涓�
-        Date nowDate = new Date();
-        // 涓�銆佽嚜鍔ㄦ彁鐜伴拡瀵圭殑鐢ㄦ埛缇わ細 鍓嶆彁鏉′欢:鐢ㄦ埛鍦ㄨ窛浠�60澶╁埌90澶╁唴鏈椿璺冭繃鐨勭敤鎴�
-        String beganDate = DateUtil.reduceDayTostring(90, nowDate);
-        String endDate = DateUtil.reduceDayTostring(60, nowDate);
-        // 鏉′欢3锛氳窛绂讳笂涓�娆℃垚鍔熼鍙栧井淇$孩鍖呭凡缁忚秴杩囦簡30澶╂椂闂达紝鍙湪绗�31澶╁啀娆′笅鍙戯紱
-        String receivedDate = DateUtil.reduceDayTostring(30, nowDate);
-        // 鏉′欢4锛氳窛绂讳笂涓�娆℃湭鎴愬姛棰嗗彇寰俊绾㈠寘宸茬粡瓒呰繃浜�15澶╂椂闂达紝鍙湪绗�16澶╁啀娆′笅鍙戯紱
-        String refundDate = DateUtil.reduceDayTostring(15, nowDate);
-
-        // 鎻愮幇閲戦
-        BigDecimal money = BigDecimal.valueOf(Constant.AUTO_EXTRACT_MONEY);
-        // 浣欓鏈�浣庨檺鍒�
-        BigDecimal minSurplus = BigDecimal.valueOf(Constant.AUTO_EXTRACT_MIN_SURPLUS);
-
-        List<String> listOpendIDs = new ArrayList<String>();
-        // 棣栬appID
-        listOpendIDs.add(Constant.getWXAccount(null, null).getAppId());
-
-        while (true) {
-            // 鏌ヨ婊¤冻鏉′欢 1銆�2 鐨剈id
-            List<UserInfo> listUser = userInfoService.getAutoExtractUser(page * pageSize, pageSize, minSurplus,
-                    beganDate, endDate);
-            if (listUser == null || listUser.isEmpty())
-                break;
-
-            List<Long> listId = new ArrayList<Long>();
-            for (UserInfo userInfo : listUser) {
-                listId.add(userInfo.getId());
-            }
-
-            // 鏌ヨ璁板綍鏄惁婊¤冻
-            List<Long> listValid = extractWeiXinRecordService.getValidUsers(listId, receivedDate, refundDate);
-            if (listValid == null || listValid.isEmpty()) {
-                page++;
-                continue;
-            }
-
-            for (Long uid : listValid) {
-                UserInfo userInfo = subHongBaoByUid(uid, money, minSurplus);
-                if (userInfo != null) {
-                    listOpendIDs.add(userInfo.getWxOpenId());
-                    if (listOpendIDs.size() >= maxSize)
-                        break;
-                }
-            }
-
-            if (listOpendIDs.size() >= maxSize)
-                break;
-
-            page++;
-        }
-        return listOpendIDs;
-    }
-
-    @Override
-    public List<UserInfo> preAutoUserTo1212() throws Exception {
-        int page = 0;
-        int pageSize = 100;
-        int maxSize = 300;
-        Date nowDate = new Date();
-        // 鏉′欢3锛氳窛绂讳笂涓�娆℃垚鍔熼鍙栧井淇$孩鍖呭凡缁忚秴杩囦簡30澶╂椂闂达紝鍙湪绗�31澶╁啀娆′笅鍙戯紱
-        String receivedDate = DateUtil.reduceDayTostring(30, nowDate);
-        // 鏉′欢4锛氳窛绂讳笂涓�娆℃湭鎴愬姛棰嗗彇寰俊绾㈠寘宸茬粡瓒呰繃浜�15澶╂椂闂达紝鍙湪绗�16澶╁啀娆′笅鍙戯紱
-        String refundDate = DateUtil.reduceDayTostring(15, nowDate);
-        // 浣欓鏈�浣庨檺鍒�
-        List<UserInfo> list = new ArrayList<UserInfo>();
-        while (true) {
-            // 鏌ヨ婊¤冻鏉′欢 1銆�2 鐨剈id
-            List<UserInfo> listUser = userInfoService.getAutoExtractUserTo1212(page * pageSize, pageSize);
-            if (listUser == null || listUser.isEmpty())
-                break;
-
-            List<Long> listId = new ArrayList<Long>();
-            for (UserInfo userInfo : listUser) {
-                listId.add(userInfo.getId());
-            }
-
-            // 鏌ヨ璁板綍鏄惁婊¤冻
-            List<Long> listValid = extractWeiXinRecordService.getValidUsers(listId, receivedDate, refundDate);
-            if (listValid == null || listValid.isEmpty()) {
-                page++;
-                continue;
-            }
-
-            for (Long uid : listValid) {
-                if (list.size() >= maxSize)
-                    break;
-                for (UserInfo userInfo : listUser) {
-                    if (list.size() >= maxSize)
-                        break;
-
-                    if (userInfo.getId().longValue() == uid.longValue()) {
-                        list.add(userInfo);
-                        break;
-                    }
-                }
-            }
-
-            if (list.size() >= maxSize)
-                break;
-
-            page++;
-        }
-        return list;
-    }
-
-    @Override
-    public List<String> getAutoExtractOpenIdsTo1212() throws Exception {
-        int page = 0;
-        int pageSize = 100;
-        int maxSize = 301; // appId + 瀹為檯openid300涓�
-        Date nowDate = new Date();
-        // 鏉′欢3锛氳窛绂讳笂涓�娆℃垚鍔熼鍙栧井淇$孩鍖呭凡缁忚秴杩囦簡30澶╂椂闂达紝鍙湪绗�31澶╁啀娆′笅鍙戯紱
-        String receivedDate = DateUtil.reduceDayTostring(30, nowDate);
-        // 鏉′欢4锛氳窛绂讳笂涓�娆℃湭鎴愬姛棰嗗彇寰俊绾㈠寘宸茬粡瓒呰繃浜�15澶╂椂闂达紝鍙湪绗�16澶╁啀娆′笅鍙戯紱
-        String refundDate = DateUtil.reduceDayTostring(15, nowDate);
-
-        // 鎻愮幇閲戦
-        BigDecimal money = BigDecimal.valueOf(1);
-
-        List<String> listOpendIDs = new ArrayList<String>();
-        // 棣栬appID
-        listOpendIDs.add(Constant.getWXAccount(null, null).getAppId());
-
-        while (true) {
-            // 鏌ヨ婊¤冻鏉′欢 1銆�2 鐨剈id
-            List<UserInfo> listUser = userInfoService.getAutoExtractUserTo1212(page * pageSize, pageSize);
-            if (listUser == null || listUser.isEmpty())
-                break;
-
-            List<Long> listId = new ArrayList<Long>();
-            for (UserInfo userInfo : listUser) {
-                listId.add(userInfo.getId());
-            }
-
-            // 鏌ヨ璁板綍鏄惁婊¤冻
-            List<Long> listValid = extractWeiXinRecordService.getValidUsers(listId, receivedDate, refundDate);
-            if (listValid == null || listValid.isEmpty()) {
-                page++;
-                continue;
-            }
-
-            for (Long uid : listValid) {
-                UserInfo userInfo = subHongBaoByUid(uid, money, money);
-                if (userInfo != null) {
-                    listOpendIDs.add(userInfo.getWxOpenId());
-                    if (listOpendIDs.size() >= maxSize)
-                        break;
-                }
-            }
-
-            if (listOpendIDs.size() >= maxSize)
-                break;
-
-            page++;
-        }
-        return listOpendIDs;
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    private UserInfo subHongBaoByUid(Long uid, BigDecimal money, BigDecimal minSurplus) {
-        UserInfo userInfo = userInfoMapper.selectByPrimaryKeyForUpdate(uid);
-        if (userInfo != null && !StringUtil.isNullOrEmpty(userInfo.getWxOpenId())
-                && !StringUtil.isNullOrEmpty(userInfo.getWxUnionId())
-                && userInfo.getMyHongBao().compareTo(minSurplus) >= 0) {
-            // 寰俊鎻愮幇璁板綍
-            ExtractWeiXinRecord extractRecord = new ExtractWeiXinRecord();
-            extractRecord.setUid(uid);
-            extractRecord.setOpenId(userInfo.getWxOpenId());
-            extractRecord.setUnionId(userInfo.getWxUnionId());
-            extractRecord.setMoney(money);
-            extractRecord.setStatus(ExtractWeiXinRecord.SENDING);
-            extractRecord.setType(ExtractWeiXinRecord.TYPE_MANUAL);
-            extractRecord.setCreateTime(new Date());
-            extractRecord.setUpdateTime(new Date());
-            extractWeiXinRecordService.insertSelective(extractRecord);
-            // 璁板綍id
-            Long recordId = extractRecord.getId();
-
-            // 璧勯噾鏄庣粏
-            UserMoneyDetail detail = new UserMoneyDetail();
-            detail.setCreateTime(new Date());
-            detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extractAutoWX.name() + ":" + recordId));
-            detail.setMoney(new BigDecimal("-" + money.toString()));
-            detail.setTitle(UserMoneyDetailTypeEnum.extractAutoWX.getDesc());
-            detail.setType(UserMoneyDetailTypeEnum.extractAutoWX);
-            detail.setUpdateTime(new Date());
-            detail.setUserInfo(userInfo);
-
-            // 璧勯噾璁$畻
-            userMoneyService.subUserMoney(userInfo.getId(), money, detail);
-
-            // 婊¤冻鏉′欢杩斿洖淇℃伅
-            return userInfo;
-        }
-        return null;
-    }
-
-    @Override
-    public void updateManualExtractRecord(List<RedPackRecord> list) throws ExtractException {
-        if (list == null || list.isEmpty())
-            throw new ExtractException(1, "绾㈠寘璁板綍淇℃伅涓虹┖");
-
-        for (RedPackRecord redPackRecord : list) {
-            updateWeiXinRecord(redPackRecord);
-        }
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    private void updateWeiXinRecord(RedPackRecord redPackRecord) {
-        if (StringUtil.isNullOrEmpty(redPackRecord.getOpenId()))
-            return;
-
-        ExtractWeiXinRecord record = extractWeiXinRecordService.getByOpenIdAndType(redPackRecord.getOpenId(),
-                ExtractWeiXinRecord.TYPE_MANUAL);
-        if (record == null)
-            return;
-
-        // 鐘舵�佽繃婊�
-        String statusOld = record.getStatus();
-        if (StringUtil.isNullOrEmpty(statusOld) || ExtractWeiXinRecord.REFUND.equals(statusOld)
-                || ExtractWeiXinRecord.RECEIVED.equals(statusOld))
-            return;
-
-        ExtractWeiXinRecord updeteRecord = new ExtractWeiXinRecord();
-        updeteRecord.setId(record.getId());
-        updeteRecord.setUpdateTime(new Date());
-
-        String billno = redPackRecord.getBillno();
-        if (!StringUtil.isNullOrEmpty(billno)) {
-            updeteRecord.setBillno(billno.replace("`", "").replace("'", ""));
-        }
-
-        String detailno = redPackRecord.getDetailno();
-        if (!StringUtil.isNullOrEmpty(detailno)) {
-            updeteRecord.setDetailno(detailno.replace("`", "").replace("'", ""));
-        }
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-        String rcvTime = redPackRecord.getRcvTime();
-        if (!StringUtil.isNullOrEmpty(rcvTime)) {
-            try {
-                updeteRecord.setRcvTime(sdf.parse(rcvTime));
-            } catch (ParseException e) {
-                e.printStackTrace();
-            }
-        }
-
-        String sendTime = redPackRecord.getSendTime();
-        if (!StringUtil.isNullOrEmpty(sendTime)) {
-            try {
-                updeteRecord.setSendTime(sdf.parse(sendTime));
-            } catch (ParseException e) {
-                e.printStackTrace();
-            }
-        }
-
-        String status = redPackRecord.getStatus();
-        if (!StringUtil.isNullOrEmpty(status)) {
-            switch (status) {
-                case "宸插彂鏀惧緟棰嗗彇":
-                    status = ExtractWeiXinRecord.SENT;
-                    break;
-                case "杩囨湡鏈閫�娆�":
-                    status = ExtractWeiXinRecord.REFUND;
-                    break;
-                case "宸查鍙�":
-                    status = ExtractWeiXinRecord.RECEIVED;
-                    break;
-                default:
-                    status = null;
-                    break;
-            }
-        }
-        updeteRecord.setStatus(status);
-        extractWeiXinRecordService.updateByPrimaryKeySelective(updeteRecord);
-
-        if (ExtractWeiXinRecord.RECEIVED.equals(status)) {
-        } else if (ExtractWeiXinRecord.REFUND.equals(status)) {
-            // 璧勯噾鏄庣粏
-            UserMoneyDetail detail = new UserMoneyDetail();
-            detail.setCreateTime(new Date());
-            detail.setIdentifyCode(
-                    StringUtil.Md5(UserMoneyDetailTypeEnum.extractAutoWXRefund.name() + ":" + record.getId()));
-            detail.setMoney(record.getMoney());
-            detail.setTitle(UserMoneyDetailTypeEnum.extractAutoWXRefund.getDesc());
-            detail.setType(UserMoneyDetailTypeEnum.extractAutoWXRefund);
-            detail.setUpdateTime(new Date());
-            detail.setUserInfo(new UserInfo(record.getUid()));
-            // 璧勯噾璁$畻
-            userMoneyService.addUserMoney(record.getUid(), record.getMoney(), detail);
-        }
-    }
-
-
-    @Override
-    public List<Extract> getExtractSucceedRecord(int page, int pageSize, Long uid) {
-        return extractMapper.getExtractSucceedRecord((page - 1) * pageSize, pageSize, uid);
-    }
-
-    @Override
-    public long countExtractSucceedRecord(Long uid) {
-        Long count = extractMapper.countExtractSucceedRecord(uid);
-        return count == null ? 0 : count;
-    }
-}
+package com.yeshi.fanli.service.impl.money.extract;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import com.yeshi.fanli.entity.SystemEnum;
+import com.yeshi.fanli.util.*;
+import com.yeshi.fanli.util.mq.rabbit.RabbitmqManager;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.yeshi.utils.DateUtil;
+import org.yeshi.utils.entity.wx.RedPackParams;
+import org.yeshi.utils.entity.wx.RedPackRecord;
+import org.yeshi.utils.wx.WXPayUtil;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.response.AlipayFundTransUniTransferResponse;
+import com.google.gson.Gson;
+import com.yeshi.fanli.dao.mybatis.AccountMessageMapper;
+import com.yeshi.fanli.dao.mybatis.AlipayAccountValidNormalHistoryMapper;
+import com.yeshi.fanli.dao.mybatis.ExtractAuditRecordMapper;
+import com.yeshi.fanli.dao.mybatis.ExtractMapper;
+import com.yeshi.fanli.dao.mybatis.ExtractRecordMapper;
+import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper;
+import com.yeshi.fanli.dao.mybatis.PayInfoMapper;
+import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
+import com.yeshi.fanli.dao.mybatis.money.UserMoneyDetailMapper;
+import com.yeshi.fanli.dto.HongBao;
+import com.yeshi.fanli.dto.money.ExtractOrderStatisticDTO;
+import com.yeshi.fanli.entity.bus.user.AlipayTransferResultInfo;
+import com.yeshi.fanli.entity.bus.user.Extract;
+import com.yeshi.fanli.entity.bus.user.ExtractAuditRecord;
+import com.yeshi.fanli.entity.bus.user.ExtractRecord;
+import com.yeshi.fanli.entity.bus.user.ExtractWeiXinRecord;
+import com.yeshi.fanli.entity.bus.user.HongBaoV2;
+import com.yeshi.fanli.entity.bus.user.PayInfo;
+import com.yeshi.fanli.entity.bus.user.UserAccountBindingHistory;
+import com.yeshi.fanli.entity.bus.user.UserInfo;
+import com.yeshi.fanli.entity.common.AdminUser;
+import com.yeshi.fanli.entity.money.UserMoneyDetail;
+import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum;
+import com.yeshi.fanli.entity.system.ConfigKeyEnum;
+import com.yeshi.fanli.exception.ExtractException;
+import com.yeshi.fanli.exception.NotExistObjectException;
+import com.yeshi.fanli.exception.ObjectStateException;
+import com.yeshi.fanli.exception.money.UserMoneyDetailException;
+import com.yeshi.fanli.log.LogHelper;
+import com.yeshi.fanli.service.inter.config.ConfigService;
+import com.yeshi.fanli.service.inter.config.SystemConfigService;
+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.extract.ExtractRecordService;
+import com.yeshi.fanli.service.inter.money.extract.ExtractService;
+import com.yeshi.fanli.service.inter.money.extract.ExtractWeiXinRecordService;
+import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
+import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
+import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
+import com.yeshi.fanli.service.inter.order.OrderUserStatisticService;
+import com.yeshi.fanli.service.inter.push.PushService;
+import com.yeshi.fanli.service.inter.user.UserAccountBindingHistoryService;
+import com.yeshi.fanli.service.inter.user.UserInfoService;
+import org.yeshi.utils.MoneyBigDecimalUtil;
+import org.yeshi.utils.TimeUtil;
+import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
+
+@Service
+public class ExtractServiceImpl implements ExtractService {
+
+    @Resource
+    private UserInfoService userInfoService;
+
+    @Resource
+    private ConfigService configService;
+
+    @Resource
+    private ExtractRecordService extractRecordService;
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @Resource
+    private ExtractMapper extractMapper;
+
+    @Resource
+    private ExtractAuditRecordMapper extractAuditRecordMapper;
+
+    @Resource
+    private UserInfoMapper userInfoMapper;
+
+    @Resource
+    private PayInfoMapper payInfoMapper;
+
+    @Resource
+    private AccountMessageMapper accountMessageMapper;
+
+    @Resource
+    private ExtractRecordMapper extractRecordMapper;
+
+    @Resource
+    private HongBaoV2Mapper hongBaoV2Mapper;
+
+    @Resource
+    private HongBaoV2Service hongBaoV2Service;
+
+    @Resource
+    private PushService pushService;
+
+    @Resource
+    private UserMoneyDetailMapper userMoneyDetailMapper;
+
+    @Resource
+    private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
+
+    @Resource
+    private AlipayAccountValidNormalHistoryMapper alipayAccountValidNormalHistoryMapper;
+
+    @Resource
+    private UserMoneyDetailService userMoneyDetailService;
+
+    @Resource
+    private UserAccountBindingHistoryService userAccountBindingHistoryService;
+
+    @Resource
+    private UserMoneyDebtService userMoneyDebtService;
+
+    @Resource
+    private UserMoneyService userMoneyService;
+
+    @Resource
+    private OrderUserStatisticService orderUserStatisticService;
+
+    @Resource
+    private ExtractWeiXinRecordService extractWeiXinRecordService;
+
+    @Resource
+    private CommonOrderCountService commonOrderCountService;
+
+    @Resource
+    private RabbitmqManager rabbitmqManager;
+
+    @Transactional
+    public Integer addExtract(Extract extract) {
+        Integer integer = extract(extract);
+        return integer;
+    }
+
+    @Transactional
+    public Integer passExtract(final long id, AdminUser admin) {
+        Extract find = extractMapper.selectByPrimaryKeyForUpdate(id);
+        if (find == null)
+            return Constant.NOT_EXIST_OBJACT;
+
+        if (find.getState() != Extract.STATE_NOT_PROCESS) {
+            return Constant.OBJECT_STATE_EXCEPTION;
+        }
+
+        // 鏇存敼鎻愮幇鐘舵�佷负澶勭悊涓�
+        Extract updateExtract = new Extract();
+        updateExtract.setId(id);
+        updateExtract.setState(Extract.STATE_PROCESSING);
+        extractMapper.updateByPrimaryKeySelective(updateExtract);
+        // 鏀瑰彉璧勯噾璁板綍鐘舵��
+        UserMoneyDetail detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
+                UserMoneyDetailTypeEnum.extract, find.getUserInfo().getId(), find.getId());
+        if (detail != null) {
+            UserMoneyDetail update = new UserMoneyDetail(detail.getId());
+            update.setShow(true);
+            update.setUpdateTime(new Date());
+            userMoneyDetailMapper.updateByPrimaryKeySelective(update);
+        }
+
+        transfer(find, admin); // 鎻愮幇閫氳繃锛屾敮浠樺疂杞处
+
+        return null;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public synchronized void rejectExtract(long id, String reason, AdminUser admin)
+            throws ObjectStateException, NotExistObjectException {
+        Extract find = extractMapper.selectByPrimaryKey(id);
+
+        if (find == null) {
+            throw new NotExistObjectException("涓嶅瓨鍦ㄨ瀵硅薄");
+        }
+
+        if (find.getState() != Constant.EXTRACT_DEFUALT) {
+            throw new ObjectStateException("璇ョ姸鎬佷笉绛変簬涓嶄负鍒濆鐘舵��");
+        }
+
+        UserInfo user = find.getUserInfo();
+
+        UserMoneyDetail userMoneyDetail = null;
+        try {
+            userMoneyDetail = UserMoneyDetailFactory.createExtractReject(find);
+        } catch (UserMoneyDetailException e1) {
+            e1.printStackTrace();
+        }
+
+        // 澧炲姞璧勯噾
+        userMoneyService.addUserMoney(user.getId(), find.getMoney(), userMoneyDetail);
+        // 鏇存柊鍘熸潵鐨勭姸鎬�
+        Extract updateExtract = new Extract();
+        updateExtract.setId(id);
+        updateExtract.setState(Constant.EXTRACT_REJECT);
+        updateExtract.setReason(reason);
+        extractMapper.updateByPrimaryKeySelective(updateExtract);
+
+        long auditTime = java.lang.System.currentTimeMillis();
+        // 鏇存柊瀹℃牳璁板綍
+        ExtractAuditRecord auditRecord = new ExtractAuditRecord();
+        List<ExtractAuditRecord> records = extractAuditRecordMapper.getbyExtractId(id);
+        if (records != null && records.size() > 0) {
+            auditRecord = records.get(0);
+        }
+
+        // 瑙掕壊榛樿锛氬鏈�
+        auditRecord.setAuditRole("瀹㈡湇");
+        // 瀹℃牳浜�
+        auditRecord.setAdminUser(admin);
+        // 鎻愮幇涔嬪悗閲戦 涓嶅彉
+        auditRecord.setAfterMoney(auditRecord.getBeforeMoney());
+        // 瀹℃牳鏃堕棿
+        auditRecord.setAuditTime(auditTime);
+
+        // 鍘嗗彶鎻愮幇閲戦
+        Long uid = user.getId();
+        double countSuccessMoneys = extractMapper.countSuccessMoneysByUid(uid);
+        auditRecord.setCountMoney(new BigDecimal(countSuccessMoneys));
+
+        // 鍘嗗彶鎻愮幇娆℃暟
+        long countSuccess = extractMapper.countSuccessByUid(uid);
+        auditRecord.setCountNum(countSuccess);
+
+        // 鏇存柊鎻愮幇璁板綍瀹℃牳琛�
+        extractAuditRecordMapper.updateByPrimaryKeySelective(auditRecord);
+        // 鏂扮増璧勯噾璇︽儏
+
+        // 鏂扮増閫氱煡
+        userMoneyMsgNotificationService.extractFail(find, reason);
+    }
+
+    /**
+     * 鎻愮幇鐢宠
+     *
+     * @param extract
+     * @return
+     */
+    @Transactional
+    private Integer extract(Extract extract) {
+        UserAccountBindingHistory history = userAccountBindingHistoryService
+                .getLatestHistory(extract.getUserInfo().getId(), UserAccountBindingHistory.TYPE_PHONE);
+        // 鎵嬫満鍙锋洿鎹㈢粦瀹氱殑7澶╁唴涓嶈兘鎻愮幇
+        if (history != null && !history.getFirst()
+                && (System.currentTimeMillis() - history.getCreateTime().getTime()) < 1000 * 60 * 60 * 24 * 7L)
+            return 111;
+
+
+        UserInfo user = userInfoMapper.selectByPrimaryKeyForUpdate(extract.getUserInfo().getId());
+        // 浣欓涓嶈冻
+        if (user.getMyHongBao().compareTo(extract.getMoney()) < 0) {
+            return 3;
+        }
+
+        // 鏈夊�熻捶鍏崇郴
+        boolean isHaveToReplay = userMoneyDebtService.isHaveDebtToRepay(extract.getUserInfo().getId());
+        if (isHaveToReplay) {
+            return 110;
+        }
+
+        final String autoExtract = configService.getValue(ConfigKeyEnum.extractWay.getKey(), user.getSystem()); // 鏄惁鑷姩杞处
+        final String maxCount = configService.getValue(ConfigKeyEnum.extractDayCount.getKey(), user.getSystem());
+        final String maxMoney = configService.getValue(ConfigKeyEnum.extractMoneyDay.getKey(), user.getSystem());
+
+
+        Integer type = setExtractRecord(extract, maxCount, maxMoney);
+        if (type != 0) {
+            return type;
+        }
+
+        extractMapper.insertSelective(extract);
+
+        final ExtractAuditRecord auditRecord = new ExtractAuditRecord();
+        auditRecord.setBeforeMoney(user.getMyHongBao());
+        auditRecord.setExtract(extract);
+
+        Date minTime = new Date(System.currentTimeMillis() - 1000 * 60 * 60L * 24 * 180);
+
+        extractAuditRecordMapper.insertSelective(auditRecord);
+
+        ThreadUtil.run(new Runnable() {
+
+            @Override
+            public void run() {
+                // 缁熻鏁版嵁
+                int less10Count = commonOrderCountService.countOderByUidAndLess10(user.getId());
+                ExtractAuditRecord update = new ExtractAuditRecord();
+                update.setId(auditRecord.getId());
+                int orderCountBigMoneyOrder = orderUserStatisticService.countOrderMoneyMoreByUidAndMinTime(user.getId(),
+                        minTime, OrderConstant.BIG_ORDER_MONEY);
+                BigDecimal weiQuanOrderFanAmount = orderUserStatisticService.sumWeiQuanOrderFanAmountByUid(user.getId(),
+                        minTime);
+                int weiQuanOrderCount = orderUserStatisticService.countWeiQuanOrderByUid(user.getId(), minTime);
+                update.setExtraInfoStr(new Gson().toJson(new ExtractOrderStatisticDTO(orderCountBigMoneyOrder,
+                        weiQuanOrderCount, weiQuanOrderFanAmount, 0, less10Count)));
+                extractAuditRecordMapper.updateByPrimaryKeySelective(update);
+            }
+        });
+
+        // 鏂扮増璧勯噾璇︽儏
+        UserMoneyDetail userMoneyDetail = null;
+        try {
+            userMoneyDetail = UserMoneyDetailFactory.createExtract(extract, null);
+        } catch (UserMoneyDetailException e2) {
+            try {
+                LogHelper.errorDetailInfo(e2);
+            } catch (Exception e1) {
+                e1.printStackTrace();
+            }
+        }
+
+        // 鍑忓幓璐︽埛璧勯噾
+        userMoneyService.subUserMoney(extract.getUserInfo().getId(), extract.getMoney(), userMoneyDetail);
+
+        // 娣诲姞鏂扮増閫氱煡
+        userMoneyMsgNotificationService.extractApplay(extract);
+
+        if ("鏄�".equals(autoExtract)) {
+            LogHelper.userInfo("uid=" + user.getId() + ",鎻愪氦杞处鐢宠!");
+        } else {// 鏆傛椂涓嶈嚜鍔ㄦ彁鐜�
+            // transfer(extract, null);
+        }
+        return null;
+    }
+
+    /**
+     * 杞处
+     *
+     * @param extract
+     * @param session
+     */
+    private void transfer(Extract extract, AdminUser adminUser) {
+        Integer type = extract.getType();
+        if (Constant.ZHIFUBAO == type) {
+            extractByZhiFuBao(extract, adminUser);
+        } else {
+            LogHelper.userInfo("鎻愮幇绫诲瀷閿欒锛�" + type);
+        }
+    }
+
+    /**
+     * 澧炲姞鎻愮幇璁板綍
+     *
+     * @param extract
+     * @param maxCount 鏈�澶氭彁鐜版鏁�
+     * @param maxMoney 鏈�澶ф彁鐜伴噾棰�
+     * @param session
+     * @return 濡傛灉涓�0锛屽垯澧炲姞鎴愬姛銆備负1锛屽垯瓒呰繃姣忔棩鏈�澶氭彁鐜版鏁般�備负2锛屽垯瓒呰繃姣忔棩鏈�澶氭彁鐜伴噾棰�
+     */
+    @Transactional
+    public Integer setExtractRecord(Extract extract, String maxCount, String maxMoney) {
+        long uid = extract.getUserInfo().getId();
+        BigDecimal money = extract.getMoney();
+
+        List<ExtractRecord> extractRecordList = extractRecordMapper.selectByUidAndToday(uid);
+
+        if (extractRecordList.size() == 0) {
+            ExtractRecord er = new ExtractRecord();
+            er.setCount(1);
+            er.setMoney(money);
+            er.setUserInfo(new UserInfo(uid));
+            er.setCreateTime(java.lang.System.currentTimeMillis());
+            extractRecordMapper.insertSelective(er);
+        } else {
+            ExtractRecord er = extractRecordList.get(0);
+            int count = er.getCount();
+            int maxCountInt = Integer.parseInt(maxCount);
+            if (count >= maxCountInt) {
+                return 1;
+            }
+            BigDecimal oldMoney = er.getMoney();
+            BigDecimal sumMoney = MoneyBigDecimalUtil.add(money, oldMoney);
+            BigDecimal maxMoneyDou = new BigDecimal(maxMoney);
+            if (maxMoneyDou.compareTo(sumMoney) == -1) {
+                return 2;
+            }
+
+            ExtractRecord updateER = new ExtractRecord();
+            updateER.setId(er.getId());
+            updateER.setCount(count + 1);
+            updateER.setMoney(sumMoney);
+            er.setCreateTime(java.lang.System.currentTimeMillis());
+            extractRecordMapper.updateByPrimaryKeySelective(updateER);
+        }
+        return 0;
+    }
+
+    private String getOrderPrefix(SystemEnum system) {
+        if (system == SystemEnum.yhqjx) {
+            return "TJ";
+        } else if (system == SystemEnum.hsb) {
+            return "HSB";
+        }
+        return "";
+    }
+
+    /**
+     * 鎻愮幇鍒版敮浠樺疂
+     *
+     * @param extract
+     * @param session
+     */
+    // TODO 杞处閫昏緫闇�瑕佹敼鍙橈紝鍥哄畾IP
+    private void extractByZhiFuBao(Extract extract, AdminUser adminUser) {
+        LogHelper.userErrorInfo("鎻愮幇:寮�濮嬮�氳繃鎻愮幇-" + extract.getId());
+        //鑾峰彇鐢ㄦ埛鐨勭郴缁�
+        UserInfo user = userInfoMapper.selectByPrimaryKey(extract.getUserInfo().getId());
+        String appName = user.getSystem().getName();
+        //澶囨敞
+        String remark = appName + "APP娓犻亾鎻愮幇";
+        //鐞嗙敱
+        String reason = String.format("鐢ㄦ埛ID銆�%s銆戝彂璧风殑鎻愮幇", getOrderPrefix(user.getSystem()) + user.getId());
+
+        AlipayFundTransUniTransferResponse response = null;
+        try {
+            response = AlipayUtil.transferNoThrowException("widthdraw_" + extract.getId(), extract.getAccount(), extract.getName(), extract.getMoney(), remark, reason);
+            LogHelper.userErrorInfo("鎻愮幇:鏀粯瀹濋�氳繃鎻愮幇鎴愬姛-" + extract.getId());
+        } catch (AlipayApiException e) {
+            LogHelper.errorDetailInfo(e, "鏀粯瀹濊浆璐﹀紓甯�:" + extract.getId(), "");
+            LogHelper.userErrorInfo("鎻愮幇:鏀粯瀹濇彁鐜板紓甯革細" + response + ",鎻愮幇淇℃伅" + GsonUtil.toJson(extract));
+        }
+
+        try {
+            rabbitmqManager.addExtractResultMsg(extract, response, adminUser);
+            LogHelper.userErrorInfo("鎻愮幇:娣诲姞澶勭悊闃熷垪鎴愬姛-" + extract.getId());
+        } catch (Exception e) {
+            LogHelper
+                    .userErrorInfo("鎻愮幇:鏀粯瀹濇彁鐜癈MQ寮傚父锛�" + new Gson().toJson(response) + ",鎻愮幇淇℃伅" + GsonUtil.toJson(extract));
+        }
+    }
+
+    /**
+     * 鎻愮幇澶辫触
+     *
+     * @param extract
+     * @param msg
+     */
+    private void extractFail(Extract extract, String subCode, String msg) {
+        UserInfo user = extract.getUserInfo();
+        // MoneyRecord moneyRecord = new MoneyRecord(user, null, extract
+        // .getMoney(), "鎻愮幇", "鎻愮幇澶辫触", new Date().getTime(), 3);
+        if ("PAYER_BALANCE_NOT_ENOUGH".equals(subCode) || "BALANCE_IS_NOT_ENOUGH".equals(subCode)) {
+            Extract updateExtract = new Extract();
+            updateExtract.setId(extract.getId());
+            updateExtract.setState(Constant.EXTRACT_DEFUALT);
+            updateExtract.setReason(msg);
+            extractMapper.updateByPrimaryKeySelective(updateExtract);
+        } else {
+            // 鑰佺増鏈姛鑳�
+            // List<MoneyRecord> list = moneyRecordDao.list("from MoneyRecord mr
+            // where mr.extract.id =" + extract.getId());
+            // if (list.size() > 0) {
+            // MoneyRecord moneyRecord = list.get(0);
+            // moneyRecordMapper.deleteByPrimaryKey(moneyRecord.getId());
+            // }
+
+            Extract updateExtract = new Extract();
+            updateExtract.setId(extract.getId());
+            updateExtract.setState(Constant.EXTRACT_REJECT);
+            updateExtract.setReason(msg);
+            extractMapper.updateByPrimaryKeySelective(updateExtract);
+
+            UserMoneyDetail userMoneyDetail = null;
+            // 鏂扮増璧勯噾璇︽儏
+            try {
+                userMoneyDetail = UserMoneyDetailFactory.createExtractReject(extract);
+            } catch (UserMoneyDetailException e2) {
+                try {
+                    LogHelper.errorDetailInfo(e2);
+                } catch (Exception e1) {
+                    e1.printStackTrace();
+                }
+            }
+            // 澧炲姞璧勯噾
+            userMoneyService.addUserMoney(user.getId(), extract.getMoney(), userMoneyDetail);
+
+            try {
+                LogHelper.userInfo("鏀粯瀹濊浆璐﹀け璐�:[鎻愮幇IP锛�" + extract.getIp() + ",鎵�杞处鍙�:" + extract.getAccount() + ",鐪熷疄濮撳悕锛�"
+                        + extract.getName() + ",鎵�杞噾棰濓細" + extract.getMoney() + ",澶辫触鍘熷洜" + extract.getReason() + "]");
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            // 鏂扮増鎻愮幇
+            userMoneyMsgNotificationService.extractFail(extract, null);
+        }
+    }
+
+    /**
+     * 鎻愮幇鎴愬姛
+     *
+     * @param extract
+     * @param session
+     */
+    private void extractSuccess(Extract extract, String alipayNo) {
+        // 鑰佺増鏈姛鑳�
+        // List<MoneyRecord> list = moneyRecordDao.list("from MoneyRecord mr
+        // where mr.extract.id = " + extract.getId());
+        // MoneyRecord moneyRecord = list.get(0);
+        // moneyRecord.setType(3);
+        // MoneyRecord updateMoneyRecord = new MoneyRecord();
+        // updateMoneyRecord.setId(moneyRecord.getId());
+        // updateMoneyRecord.setType(3);
+        // moneyRecordMapper.updateByPrimaryKeySelective(updateMoneyRecord);
+        Extract updateExtract = new Extract();
+        updateExtract.setId(extract.getId());
+        updateExtract.setState(Constant.EXTRACT_PASS);
+        updateExtract.setReceiveTime(new Date());
+        updateExtract.setReason("鎻愮幇鎴愬姛");
+        extractMapper.updateByPrimaryKeySelective(updateExtract);
+
+        try {
+            LogHelper.userInfo("鏀粯瀹濊浆璐︽垚鍔�:[鎻愮幇IP锛�" + extract.getIp() + ",鎵�杞处鍙�:" + extract.getAccount() + ",鐪熷疄濮撳悕锛�"
+                    + extract.getName() + ",鎵�杞噾棰濓細" + extract.getMoney() + "]");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        UserMoneyDetail detailNew = null;
+        try {
+            detailNew = UserMoneyDetailFactory.createExtract(extract, alipayNo);
+        } catch (UserMoneyDetailException e) {
+            e.printStackTrace();
+        }
+
+        // 澶栨樉璐︽埛鏄庣粏
+        UserMoneyDetail userMoneyDetail = userMoneyDetailMapper.selectByTypeAndUidAndIdentifyCode(
+                UserMoneyDetailTypeEnum.extractNew, extract.getUserInfo().getId(), extract.getId());
+        if (userMoneyDetail != null) {
+            UserMoneyDetail detail = new UserMoneyDetail(userMoneyDetail.getId());
+            detail.setShow(true);
+            detail.setUpdateTime(new Date());
+            if (detailNew != null)
+                detail.setDescInfo(detailNew.getDescInfo());
+            userMoneyDetailMapper.updateByPrimaryKeySelective(detail);
+        }
+        // 鏂扮増閫氱煡
+        userMoneyMsgNotificationService.extractSuccess(extract, alipayNo);
+    }
+
+    /**
+     * 鏍规嵁鎻愮幇璁板綍id鑾峰彇鐢ㄦ埛uid
+     */
+    @Override
+    public Extract getExtractById(long id) {
+        return extractMapper.selectByPrimaryKey(id);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void checkExtract(Long uid) throws ExtractException {
+        BigDecimal compensateMoney = extractMapper.computeCompensateByUid(uid);
+        if (compensateMoney == null)
+            compensateMoney = new BigDecimal(0);
+        // 涓嶅垽瀹氬埌璐︾孩鍖呴棶棰�
+        Long count = hongBaoV2Mapper.countByUidAndState(uid, HongBao.STATE_YILINGQU);
+        if ((count == null || count == 0) && compensateMoney.compareTo(new BigDecimal(0)) == 0) {
+            throw new ExtractException(1, "娌℃湁宸插埌璐︾殑绾㈠寘");
+        }
+        // 鏌ヨ鏄惁鏈夋瑺璐�
+        boolean isDebt = userMoneyDebtService.isHaveDebtToRepay(uid);
+        if (isDebt)
+            throw new ExtractException(3, "鏈夋瑺璐︽湭杩�");
+        // 鑾峰彇鎵�鏈夋敹鍏ユ墍寰�
+        BigDecimal hongBaoMoney = hongBaoV2Service.computeMoneyByUidAndState(uid, HongBaoV2.STATE_YILINGQU);
+
+        Date now = new Date();
+        //鑾峰彇鍥㈤槦鍒嗙孩
+        List<UserMoneyDetailTypeEnum> typeList = new ArrayList<>();
+        typeList.add(UserMoneyDetailTypeEnum.teamDividents);
+        BigDecimal teamDividents = userMoneyDetailService.statisticUserTypeMoneyWithDate(uid, typeList, new Date(0),
+                now);
+
+        //绾㈠寘鎻愮幇鏀跺叆
+        typeList = new ArrayList<>();
+        typeList.add(UserMoneyDetailTypeEnum.redPackExchange);
+        BigDecimal redPackExchange = userMoneyDetailService.statisticUserTypeMoneyWithDate(uid, typeList, new Date(0),
+                now);
+
+
+        //----------鎵�鏈夋敮鍑哄紑濮�------------
+
+        // 鑾峰彇鎻愮幇锛岃幏鍙栨彁鐜伴獙璇�
+        typeList = new ArrayList<>();
+        typeList.add(UserMoneyDetailTypeEnum.extract);
+        typeList.add(UserMoneyDetailTypeEnum.extractNew);
+        typeList.add(UserMoneyDetailTypeEnum.extractReject);
+        typeList.add(UserMoneyDetailTypeEnum.extractVerify);
+        typeList.add(UserMoneyDetailTypeEnum.extractVerifyNew);
+        BigDecimal extractMoney = userMoneyDetailService.statisticUserTypeMoneyWithDate(uid, typeList, new Date(0),
+                now);
+        extractMoney = extractMoney.abs();
+        // 鑾峰彇缁存潈
+        typeList = new ArrayList<>();
+        typeList.add(UserMoneyDetailTypeEnum.weiQuan);
+        typeList.add(UserMoneyDetailTypeEnum.fanliWeiQuan);
+        typeList.add(UserMoneyDetailTypeEnum.inviteWeiQuan);
+        typeList.add(UserMoneyDetailTypeEnum.shareWeiQuan);
+        typeList.add(UserMoneyDetailTypeEnum.hongbaoDeduct);
+        //鏂扮増缁存潈锛堝埌璐︽椂鍑忓幓浜嗙淮鏉冭祫閲戯紝浣嗘槸鍦ㄨ祫閲戞槑缁嗛噷闈㈠姞鍏ヤ簡缁存潈閲戦锛屼絾骞舵湭澶栨樉锛�
+        typeList.add(UserMoneyDetailTypeEnum.fanliWeiQuanNew);
+
+        BigDecimal weiqaunMoney = userMoneyDetailService.statisticUserTypeMoneyWithDate(uid, typeList, new Date(0),
+                now);
+        weiqaunMoney = weiqaunMoney.abs();
+
+
+        //--------------鎵�鏈夋敮鍑虹粨鏉�------------
+
+        BigDecimal balance = userInfoService.selectByPKey(uid).getMyHongBao();
+
+        BigDecimal after = hongBaoMoney.add(teamDividents).add(redPackExchange).subtract(extractMoney.add(weiqaunMoney).add(balance).add(compensateMoney));
+
+        if (after.compareTo(new BigDecimal("0")) != 0)
+            throw new ExtractException(2, "缁撶畻璧勯噾寮傚父锛�" + after);
+    }
+
+    @Override
+    public Extract selectByPrimaryKey(Long id) {
+        return extractMapper.selectByPrimaryKey(id);
+    }
+
+    @Override
+    public Extract getMyTaskInfo(Long adminId) {
+        return extractMapper.getMyTaskInfo(adminId);
+    }
+
+    @Override
+    public Extract getNewTaskInfo() {
+        return extractMapper.getNewTaskInfo();
+    }
+
+    @Override
+    public List<Map<String, Object>> getFinishRecord(int pageIndex, int pageSize, String key, String startTime,
+                                                     String endTime) {
+        return extractMapper.getFinishRecord((pageIndex - 1) * pageSize, pageSize, key, startTime, endTime);
+    }
+
+    @Override
+    public int updateByPrimaryKeySelective(Extract record) {
+        return extractMapper.updateByPrimaryKeySelective(record);
+    }
+
+    @Transactional
+    @Override
+    public void processExtractResult(AlipayTransferResultInfo info) {
+        if (info == null)
+            return;
+        AlipayFundTransUniTransferResponse response = info.getAlipayFundTransUniTransferResponse();
+        Extract extract = info.getExtract();
+        AdminUser admin = info.getAdminUser();
+        if (response == null)
+            return;
+        if (extract == null)
+            return;
+
+        extract = extractMapper.selectByPrimaryKey(info.getExtract().getId());
+
+        LogHelper.test("鎻愮幇缁撴灉:code-" + response.getCode() + " 淇℃伅:" + response.getMsg());
+        long uid = extract.getUserInfo().getId();
+        if (response.isSuccess()) {
+            String code = response.getCode();
+            if ("10000".equals(code)) {
+                extractSuccess(extract, response.getOrderId());
+            } else {
+                extractFail(extract, response.getSubCode(), response.getSubMsg());
+            }
+        } else {
+            extractFail(extract, response.getSubCode(), response.getSubMsg());
+        }
+        PayInfo payInfo = new PayInfo();
+        payInfo.setBizno(response.getOutBizNo());
+        payInfo.setCreatetime(new Date());
+        payInfo.setExtract(extract);
+        if ("10000".equals(response.getCode())) {
+            payInfo.setState(1);
+        } else {
+            payInfo.setState(2);
+        }
+        payInfo.setOrderId(response.getOrderId());
+        payInfo.setOrdertime(response.getTransDate());
+        payInfo.setInfo(response.getSubMsg());
+        payInfoMapper.insertSelective(payInfo);
+
+        // 鏇存柊瀹℃牳璁板綍
+        ExtractAuditRecord auditRecord = null;
+        List<ExtractAuditRecord> records = extractAuditRecordMapper.getbyExtractId(extract.getId());
+        if (records != null && records.size() > 0) {
+            auditRecord = records.get(0);
+        }
+
+        if (auditRecord != null) {
+
+            // 鎻愮幇浠樻璁板綍
+            List<PayInfo> paylist = payInfoMapper.getListbyExtractId(extract.getId());
+
+            if (paylist != null && paylist.size() > 0) {
+                // 鎻愮幇鎴愬姛 锛� 鎻愮幇涔嬪墠鎬婚噾棰濓細鎻愮幇鏃堕噾棰濆噺鍘绘彁鐜伴噾棰�
+                BigDecimal exceedMoney = MoneyBigDecimalUtil.sub(auditRecord.getBeforeMoney(), extract.getMoney());
+                // 鎻愮幇涔嬪悗閲戦
+                auditRecord.setAfterMoney(exceedMoney);
+            } else {
+                // 鎻愮幇澶辫触锛氫粯娆炬柟浣欓涓嶈冻銆佽处鎴蜂俊鎭敊璇� 鎻愮幇涔嬪悗閲戦 涓嶅彉
+                auditRecord.setAfterMoney(auditRecord.getBeforeMoney());
+            }
+
+            // 鍘嗗彶鎻愮幇閲戦
+            double countSuccessMoneys = extractMapper.countSuccessMoneysByUid(uid);
+            auditRecord.setCountMoney(new BigDecimal(countSuccessMoneys));
+
+            // 鍘嗗彶鎻愮幇娆℃暟
+            long countSuccess = extractMapper.countSuccessByUid(uid);
+            auditRecord.setCountNum(countSuccess);
+
+            // 瑙掕壊榛樿锛氬鏈�
+            auditRecord.setAuditRole("瀹㈡湇");
+            // 瀹℃牳浜�
+            auditRecord.setAdminUser(admin);
+            // 瀹℃牳鏃堕棿
+            auditRecord.setAuditTime(java.lang.System.currentTimeMillis());
+
+            // 鏇存柊鎻愮幇璁板綍瀹℃牳琛�
+            extractAuditRecordMapper.updateByPrimaryKeySelective(auditRecord);
+        }
+
+    }
+
+    @Transactional
+    @Override
+    public void testExtractSuccess(Long id) {
+        Extract extract = extractMapper.selectByPrimaryKey(id);
+        extractSuccess(extract, null);
+        Long uid = extract.getUserInfo().getId();
+
+        // 鏇存柊瀹℃牳璁板綍
+        ExtractAuditRecord auditRecord = null;
+        List<ExtractAuditRecord> records = extractAuditRecordMapper.getbyExtractId(extract.getId());
+        if (records != null && records.size() > 0) {
+            auditRecord = records.get(0);
+        }
+
+        if (auditRecord != null) {
+            // 鎻愮幇浠樻璁板綍
+            List<PayInfo> paylist = payInfoMapper.getListbyExtractId(extract.getId());
+            if (paylist != null && paylist.size() > 0) {
+                // 鎻愮幇鎴愬姛 锛� 鎻愮幇涔嬪墠鎬婚噾棰濓細鎻愮幇鏃堕噾棰濆噺鍘绘彁鐜伴噾棰�
+                BigDecimal exceedMoney = MoneyBigDecimalUtil.sub(auditRecord.getBeforeMoney(), extract.getMoney());
+                // 鎻愮幇涔嬪悗閲戦
+                auditRecord.setAfterMoney(exceedMoney);
+            } else {
+                // 鎻愮幇澶辫触锛氫粯娆炬柟浣欓涓嶈冻銆佽处鎴蜂俊鎭敊璇� 鎻愮幇涔嬪悗閲戦 涓嶅彉
+                auditRecord.setAfterMoney(auditRecord.getBeforeMoney());
+            }
+
+            // 鍘嗗彶鎻愮幇閲戦
+            double countSuccessMoneys = extractMapper.countSuccessMoneysByUid(uid);
+            auditRecord.setCountMoney(new BigDecimal(countSuccessMoneys));
+
+            // 鍘嗗彶鎻愮幇娆℃暟
+            long countSuccess = extractMapper.countSuccessByUid(uid);
+            auditRecord.setCountNum(countSuccess);
+
+            // 瑙掕壊榛樿锛氬鏈�
+            auditRecord.setAuditRole("瀹㈡湇");
+            // 瀹℃牳浜�
+            auditRecord.setAdminUser(new AdminUser(3L));
+            // 瀹℃牳鏃堕棿
+            auditRecord.setAuditTime(java.lang.System.currentTimeMillis());
+
+            // 鏇存柊鎻愮幇璁板綍瀹℃牳琛�
+            extractAuditRecordMapper.updateByPrimaryKeySelective(auditRecord);
+        }
+
+    }
+
+    @Override
+    public BigDecimal sumTodayApplyMoney(Long uid, String day) {
+        return extractMapper.sumToadyApplyByUid(uid, day);
+    }
+
+    @Override
+    public BigDecimal sumVerifyingMoney(Long uid) {
+        List<Integer> stateList = new ArrayList<>();
+        stateList.add(Extract.STATE_NOT_PROCESS);
+        stateList.add(Extract.STATE_PROCESSING);
+        BigDecimal money = extractMapper.sumMoneyByUidAndState(uid, stateList);
+        if (money == null)
+            return new BigDecimal(0);
+        else
+            return money;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void autoExtract(UserInfo user) {
+        if (user == null || user.getWxOpenId() == null || user.getWxUnionId() == null
+                || user.getState() != UserInfo.STATE_NORMAL)
+            return;
+
+        Date date = new Date();
+        BigDecimal money = new BigDecimal(Constant.AUTO_EXTRACT_MONEY);
+
+        // 1銆佹彃鍏ヨ褰�
+        ExtractWeiXinRecord extractRecord = new ExtractWeiXinRecord();
+        extractRecord.setUid(user.getId());
+        extractRecord.setOpenId(user.getWxOpenId());
+        extractRecord.setUnionId(user.getWxUnionId());
+        extractRecord.setMoney(money);
+        extractRecord.setCreateTime(date);
+        extractRecord.setUpdateTime(date);
+        extractWeiXinRecordService.insertSelective(extractRecord);
+
+        // 浜ゆ槗鍙�
+        Long recordId = extractRecord.getId();
+        String billno = "BanLiExtract" + recordId;
+
+        // 鏇存柊璁板綍
+        ExtractWeiXinRecord updeteRecord = null;
+
+        String mchId = "1520950211";
+        String appId = "wx5c0d167c6e3ad726";
+        String key = "XYJkJ2018FAfaodCCx899mLl138rfGVd";
+
+        // 2銆佸彂鏀惧井淇$孩鍖�
+        RedPackParams redPackParams = new RedPackParams();
+        redPackParams.setBillno(billno);
+        redPackParams.setMchId(mchId);
+        redPackParams.setWxappId(appId);
+        redPackParams.setSendName("鏉挎牀蹇渷");
+        redPackParams.setOpenid(user.getWxOpenId());
+        redPackParams.setMoney(money);
+        redPackParams.setTotalNum(1);
+        redPackParams.setWishing("璐︽埛涓墿浣欎綑棰濊鍦ㄦ湰App鍐呭畬鎴愭彁鐜�");
+        redPackParams.setClientIp("106.80.118.163");
+        redPackParams.setActName("鑷姩鎻愮幇");
+        redPackParams.setKey(key);
+        redPackParams.setRemark("寰俊鑷姩鎻愮幇");
+        // redPackParams.setSceneId(null);
+        // redPackParams.setRiskInfo(null);
+
+        // 鍙戠敓绾㈠寘鐘舵��
+        boolean stateRedPack = false;
+
+        String pwd = "1520950211";
+        InputStream cert = ExtractServiceImpl.class.getClassLoader()
+                .getResourceAsStream("certificate/apiclient_cert.p12"); // 璇诲彇.p12鏂囦欢
+        // 鎵ц鍙戞斁绾㈠寘
+        try {
+            String result = WXPayUtil.redPackToOpenId(redPackParams, pwd, cert);
+            if (!StringUtil.isNullOrEmpty(result)) {
+                stateRedPack = parseSendResult(result);
+            }
+
+            if (!stateRedPack) {
+                String redPackRecord = WXPayUtil.getRedPackRecord(billno, mchId, appId, key, pwd, cert);
+                if (!StringUtil.isNullOrEmpty(redPackRecord)) {
+                    updeteRecord = parseDTO(redPackRecord);
+                }
+            }
+        } catch (Exception e) {
+            String redPackRecord = WXPayUtil.getRedPackRecord(billno, mchId, appId, key, pwd, cert);
+            if (!StringUtil.isNullOrEmpty(redPackRecord)) {
+                updeteRecord = parseDTO(redPackRecord);
+            }
+            LogHelper.errorDetailInfo(e);
+        }
+        try {
+            cert.close();
+        } catch (IOException e1) {
+            e1.printStackTrace();
+        }
+
+        // 鏇存柊淇℃伅
+        if (updeteRecord == null) {
+            updeteRecord = new ExtractWeiXinRecord();
+        } else {
+            stateRedPack = true;
+        }
+
+        updeteRecord.setId(recordId);
+        updeteRecord.setStatus(ExtractWeiXinRecord.SENDING);
+        updeteRecord.setBillno(billno);
+        extractWeiXinRecordService.updateByPrimaryKeySelective(updeteRecord);
+
+        // 绾㈠寘鍙戞斁澶辫触
+        if (!stateRedPack)
+            return;
+
+        // 3銆佸姞鍏ヨ祫閲戞槑缁�
+        UserMoneyDetail detail = new UserMoneyDetail();
+        detail.setCreateTime(new Date());
+        detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extractAutoWX.name() + ":" + recordId));
+        detail.setMoney(money);
+        detail.setTitle(UserMoneyDetailTypeEnum.extractAutoWX.getDesc());
+        detail.setType(UserMoneyDetailTypeEnum.extractAutoWX);
+        detail.setUpdateTime(new Date());
+        detail.setUserInfo(user);
+        try {
+            userMoneyDetailService.addUserMoneyDetail(detail);
+        } catch (UserMoneyDetailException e) {
+            LogHelper.errorDetailInfo(e);
+        }
+
+    }
+
+    private boolean parseSendResult(String result) {
+        try {
+            Document document = DocumentHelper.parseText(result);
+            // 鑾峰彇鏍硅妭鐐瑰厓绱犲璞�
+            Element root = document.getRootElement();
+            Element returnCode = root.element("return_code");
+
+            if (!"SUCCESS".equalsIgnoreCase(returnCode.getText())) {
+                Element returnMsg = root.element("return_msg");
+                System.out.println(returnMsg.getText());
+                return false;
+            }
+
+            Element resultCode = root.element("result_code");
+            if (!"SUCCESS".equalsIgnoreCase(resultCode.getText())) {
+                Element errCode = root.element("err_code");
+                Element errCodeDes = root.element("err_code_des");
+                System.out.println(errCode.getText() + ":" + errCodeDes.getText());
+                return false;
+            }
+            return true;
+        } catch (DocumentException e) {
+            e.printStackTrace();
+            LogHelper.errorDetailInfo(e);
+        }
+        return false;
+    }
+
+    private ExtractWeiXinRecord parseDTO(String result) {
+        try {
+
+            Document document = DocumentHelper.parseText(result);
+            // 鑾峰彇鏍硅妭鐐瑰厓绱犲璞�
+            Element root = document.getRootElement();
+            Element returnCode = root.element("return_code");
+
+            if (!"SUCCESS".equalsIgnoreCase(returnCode.getText())) {
+                Element returnMsg = root.element("return_msg");
+                System.out.println(returnMsg.getText());
+                return null;
+            }
+
+            Element resultCode = root.element("result_code");
+            if (!"SUCCESS".equalsIgnoreCase(resultCode.getText())) {
+                Element errCode = root.element("err_code");
+                Element errCodeDes = root.element("err_code_des");
+                System.out.println(errCode.getText() + ":" + errCodeDes.getText());
+            }
+
+            ExtractWeiXinRecord resultRecord = new ExtractWeiXinRecord();
+            resultRecord.setBillno(root.element("result_code").getText());
+            resultRecord.setDetailno(root.element("detail_id").getText());
+            resultRecord.setStatus(root.element("status").getText());
+            resultRecord.setSendType(root.element("send_type").getText());
+            resultRecord.setHbType(root.element("result_code").getText());
+
+            String totalNum = root.element("total_num").getText();
+            resultRecord.setTotalNum(Integer.parseInt(totalNum));
+
+            String sendTime = root.element("send_time").getText();
+            resultRecord.setSendTime(new Date(TimeUtil.convertDateToTemp2(sendTime)));
+
+            Element element = root.element("hblist");
+            Iterator<?> iterator = element.elementIterator();
+            while (iterator.hasNext()) {
+                Element childElement = (Element) iterator.next();
+                Element rcvTime = childElement.element("rcv_time");
+                resultRecord.setRcvTime(new Date(TimeUtil.convertDateToTemp2(rcvTime.getText())));
+                break;
+            }
+            return resultRecord;
+
+        } catch (DocumentException e) {
+            e.printStackTrace();
+            LogHelper.errorDetailInfo(e);
+        }
+        return null;
+    }
+
+    @Override
+    public List<UserInfo> preAutoUser() throws Exception {
+        int page = 0;
+        int pageSize = 100;
+        int maxSize = 300;
+        Date nowDate = new Date();
+        // 涓�銆佽嚜鍔ㄦ彁鐜伴拡瀵圭殑鐢ㄦ埛缇わ細 鍓嶆彁鏉′欢:鐢ㄦ埛鍦ㄨ窛浠�60澶╁埌90澶╁唴鏈椿璺冭繃鐨勭敤鎴�
+        String beganDate = DateUtil.reduceDayTostring(90, nowDate);
+        String endDate = DateUtil.reduceDayTostring(60, nowDate);
+        // 鏉′欢3锛氳窛绂讳笂涓�娆℃垚鍔熼鍙栧井淇$孩鍖呭凡缁忚秴杩囦簡30澶╂椂闂达紝鍙湪绗�31澶╁啀娆′笅鍙戯紱
+        String receivedDate = DateUtil.reduceDayTostring(30, nowDate);
+        // 鏉′欢4锛氳窛绂讳笂涓�娆℃湭鎴愬姛棰嗗彇寰俊绾㈠寘宸茬粡瓒呰繃浜�15澶╂椂闂达紝鍙湪绗�16澶╁啀娆′笅鍙戯紱
+        String refundDate = DateUtil.reduceDayTostring(15, nowDate);
+
+        // 浣欓鏈�浣庨檺鍒�
+        BigDecimal minSurplus = BigDecimal.valueOf(Constant.AUTO_EXTRACT_MIN_SURPLUS);
+
+        List<UserInfo> list = new ArrayList<UserInfo>();
+
+        while (true) {
+            // 鏌ヨ婊¤冻鏉′欢 1銆�2 鐨剈id
+            List<UserInfo> listUser = userInfoService.getAutoExtractUser(page * pageSize, pageSize, minSurplus,
+                    beganDate, endDate);
+            if (listUser == null || listUser.isEmpty())
+                break;
+
+            List<Long> listId = new ArrayList<Long>();
+            for (UserInfo userInfo : listUser) {
+                listId.add(userInfo.getId());
+            }
+
+            // 鏌ヨ璁板綍鏄惁婊¤冻
+            List<Long> listValid = extractWeiXinRecordService.getValidUsers(listId, receivedDate, refundDate);
+            if (listValid == null || listValid.isEmpty()) {
+                page++;
+                continue;
+            }
+
+            for (Long uid : listValid) {
+                if (list.size() >= maxSize)
+                    break;
+                for (UserInfo userInfo : listUser) {
+                    if (list.size() >= maxSize)
+                        break;
+
+                    if (userInfo.getId().longValue() == uid.longValue()) {
+                        list.add(userInfo);
+                        break;
+                    }
+                }
+            }
+
+            if (list.size() >= maxSize)
+                break;
+
+            page++;
+        }
+        return list;
+    }
+
+    @Override
+    public List<String> getAutoExtractOpenIds() throws Exception {
+        int page = 0;
+        int pageSize = 100;
+        int maxSize = 301; // appId + 瀹為檯openid300涓�
+        Date nowDate = new Date();
+        // 涓�銆佽嚜鍔ㄦ彁鐜伴拡瀵圭殑鐢ㄦ埛缇わ細 鍓嶆彁鏉′欢:鐢ㄦ埛鍦ㄨ窛浠�60澶╁埌90澶╁唴鏈椿璺冭繃鐨勭敤鎴�
+        String beganDate = DateUtil.reduceDayTostring(90, nowDate);
+        String endDate = DateUtil.reduceDayTostring(60, nowDate);
+        // 鏉′欢3锛氳窛绂讳笂涓�娆℃垚鍔熼鍙栧井淇$孩鍖呭凡缁忚秴杩囦簡30澶╂椂闂达紝鍙湪绗�31澶╁啀娆′笅鍙戯紱
+        String receivedDate = DateUtil.reduceDayTostring(30, nowDate);
+        // 鏉′欢4锛氳窛绂讳笂涓�娆℃湭鎴愬姛棰嗗彇寰俊绾㈠寘宸茬粡瓒呰繃浜�15澶╂椂闂达紝鍙湪绗�16澶╁啀娆′笅鍙戯紱
+        String refundDate = DateUtil.reduceDayTostring(15, nowDate);
+
+        // 鎻愮幇閲戦
+        BigDecimal money = BigDecimal.valueOf(Constant.AUTO_EXTRACT_MONEY);
+        // 浣欓鏈�浣庨檺鍒�
+        BigDecimal minSurplus = BigDecimal.valueOf(Constant.AUTO_EXTRACT_MIN_SURPLUS);
+
+        List<String> listOpendIDs = new ArrayList<String>();
+        // 棣栬appID
+        listOpendIDs.add(Constant.getWXAccount(null, null).getAppId());
+
+        while (true) {
+            // 鏌ヨ婊¤冻鏉′欢 1銆�2 鐨剈id
+            List<UserInfo> listUser = userInfoService.getAutoExtractUser(page * pageSize, pageSize, minSurplus,
+                    beganDate, endDate);
+            if (listUser == null || listUser.isEmpty())
+                break;
+
+            List<Long> listId = new ArrayList<Long>();
+            for (UserInfo userInfo : listUser) {
+                listId.add(userInfo.getId());
+            }
+
+            // 鏌ヨ璁板綍鏄惁婊¤冻
+            List<Long> listValid = extractWeiXinRecordService.getValidUsers(listId, receivedDate, refundDate);
+            if (listValid == null || listValid.isEmpty()) {
+                page++;
+                continue;
+            }
+
+            for (Long uid : listValid) {
+                UserInfo userInfo = subHongBaoByUid(uid, money, minSurplus);
+                if (userInfo != null) {
+                    listOpendIDs.add(userInfo.getWxOpenId());
+                    if (listOpendIDs.size() >= maxSize)
+                        break;
+                }
+            }
+
+            if (listOpendIDs.size() >= maxSize)
+                break;
+
+            page++;
+        }
+        return listOpendIDs;
+    }
+
+    @Override
+    public List<UserInfo> preAutoUserTo1212() throws Exception {
+        int page = 0;
+        int pageSize = 100;
+        int maxSize = 300;
+        Date nowDate = new Date();
+        // 鏉′欢3锛氳窛绂讳笂涓�娆℃垚鍔熼鍙栧井淇$孩鍖呭凡缁忚秴杩囦簡30澶╂椂闂达紝鍙湪绗�31澶╁啀娆′笅鍙戯紱
+        String receivedDate = DateUtil.reduceDayTostring(30, nowDate);
+        // 鏉′欢4锛氳窛绂讳笂涓�娆℃湭鎴愬姛棰嗗彇寰俊绾㈠寘宸茬粡瓒呰繃浜�15澶╂椂闂达紝鍙湪绗�16澶╁啀娆′笅鍙戯紱
+        String refundDate = DateUtil.reduceDayTostring(15, nowDate);
+        // 浣欓鏈�浣庨檺鍒�
+        List<UserInfo> list = new ArrayList<UserInfo>();
+        while (true) {
+            // 鏌ヨ婊¤冻鏉′欢 1銆�2 鐨剈id
+            List<UserInfo> listUser = userInfoService.getAutoExtractUserTo1212(page * pageSize, pageSize);
+            if (listUser == null || listUser.isEmpty())
+                break;
+
+            List<Long> listId = new ArrayList<Long>();
+            for (UserInfo userInfo : listUser) {
+                listId.add(userInfo.getId());
+            }
+
+            // 鏌ヨ璁板綍鏄惁婊¤冻
+            List<Long> listValid = extractWeiXinRecordService.getValidUsers(listId, receivedDate, refundDate);
+            if (listValid == null || listValid.isEmpty()) {
+                page++;
+                continue;
+            }
+
+            for (Long uid : listValid) {
+                if (list.size() >= maxSize)
+                    break;
+                for (UserInfo userInfo : listUser) {
+                    if (list.size() >= maxSize)
+                        break;
+
+                    if (userInfo.getId().longValue() == uid.longValue()) {
+                        list.add(userInfo);
+                        break;
+                    }
+                }
+            }
+
+            if (list.size() >= maxSize)
+                break;
+
+            page++;
+        }
+        return list;
+    }
+
+    @Override
+    public List<String> getAutoExtractOpenIdsTo1212() throws Exception {
+        int page = 0;
+        int pageSize = 100;
+        int maxSize = 301; // appId + 瀹為檯openid300涓�
+        Date nowDate = new Date();
+        // 鏉′欢3锛氳窛绂讳笂涓�娆℃垚鍔熼鍙栧井淇$孩鍖呭凡缁忚秴杩囦簡30澶╂椂闂达紝鍙湪绗�31澶╁啀娆′笅鍙戯紱
+        String receivedDate = DateUtil.reduceDayTostring(30, nowDate);
+        // 鏉′欢4锛氳窛绂讳笂涓�娆℃湭鎴愬姛棰嗗彇寰俊绾㈠寘宸茬粡瓒呰繃浜�15澶╂椂闂达紝鍙湪绗�16澶╁啀娆′笅鍙戯紱
+        String refundDate = DateUtil.reduceDayTostring(15, nowDate);
+
+        // 鎻愮幇閲戦
+        BigDecimal money = BigDecimal.valueOf(1);
+
+        List<String> listOpendIDs = new ArrayList<String>();
+        // 棣栬appID
+        listOpendIDs.add(Constant.getWXAccount(null, null).getAppId());
+
+        while (true) {
+            // 鏌ヨ婊¤冻鏉′欢 1銆�2 鐨剈id
+            List<UserInfo> listUser = userInfoService.getAutoExtractUserTo1212(page * pageSize, pageSize);
+            if (listUser == null || listUser.isEmpty())
+                break;
+
+            List<Long> listId = new ArrayList<Long>();
+            for (UserInfo userInfo : listUser) {
+                listId.add(userInfo.getId());
+            }
+
+            // 鏌ヨ璁板綍鏄惁婊¤冻
+            List<Long> listValid = extractWeiXinRecordService.getValidUsers(listId, receivedDate, refundDate);
+            if (listValid == null || listValid.isEmpty()) {
+                page++;
+                continue;
+            }
+
+            for (Long uid : listValid) {
+                UserInfo userInfo = subHongBaoByUid(uid, money, money);
+                if (userInfo != null) {
+                    listOpendIDs.add(userInfo.getWxOpenId());
+                    if (listOpendIDs.size() >= maxSize)
+                        break;
+                }
+            }
+
+            if (listOpendIDs.size() >= maxSize)
+                break;
+
+            page++;
+        }
+        return listOpendIDs;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    private UserInfo subHongBaoByUid(Long uid, BigDecimal money, BigDecimal minSurplus) {
+        UserInfo userInfo = userInfoMapper.selectByPrimaryKeyForUpdate(uid);
+        if (userInfo != null && !StringUtil.isNullOrEmpty(userInfo.getWxOpenId())
+                && !StringUtil.isNullOrEmpty(userInfo.getWxUnionId())
+                && userInfo.getMyHongBao().compareTo(minSurplus) >= 0) {
+            // 寰俊鎻愮幇璁板綍
+            ExtractWeiXinRecord extractRecord = new ExtractWeiXinRecord();
+            extractRecord.setUid(uid);
+            extractRecord.setOpenId(userInfo.getWxOpenId());
+            extractRecord.setUnionId(userInfo.getWxUnionId());
+            extractRecord.setMoney(money);
+            extractRecord.setStatus(ExtractWeiXinRecord.SENDING);
+            extractRecord.setType(ExtractWeiXinRecord.TYPE_MANUAL);
+            extractRecord.setCreateTime(new Date());
+            extractRecord.setUpdateTime(new Date());
+            extractWeiXinRecordService.insertSelective(extractRecord);
+            // 璁板綍id
+            Long recordId = extractRecord.getId();
+
+            // 璧勯噾鏄庣粏
+            UserMoneyDetail detail = new UserMoneyDetail();
+            detail.setCreateTime(new Date());
+            detail.setIdentifyCode(StringUtil.Md5(UserMoneyDetailTypeEnum.extractAutoWX.name() + ":" + recordId));
+            detail.setMoney(new BigDecimal("-" + money.toString()));
+            detail.setTitle(UserMoneyDetailTypeEnum.extractAutoWX.getDesc());
+            detail.setType(UserMoneyDetailTypeEnum.extractAutoWX);
+            detail.setUpdateTime(new Date());
+            detail.setUserInfo(userInfo);
+
+            // 璧勯噾璁$畻
+            userMoneyService.subUserMoney(userInfo.getId(), money, detail);
+
+            // 婊¤冻鏉′欢杩斿洖淇℃伅
+            return userInfo;
+        }
+        return null;
+    }
+
+    @Override
+    public void updateManualExtractRecord(List<RedPackRecord> list) throws ExtractException {
+        if (list == null || list.isEmpty())
+            throw new ExtractException(1, "绾㈠寘璁板綍淇℃伅涓虹┖");
+
+        for (RedPackRecord redPackRecord : list) {
+            updateWeiXinRecord(redPackRecord);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    private void updateWeiXinRecord(RedPackRecord redPackRecord) {
+        if (StringUtil.isNullOrEmpty(redPackRecord.getOpenId()))
+            return;
+
+        ExtractWeiXinRecord record = extractWeiXinRecordService.getByOpenIdAndType(redPackRecord.getOpenId(),
+                ExtractWeiXinRecord.TYPE_MANUAL);
+        if (record == null)
+            return;
+
+        // 鐘舵�佽繃婊�
+        String statusOld = record.getStatus();
+        if (StringUtil.isNullOrEmpty(statusOld) || ExtractWeiXinRecord.REFUND.equals(statusOld)
+                || ExtractWeiXinRecord.RECEIVED.equals(statusOld))
+            return;
+
+        ExtractWeiXinRecord updeteRecord = new ExtractWeiXinRecord();
+        updeteRecord.setId(record.getId());
+        updeteRecord.setUpdateTime(new Date());
+
+        String billno = redPackRecord.getBillno();
+        if (!StringUtil.isNullOrEmpty(billno)) {
+            updeteRecord.setBillno(billno.replace("`", "").replace("'", ""));
+        }
+
+        String detailno = redPackRecord.getDetailno();
+        if (!StringUtil.isNullOrEmpty(detailno)) {
+            updeteRecord.setDetailno(detailno.replace("`", "").replace("'", ""));
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        String rcvTime = redPackRecord.getRcvTime();
+        if (!StringUtil.isNullOrEmpty(rcvTime)) {
+            try {
+                updeteRecord.setRcvTime(sdf.parse(rcvTime));
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+
+        String sendTime = redPackRecord.getSendTime();
+        if (!StringUtil.isNullOrEmpty(sendTime)) {
+            try {
+                updeteRecord.setSendTime(sdf.parse(sendTime));
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+
+        String status = redPackRecord.getStatus();
+        if (!StringUtil.isNullOrEmpty(status)) {
+            switch (status) {
+                case "宸插彂鏀惧緟棰嗗彇":
+                    status = ExtractWeiXinRecord.SENT;
+                    break;
+                case "杩囨湡鏈閫�娆�":
+                    status = ExtractWeiXinRecord.REFUND;
+                    break;
+                case "宸查鍙�":
+                    status = ExtractWeiXinRecord.RECEIVED;
+                    break;
+                default:
+                    status = null;
+                    break;
+            }
+        }
+        updeteRecord.setStatus(status);
+        extractWeiXinRecordService.updateByPrimaryKeySelective(updeteRecord);
+
+        if (ExtractWeiXinRecord.RECEIVED.equals(status)) {
+        } else if (ExtractWeiXinRecord.REFUND.equals(status)) {
+            // 璧勯噾鏄庣粏
+            UserMoneyDetail detail = new UserMoneyDetail();
+            detail.setCreateTime(new Date());
+            detail.setIdentifyCode(
+                    StringUtil.Md5(UserMoneyDetailTypeEnum.extractAutoWXRefund.name() + ":" + record.getId()));
+            detail.setMoney(record.getMoney());
+            detail.setTitle(UserMoneyDetailTypeEnum.extractAutoWXRefund.getDesc());
+            detail.setType(UserMoneyDetailTypeEnum.extractAutoWXRefund);
+            detail.setUpdateTime(new Date());
+            detail.setUserInfo(new UserInfo(record.getUid()));
+            // 璧勯噾璁$畻
+            userMoneyService.addUserMoney(record.getUid(), record.getMoney(), detail);
+        }
+    }
+
+
+    @Override
+    public List<Extract> getExtractSucceedRecord(int page, int pageSize, Long uid) {
+        return extractMapper.getExtractSucceedRecord((page - 1) * pageSize, pageSize, uid);
+    }
+
+    @Override
+    public long countExtractSucceedRecord(Long uid) {
+        Long count = extractMapper.countExtractSucceedRecord(uid);
+        return count == null ? 0 : count;
+    }
+}

--
Gitblit v1.8.0