package com.dsh.course.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
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.AppUserClient;
import com.dsh.course.feignclient.account.CoachClient;
import com.dsh.course.feignclient.account.model.AppUser;
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.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 CoursePackagePaymentConfigMapper cpConfigMapper;
@Resource
private CouponClient client;
@Resource
private PayMoneyUtil payMoneyUtil;
@Resource
private AppUserClient appuClient;
/**
* 获取课包购买人数
* @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 "ERROR";
}
@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 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()
.eq("coursePackageId", request.getLessonId())
.eq("classHours", request.getCourseHoursNum()));
TCoursePackageDiscount coursePackageDiscount = tcpdMapper.selectOne(new QueryWrapper()
.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 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 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 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 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