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 | 2729 +++++++++++++++++++++++++++++-----------------------------
 1 files changed, 1,379 insertions(+), 1,350 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 8faef37..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,1350 +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.AlipayFundTransToaccountTransferResponse;
-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.exception.user.AlipayTransferException;
-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 com.yeshi.fanli.util.MoneyBigDecimalUtil;
-import com.yeshi.fanli.util.StringUtil;
-import com.yeshi.fanli.util.ThreadUtil;
-import com.yeshi.fanli.util.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.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);
-		BigDecimal weiqaunMoney = userMoneyDetailService.statisticUserTypeMoneyWithDate(uid, typeList, new Date(0),
-				now);
-		weiqaunMoney = weiqaunMoney.abs();
-
-		BigDecimal balance = userInfoService.selectByPKey(uid).getMyHongBao();
-
-		BigDecimal after = hongBaoMoney.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