liujie
2023-09-20 d09828cdec78a160f4530a8ab245216ed8671c27
cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java
@@ -1,12 +1,56 @@
package com.dsh.course.service.impl;
import com.dsh.course.entity.TCoursePackagePayment;
import com.dsh.course.mapper.TCoursePackagePaymentMapper;
import com.dsh.course.service.TCoursePackagePaymentService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.domain.Person;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsh.course.entity.*;
import com.dsh.course.feignclient.account.AppUserClient;
import com.dsh.course.feignclient.account.CoachClient;
import com.dsh.course.feignclient.account.StudentClient;
import com.dsh.course.feignclient.account.model.AppUser;
import com.dsh.course.feignclient.account.model.Coach;
import com.dsh.course.feignclient.account.model.Student;
import com.dsh.course.feignclient.account.model.TCourseInfoRecord;
import com.dsh.course.feignclient.activity.BenefitVideoClient;
import com.dsh.course.feignclient.activity.CouponClient;
import com.dsh.course.feignclient.activity.model.BenefitsVideos;
import com.dsh.course.feignclient.activity.model.Coupon;
import com.dsh.course.feignclient.model.RecordAppoint;
import com.dsh.course.feignclient.other.StoreClient;
import com.dsh.course.feignclient.other.model.Store;
import com.dsh.course.mapper.*;
import com.dsh.course.model.BillingRequest;
import com.dsh.course.model.QueryRegistrationRecord;
import com.dsh.course.model.QueryWalkInStudentList;
import com.dsh.course.model.dto.DiscountJsonDto;
import com.dsh.course.model.vo.RegisterCourseVo;
import com.dsh.course.model.vo.request.*;
import com.dsh.course.model.vo.response.*;
import com.dsh.course.service.ICoursePackageSchedulingService;
import com.dsh.course.service.TCoursePackagePaymentService;
import com.dsh.course.util.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
 * <p>
