package com.dsh.account.service.impl; import com.alipay.api.response.AlipayTradeQueryResponse; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.account.entity.RechargeRecords; import com.dsh.account.entity.TAppUser; import com.dsh.account.entity.VipPayment; import com.dsh.account.enums.RechargeRecordEnum; import com.dsh.account.feignclient.competition.DeductionCompetitionsClient; import com.dsh.account.feignclient.competition.model.PaymentCompetition; import com.dsh.account.feignclient.course.CoursePaymentClient; import com.dsh.account.feignclient.course.model.CouponPaymentVo; import com.dsh.account.feignclient.course.model.TCoursePackagePayment; import com.dsh.account.feignclient.other.RechargeConfigClient; import com.dsh.account.feignclient.other.SiteClient; import com.dsh.account.feignclient.other.model.SiteBooking; import com.dsh.account.mapper.RechargeRecordsMapper; import com.dsh.account.mapper.TAppUserMapper; import com.dsh.account.model.IncomeQuery; import com.dsh.account.model.query.RechargeRecordsQuery; import com.dsh.account.model.vo.RechargeRecordsVO; import com.dsh.account.model.vo.userBenefitDetail.RechargeDetailsVo; import com.dsh.account.model.vo.userBenefitDetail.RechargePayRequest; import com.dsh.account.model.vo.userBenefitDetail.RechargesDetail; import com.dsh.account.service.RechargeRecordsService; import com.dsh.account.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** *

* 充值记录 服务实现类 *

