package com.dsh.account.service.impl; 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.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.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; @Override public List getAppUserRechargeRecord(String yearMonth, Integer recordId, Integer appUserId,Integer pageNum,Integer pageSize) { List details = new ArrayList<>(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("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) { 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) { RechargesDetail consumeDetail = new RechargesDetail(); consumeDetail.setConsumeName(RechargeRecordEnum.VENUE_RESERVATION.name()); consumeDetail.setConsumeTime(simpleDateFormat.format(booking.getInsertTime())); consumeDetail.setConsumeAmount("-" + booking.getPayMoney()); consumeDetail.setRecordId(2); details.add(consumeDetail); } } // 4.智慧球场 // 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.name() + ":" + rechargeRecord.getPlayPaiCoins()); consumeDetail.setConsumeTime(simpleDateFormat.format(rechargeRecord.getInsertTime())); consumeDetail.setConsumeAmount("+" + rechargeRecord.getAmount()); 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; //分页 details = details.stream().skip((pageNo - 1) * size).limit(size). collect(Collectors.toList()); return details; } @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) { Long o = (Long) 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 ResultUtil AlipayPayment(String code,BigDecimal amount) { ResultUtil alipay = payMoneyUtil.alipay("玩湃币充值", "玩湃币充值", "", 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; } ResultUtil> resultUtil = payMoneyUtil.queryALIOrder(code); if(resultUtil.getCode() == 200 && 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"); if("TRADE_CLOSED".equals(s) || "TRADE_FINISHED".equals(s) || num == 10){ records.setState(3); rereMapper.deleteById(records.getId()); break; } if("TRADE_SUCCESS".equals(s)){ records.setPayStatus(2); records.setOrderNumber(tradeNo); rereMapper.updateById(records); break; } if("WAIT_BUYER_PAY".equals(s)){ 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.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; } 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); } }