无关风月
2024-07-11 eb6b6dbb35a9f029e0b7d269773685c19fd40976
cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java
@@ -1,35 +1,44 @@
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.DateTimeHelper;
import com.dsh.account.util.PayMoneyUtil;
import com.dsh.account.util.ResultUtil;
import com.dsh.account.util.UUIDUtil;
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.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
@@ -58,16 +67,20 @@
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    @Resource
    private SiteClient stClient;
    @Resource
    private RechargeConfigClient reconMapper;
    @Autowired
    private RechargeRecordsMapper rechargeRecordsMapper;
    @Override
    public RechargeDetailsVo getAppUserRechargeRecord(String yearMonth, Integer recordId, Integer appUserId) {
        RechargeDetailsVo vo = new RechargeDetailsVo();
        List<RechargeDetailsVo.RechargesDetail> details = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM-dd HH:mm");
    public List<RechargesDetail> getAppUserRechargeRecord(String yearMonth, Integer recordId, Integer appUserId, Integer pageNum, Integer pageSize) {
        List<RechargesDetail> details = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        Date monthStart = null;
        Date monthEnd = null;
@@ -79,55 +92,156 @@
            monthEnd = DateTimeHelper.getCurrentMouthEnd();
        }
        TAppUser tAppUser = tappMapper.selectById(appUserId);
        if (null != tAppUser){
            vo.setWpGold(tAppUser.getPlayPaiCoins());
        }else {
            vo.setWpGold(0);
        }
//            1.赛事报名
        List<PaymentCompetition> playPaiFGoldPayRecord = deducClient.getPlayPaiFGoldPayRecord(appUserId);
        if (playPaiFGoldPayRecord.size() > 0 ){
        if (playPaiFGoldPayRecord.size() > 0) {
            for (PaymentCompetition competition : playPaiFGoldPayRecord) {
                RechargeDetailsVo.RechargesDetail consumeDetail = new RechargeDetailsVo.RechargesDetail();
                consumeDetail.setConsumeName(RechargeRecordEnum.EVENT_REGISTRATION.getMsg() );
                consumeDetail.setConsumeTime(simpleDateFormat.format(competition.getInsertTime()));
                consumeDetail.setConsumeAmount("-" + competition.getAmount());
                details.add(consumeDetail);
                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<TCoursePackagePayment> appuserCourseList = cpClient.getAppuserCourseList(appUserId);
        if (appuserCourseList.size() > 0){
            for (TCoursePackagePayment tCoursePackagePayment : appuserCourseList) {
                RechargeDetailsVo.RechargesDetail consumeDetail = new RechargeDetailsVo.RechargesDetail();
                consumeDetail.setConsumeName(RechargeRecordEnum.COURSE_PACKAGE_PURCHASE.getMsg() );
                consumeDetail.setConsumeTime(simpleDateFormat.format(tCoursePackagePayment.getInsertTime()));
                consumeDetail.setConsumeAmount("-" + tCoursePackagePayment.getPlayPaiCoin());
        List<CouponPaymentVo> 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.场地预约
        // TODO: 2023/7/14  充值明细的场地预约查询
        List<SiteBooking> 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);
//            4.智慧球场
                    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);
//            5.充值
                }
            }
        }
        //    4.智慧球场
        List<Map<String, Object>> list = stClient.game(appUserId);
        if (list.size() > 0) {
            for (Map<String, Object> 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> rechargeRecords = this.baseMapper.selectList(new QueryWrapper<RechargeRecords>()
                .eq("payStatus", 2)
                .eq("appUserId", appUserId)
                .between("insertTime", monthStart, monthEnd));
        if (rechargeRecords.size() > 0) {
            for (RechargeRecords rechargeRecord : rechargeRecords) {
                RechargeDetailsVo.RechargesDetail consumeDetail = new RechargeDetailsVo.RechargesDetail();
                consumeDetail.setConsumeName(RechargeRecordEnum.RECHARGE.name() + ":" + rechargeRecord.getPlayPaiCoins());
                RechargesDetail consumeDetail = new RechargesDetail();
                consumeDetail.setConsumeName(RechargeRecordEnum.RECHARGE.getMsg() + ":¥" + rechargeRecord.getAmount());
                consumeDetail.setConsumeTime(simpleDateFormat.format(rechargeRecord.getInsertTime()));
                consumeDetail.setConsumeAmount("+" + rechargeRecord.getAmount());
                consumeDetail.setConsumeAmount("+" + rechargeRecord.getPlayPaiCoins());
                consumeDetail.setRecordId(1);
                details.add(consumeDetail);
            }
        }
        vo.setDetailList(details);
        return vo;
        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<RechargesDetail>() {
                @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<RechargesDetail> 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
@@ -138,15 +252,18 @@
        RechargeRecords rechargeRecords = new RechargeRecords();
        rechargeRecords.setCode(code);
        rechargeRecords.setAppUserId(userIdFormRedis);
        rechargeRecords.setAmount(request.getPayAmount());
        List<Map<String, Object>> rechargeConfig = reconMapper.getRechargeConfig();
        if (rechargeConfig.size() > 0){
        BigDecimal amount = BigDecimal.ZERO;
        if (rechargeConfig.size() > 0) {
            for (Map<String, Object> stringObjectMap : rechargeConfig) {
                Object o = stringObjectMap.get("money");
                if (o.equals(request.getPayAmount())){
                    if (tAppUser.getIsVip() == 1){
                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 {
                    } else {
                        rechargeRecords.setPlayPaiCoins((Integer) stringObjectMap.get("usersCoins"));
                    }
                }
@@ -157,70 +274,93 @@
        rechargeRecords.setInsertTime(new Date());
        this.baseMapper.insert(rechargeRecords);
        try {
            switch (request.getPayType()){
            switch (request.getPayType()) {
                case 1:
                    return WeChatPayment(code,request.getPayAmount());
                    return WeChatPayment(code, amount);
                case 2:
                    return AlipayPayment(code,request.getPayAmount());
                    return AlipayPayment(code, amount);
                default:
                    break;
            }
        }catch (Exception e){
        } catch (Exception e) {
            ResultUtil.runErr();
        }
        return ResultUtil.success();
    }
    private ResultUtil AlipayPayment(String code,BigDecimal amount) {
        ResultUtil alipay = payMoneyUtil.alipay("玩湃币充值", "", "", code, amount.toString(),
    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){
        if (alipay.getCode() == 200) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        int num = 1;
                        int wait = 0;
                        while (num <= 10){
                        while (num <= 10) {
                            int min = 5000;
                            wait += (min * num);
                            Thread.sleep(wait);
                            RechargeRecords records = rereMapper.selectOne(new QueryWrapper<RechargeRecords>()
                                    .eq("code",code));
                            if(records.getPayStatus() == 2){
                                    .eq("code", code));
                            if (records.getPayStatus() == 2) {
                                break;
                            }
                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryALIOrder(code);
                            if(resultUtil.getCode() == 200 && records.getPayStatus() == 1){
                            AlipayTradeQueryResponse resultUtil = payMoneyUtil.queryALIOrder(code);
                            if (resultUtil.getCode().equals("10000") && records.getPayStatus() == 1) {
                                /**
                                 * WAIT_BUYER_PAY(交易创建,等待买家付款)、
                                 * TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、
                                 * TRADE_SUCCESS(交易支付成功)、
                                 * TRADE_FINISHED(交易结束,不可退款)
                                 */
                                Map<String, String> data1 = resultUtil.getData();
                                String s = data1.get("tradeStatus");
                                String tradeNo = data1.get("tradeNo");
                                if("TRADE_CLOSED".equals(s) || "TRADE_FINISHED".equals(s) || num == 10){
//                                Map<String, String> 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(s)){
                                if ("TRADE_SUCCESS".equals(tradeStatus)) {
                                    records.setAppUserId(null);
                                    records.setPayStatus(2);
                                    records.setPayTime(new Date());
                                    records.setOrderNumber(tradeNo);
                                    rereMapper.updateById(records);
                                    payMoneyUtil.confirm(smid,code,tradeNo,amount.toString());
                                    RechargeRecords rechargeRecords = rereMapper.selectOne(new QueryWrapper<RechargeRecords>()
                                            .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(s)){
                                if ("WAIT_BUYER_PAY".equals(tradeStatus)) {
                                    num++;
                                }
                            }
                        }
                    }catch (Exception e){
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
@@ -229,27 +369,27 @@
        return alipay;
    }
    private ResultUtil WeChatPayment(String code,BigDecimal amount) throws Exception {
    private ResultUtil WeChatPayment(String code, BigDecimal amount) throws Exception {
        ResultUtil weixinpay = payMoneyUtil.weixinpay("玩湃币充值", "", code, amount.toString(),
                "/base/recharge/wechatRechargeCallback", "APP", "");
        if(weixinpay.getCode() == 200){
        if (weixinpay.getCode() == 200) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        int num = 1;
                        int wait = 0;
                        while (num <= 10){
                        while (num <= 10) {
                            int min = 5000;
                            wait += (min * num);
                            Thread.sleep(wait);
                            RechargeRecords records = rereMapper.selectOne(new QueryWrapper<RechargeRecords>()
                                    .eq("code",code));
                            if(records.getPayStatus() == 2){
                                    .eq("code", code));
                            if (records.getPayStatus() == 2) {
                                break;
                            }
                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, "");
                            if(resultUtil.getCode() == 200 && records.getPayStatus() == 1){
                            if (resultUtil.getCode() == 200 && records.getPayStatus() == 1) {
                                /**
                                 * SUCCESS—支付成功,
                                 * REFUND—转入退款,
@@ -262,23 +402,23 @@
                                Map<String, String> 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){
                                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)){
                                if ("SUCCESS".equals(s)) {
                                    records.setPayStatus(2);
                                    records.setOrderNumber(transaction_id);
                                    rereMapper.updateById(records);
                                    break;
                                }
                                if("USERPAYING".equals(s)){
                                if ("USERPAYING".equals(s)) {
                                    num++;
                                }
                            }
                        }
                    }catch (Exception e){
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
@@ -292,18 +432,63 @@
    public ResultUtil addRechargeCallbackPay(String code, String orderNumber) {
        RechargeRecords rechargeRecords = this.baseMapper.selectOne(new QueryWrapper<RechargeRecords>()
                .eq("code", code));
        if (rechargeRecords.getPayStatus() == 2){
            return  ResultUtil.success();
        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() );
        tAppUser.setPlayPaiCoins(null == tAppUser.getPlayPaiCoins() ? rechargeRecords.getPlayPaiCoins() : tAppUser.getPlayPaiCoins() + rechargeRecords.getPlayPaiCoins());
        tappMapper.updateById(tAppUser);
        return null;
    }
    @Override
    public List<RechargeRecordsVO> 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<VipPayment> 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 <T> List<T> pageList(List<T> 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);
    }
}