package com.dsh.course.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.course.entity.*; import com.dsh.course.feignclient.account.CoachClient; import com.dsh.course.feignclient.account.model.Coach; 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.dto.DiscountJsonDto; import com.dsh.course.model.vo.RegisterCourseVo; import com.dsh.course.model.vo.request.ClasspaymentRequest; import com.dsh.course.model.vo.request.CourseOfAfterRequest; import com.dsh.course.model.vo.request.CourseWithDetailsRequest; import com.dsh.course.model.vo.request.UpdateCourseVideoStatusRequest; import com.dsh.course.model.vo.response.AppUserVideoResponse; import com.dsh.course.model.vo.response.CourseDetailsResponse; import com.dsh.course.model.vo.response.CourseOfVideoResponse; 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.stereotype.Service; 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; /** *

* 用户课程包购买记录 服务实现类 *

* * @author administrator * @since 2023-06-14 */ @Service public class TCoursePackagePaymentServiceImpl extends ServiceImpl 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 CouponClient client; @Autowired private PayMoneyUtil payMoneyUtil; /** * 获取课包购买人数 * @param coursePackageId * @return */ @Override public Integer queryCountNumber(Integer coursePackageId) { return this.baseMapper.queryCountNumber(coursePackageId); } @Override public List queryAfterVideo(CourseOfAfterRequest search,List courseIds) { List responses = new ArrayList<>(); List videoList = pcvMapper.selectList(new QueryWrapper() .eq("coursePackageId", courseIds)); if (videoList.size() > 0){ List videoIds = videoList.stream().map(PostCourseVideo::getCourseId).collect(Collectors.toList()); List userVideoDetails = uvdmapper.selectList(new QueryWrapper() .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()); if (null != search.getSearch()){ // 根据正则模糊匹配 String pattern = ".*" + search.getSearch() + ".*"; Pattern regex = Pattern.compile(pattern); Matcher matcher = regex.matcher(videosWithIds.getName()); if (matcher.matches()) { response.setVideoName(videosWithIds.getName()); } }else { 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)); } } 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() .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()); } return response; } @Override public String updateVideoStatus(UpdateCourseVideoStatusRequest detailsRequest, Integer appUserId) { UserVideoDetails userVideoDetails = uvdmapper.selectOne(new QueryWrapper() .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 null; } @Override public List queryRegisteredCourseList(CourseOfAfterRequest courseTypeId, Integer appUserId) { List courseVos = new ArrayList<>(); List tCoursePackagePayments = this.list(new QueryWrapper() .eq("appUserId",appUserId )); if (tCoursePackagePayments.size() > 0){ for (TCoursePackagePayment tCoursePackagePayment : tCoursePackagePayments) { TCoursePackage coursePackage = tcpmapper.selectById(tCoursePackagePayment.getCoursePackageId()); Store store = stoClient.queryStoreById(coursePackage.getStoreId()); RegisterCourseVo registerCourseVo = new RegisterCourseVo(); registerCourseVo.setCoursePayId(tCoursePackagePayment.getId()); registerCourseVo.setCoursePackageId(tCoursePackagePayment.getCoursePackageId()); registerCourseVo.setPackageImg(coursePackage.getCoverDrawing()); String storeAndCourse = coursePackage.getName()+"("+ store.getName() +")"; registerCourseVo.setCourseNameStore(storeAndCourse); registerCourseVo.setCourseTime(coursePackage.getClassStartTime()+"-"+coursePackage.getClassEndTime()); Coach coach = coachClient.queryCoachById(coursePackage.getCoachId()); registerCourseVo.setCourseTeacher(coach.getName()); List coursePackageStudents = cpsMapper.selectList(new QueryWrapper() .eq("coursePackageId",coursePackage.getId()) .eq("studentId",appUserId )); registerCourseVo.setCourseNums(coursePackageStudents.size() * 2); registerCourseVo.setPayStatus(tCoursePackagePayment.getPayStatus()); courseVos.add(registerCourseVo); } } return courseVos; } @Override public CourseDetailsResponse queryRegisteredCourseDetails(Integer 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 integers = StrUtils.dealStrToList(coursePackage.getClassWeeks()); if (integers.size() > 0){ StringBuilder courWeeks = new StringBuilder("每"); for (Integer integer : integers) { switch (integer){ case 1: courWeeks.append("周一、"); break; case 2: courWeeks.append("周二、"); break; case 3: courWeeks.append("周三、"); break; case 4: courWeeks.append("周四、"); break; case 5: courWeeks.append("周五、"); break; case 6: courWeeks.append("周六、"); break; case 7: courWeeks.append("周末、"); break; default: break; } } 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 = cashPayment.doubleValue(); Integer playPaiCoin = tCoursePackagePayment.getPlayPaiCoin(); TCoursePackageDiscount coursePackageDiscount = tcpdMapper.selectOne(new QueryWrapper() .eq("coursePackageId",coursePackage.getId() ) .eq("type",1) .eq("auditStatus",2)); ObjectMapper objectMapper = new ObjectMapper(); String content = coursePackageDiscount.getContent(); double discountMember = 0.0; 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 userIdFormRedis, ClasspaymentRequest request) { TCoursePackagePayment tCoursePackagePayment = this.baseMapper.selectById(request.getCoursePayId()); String code = ""; if (tCoursePackagePayment.getPayStatus() == 1){ code = tCoursePackagePayment.getCode(); }else { TCoursePackagePayment newPayment = new TCoursePackagePayment(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); newPayment.setCode(sdf.format(new Date()) + UUIDUtil.getNumberRandom(5)); newPayment.setAppUserId(userIdFormRedis); newPayment.setStudentId(request.getStuId()); newPayment.setCoursePackageId(request.getLessonId()); newPayment.setClassHours(tCoursePackagePayment.getClassHours()); newPayment.setOriginalPrice(tCoursePackagePayment.getOriginalPrice()); newPayment.setTotalClassHours(tCoursePackagePayment.getTotalClassHours()); newPayment.setLaveClassHours(tCoursePackagePayment.getTotalClassHours()); newPayment.setAbsencesNumber(0); newPayment.setPayUserType(1); newPayment.setPayStatus(1); newPayment.setStatus(1); newPayment.setState(1); newPayment.setInsertTime(new Date()); this.baseMapper.insert(newPayment); code = newPayment.getCode(); } switch (request.getPayType()){ case 1: WeChatPayment(code,request); break; case 2: AlipayPayment(code,request); break; case 3: PlaypaiGoldPayment(code,request); break; default: break; } return ResultUtil.success(); } public void WeChatPayment(String code, ClasspaymentRequest request){ } public ResultUtil AlipayPayment(String code, ClasspaymentRequest request){ BigDecimal amount = BigDecimal.ZERO; if (request.getUseConpon() == 1){ Coupon coupon = client.queryCouponById(request.getConponId()); // TODO: 2023/7/11 课包购买的微信支付 } ResultUtil alipay = payMoneyUtil.alipay("课包购买", "", "", code, amount.toString(), "/base/coursePackage/alipayNewPaymentCallback"); // 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 = couPayClient.getCoursePackagePaymentByCode(code); // if(coursePackagePayment.getPayStatus() == 2){ // break; // } // ResultUtil> resultUtil = payMoneyUtil.queryALIOrder(code); // if(resultUtil.getCode() == 200 && coursePackagePayment.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){ // coursePackagePayment.setState(3); // couPayClient.delPaymentCoursePackage(coursePackagePayment.getId()); // break; // } // if("TRADE_SUCCESS".equals(s)){ // coursePackagePayment.setPayStatus(2); // coursePackagePayment.setOrderNumber(tradeNo); // couPayClient.updatePaymentCoursePackage(coursePackagePayment); // break; // } // if("WAIT_BUYER_PAY".equals(s)){ // num++; // } // } // } // }catch (Exception e){ // e.printStackTrace(); // } // } // }).start(); // } return alipay; } public void PlaypaiGoldPayment(String code, ClasspaymentRequest request){ } @Override public List obtainStuClassDetails(Integer stuId, Integer appUserId) { List recordVoList = new ArrayList<>(); List tCoursePackagePayments = this.baseMapper.selectList(new QueryWrapper() .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) { 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()); CoursePackageStudent coursePackageStudent = cpsMapper.selectOne(new QueryWrapper() .eq("coursePackageId",tCoursePackagePayment.getCoursePackageId() ) .eq("studentId",stuId) .eq("appUserId",appUserId) .eq("reservationStatus",1)); if (ToolUtil.isNotEmpty(coursePackageStudent) && coursePackageStudent.getReservationStatus() == 1){ recordVo.setCourseStuRecordId(coursePackageStudent.getId()); String classWeeks = coursePackage.getClassWeeks(); String[] split = classWeeks.split(";"); List integerList = Arrays.stream(split) .map(Integer::parseInt) .collect(Collectors.toList()); int dayOfWeek = DateTimeHelper.getDayOfWeek(new Date()); if (integerList.contains(dayOfWeek)){ 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 { CancelledClasses cancelledClasses = cacMapper.selectOne(new QueryWrapper() .eq("coursePackageId",tCoursePackagePayment.getCoursePackageId() )); if (ToolUtil.isNotEmpty(cancelledClasses)){ recordVo.setStatus(3); }else { recordVo.setStatus(2); } } }else { recordVo.setStatus(1); } }else { recordVo.setStatus(4); } recordVoList.add(recordVo); } } return recordVoList; } }