package com.ruoyi.web.controller.api; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.ImmutableMap; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.OrderNos; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.model.*; import com.ruoyi.system.query.CourseOrderListQuery; import com.ruoyi.system.query.GetCourseListQuery; import com.ruoyi.system.service.*; import com.ruoyi.system.task.base.QuartzManager; import com.ruoyi.system.task.base.TimeJobType; import com.ruoyi.system.task.jobs.OrderJob; import com.ruoyi.system.wxPay.model.WeixinPayProperties; import com.ruoyi.system.wxPay.utils.WxRefundUtil; import com.ruoyi.system.wxPay.utils.WxV3Pay; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("/course") @Api(tags = "课程模块") public class CourseController { private final TCourseService courseService; private final TCourseOrderService courseOrderService; private final TokenService tokenService; private final WxV3Pay wxV3Pay; private final WeixinPayProperties weixinPayProperties; private final TAppUserService appUserService; private final TInsuranceOrderService insuranceOrderService; private final TOtherConfigService otherConfigService; public CourseController(TCourseService courseService, TCourseOrderService courseOrderService, TokenService tokenService, WxV3Pay wxV3Pay, WeixinPayProperties weixinPayProperties, TAppUserService appUserService, TInsuranceOrderService insuranceOrderService, TOtherConfigService otherConfigService) { this.courseService = courseService; this.courseOrderService = courseOrderService; this.tokenService = tokenService; this.wxV3Pay = wxV3Pay; this.weixinPayProperties = weixinPayProperties; this.appUserService = appUserService; this.insuranceOrderService = insuranceOrderService; this.otherConfigService = otherConfigService; } @GetMapping("/getOtherConfig") @ApiOperation(value = "课程模块--是否开启课程缴费 1=是 0=否",response = TOtherConfig.class) public R getOtherConfig() { TOtherConfig tOtherConfig = otherConfigService.getById(1); return R.ok(tOtherConfig); } @PostMapping("/getCourseList") @ApiOperation(value = "课程模块--列表",response = TCourse.class) public R> getCourseList(@RequestBody GetCourseListQuery query) { Page page = new Page<>(query.getPageNum(), query.getPageSize()); Page coursePage = courseService.page(page, Wrappers.lambdaQuery().eq(TCourse::getCourseType,query.getCourseType()).like(Objects.nonNull(query.getCourseTitle()), TCourse::getCourseTitle, query.getCourseTitle()).orderByDesc(TCourse::getCreateTime)); return R.ok(coursePage); } @PostMapping("/getCourseDetail/{id}") @ApiOperation(value = "课程模块--详情",response = TCourse.class) public R getCourseDetail(@PathVariable String id) { TCourse course = courseService.getById(id); long count = courseOrderService.count(Wrappers.lambdaQuery(TCourseOrder.class).eq(TCourseOrder::getCourseId, id).in(TCourseOrder::getPayStatus, Arrays.asList(1, 2, 5))); course.setSignUpNum((int) count); return R.ok(course); } @PostMapping("/getCourseOrderList") @ApiOperation(value = "课程模块--订单列表",response = TCourseOrder.class) public R> getCourseOrderList(@RequestBody CourseOrderListQuery query) { String userId = tokenService.getLoginUserApplet().getUserId(); Page page = new Page<>(query.getPageNum(), query.getPageSize()); Page courseOrderPage = courseOrderService.page(page, Wrappers.lambdaQuery() .eq(TCourseOrder::getAppUserId, userId) .ne(TCourseOrder::getPayStatus, 4) .eq(Objects.nonNull(query.getPayStatus()),TCourseOrder::getPayStatus, query.getPayStatus()) .orderByDesc(TCourseOrder::getCreateTime)); List records = courseOrderPage.getRecords(); if(!records.isEmpty()){ List courseIds = records.stream().map(TCourseOrder::getCourseId).collect(Collectors.toList()); List tCourses = courseService.listByIds(courseIds); records.forEach(courseOrder -> { tCourses.forEach(course -> { if(course.getId().equals(courseOrder.getCourseId())){ courseOrder.setCourse(course); } }); }); } courseOrderPage.setRecords(records); return R.ok(courseOrderPage); } @GetMapping("/getCourseOrderDetail/{id}") @ApiOperation(value = "课程模块--订单详情",response = TCourseOrder.class) public R getCourseOrderList(@PathVariable String id) { String userId = tokenService.getLoginUserApplet().getUserId(); TCourseOrder courseOrder = courseOrderService.getById(id); if(!courseOrder.getAppUserId().equals(userId)){ return R.fail("无权限"); } String courseId = courseOrder.getCourseId(); TCourse course = courseService.getById(courseId); courseOrder.setCourse(course); return R.ok(courseOrder); } @PostMapping("/saveOrder") @ApiOperation(value = "课程模块--报名") public R> saveOrder(@RequestBody TCourseOrder courseOrder) { String userId = tokenService.getLoginUserApplet().getUserId(); TAppUser appUser = appUserService.getById(userId); TCourse course = courseService.getById(courseOrder.getCourseId()); LocalDate endTime = course.getEndTime(); if(endTime.isBefore(LocalDate.now())){ return R.fail("课程已截至报名"); } long count = courseOrderService.count(Wrappers.lambdaQuery(TCourseOrder.class).eq(TCourseOrder::getCourseId, course.getId()).in(TCourseOrder::getPayStatus, Arrays.asList(1, 2, 5))); if(count>=course.getPeopleLimit()){ return R.fail("报名人数已满"); } courseOrder.setAppUserId(userId); courseOrder.setPayMoney(course.getCourseCost()); courseOrder.setPayStatus(1); courseOrder.setOrderNumber(OrderNos.getDid()); boolean save = courseOrderService.save(courseOrder); // if (save) { // Map maps = // new ImmutableMap.Builder(). // put("id", courseOrder.getId()) // .build(); // QuartzManager.addJob( // OrderJob.class, // (OrderJob.name+courseOrder.getId()).toUpperCase(), // TimeJobType.CANCEL_ORDER, // DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(15)), // maps // ); // Map result = wxV3Pay.jsApi(courseOrder.getOrderNumber(), course.getCourseCost().multiply(BigDecimal.valueOf(100)).longValue(), appUser.getOpenId(),"购买课程",""); // return R.ok(result); //// return R.ok(); // } return R.ok(); } @PostMapping("/saveOrderAndPay") @ApiOperation(value = "课程模块--报名并支付") public R> saveOrderAndPay(@RequestBody TCourseOrder courseOrder) { String userId = tokenService.getLoginUserApplet().getUserId(); TAppUser appUser = appUserService.getById(userId); TCourse course = courseService.getById(courseOrder.getCourseId()); LocalDate endTime = course.getEndTime(); long count1 = insuranceOrderService.count(new LambdaQueryWrapper().eq(TInsuranceOrder::getType,course.getCourseType()).eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2)); if(count1<=0){ return R.fail("请先缴纳保险费"); } if(endTime.isBefore(LocalDate.now())){ return R.fail("课程已截至报名"); } long count = courseOrderService.count(Wrappers.lambdaQuery(TCourseOrder.class).eq(TCourseOrder::getCourseId, course.getId()).in(TCourseOrder::getPayStatus, Arrays.asList(1, 2, 5))); if(count>=course.getPeopleLimit()){ return R.fail("报名人数已满"); } courseOrder.setAppUserId(userId); courseOrder.setPayMoney(course.getCourseCost()); courseOrder.setPayStatus(1); courseOrder.setOrderNumber(OrderNos.getDid()); boolean save = courseOrderService.save(courseOrder); if (save) { Map maps = new ImmutableMap.Builder(). put("id", courseOrder.getId()) .build(); QuartzManager.addJob( OrderJob.class, (OrderJob.name+courseOrder.getId()).toUpperCase(), TimeJobType.CANCEL_ORDER, DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(15)), maps ); Map result = wxV3Pay.jsApi(courseOrder.getOrderNumber(), course.getCourseCost().multiply(BigDecimal.valueOf(100)).longValue(), appUser.getOpenId(),"购买课程",""); return R.ok(result); // return R.ok(); } return R.ok(); } @PostMapping("/payOrder") @ApiOperation(value = "课程模块--支付订单") public R> payOrder(@RequestBody TCourseOrder courseOrder) { String userId = tokenService.getLoginUserApplet().getUserId(); TCourse course = courseService.getById(courseOrder.getCourseId()); long count1 = insuranceOrderService.count(new LambdaQueryWrapper().eq(TInsuranceOrder::getType,course.getCourseType()).eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2)); if(count1<=0){ return R.fail("请先缴纳保险费"); } TAppUser appUser = appUserService.getById(userId); TCourseOrder courseOrder1 = courseOrderService.getById(courseOrder.getId()); // if(!userId.equals(courseOrder1.getAppUserId())){ // return R.fail("无权限操作"); // } if(courseOrder1.getPayStatus()!=1){ return R.fail("订单目前无法支付"); } courseOrder1.setOrderNumber(OrderNos.getDid()); courseOrder1.setRealName(courseOrder.getRealName()); courseOrder1.setUserPhone(courseOrder.getUserPhone()); courseOrder1.setIdCard(courseOrder.getIdCard()); courseOrderService.updateById(courseOrder1); Map result = wxV3Pay.jsApi(courseOrder1.getOrderNumber(), courseOrder1.getPayMoney().multiply(BigDecimal.valueOf(100)).longValue(), appUser.getOpenId(),"购买课程",""); return R.ok(result); } @PostMapping("/refundOrder") @ApiOperation(value = "课程模块--退款") public R refundOrder(@RequestBody TCourseOrder courseOrder) { String userId = tokenService.getLoginUserApplet().getUserId(); TCourseOrder courseOrder1 = courseOrderService.getById(courseOrder.getId()); courseOrder1.setRefundReason(courseOrder.getRefundReason()); courseOrder1.setRefundReasonPictures(courseOrder.getRefundReasonPictures()); courseOrder1.setRequestRefundTime(LocalDateTime.now()); courseOrder1.setRefundMoney(courseOrder1.getPayMoney()); if(!userId.equals(courseOrder1.getAppUserId())){ return R.fail("无权限操作"); } if(courseOrder1.getPayStatus()!=2){ return R.fail("状态不允许退款"); } courseOrder1.setPayStatus(6); LocalDateTime payTime = courseOrder1.getPayTime(); if(payTime==null){ return R.fail("状态不允许退款"); } if(payTime.plusDays(2).isBefore(LocalDateTime.now())){ courseOrder1.setBankCardNumber(courseOrder.getBankCardNumber()); courseOrder1.setCardholderName(courseOrder.getCardholderName()); courseOrder1.setBankName(courseOrder.getBankName()); courseOrder1.setRefundStatus(1); courseOrderService.updateById(courseOrder1); }else { String outRefundNo = OrderNos.getDid(); courseOrder1.setRefundNumber(outRefundNo); courseOrderService.updateById(courseOrder1); // WxPaymentRefundModel refundModel = new WxPaymentRefundModel(); //// refundModel.setSub_mchid(weixinPayProperties.getMchId()); //// refundModel.setSp_appid(weixinPayProperties.getAppId()); //// refundModel.setTransaction_id(courseOrder1.getTransactionId()); // refundModel.setOut_trade_no(courseOrder1.getOrderNumber()); // refundModel.setOut_refund_no(OrderNos.getDid()); // refundModel.setReason(courseOrder1.getRefundReason()); // refundModel.setGoods_detail(new ArrayList<>()); // refundModel.setAmount(new WxPaymentRefundModel.RefundAmount(courseOrder1.getPayMoney().multiply(BigDecimal.valueOf(100)).intValue(), "CNY", courseOrder1.getPayMoney().multiply(BigDecimal.valueOf(100)).intValue())); // Map refund = wxV3Pay.refund(refundModel); // System.out.println(refund); String result = wxRefundUtil.refund(courseOrder1.getPayMoney().multiply(BigDecimal.valueOf(100)).intValue(), courseOrder1.getOrderNumber(),outRefundNo); if(result!=null){ return R.fail(result); } } return R.ok(); } @Autowired private WxRefundUtil wxRefundUtil; }