@@ -19,8 +63,961 @@
@Service
public class TCoursePackagePaymentServiceImpl extends ServiceImpl<TCoursePackagePaymentMapper, TCoursePackagePayment> implements TCoursePackagePaymentService {
    @Resource
    private BenefitVideoClient bfvoClient;
    @Resource
    private UserVideoDetailsMapper uvdmapper;
    @Resource
    private PostCourseVideoMapper pcvMapper;
    @Resource
    private TCoursePackageMapper tcpmapper;
    @Resource
    private StoreClient stoClient;
    @Resource
    private CoachClient coachClient;
    @Resource
    private CoursePackageStudentMapper cpsMapper;
    @Resource
    private CancelledClassesMapper cacMapper;
    @Resource
    private TCoursePackageDiscountMapper tcpdMapper;
    @Resource
    private CoursePackagePaymentConfigMapper cpConfigMapper;
    @Resource
    private CouponClient client;
    @Resource
    private PayMoneyUtil payMoneyUtil;
    @Resource
    private AppUserClient appuClient;
    @Resource
    private StudentClient studentClient;
    @Autowired
    private ICoursePackageSchedulingService coursePackageSchedulingService;
    @Autowired
    private RestTemplate internalRestTemplate;
    /**
     * 获取课包购买人数
     * @param coursePackageId
     * @return
     */
    @Override
    public List<TCoursePackagePayment> queryAllCoursePackage(Integer stuId,Integer appUserId) {
        return this.baseMapper.queryAllCoursePackage(stuId,appUserId);
    public Integer queryCountNumber(Integer coursePackageId) {
        return this.baseMapper.queryCountNumber(coursePackageId);
    }
    @Override
    public List<AppUserVideoResponse> queryAfterVideo(CourseOfAfterRequest search,List<Integer> courseIds) {
        List<AppUserVideoResponse> responses = new ArrayList<>();
        List<PostCourseVideo> videoList = new ArrayList<>();
        LambdaQueryWrapper<PostCourseVideo> queryWrapper = new LambdaQueryWrapper<PostCourseVideo>();
        if (courseIds.size() > 0 ){
            queryWrapper.in(PostCourseVideo::getCoursePackageId,courseIds);
        }
        videoList = pcvMapper.selectList(queryWrapper);
        System.out.println(videoList);
        if (videoList.size() > 0){
            List<Integer> videoIds = videoList.stream().map(PostCourseVideo::getCourseId).collect(Collectors.toList());
            List<UserVideoDetails> userVideoDetails = uvdmapper.selectList(new QueryWrapper<UserVideoDetails>()
                    .in("courseId", videoIds));
            if (userVideoDetails.size() > 0){
                for (UserVideoDetails userVideoDetail : userVideoDetails) {
                    AppUserVideoResponse response = new AppUserVideoResponse();
                    TCoursePackage coursePackage = tcpmapper.selectById(userVideoDetail.getCoursePackageId());
                    response.setPackageName(coursePackage.getName());
                    response.setCoursePackageId(userVideoDetail.getCoursePackageId());
                    BenefitsVideos videosWithIds = bfvoClient.getVideosWithIds(userVideoDetail.getCourseId());
                    response.setVideoId(userVideoDetail.getCourseId());
                    response.setCoverImage(videosWithIds.getCover());
                    response.setVideoName(videosWithIds.getName());
                    response.setSynopsis(videosWithIds.getIntroduction());
                    response.setIntegral(videosWithIds.getIntegral());
                    response.setStudyStatus(userVideoDetail.getState());
                    responses.add(response);
                }
                Collections.sort(responses, Comparator.comparing(AppUserVideoResponse::getStudyStatus));
            }
            if (ToolUtil.isNotEmpty(search.getSearch())){
                responses = responses.stream()
                        .filter(person -> person.getPackageName().contains(search.getSearch()))
                        .collect(Collectors.toList());
            }
            if (ToolUtil.isNotEmpty(search.getCourseTypeId())){
                responses = responses.stream()
                        .filter(person -> Objects.equals(person.getCoursePackageId(), search.getCourseTypeId()))
                        .collect(Collectors.toList());
            }
        }
        return responses;
    }
    @Override
    public CourseOfVideoResponse queryVideoDetails(CourseWithDetailsRequest detailsRequest,Integer appUserId) {
        CourseOfVideoResponse response = new CourseOfVideoResponse();
        BenefitsVideos videosWithIds = bfvoClient.getVideosWithIds(detailsRequest.getVideoId());
        TCoursePackage coursePackage = tcpmapper.selectById(detailsRequest.getCoursePackageId());
        if (null != videosWithIds && null != coursePackage){
            response.setCoursePackageId(coursePackage.getId());
            response.setVideoId(videosWithIds.getId());
            response.setVideoURL(videosWithIds.getVideos());
            response.setVideoName(videosWithIds.getName());
            response.setIntegral(videosWithIds.getIntegral());
            UserVideoDetails userVideoDetails = uvdmapper.selectOne(new QueryWrapper<UserVideoDetails>()
                    .eq("appUserId",appUserId )
                    .eq("coursePackageId",coursePackage.getId())
                    .eq("courseId",videosWithIds.getId()));
            response.setStudyStatus(userVideoDetails.getState());
            response.setPackageName(coursePackage.getName());
            response.setSynopsis(videosWithIds.getIntroduction());
            response.setDetailedDiagram(coursePackage.getIntroduceDrawing());
            response.setCover(videosWithIds.getCover());
        }
        return response;
    }
    @Override
    public String updateVideoStatus(UpdateCourseVideoStatusRequest detailsRequest, Integer appUserId) {
        UserVideoDetails userVideoDetails = uvdmapper.selectOne(new QueryWrapper<UserVideoDetails>()
                .eq("appUserId",appUserId )
                .eq("coursePackageId",detailsRequest.getCoursePackageId())
                .eq("courseId",detailsRequest.getVideoId())
                );
        if (null != userVideoDetails && userVideoDetails.getState() ==1 && detailsRequest.getIsOver() == 1){
            userVideoDetails.setState(2);
            userVideoDetails.setUpdateTime(new Date());
            uvdmapper.updateById(userVideoDetails);
            return "SUCCESS";
        }
        return "ERROR";
    }
    @Override
    public List<RegisterCourseVo> queryRegisteredCourseList(CourseOfAfterRequest courseTypeId, Integer appUserId) {
        List<RegisterCourseVo> courseVos = new ArrayList<>();
        List<TCoursePackagePayment> tCoursePackagePayments = this.list(new QueryWrapper<TCoursePackagePayment>()
                .eq("appUserId",appUserId ));
        System.out.println(tCoursePackagePayments);
        if (tCoursePackagePayments.size() > 0){
            for (TCoursePackagePayment tCoursePackagePayment : tCoursePackagePayments) {
                TCoursePackage coursePackage = tcpmapper.selectById(tCoursePackagePayment.getCoursePackageId());
                Store store = stoClient.queryStoreById(coursePackage.getStoreId());
                RegisterCourseVo registerCourseVo = new RegisterCourseVo();
                // 2.0
                registerCourseVo.setType(coursePackage.getType());
                registerCourseVo.setCoursePayId(tCoursePackagePayment.getId());
                registerCourseVo.setCoursePackageId(tCoursePackagePayment.getCoursePackageId());
                registerCourseVo.setCoursePackTypeId(coursePackage.getCoursePackageTypeId());
                registerCourseVo.setPackageImg(coursePackage.getCoverDrawing());
                String storeAndCourse = coursePackage.getName()+"("+ store.getName() +")";
                registerCourseVo.setCourseNameStore(storeAndCourse);
//                registerCourseVo.setCourseTime(coursePackage.getClassStartTime()+"-"+coursePackage.getClassEndTime());
                // 2.0
                registerCourseVo.setCourseTime(new SimpleDateFormat("yyyy-MM-dd").format(tCoursePackagePayment.getInsertTime()));
                Coach coach = coachClient.queryCoachById(coursePackage.getCoachId());
                registerCourseVo.setCourseTeacher(ToolUtil.isEmpty(coach) ? "" : coach.getName());
                List<CoursePackageStudent> coursePackageStudents = cpsMapper.selectList(new QueryWrapper<CoursePackageStudent>()
                        .eq("coursePackageId",coursePackage.getId())
                        .eq("studentId",appUserId ));
                if (coursePackageStudents.size() > 0 ){
                    registerCourseVo.setCourseNums(coursePackageStudents.size() * 2);
                }
                registerCourseVo.setPayStatus(tCoursePackagePayment.getPayStatus());
                courseVos.add(registerCourseVo);
            }
            if (ToolUtil.isNotEmpty(courseTypeId.getSearch())){
                courseVos = courseVos.stream()
                        .filter(person -> person.getCourseNameStore().contains(courseTypeId.getSearch()))
                        .collect(Collectors.toList());
            }
            if (ToolUtil.isNotEmpty(courseTypeId.getCourseTypeId())){
                courseVos = courseVos.stream()
                        .filter(person -> Objects.equals(person.getCoursePackTypeId(), courseTypeId.getCourseTypeId()))
                        .collect(Collectors.toList());
            }
            if (courseVos.size() > 0 ){
                courseVos = courseVos.stream()
                        .sorted(Comparator.comparingInt(person -> person.getPayStatus() == 1 ? -1 : 1))
                        .collect(Collectors.toList());
            }
        }
        return courseVos;
    }
    @Override
    public CourseDetailsResponse queryRegisteredCourseDetails(Long coursePayId, Integer appUserId) {
        CourseDetailsResponse response = new CourseDetailsResponse();
        TCoursePackagePayment tCoursePackagePayment = this.baseMapper.selectById(coursePayId);
        if (null != tCoursePackagePayment){
            TCoursePackage coursePackage = tcpmapper.selectById(tCoursePackagePayment.getCoursePackageId());
            response.setCoursePackageId(tCoursePackagePayment.getCoursePackageId());
            response.setCoverDrawing(coursePackage.getCoverDrawing());
            response.setCoursePackageName(coursePackage.getName());
            response.setCoursePayId(tCoursePackagePayment.getId());
            List<Integer> integers = StrUtils.dealStrToList(coursePackage.getClassWeeks());
            if (integers.size() > 0){
                StringBuilder courWeeks = new StringBuilder("每");
                for (Integer integer : integers) {
                    courWeeks.append(integer).append("、");
                }
                if (courWeeks.length() > 0 && courWeeks.charAt(courWeeks.length() - 1) == '、'){
                    courWeeks.deleteCharAt(courWeeks.length() - 1);
                }
                response.setWeeks(courWeeks.toString());
            }
            response.setCourseTimeFrame(coursePackage.getClassStartTime()+"-"+coursePackage.getClassEndTime());
            response.setIntroduceDrawing(coursePackage.getIntroduceDrawing());
            Integer payType = tCoursePackagePayment.getPayType();
            BigDecimal cashPayment = tCoursePackagePayment.getCashPayment();
            double cashPaymentValue = 0.0;
            if(cashPayment!=null){
                 cashPaymentValue = cashPayment.doubleValue();
            }
            Integer playPaiCoin = tCoursePackagePayment.getPlayPaiCoin();
            TCoursePackageDiscount coursePackageDiscount = tcpdMapper.selectOne(new QueryWrapper<TCoursePackageDiscount>()
                    .eq("coursePackageId",coursePackage.getId() )
                    .eq("type",1)
                    .eq("auditStatus",2));
            ObjectMapper objectMapper = new ObjectMapper();
            double discountMember = 0.0;
            if(coursePackageDiscount!=null){
                String content = coursePackageDiscount.getContent();
                DiscountJsonDto discountJsonDto = null;
                try {
                    discountJsonDto = objectMapper.readValue(content, DiscountJsonDto.class);
                    discountMember = discountJsonDto.getDiscountMember();
                } catch (JsonProcessingException e) {
                    throw new RuntimeException(e);
                }
            }
            switch (payType) {
                case 1:
                case 2:
                    response.setAmount(cashPaymentValue);
                    response.setVipAmount(discountMember);
                    break;
                case 3:
                    response.setWpGold(playPaiCoin);
                    break;
            }
            response.setPayStatus(tCoursePackagePayment.getPayStatus());
        }
        return response;
    }
    @Override
    public ResultUtil ContinuationOrpaymentCourse(Integer ids, ClasspaymentRequest request) {
        AppUser userIdFormRedis = appuClient.queryAppUser(ids);
        TCoursePackagePayment tCoursePackagePayment = this.baseMapper.selectById(request.getCoursePayId());
        String code = "";
        BigDecimal money = tCoursePackagePayment.getCashPayment();
        Integer wpGold = tCoursePackagePayment.getPlayPaiCoin();
        if (tCoursePackagePayment.getPayStatus() == 1){
//            待支付的订单
            code = tCoursePackagePayment.getCode();
            tCoursePackagePayment.setPayType(request.getPayType());
            if (request.getUseConpon() == 1){
                tCoursePackagePayment.setUserCouponId(Long.valueOf(request.getUseConpon()));
            }
            this.baseMapper.updateById(tCoursePackagePayment);
        }else {
//            续课的订单
//            查询是否续课优惠
            CoursePackagePaymentConfig paymentConfig = cpConfigMapper.selectOne(new QueryWrapper<CoursePackagePaymentConfig>()
                    .eq("coursePackageId", request.getLessonId())
                    .eq("classHours", request.getCourseHoursNum()));
            TCoursePackageDiscount coursePackageDiscount = tcpdMapper.selectOne(new QueryWrapper<TCoursePackageDiscount>()
                    .eq("coursePackageId", request.getLessonId())
                    .eq("type", 2)
                    .eq("auditStatus", 1)
                    .eq("coursePackagePaymentConfigId", paymentConfig.getCoursePackageId()));
            if (ToolUtil.isNotEmpty(coursePackageDiscount)){
                String content = coursePackageDiscount.getContent();
                JSONObject jsonObject = JSON.parseObject(content);
                if (userIdFormRedis.getIsVip() == 1){
                    Double jsonObjectDouble = jsonObject.getDouble("num1");
                    money = BigDecimal.valueOf(jsonObjectDouble);
                }else {
                    Double jsonObjectDouble = jsonObject.getDouble("num2");
                    money = BigDecimal.valueOf(jsonObjectDouble);
                }
            }
            TCoursePackagePayment newPayment = new TCoursePackagePayment();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            newPayment.setCode(sdf.format(new Date()) + UUIDUtil.getNumberRandom(5));
            newPayment.setAppUserId(userIdFormRedis.getId());
            newPayment.setStudentId(request.getStuId());
            newPayment.setCoursePackageId(request.getLessonId());
            newPayment.setClassHours(tCoursePackagePayment.getClassHours());
            newPayment.setOriginalPrice(tCoursePackagePayment.getOriginalPrice());
            newPayment.setTotalClassHours(tCoursePackagePayment.getTotalClassHours());
            newPayment.setLaveClassHours(tCoursePackagePayment.getTotalClassHours());
            if (request.getUseConpon() == 1){
                newPayment.setUserCouponId(Long.valueOf(request.getUseConpon()));
            }
            newPayment.setAbsencesNumber(0);
            newPayment.setPayUserType(1);
            newPayment.setPayStatus(1);
            newPayment.setStatus(1);
            newPayment.setPayType(request.getPayType());
            newPayment.setState(1);
            newPayment.setInsertTime(new Date());
            this.baseMapper.insert(newPayment);
            code = newPayment.getCode();
        }
        switch (request.getPayType()){
            case 1:
                if (request.getUseConpon() == 1){
                    Coupon coupon = client.queryCouponById(request.getConponId());
                    if (coupon.getType() == 1){
                        Map<String, Object> couponRules = client.getCouponRules(coupon.getId());
                        Double conditionalAmount = (Double) couponRules.get("conditionalAmount");
                        Double deductionAmount = (Double) couponRules.get("deductionAmount");
                        if (money.compareTo(BigDecimal.valueOf(conditionalAmount)) >= 0){
                            money = BigDecimal.valueOf(deductionAmount);
                        }
                    }
                    if (coupon.getType() == 2){
                        Map<String, Object> couponRules = client.getCouponRules(coupon.getId());
                        Object amount = couponRules.get("deductionAmount");
                        money = BigDecimal.valueOf((Double) amount);
                    }
                }
                try {
                    return WeChatPayment(code,money);
                }catch (Exception e){
                    return ResultUtil.runErr();
                }
            case 2:
                if (request.getUseConpon() == 1){
                    Coupon coupon = client.queryCouponById(request.getConponId());
                    if (coupon.getType() == 1){
                        Map<String, Object> couponRules = client.getCouponRules(coupon.getId());
                        Double conditionalAmount = (Double) couponRules.get("conditionalAmount");
                        Double deductionAmount = (Double) couponRules.get("deductionAmount");
                        if (money.compareTo(BigDecimal.valueOf(conditionalAmount)) >= 0){
                            money = BigDecimal.valueOf(deductionAmount);
                        }
                    }
                    if (coupon.getType() == 2){
                        Map<String, Object> couponRules = client.getCouponRules(coupon.getId());
                        Object amount = couponRules.get("deductionAmount");
                        money = BigDecimal.valueOf((Double) amount);
                    }
                }
                return AlipayPayment(code,money);
            case 3:
                PlaypaiGoldPayment(userIdFormRedis,code,wpGold);
                break;
            default:
                break;
        }
        return ResultUtil.success();
    }
    public ResultUtil WeChatPayment(String code, BigDecimal request) throws Exception {
        TCoursePackagePaymentMapper baseMapper1 = this.baseMapper;
        ResultUtil weixinpay = payMoneyUtil.weixinpay("课包续费", "", code, request.toString(),
                "/base/coursePackage/wechatRegisteredCoursesCallback", "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);
                            TCoursePackagePayment coursePackagePayment = baseMapper1.getCoursePackagePaymentByCode(code);
                            if(coursePackagePayment.getPayStatus() == 2){
                                break;
                            }
                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, "");
                            if(resultUtil.getCode() == 200 && coursePackagePayment.getPayStatus() == 1){
                                /**
                                 * SUCCESS—支付成功,
                                 * REFUND—转入退款,
                                 * NOTPAY—未支付,
                                 * CLOSED—已关闭,
                                 * REVOKED—已撤销(刷卡支付),
                                 * USERPAYING--用户支付中,
                                 * PAYERROR--支付失败(其他原因,如银行返回失败)
                                 */
                                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){
                                    coursePackagePayment.setState(3);
                                    baseMapper1.deleteById(coursePackagePayment.getId());
                                    break;
                                }
                                if("SUCCESS".equals(s)){
                                    coursePackagePayment.setPayStatus(2);
                                    coursePackagePayment.setOrderNumber(transaction_id);
                                    baseMapper1.updateById(coursePackagePayment);
                                    break;
                                }
                                if("USERPAYING".equals(s)){
                                    num++;
                                }
                            }
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }).start();
        }
        return weixinpay;
    }
    public ResultUtil AlipayPayment(String code, BigDecimal request){
        TCoursePackagePaymentMapper baseMapper1 = this.baseMapper;
        ResultUtil alipay = payMoneyUtil.alipay("课包购买", "", "", code, request.toString(),
                "/base/coursePackage/alipayRegisteredCoursesCallback");
        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);
                            TCoursePackagePayment coursePackagePayment = baseMapper1.getCoursePackagePaymentByCode(code);
                            if(coursePackagePayment.getPayStatus() == 2){
                                break;
                            }
                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryALIOrder(code);
                            if(resultUtil.getCode() == 200 && coursePackagePayment.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){
                                    coursePackagePayment.setState(3);
                                    baseMapper1.deleteById(coursePackagePayment.getId());
                                    break;
                                }
                                if("TRADE_SUCCESS".equals(s)){
                                    coursePackagePayment.setPayStatus(2);
                                    coursePackagePayment.setOrderNumber(tradeNo);
                                    baseMapper1.updateById(coursePackagePayment);
                                    break;
                                }
                                if("WAIT_BUYER_PAY".equals(s)){
                                    num++;
                                }
                            }
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }).start();
        }
        return alipay;
    }
    public ResultUtil PlaypaiGoldPayment(AppUser appUser,String code, Integer wpGold){
        TCoursePackagePayment packagePayment = this.baseMapper.selectOne(new QueryWrapper<TCoursePackagePayment>()
                .eq("code",code ));
        if (appUser.getPlayPaiCoins() < wpGold){
            return ResultUtil.error("玩牌币不足!");
        }
        packagePayment.setPayStatus(2);
        packagePayment.setPayUserId(appUser.getId());
        packagePayment.setPlayPaiCoin(wpGold);
        this.baseMapper.updateById(packagePayment);
        appUser.setPlayPaiCoins(ToolUtil.isNotEmpty(appUser.getPlayPaiCoins()) ? appUser.getPlayPaiCoins()-wpGold : wpGold);
        appuClient.updateAppUser(appUser);
        return ResultUtil.success();
    }
    @Override
    public List<RecordAppoint> obtainStuClassDetails(Integer stuId, Integer appUserId) {
        List<RecordAppoint> recordVoList = new ArrayList<>();
        List<TCoursePackagePayment> tCoursePackagePayments = this.baseMapper.selectList(new QueryWrapper<TCoursePackagePayment>()
                .eq("studentId",stuId )
                .eq("appUserId",appUserId )
                .eq("payStatus",2 )
                .eq("status",1 )
                .orderByDesc("insertTime"));
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd");
        SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
        if (tCoursePackagePayments.size() > 0 ){
            for (TCoursePackagePayment tCoursePackagePayment : tCoursePackagePayments) {
                List<CoursePackageStudent> coursePackageStudent1 = cpsMapper.selectList(new QueryWrapper<CoursePackageStudent>()
                        .eq("coursePackageId",tCoursePackagePayment.getCoursePackageId() )
                        .eq("studentId",stuId)
                        .eq("appUserId",appUserId)
                        .eq("reservationStatus",1));
                if (ToolUtil.isNotEmpty(coursePackageStudent1) && coursePackageStudent1.size() > 0){
                    for (CoursePackageStudent coursePackageStudent : coursePackageStudent1) {
                        RecordAppoint recordVo = new RecordAppoint();
                        recordVo.setCoursePackageId(tCoursePackagePayment.getCoursePackageId());
                        TCoursePackage coursePackage = tcpmapper.selectById(tCoursePackagePayment.getCoursePackageId());
                        recordVo.setCoursePackageName(coursePackage.getName());
                        recordVo.setCourseHours(tCoursePackagePayment.getClassHours());
                        Date date = DateUtil.getDate();
                        String classStartTime = coursePackage.getClassStartTime();
                        String classEndTime = coursePackage.getClassEndTime();
                        recordVo.setTimeFrame(simpleDateFormat.format(date)+" "+classStartTime+"-"+classEndTime);
                        Store store = stoClient.queryStoreById(coursePackage.getStoreId());
                        recordVo.setStoreNameAddr(store.getName()+store.getAddress());
                        recordVo.setCourseStuRecordId(coursePackageStudent.getId());
                        String classWeeks = coursePackage.getClassWeeks();
                        String[] split = classWeeks.split(";");
                        List<String> integerList = Arrays.asList(split);
                        String weekOfDate = DateTimeHelper.getWeekOfDate(new Date());
                        if (integerList.contains(weekOfDate)){
                            String dat = simpleDateFormat.format(date) +" "+ classStartTime;
                            Date start = null;
                            try {
                                start = format.parse(dat);
                            } catch (ParseException e) {
                                throw new RuntimeException(e);
                            }
                            if (start.after(new Date())){
                                recordVo.setStatus(1);
                            }else if(coursePackageStudent.getSignInOrNot()==2){
                                recordVo.setStatus(5);
                            }else {
                                CancelledClasses cancelledClasses = cacMapper.selectOne(new QueryWrapper<CancelledClasses>()
                                        .eq("coursePackageId",tCoursePackagePayment.getCoursePackageId() ));
                                if (ToolUtil.isNotEmpty(cancelledClasses)){
                                    recordVo.setStatus(3);
                                    // 消课 到课状态0 旷课
                                    if(coursePackageStudent.getSignInOrNot()==0){
                                        recordVo.setStatus(6);
                                    }
                                }else {
                                    recordVo.setStatus(2);
                                }
                            }
                        }else {
                            recordVo.setStatus(1);
                        }
                        recordVoList.add(recordVo);
                    }
                }else {
//                    recordVo.setStatus(4);
                }
            }
        }
        return recordVoList;
    }
    @Override
    public ResultUtil insertVipPaymentCallback(String code, String orderNumber) {
        TCoursePackagePayment coursePackagePayment = this.baseMapper.getCoursePackagePaymentByCode(code);
        if(coursePackagePayment.getPayStatus() != 1){
            return ResultUtil.success();
        }
        coursePackagePayment.setPayStatus(2);
        coursePackagePayment.setOrderNumber(orderNumber);
        this.baseMapper.updateById(coursePackagePayment);
        return ResultUtil.success();
    }
    @Override
    public List<BillingRequest> queryAmountDatas(Integer appUserId, String monthStart, String monthEnd) {
        return this.baseMapper.billingDataRequestVo(appUserId,monthStart,monthEnd);
    }
    /**
     * 获取课包报名信息
     * @param page
     * @param queryRegistrationRecord
     * @return
     */
    @Override
    public List<Map<String, Object>> queryRegistrationRecord(Page<Map<String, Object>> page, QueryRegistrationRecord queryRegistrationRecord) {
        Integer coursePackageId = queryRegistrationRecord.getCoursePackageId();
        String userName = queryRegistrationRecord.getUserName();
        List<Integer> userIds = null;
        List<Integer> studentIds = null;
        if(ToolUtil.isNotEmpty(userName)){
            List<AppUser> appUsers = appuClient.queryAppUserListByName(userName);
            if(appUsers.size() > 0){
                userIds = appUsers.stream().map(AppUser::getId).collect(Collectors.toList());
            }
        }
        String studentName = queryRegistrationRecord.getStudentName();
        if(ToolUtil.isNotEmpty(studentName)){
            List<Student> students = studentClient.queryStudentListByName(studentName);
            if(students.size() > 0){
                studentIds = students.stream().map(Student::getId).collect(Collectors.toList());
            }
        }
        List<Map<String, Object>> list = this.baseMapper.queryRegistrationRecord(page, coursePackageId, userIds, studentIds);
        for (Map<String, Object> map : list) {
            Long id = Long.valueOf(map.get("id").toString());
            Integer appUserId = Integer.valueOf(map.get("appUserId").toString());
            Integer studentId = Integer.valueOf(map.get("studentId").toString());
            AppUser appUser = appuClient.queryAppUser(appUserId);
            map.put("userName", null != appUser ? appUser.getName() : "");
            map.put("phone", null != appUser ? appUser.getPhone() : "");
            Student student = studentClient.queryStudentById(studentId);
            map.put("studentName", null != student ? student.getName() : "");
            Integer integer = cpsMapper.selectCount(new QueryWrapper<CoursePackageStudent>().eq("appUserId", appUserId)
                    .eq("studentId", studentId).eq("coursePackagePaymentId", id).eq("signInOrNot", 1));
            map.put("already", integer);
        }
        return list;
    }
    /**
     * 获取未预约排课学员列表
     * @param page
     * @param queryWalkInStudentList
     * @return
     */
    @Override
    public List<Map<String, Object>> queryWalkInStudentList(Page<Map<String, Object>> page, QueryWalkInStudentList queryWalkInStudentList) {
        Long coursePackageSchedulingId = queryWalkInStudentList.getCoursePackageSchedulingId();
        CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingService.getById(coursePackageSchedulingId);
        String userName = queryWalkInStudentList.getUserName();
        List<Integer> userIds = null;
        List<Integer> studentIds = null;
        if(ToolUtil.isNotEmpty(userName)){
            List<AppUser> appUsers = appuClient.queryAppUserListByName(userName);
            if(appUsers.size() > 0){
                userIds = appUsers.stream().map(AppUser::getId).collect(Collectors.toList());
            }
        }
        String studentName = queryWalkInStudentList.getStudentName();
        if(ToolUtil.isNotEmpty(studentName)){
            List<Student> students = studentClient.queryStudentListByName(studentName);
            if(students.size() > 0){
                studentIds = students.stream().map(Student::getId).collect(Collectors.toList());
            }
        }
        List<Long> coursePackagePaymentId = null;
        List<CoursePackageStudent> coursePackageStudents = cpsMapper.selectList(new QueryWrapper<CoursePackageStudent>().eq("coursePackageSchedulingId", coursePackageSchedulingId).eq("reservationStatus", 1));
        if(coursePackageStudents.size() > 0){
            coursePackagePaymentId = coursePackageStudents.stream().map(CoursePackageStudent::getCoursePackagePaymentId).collect(Collectors.toList());
        }
        List<Map<String, Object>> list = this.baseMapper.queryWalkInStudentList(page, coursePackageScheduling.getCoursePackageId(), coursePackagePaymentId, userIds, studentIds);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        Integer now = Integer.valueOf(sdf.format(new Date()));
        for (Map<String, Object> map : list) {
            Integer appUserId = Integer.valueOf(map.get("appUserId").toString());
            Integer student_Id = Integer.valueOf(map.get("studentId").toString());
            AppUser appUser = appuClient.queryAppUser(appUserId);
            Student student = studentClient.queryStudentById(student_Id);
            map.put("userName", appUser.getName());
            map.put("phone", student.getPhone());
            map.put("studentName", student.getName());
            map.put("age", null != student.getBirthday() ? now - Integer.valueOf(sdf.format(student.getBirthday())) : "-");
            map.put("sex", student.getSex());
        }
        return list;
    }
    @Override
    public List<PayCourseRes> getMyCourseList(Integer storeId, Integer appUserId) {
        // 找到购买的课包
        List<TCoursePackagePayment> tCoursePackagePayments = this.baseMapper.selectList(new LambdaQueryWrapper<TCoursePackagePayment>().eq(TCoursePackagePayment::getAppUserId, appUserId));
        ArrayList<PayCourseRes> payCourseRes = new ArrayList<>();
        for (TCoursePackagePayment tCoursePackagePayment : tCoursePackagePayments) {
            TCoursePackage tCoursePackage = tcpmapper.selectById(tCoursePackagePayment.getCoursePackageId());
            if(tCoursePackage.getStoreId().equals(storeId)){
                PayCourseRes payCourseRes1 = new PayCourseRes();
                payCourseRes1.setId(tCoursePackagePayment.getId());
                payCourseRes1.setName(tCoursePackage.getName());
                payCourseRes1.setCourseNum(tCoursePackagePayment.getLaveClassHours());
                payCourseRes.add(payCourseRes1);
            }
        }
        return payCourseRes;
    }
    @Override
    public PayCourseInfoReq payCourseInfo(Integer courseId){
        PayCourseInfoReq payCourseInfoReq = new PayCourseInfoReq();
        TCoursePackage tCoursePackage = tcpmapper.selectById(courseId);
        payCourseInfoReq.setId(courseId);
        payCourseInfoReq.setName(tCoursePackage.getName());
        payCourseInfoReq.setNum(tCoursePackage.getNeedNum());
        payCourseInfoReq.setWeek(tCoursePackage.getClassWeeks());
        String classStartTime = tCoursePackage.getClassStartTime();
        String classEndTime = tCoursePackage.getClassEndTime();
        String[] split = classStartTime.split(",");
        String[] split1 = classEndTime.split(",");
        ArrayList<String> strings = new ArrayList<>();
        for (int i = 0; i < classStartTime.split(",").length; i++) {
            String s = split[i] + "-" + split1[i];
            strings.add(s);
        }
        payCourseInfoReq.setTime(strings);
        List<Integer> week = week(tCoursePackage.getClassWeeks());
        // 今天周几
        int i = cn.hutool.core.date.DateUtil.dayOfWeek(new Date())-1;
        SimpleDateFormat format = new SimpleDateFormat("MM.dd");
        ArrayList<String> strings1 = new ArrayList<>();
        for (Integer integer : week) {
            if(integer<i){
                // 找下一周的时间
                Calendar instance = Calendar.getInstance();
                instance.add(Calendar.DATE,7-(i-integer));
                Date time = instance.getTime();
                strings1.add(format.format(time));
            }else if(integer>i) {
                Calendar instance = Calendar.getInstance();
                instance.add(Calendar.DATE,integer-i);
                Date time = instance.getTime();
                strings1.add(format.format(time));
            }else {
                Calendar instance = Calendar.getInstance();
                instance.add(Calendar.DATE,7);
                Date time = instance.getTime();
                strings1.add(format.format(time));
            }
        }
        payCourseInfoReq.setDay(strings1);
        return payCourseInfoReq;
    }
    private static List<Integer> week(String week){
        String[] split = week.split(";");
        ArrayList<Integer> integers = new ArrayList<>();
        for (String s : split) {
            switch (s){
                case "周一":
                    integers.add(1);
                    break;
                case "周二":
                    integers.add(2);
                    break;
                case "周三":
                    integers.add(3);
                    break;
                case "周四":
                    integers.add(4);
                    break;
                case "周五":
                    integers.add(5);
                    break;
                case "周六":
                    integers.add(6);
                    break;
                case "周日":
                    integers.add(7);
                    break;
            }
        }
        return integers;
    }
    public static void main(String[] args) {
        List<Integer> week = week("周一,周二");
        // 今天周几
        int i = cn.hutool.core.date.DateUtil.dayOfWeek(new Date())-1;
        SimpleDateFormat format = new SimpleDateFormat("MM.dd");
        ArrayList<String> strings = new ArrayList<>();
        for (Integer integer : week) {
            if(integer<i){
                // 找下一周的时间
                Calendar instance = Calendar.getInstance();
                instance.add(Calendar.DATE,7-(i-integer));
                Date time = instance.getTime();
                strings.add(format.format(time));
            }else if(integer>i) {
                Calendar instance = Calendar.getInstance();
                instance.add(Calendar.DATE,integer-i);
                Date time = instance.getTime();
                strings.add(format.format(time));
            }else {
                Calendar instance = Calendar.getInstance();
                instance.add(Calendar.DATE,7);
                Date time = instance.getTime();
                strings.add(format.format(time));
            }
        }
        System.out.println(strings);
    }
    @Override
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    public ResultUtil payCourse(PayCourseReq req,Integer userId){
        // 扣除 原来的课时数
        // 添加购买课时 paytyoe为7
        // 排课可期  判断课程时间段  添加排课表  添加上课记录表
        // 找到原来的课包 扣课时
        TCoursePackagePayment tCoursePackagePayment = this.baseMapper.selectById(req.getOldCourseId());
        if(req.getNum()>tCoursePackagePayment.getLaveClassHours()){
            return ResultUtil.error("当前课包课时数不足");
        }
        tCoursePackagePayment.setLaveClassHours(tCoursePackagePayment.getLaveClassHours()-req.getNum());
        this.baseMapper.updateById(tCoursePackagePayment);
        TCoursePackage tCoursePackage = tcpmapper.selectById(req.getCourseId());
        // 添加课包
        TCoursePackagePayment tCoursePackagePayment1 = new TCoursePackagePayment();
        tCoursePackagePayment1.setAppUserId(userId);
        Student student = studentClient.queryDefaultStudent(userId);
        // student ID
        Integer sId=null;
        if(student!=null){
            tCoursePackagePayment1.setStudentId(student.getId());
            sId=student.getId();
        }
        tCoursePackagePayment1.setCoursePackageId(tCoursePackage.getId());
        tCoursePackagePayment1.setPayType(7);
        tCoursePackagePayment1.setClassHours(req.getNum());
        tCoursePackagePayment1.setOriginalPrice(0.0);
        tCoursePackagePayment1.setTotalClassHours(req.getNum());
        tCoursePackagePayment1.setLaveClassHours(req.getNum());
        tCoursePackagePayment1.setAbsencesNumber(0);
        tCoursePackagePayment1.setPayUserType(1);
        tCoursePackagePayment1.setPayStatus(2);
        tCoursePackagePayment1.setPayUserId(userId);
        tCoursePackagePayment1.setStatus(1);
        tCoursePackagePayment1.setState(1);
        tCoursePackagePayment1.setInsertTime(new Date());
        this.baseMapper.insert(tCoursePackagePayment1);
        // 找出课包时间段
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        String classStartTime = tCoursePackage.getClassStartTime();
        String classEndTime = tCoursePackage.getClassEndTime();
        String[] split = classStartTime.split(",");
        String[] split1 = classEndTime.split(",");
        List<String> time = req.getTime();
        for (String s : time) {
            for (int i = 0; i < split.length; i++) {
                CoursePackageScheduling coursePackageScheduling = new CoursePackageScheduling();
                coursePackageScheduling.setCoursePackageId(tCoursePackage.getId());
                try {
                    Date parse = format.parse(s + " " + split[i]);
                    Date parse1 = format.parse(s + " " + split1[i]);
                    coursePackageScheduling.setClassDate(parse);
                    coursePackageScheduling.setEndDate(parse1);
                    coursePackageScheduling.setStatus(1);
                    coursePackageSchedulingService.save(coursePackageScheduling);
                    CoursePackageStudent student1 = new CoursePackageStudent();
                    student1.setAppUserId(userId);
                    student1.setStudentId(sId);
                    student1.setCoursePackageId(tCoursePackage.getId());
                    student1.setCoursePackagePaymentId(tCoursePackagePayment1.getId());
                    student1.setCoursePackageSchedulingId(coursePackageScheduling.getId());
                    student1.setSignInOrNot(0);
                    student1.setReservationStatus(1);
                    student1.setInsertTime(new Date());
                    cpsMapper.insert(student1);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        }
        // 2.0
        TCourseInfoRecord tCourseInfoRecord = new TCourseInfoRecord();
        tCourseInfoRecord.setUserId(userId);
        tCourseInfoRecord.setCourseId(req.getOldCourseId());
        tCourseInfoRecord.setName("体验购课");
        tCourseInfoRecord.setNum(req.getNum());
        tCourseInfoRecord.setTime(new Date());
        tCourseInfoRecord.setType(2);
        appuClient.addCourseInfoRecord(tCourseInfoRecord);
        if(tCoursePackagePayment.getLaveClassHours()<=3){
            Integer appUserId = userId;
            //调用推送
            HttpHeaders headers = new HttpHeaders();
            // 以表单的方式提交
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            String s1 = appUserId + "_" + "Three";
            //定时修改排课状态
            String s = internalRestTemplate.getForObject("http://mb-cloud-gateway/netty/sendMsgToClient?id="+s1, String.class);
            JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
            if(jsonObject1.getIntValue("code") != 200){
                System.err.println(jsonObject1.getString("msg"));
            }
        }
        return ResultUtil.success();
    }
    @Override
    public void updateUseTime(Long id, Date date) {
        this.baseMapper.updateUseTime(id,date);
    }
    @Override
    public List<Integer> getStudentIds(Integer payId) {
       return  this.baseMapper.getStudentIds(payId);
    }
}