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 | 2114 ++++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 1,379 insertions(+), 735 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 39ba789..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,735 +1,1379 @@ -package com.yeshi.fanli.service.impl.money.extract; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import javax.annotation.Resource; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.alipay.api.AlipayApiException; -import com.alipay.api.AlipayClient; -import com.alipay.api.DefaultAlipayClient; -import com.alipay.api.request.AlipayFundTransToaccountTransferRequest; -import com.alipay.api.response.AlipayFundTransToaccountTransferResponse; -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.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.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.hongbao.HongBaoV2Service; -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.msg.UserMoneyMsgNotificationService; -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.CMQManager; -import com.yeshi.fanli.util.Constant; -import com.yeshi.fanli.util.GsonUtil; -import com.yeshi.fanli.util.MoneyBigDecimalUtil; -import com.yeshi.fanli.util.factory.UserMoneyDetailFactory; - -import net.sf.json.JSONObject; - -@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; - - @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); - transfer(find, admin); // 鎻愮幇閫氳繃锛屾敮浠樺疂杞处 - - return null; - } - - @Transactional - 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; - - final String autoExtract = configService.get("extract_way"); // 鏄惁鑷姩杞处 - final String maxCount = configService.get("extract_count_day"); - final String maxMoney = configService.get("extract_money_day"); - - 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; - } - - Integer type = setExtractRecord(extract, maxCount, maxMoney); - if (type != 0) { - return type; - } - - extractMapper.insertSelective(extract); - - ExtractAuditRecord auditRecord = new ExtractAuditRecord(); - auditRecord.setBeforeMoney(user.getMyHongBao()); - auditRecord.setExtract(extract); - - Date minTime = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 180L); - // 缁熻鏁版嵁 - int orderCount50More = orderUserStatisticService.countOrderCount100MoreByUidAndMinTime(user.getId(), minTime); - - BigDecimal weiQuanOrderFanAmount = orderUserStatisticService.sumWeiQuanOrderFanAmountByUid(user.getId(), - minTime); - int weiQuanOrderCount = orderUserStatisticService.countWeiQuanOrderByUid(user.getId(), minTime); - auditRecord.setExtraInfoStr(new Gson() - .toJson(new ExtractOrderStatisticDTO(orderCount50More, weiQuanOrderCount, weiQuanOrderFanAmount, 0))); - extractAuditRecordMapper.insertSelective(auditRecord); - - // 鏂扮増璧勯噾璇︽儏 - UserMoneyDetail userMoneyDetail = null; - try { - userMoneyDetail = UserMoneyDetailFactory.createExtract(extract); - } 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 - */ - @Transactional - private void extractByZhiFuBao(Extract extract, AdminUser adminUser) { - LogHelper.userErrorInfo("鎻愮幇:寮�濮嬮�氳繃鎻愮幇-"+extract.getId()); - String privateKey = Constant.alipayConfig.getPrivateKey(); - AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", - Constant.alipayConfig.getAppId(), privateKey, "json", "gbk", null, "RSA2"); - AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest(); - String uuid = UUID.randomUUID().toString().replace("-", ""); - String appName = Constant.systemCommonConfig.getProjectChineseName(); - JSONObject json = new JSONObject(); - json.put("out_biz_no", uuid); - json.put("payee_type", "ALIPAY_LOGONID"); - json.put("payee_account", extract.getAccount()); - json.put("amount", extract.getMoney()); - json.put("payer_show_name", appName + "App" + "鎻愮幇"); - json.put("payee_real_name", extract.getName()); - json.put("remark", "鏉ヨ嚜" + appName + "App" + "鐨勬彁鐜�"); - request.setBizContent(json.toString()); - AlipayFundTransToaccountTransferResponse response = null; - try { - response = alipayClient.execute(request); - LogHelper.userErrorInfo("鎻愮幇:鏀粯瀹濋�氳繃鎻愮幇鎴愬姛-"+extract.getId()); - } catch (AlipayApiException e) { - e.printStackTrace(); - 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) { - // 鑰佺増鏈姛鑳� - // 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(); - } - // 鏂扮増閫氱煡 - userMoneyMsgNotificationService.extractSuccess(extract); - } - - /** - * 鏍规嵁鎻愮幇璁板綍id鑾峰彇鐢ㄦ埛uid - */ - @Override - public Extract getExtractById(long id) { - return extractMapper.selectByPrimaryKey(id); - } - - @Transactional - @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.extractReject); - typeList.add(UserMoneyDetailTypeEnum.extractVerify); - 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, "缁撶畻璧勯噾寮傚父"); - } - - @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; - AlipayFundTransToaccountTransferResponse response = info.getAlipayFundTransToaccountTransferResponse(); - 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); - } 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.getPayDate()); - 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); - 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; - } -} +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