* * @author jqs * @since 2023-07-07 */ @Service public class RechargeRecordsServiceImpl extends ServiceImpl implements RechargeRecordsService { @Resource private RechargeRecordsMapper rereMapper; @Resource private TAppUserMapper tappMapper; @Autowired private CoursePaymentClient cpClient; @Autowired private DeductionCompetitionsClient deducClient; @Autowired private PayMoneyUtil payMoneyUtil; @Resource private SiteClient stClient; @Resource private RechargeConfigClient reconMapper; @Autowired private RechargeRecordsMapper rechargeRecordsMapper; @Override public List getAppUserRechargeRecord(String yearMonth, Integer recordId, Integer appUserId, Integer pageNum, Integer pageSize) { List details = new ArrayList<>(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); Date monthStart = null; Date monthEnd = null; if (StringUtils.hasText(yearMonth)) { monthStart = DateTimeHelper.getCurrentIdetMouthStart(yearMonth); monthEnd = DateTimeHelper.getCurrentIdeaMouthEnd(yearMonth); } else { monthStart = DateTimeHelper.getCurrentMouthStart(); monthEnd = DateTimeHelper.getCurrentMouthEnd(); } // 1.赛事报名 List playPaiFGoldPayRecord = deducClient.getPlayPaiFGoldPayRecord(appUserId); if (playPaiFGoldPayRecord.size() > 0) { for (PaymentCompetition competition : playPaiFGoldPayRecord) { if (competition.getPayStatus() == 2) { RechargesDetail consumeDetail = new RechargesDetail(); consumeDetail.setConsumeName(RechargeRecordEnum.EVENT_REGISTRATION.getMsg()); consumeDetail.setConsumeTime(simpleDateFormat.format(competition.getInsertTime())); consumeDetail.setConsumeAmount("-" + competition.getAmount()); consumeDetail.setRecordId(2); details.add(consumeDetail); } else { RechargesDetail consumeDetail1 = new RechargesDetail(); consumeDetail1.setConsumeName(RechargeRecordEnum.CANCEL_EVENT_REGISTRATION.getMsg()); consumeDetail1.setConsumeTime(simpleDateFormat.format(competition.getRefundTime())); consumeDetail1.setConsumeAmount("+" + competition.getAmount()); consumeDetail1.setRecordId(1); details.add(consumeDetail1); RechargesDetail consumeDetail = new RechargesDetail(); consumeDetail.setConsumeName(RechargeRecordEnum.EVENT_REGISTRATION.getMsg()); consumeDetail.setConsumeTime(simpleDateFormat.format(competition.getInsertTime())); consumeDetail.setConsumeAmount("-" + competition.getAmount()); consumeDetail.setRecordId(2); details.add(consumeDetail); } } } // 2.课包购买 List appuserCourseList = cpClient.getAppuserCourseList(appUserId); if (appuserCourseList.size() > 0) { for (CouponPaymentVo tCoursePackagePayment : appuserCourseList) { RechargesDetail consumeDetail = new RechargesDetail(); consumeDetail.setConsumeName(RechargeRecordEnum.COURSE_PACKAGE_PURCHASE.getMsg()); consumeDetail.setConsumeTime(tCoursePackagePayment.getTime()); consumeDetail.setConsumeAmount("-" + tCoursePackagePayment.getAmount()); consumeDetail.setRecordId(2); details.add(consumeDetail); } } // 3.场地预约 List siteBookings = stClient.wanpaiGoldSiteBookingList(appUserId); if (siteBookings.size() > 0) { for (SiteBooking booking : siteBookings) { if (booking.getStatus() != 5) { RechargesDetail consumeDetail = new RechargesDetail(); consumeDetail.setConsumeName(RechargeRecordEnum.VENUE_RESERVATION.getMsg()); consumeDetail.setConsumeTime(simpleDateFormat.format(booking.getInsertTime())); consumeDetail.setConsumeAmount("-" + booking.getPayMoney()); consumeDetail.setRecordId(2); details.add(consumeDetail); } else { RechargesDetail consumeDetail1 = new RechargesDetail(); consumeDetail1.setConsumeName(RechargeRecordEnum.CANCEL_VENUE_RESERVATION.getMsg()); consumeDetail1.setConsumeTime(simpleDateFormat.format(booking.getCancelTime())); consumeDetail1.setConsumeAmount("+" + booking.getPayMoney()); consumeDetail1.setRecordId(1); details.add(consumeDetail1); RechargesDetail consumeDetail = new RechargesDetail(); consumeDetail.setConsumeName(RechargeRecordEnum.VENUE_RESERVATION.getMsg()); consumeDetail.setConsumeTime(simpleDateFormat.format(booking.getInsertTime())); consumeDetail.setConsumeAmount("-" + booking.getPayMoney()); consumeDetail.setRecordId(2); details.add(consumeDetail); } } } // 4.智慧球场 List> list = stClient.game(appUserId); if (list.size() > 0) { for (Map booking : list) { RechargesDetail consumeDetail = new RechargesDetail(); consumeDetail.setConsumeName("激战游戏"); consumeDetail.setConsumeTime(simpleDateFormat.format(new Date(Long.valueOf(booking.get("time").toString())))); consumeDetail.setConsumeAmount("-" + String.valueOf(booking.get("money"))); consumeDetail.setRecordId(2); details.add(consumeDetail); } } // 5.充值 List rechargeRecords = this.baseMapper.selectList(new QueryWrapper() .eq("payStatus", 2) .eq("appUserId", appUserId) .between("insertTime", monthStart, monthEnd)); if (rechargeRecords.size() > 0) { for (RechargeRecords rechargeRecord : rechargeRecords) { RechargesDetail consumeDetail = new RechargesDetail(); consumeDetail.setConsumeName(RechargeRecordEnum.RECHARGE.getMsg() + ":¥" + rechargeRecord.getAmount()); consumeDetail.setConsumeTime(simpleDateFormat.format(rechargeRecord.getInsertTime())); consumeDetail.setConsumeAmount("+" + rechargeRecord.getPlayPaiCoins()); consumeDetail.setRecordId(1); details.add(consumeDetail); } } if (ToolUtil.isNotEmpty(recordId)) { details = details.stream() .filter(record -> record.getRecordId().equals(recordId)) .collect(Collectors.toList()); } if (details.size() > 0) { Collections.sort(details, new Comparator() { @Override public int compare(RechargesDetail o1, RechargesDetail o2) { try { Date date1 = simpleDateFormat.parse(o1.getConsumeTime()); Date date2 = simpleDateFormat.parse(o2.getConsumeTime()); return date2.compareTo(date1); // 降序排序 } catch (ParseException e) { e.printStackTrace(); } return 0; } }); } //当前第几页 int pageNo = pageNum; //一页五条 int size = pageSize; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); List filteredList = new ArrayList<>(); for (RechargesDetail detail : details) { try { Date consumeTime = dateFormat.parse(detail.getConsumeTime()); if (consumeTime.after(monthStart) && consumeTime.before(monthEnd)) { String substring = detail.getConsumeTime().substring(5); detail.setConsumeTime(substring); filteredList.add(detail); } } catch (ParseException e) { e.printStackTrace(); } } //分页 filteredList = filteredList.stream().skip((pageNo - 1) * size).limit(size). collect(Collectors.toList()); return filteredList; } @Override public ResultUtil rechargeCenPayment(Integer userIdFormRedis, RechargePayRequest request) { TAppUser tAppUser = tappMapper.selectById(userIdFormRedis); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5); RechargeRecords rechargeRecords = new RechargeRecords(); rechargeRecords.setCode(code); rechargeRecords.setAppUserId(userIdFormRedis); List> rechargeConfig = reconMapper.getRechargeConfig(); BigDecimal amount = BigDecimal.ZERO; if (rechargeConfig.size() > 0) { for (Map stringObjectMap : rechargeConfig) { double o = (double) stringObjectMap.get("money"); if (BigDecimal.valueOf(o).compareTo(request.getAmount()) == 0) { amount = BigDecimal.valueOf(o); rechargeRecords.setAmount(BigDecimal.valueOf(o)); if (tAppUser.getIsVip() == 1) { rechargeRecords.setPlayPaiCoins((Integer) stringObjectMap.get("MemberCoins")); } else { rechargeRecords.setPlayPaiCoins((Integer) stringObjectMap.get("usersCoins")); } } } } rechargeRecords.setPayStatus(1); rechargeRecords.setState(1); rechargeRecords.setInsertTime(new Date()); this.baseMapper.insert(rechargeRecords); try { switch (request.getPayType()) { case 1: return WeChatPayment(code, amount); case 2: return AlipayPayment(code, amount); default: break; } } catch (Exception e) { ResultUtil.runErr(); } return ResultUtil.success(); } private String smid = "2088330203191220";//平台支付宝商户号 private ResultUtil AlipayPayment(String code, BigDecimal amount) { ResultUtil alipay = payMoneyUtil.alipay(smid,"玩湃币充值", "玩湃币充值", "", code, amount.toString(), "/base/recharge/alipayRechargeCallback"); if (alipay.getCode() == 200) { new Thread(new Runnable() { @Override public void run() { try { int num = 1; int wait = 0; while (num <= 10) { int min = 5000; wait += (min * num); Thread.sleep(wait); RechargeRecords records = rereMapper.selectOne(new QueryWrapper() .eq("code", code)); if (records.getPayStatus() == 2) { break; } AlipayTradeQueryResponse resultUtil = payMoneyUtil.queryALIOrder(code); if (resultUtil.getCode().equals("10000") && records.getPayStatus() == 1) { /** * WAIT_BUYER_PAY(交易创建,等待买家付款)、 * TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、 * TRADE_SUCCESS(交易支付成功)、 * TRADE_FINISHED(交易结束,不可退款) */ // Map data1 = resultUtil.getData(); // String s = data1.get("tradeStatus"); // String tradeNo = data1.get("tradeNo"); String tradeNo = resultUtil.getTradeNo(); String tradeStatus = resultUtil.getTradeStatus(); System.out.println("ssssss" + tradeStatus); if ("TRADE_CLOSED".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus) || num == 10) { records.setState(3); rereMapper.deleteById(records.getId()); if ("TRADE_FINISHED".equals(tradeStatus)) { // todo 资金结算 payMoneyUtil.confirm(smid,code,tradeNo,amount.toString()); break; } break; } if ("TRADE_SUCCESS".equals(tradeStatus)) { records.setAppUserId(null); records.setPayStatus(2); records.setPayTime(new Date()); records.setOrderNumber(tradeNo); rereMapper.updateById(records); RechargeRecords rechargeRecords = rereMapper.selectOne(new QueryWrapper() .eq("code", code)); if (rechargeRecords.getPayStatus() == 2) { TAppUser tAppUser = tappMapper.selectById(rechargeRecords.getAppUserId()); tAppUser.setPlayPaiCoins(null == tAppUser.getPlayPaiCoins() ? rechargeRecords.getPlayPaiCoins() : tAppUser.getPlayPaiCoins() + rechargeRecords.getPlayPaiCoins()); tappMapper.updateById(tAppUser); break; } break; } if ("WAIT_BUYER_PAY".equals(tradeStatus)) { num++; } } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } return alipay; } private ResultUtil WeChatPayment(String code, BigDecimal amount) throws Exception { ResultUtil weixinpay = payMoneyUtil.weixinpay("玩湃币充值", "", code, amount.toString(), "/base/recharge/wechatRechargeCallback", "APP", ""); if (weixinpay.getCode() == 200) { new Thread(new Runnable() { @Override public void run() { try { int num = 1; int wait = 0; while (num <= 10) { int min = 5000; wait += (min * num); Thread.sleep(wait); RechargeRecords records = rereMapper.selectOne(new QueryWrapper() .eq("code", code)); if (records.getPayStatus() == 2) { break; } ResultUtil> resultUtil = payMoneyUtil.queryWXOrder(code, ""); if (resultUtil.getCode() == 200 && records.getPayStatus() == 1) { /** * SUCCESS—支付成功, * REFUND—转入退款, * NOTPAY—未支付, * CLOSED—已关闭, * REVOKED—已撤销(刷卡支付), * USERPAYING--用户支付中, * PAYERROR--支付失败(其他原因,如银行返回失败) */ Map data1 = resultUtil.getData(); String s = data1.get("trade_state"); String transaction_id = data1.get("transaction_id"); if ("REFUND".equals(s) || "NOTPAY".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s) || num == 10) { records.setState(3); rereMapper.deleteById(records.getId()); break; } if ("SUCCESS".equals(s)) { records.setPayStatus(2); records.setOrderNumber(transaction_id); rereMapper.updateById(records); break; } if ("USERPAYING".equals(s)) { num++; } } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } return weixinpay; } @Override public ResultUtil addRechargeCallbackPay(String code, String orderNumber) { RechargeRecords rechargeRecords = this.baseMapper.selectOne(new QueryWrapper() .eq("code", code)); if (rechargeRecords.getPayStatus() == 2) { return ResultUtil.success(); } rechargeRecords.setAppUserId(null); rechargeRecords.setPayStatus(2); rechargeRecords.setPayTime(new Date()); rechargeRecords.setOrderNumber(orderNumber); this.baseMapper.updateById(rechargeRecords); TAppUser tAppUser = tappMapper.selectById(rechargeRecords.getAppUserId()); tAppUser.setPlayPaiCoins(null == tAppUser.getPlayPaiCoins() ? rechargeRecords.getPlayPaiCoins() : tAppUser.getPlayPaiCoins() + rechargeRecords.getPlayPaiCoins()); tappMapper.updateById(tAppUser); return null; } @Override public List rechargeList(RechargeRecordsQuery query) { String STime = null; String ETime = null; if (StringUtils.hasLength(query.getTime())) { STime = query.getTime().split(" - ")[0] + " 00:00:00"; ETime = query.getTime().split(" - ")[1] + " 23:59:59"; } return rechargeRecordsMapper.rechargeList(query, STime, ETime); } @Override public List listAll(IncomeQuery query) { String STime = null; String ETime = null; if (StringUtils.hasLength(query.getTime())) { STime = query.getTime().split(" - ")[0] + " 00:00:00"; ETime = query.getTime().split(" - ")[1] + " 23:59:59"; } return rechargeRecordsMapper.listAll(query, STime, ETime, query.getAmount(), query.getInsertType()); } public static List pageList(List list, int pageNum, int pageSize) { //计算总页数 int page = list.size() % pageSize == 0 ? list.size() / pageSize : list.size() / pageSize + 1; //兼容性分页参数错误 pageNum = pageNum <= 0 ? 1 : pageNum; pageNum = pageNum >= page ? page : pageNum; // 开始索引 int begin = 0; // 结束索引 int end = 0; if (pageNum != page) { begin = (pageNum - 1) * pageSize; end = begin + pageSize; } else { begin = (pageNum - 1) * pageSize; end = list.size(); } return list.subList(begin, end); } }