Commit adb18f33 authored by liuyang's avatar liuyang

完成定时检查订单

parent 59ae5ada
......@@ -48,12 +48,10 @@ public class AlipayNotifyController {
boolean verify_result = AlipaySignature.rsaCheckV1(params, alipayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
if (verify_result){
//验证成功
if(trade_status.equals("TRADE_SUCCESS")){
if(trade_status.equals("TRADE_SUCCESS") || trade_status.equals("TRADE_FINISHED")){
orderService.orderComplete(out_trade_no);
} else if (trade_status.equals("TRADE_FINISHED")){
}else if (trade_status.equals("WAIT_BUYER_PAY")){
orderService.updateStatus(out_trade_no, ProductOrderStatusEnum.WAIT_PAY);
} else if (trade_status.equals("TRADE_CLOSED")){
orderService.updateStatus(out_trade_no, ProductOrderStatusEnum.PAY_CLOSE);
}
}else {
//验证失败
......@@ -61,7 +59,6 @@ public class AlipayNotifyController {
}
} catch (AlipayApiException e) {
log.error(e.getMessage(),e);
orderService.updateStatus(out_trade_no, ProductOrderStatusEnum.PAY_FAILD);
return "fail";
}
return "success";
......
......@@ -2,10 +2,13 @@ package com.qkdata.alipay.service;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.*;
import com.alipay.api.domain.AlipayTradeCloseModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeCloseRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeCloseResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.qkdata.alipay.config.AlipayProperties;
......@@ -58,12 +61,15 @@ public class AlipayService {
model.setOutTradeNo(orderNo);
request.setBizModel(model);
AlipayTradeQueryResponse response = alipayClient.execute(request);
String result = "";
if (response.isSuccess()){
result = response.getTradeStatus();
}else {
log.info("Alipay trade query faild:"+JSONObject.toJSONString(response));
}
return result;
return response.getTradeStatus();
}
public AlipayTradeCloseResponse closeOrder(String orderNo) throws AlipayApiException {
AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
AlipayTradeCloseModel model = new AlipayTradeCloseModel();
model.setOutTradeNo(orderNo);
request.setBizModel(model);
AlipayTradeCloseResponse response = alipayClient.execute(request);
return response;
}
}
......@@ -4,7 +4,16 @@ package com.qkdata.biz.enums;
* 订单状态
*/
public enum ProductOrderStatusEnum {
/**
* 待支付
*/
WAIT_PAY,
/**
* 已支付
*/
PAY_COMPLETE,
PAY_FAILD;
/**
* 支付关闭
*/
PAY_CLOSE;
}
......@@ -3,6 +3,7 @@ package com.qkdata.biz.management.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.qkdata.biz.enums.PayMethodEnum;
import com.qkdata.biz.enums.PaySourceEnum;
import com.qkdata.biz.enums.ProductOrderStatusEnum;
import com.qkdata.biz.enums.ProductTypeEnum;
import com.qkdata.common.base.entity.BasePO;
......@@ -82,6 +83,10 @@ public class ProductOrderPO extends BasePO {
* 订单状态
*/
private ProductOrderStatusEnum status;
/**
* 支付来源
*/
private PaySourceEnum source;
}
......@@ -5,11 +5,14 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.response.AlipayTradeCloseResponse;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayOrderCloseResult;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
......@@ -27,6 +30,7 @@ import com.qkdata.biz.sys.service.SysRoleService;
import com.qkdata.biz.sys.service.SysUserService;
import com.qkdata.biz.sys.vo.SysRoleModel;
import com.qkdata.biz.web.vo.*;
import com.qkdata.common.base.entity.BasePO;
import com.qkdata.common.base.enums.CodeEnum;
import com.qkdata.common.base.exception.BusinessException;
import com.qkdata.common.base.model.PageResult;
......@@ -35,7 +39,9 @@ import com.qkdata.common.util.HttpContextUtils;
import com.qkdata.common.util.IPUtils;
import com.qkdata.common.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -72,6 +78,9 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
private OrgSurplusService orgSurplusService;
@Autowired
private AlipayService alipayService;
@Autowired
@Qualifier("stringRedisTemplate")
private RedisTemplate redisTemplate;
private String generateOrderNo() {
DateTime nowDateTime = DateUtil.date();
......@@ -189,6 +198,7 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
po.setPayMethod(model.getPayMethod());
po.setStatus(ProductOrderStatusEnum.WAIT_PAY);
po.setUserId(UserContext.getUserId());
po.setSource(model.getSource());
return po;
}
......@@ -199,46 +209,56 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
update(po, Wrappers.<ProductOrderPO>lambdaUpdate().eq(ProductOrderPO::getOrderNo,outTradeNo));
}
public ProductOrderStatusEnum queryStatus(String orderNo) {
ProductOrderPO orderPO = getByOrderNo(orderNo);
if (orderPO == null){
throw new BusinessException("订单号不存在");
}
if (orderPO.getStatus() == ProductOrderStatusEnum.PAY_COMPLETE){
return ProductOrderStatusEnum.PAY_COMPLETE;
}else {
try {
if (orderPO.getPayMethod() == PayMethodEnum.WeiXin) {
if(wxService.getConfig().isUseSandboxEnv()){
String key = wxService.getSandboxSignKey();
wxService.getConfig().setMchKey(key);
}
WxPayOrderQueryResult queryResult = wxService.queryOrder(null, orderNo);
if ("SUCCESS".equals(queryResult.getTradeState())){
public ProductOrderStatusEnum queryFromThirdPlatform(String orderNo,PayMethodEnum payMethod){
try {
if (payMethod == PayMethodEnum.WeiXin) {
if(wxService.getConfig().isUseSandboxEnv()){
String key = wxService.getSandboxSignKey();
wxService.getConfig().setMchKey(key);
}
WxPayOrderQueryResult queryResult = wxService.queryOrder(null, orderNo);
if ("SUCCESS".equals(queryResult.getTradeState())){
updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE);
return ProductOrderStatusEnum.PAY_COMPLETE;
}else if ("CLOSED".equals(queryResult.getTradeState())){
updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
return ProductOrderStatusEnum.PAY_CLOSE;
}else {
return ProductOrderStatusEnum.WAIT_PAY;
}
}else if (payMethod == PayMethodEnum.AliPay){
try {
String queryResult = alipayService.queryOrder(orderNo);
if (queryResult.equals("TRADE_SUCCESS") || queryResult.equals("TRADE_FINISHED")){
updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE);
return ProductOrderStatusEnum.PAY_COMPLETE;
}else if (queryResult.equals("TRADE_CLOSED")){
updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
return ProductOrderStatusEnum.PAY_CLOSE;
}else {
return ProductOrderStatusEnum.PAY_FAILD;
}
}else if (orderPO.getPayMethod() == PayMethodEnum.AliPay){
try {
String queryResult = alipayService.queryOrder(orderNo);
if (queryResult.equals("TRADE_SUCCESS") || queryResult.equals("TRADE_FINISHED")){
updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE);
return ProductOrderStatusEnum.PAY_COMPLETE;
}else {
return ProductOrderStatusEnum.PAY_FAILD;
}
} catch (AlipayApiException e) {
throw new BusinessException("查询支付宝订单请求异常");
return ProductOrderStatusEnum.WAIT_PAY;
}
}else {
throw new BusinessException("暂不支持的支付类型");
} catch (AlipayApiException e) {
throw new BusinessException("查询支付宝订单请求异常");
}
} catch (WxPayException e) {
log.error(e.getMessage(),e);
return ProductOrderStatusEnum.PAY_FAILD;
}else {
throw new BusinessException("暂不支持的支付类型");
}
} catch (WxPayException e) {
log.error(e.getMessage(),e);
return ProductOrderStatusEnum.WAIT_PAY;
}
}
public ProductOrderStatusEnum queryStatus(String orderNo) {
ProductOrderPO orderPO = getByOrderNo(orderNo);
if (orderPO == null){
throw new BusinessException("订单号不存在");
}
if (orderPO.getStatus() == ProductOrderStatusEnum.WAIT_PAY){
return queryFromThirdPlatform(orderNo,orderPO.getPayMethod());
}else {
return orderPO.getStatus();
}
}
......@@ -287,6 +307,8 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
public CreateOrderResult payAgain(CreateOrderModel model) {
CreateOrderResult result = new CreateOrderResult();
result.setOrderNo(model.getOrderNo());
ProductOrderPO orderPO = getByOrderNo(model.getOrderNo());
if (orderPO == null){
throw new BusinessException("请求错误,订单不存在");
......@@ -294,10 +316,80 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
if (orderPO.getStatus() == ProductOrderStatusEnum.PAY_COMPLETE){
throw new BusinessException("订单已完成,请不要重覆支付");
}
CreateOrderResult result = new CreateOrderResult();
result.setOrderNo(model.getOrderNo());
Object rtObj = prePay(orderPO,model.getSource(),model.getOpenId(),model.getReturnUrl());
result.setResult(rtObj);
//下单来源不一致
if (orderPO.getPayMethod() == PayMethodEnum.WeiXin && orderPO.getSource() != model.getSource()){
if (orderPO.getSource() == PaySourceEnum.MWEB){
throw new BusinessException("请从浏览器中支付");
}else if (orderPO.getSource() == PaySourceEnum.JSAPI){
throw new BusinessException("请从微信浏览器中支付");
}
}
ProductOrderStatusEnum status = queryFromThirdPlatform(orderPO.getOrderNo(),orderPO.getPayMethod());
if (status == ProductOrderStatusEnum.WAIT_PAY){
Object rtObj = prePay(orderPO,model.getSource(),model.getOpenId(),model.getReturnUrl());
result.setResult(rtObj);
return result;
}else if (status == ProductOrderStatusEnum.PAY_COMPLETE){
throw new BusinessException("订单已支付完成,请不要重覆下单");
}else if (status == ProductOrderStatusEnum.PAY_CLOSE){
throw new BusinessException("订单已关闭,请重新下单");
}
return result;
}
/**
* 定时检查未支付订单的状态(取30分钟前的订单)
*/
public void checkProductOrder() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime endTime = now.minusMinutes(30);
List<ProductOrderPO> orderList = list(Wrappers.<ProductOrderPO>lambdaQuery()
.eq(ProductOrderPO::getStatus,ProductOrderStatusEnum.WAIT_PAY)
.le(BasePO::getCreateTime,endTime));
for (ProductOrderPO order : orderList){
ProductOrderStatusEnum status = queryFromThirdPlatform(order.getOrderNo(),order.getPayMethod());
if (status == ProductOrderStatusEnum.WAIT_PAY){
closeOrder(order.getOrderNo(),order.getPayMethod());
}
}
}
private void closeOrder(String orderNo,PayMethodEnum payMethod) {
if (payMethod == PayMethodEnum.WeiXin){
try {
WxPayOrderCloseResult result = wxService.closeOrder(orderNo);
if (result.getResultCode().equals("SUCCESS")){
if (result.getResultCode().equals("SUCCESS")){
//关单成功
updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
}else if (result.getErrCode().equals("ORDERPAID")){
//订单已支付
updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE);
}else if (result.getErrCode().equals("ORDERCLOSED")){
//订单已关闭
updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
}
}else {
log.error(JSONObject.toJSONString(result));
}
} catch (WxPayException e) {
log.error(e.getMessage(),e);
}
}else if (payMethod == PayMethodEnum.AliPay){
try {
AlipayTradeCloseResponse response = alipayService.closeOrder(orderNo);
if (response.isSuccess()){
//关单成功
updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
}else {
//关单失败
log.error(JSONObject.toJSONString(response));
}
} catch (AlipayApiException e) {
log.error(e.getMessage(),e);
}
}
}
}
\ No newline at end of file
......@@ -25,12 +25,14 @@ public class TimeTaskService {
private RedisTemplate redisTemplate;
@Autowired
private CourseConsumeRecordService recordService;
@Autowired
private ProductOrderService productOrderService;
/**
* 每30分钟执行一次
* 每5分钟执行一次
*/
@Scheduled(cron = "0 */5 * * * ?")
@Scheduled(cron = "0 0/5 * * * ?")
public void saveConsumeRecord(){
log.debug("TimeTaskService saveConsumeRecord excute start=================");
Set<String> keys = redisTemplate.opsForHash().keys(BizConstants.CACHE_KE_CONSUME_RECORD);
......@@ -45,4 +47,14 @@ public class TimeTaskService {
}
log.debug("TimeTaskService saveConsumeRecord excute end=================");
}
/**
* 每隔1分名检查未支付订单状态
*/
@Scheduled(cron = "0 0/1 * * * ?")
public void checkProductOrder(){
log.debug("TimeTaskService checkProductOrder excute start=================");
productOrderService.checkProductOrder();
log.debug("TimeTaskService checkProductOrder excute end=================");
}
}
......@@ -43,9 +43,6 @@ public class WxPayNotifyController {
}catch (WxPayException e){
log.error(e.getMessage(),e);
if (null != outTradeNo){
orderService.updateStatus(outTradeNo,ProductOrderStatusEnum.PAY_FAILD);
}
}
return WxPayNotifyResponse.success("OK");
}
......
......@@ -24,9 +24,14 @@ sms:
api:
v3: http://localhost:9004/sms/api/v3
## 支付宝沙箱环境
#alipay:
# appId: 2021000117670831
# url: https://openapi.alipaydev.com/gateway.do
# appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCJOkoU54PfkfL6LktJzYRvWGQjXptV0Y2w3h35Zf4yjfIKjAXLumiNE00XCWcsR2HWbx23SpcHLlk9peUd1+OKGkk1D4Ts99r/5OimRmVjnF+/pRPtooCMEa1ub6NO2IPTnyz/jxn4gXsGlKRVIMP7Sa9xVodZib4IXWemf7+jysQuG1R5kN9ClkQi+WIv4MExueUJiu2tyhDnuvk/vIDGP3tTbY1myedqx/StZIu2zQRul/KIDKkNUmXVds0F9QbnwK7AdcQwyCyy86XQzytq0GNPqL83YZGEvmH0mJ4nfkWKpyHzOLmkhvkKzOD3rRi8HtV7YUMTWN3v3vHrRE/pAgMBAAECggEAJK/puFcA4ZeSXyJbTHreaio2c2JKoxHoEJ4BY3jKEdfzGrC+p+3JH9ZGKN+BrsvSs1J3nlYZtHjGsP2WGHlsQrKuWboxbm0BJqKbNEDjwFLBImpOvpxQQ6JCPKEqBt1JuRz4Gca3ScHME0FQAdZFrvvPJLzeaKiznmbiXBgRMweRW704Nk2HfM3Uo7x2PS3BiCDdaQ0CXnj63EWHCteyLf4TlgV7qlk0OG9uh9RWm5xRC5/ucscc8oa8BdC/fLdAh7T2XIHFtVhEe+KPYvobJ3lFZlRb/jhKlu79wWXC08zoQrunCesvsB/RrLDTHk0FV29h1qv3BneOLFVDiwj6BQKBgQC9dXcDmRx7kZcA/dDz13RljWo0kmuYQt1h1dI1a7GgqcIdI5jdwOf3vVN7Ctge6YLaG+ptiaXU+SAMN1HQnqzN5DlKn2Q7hN66I+KQjfOYggnDEscOIPEaY/avAsSVZObZu+bK/XDIbypDDl4dELvVQy8ckd4CCCKC8QduqObu8wKBgQC5bKQzIrvtmaEhqbjvP83CZyiGG/GB3zzogJUKA6nm0oKiURHldoA5UozYyvbu3sBBuw81NQYuMMBVBZgO3XIFc7hHVqyn93dHgzOxUFYk2bhliVg9siFg6n3YQWvxIDkP6NGVhCXPLL+0H33rcBCjgQyxJyUa35rAzovFWu7UswKBgQClvrvNxAcs+2N1lJdWm6jSpvLA50+Ftwlh6+OopHyTJ7AQOfIkHf1RuKntvMDx2iuFkGJ4TbFsLj4hMcw7jHV08jJE3Eid4VHQ2k/9UpJHW4wawrSt4ZfMFKPc27kLUWi8FyyDbVFbqBT68PjYyKjqm4n9nobwlBlNIHv2DYFqjQKBgDWUH+oqujTQtI+elDKFtDXdSwddYa6OS/I+3VH0dw6ce2Tdmhc845YstUgbdbjWIqWboKxWMv/71Ed9A1AgSscqhfAPKnqqdgvy7Gfq98lUJAUq55WEOELh3xUy6jbVgceIFa9nbOltW8N3ahIy4ovsSTeTQRR/0h6uUBLp0KMjAoGAHJBJOAnS8csXYIIMArXcxCUgnC90sMQ9DySaTxmtfTVAy7Gs1TnBLRpwWOg55u1KebVTgx5T6vU+KupNi5KAbuK/1so27XXCo7DAY83leJTn9UC4iyOSOhTyNBwvd8uDyT2XrxbesSTBLe1dT3QtXJwT4iBttKky9lsAQDHB13o=
# alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhBcqLFQhDttWG9Ffqzf8SNjYP/IzBHxUh9XxHVbUXFtDyCY4L0mZKfOCKKq9q7gC0D3wWEmP+OS4b/5oB7n0DgWExTb2lcStzwzISEyoRagGH38EWH77PgN97tsJw6p06nVTWr+0W60tb1FZeFmCNbqzEpuF22srRztKzfHfoyn8KyL5LcZ15JBPC8uuRT0fSh2txYrjvVuToh8tdMcLEL/LGj1h/E8ol7qSUfHkyQNyeWgP2YrzzmW9QvLuRYUS2ZjhMbbBbGpkq9Bf35kwNG3gvcb0y0cYXV9zR/OLgz0aRF7scDIICUYG9/9o0ezGaH4veaKCUC+8Zx9CqUUdZwIDAQAB
## 支付宝正式环境
alipay:
appId: 2021000117670831
url: https://openapi.alipaydev.com/gateway.do
appId: 2021002147662648
url: https://openapi.alipay.com/gateway.do
appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCJOkoU54PfkfL6LktJzYRvWGQjXptV0Y2w3h35Zf4yjfIKjAXLumiNE00XCWcsR2HWbx23SpcHLlk9peUd1+OKGkk1D4Ts99r/5OimRmVjnF+/pRPtooCMEa1ub6NO2IPTnyz/jxn4gXsGlKRVIMP7Sa9xVodZib4IXWemf7+jysQuG1R5kN9ClkQi+WIv4MExueUJiu2tyhDnuvk/vIDGP3tTbY1myedqx/StZIu2zQRul/KIDKkNUmXVds0F9QbnwK7AdcQwyCyy86XQzytq0GNPqL83YZGEvmH0mJ4nfkWKpyHzOLmkhvkKzOD3rRi8HtV7YUMTWN3v3vHrRE/pAgMBAAECggEAJK/puFcA4ZeSXyJbTHreaio2c2JKoxHoEJ4BY3jKEdfzGrC+p+3JH9ZGKN+BrsvSs1J3nlYZtHjGsP2WGHlsQrKuWboxbm0BJqKbNEDjwFLBImpOvpxQQ6JCPKEqBt1JuRz4Gca3ScHME0FQAdZFrvvPJLzeaKiznmbiXBgRMweRW704Nk2HfM3Uo7x2PS3BiCDdaQ0CXnj63EWHCteyLf4TlgV7qlk0OG9uh9RWm5xRC5/ucscc8oa8BdC/fLdAh7T2XIHFtVhEe+KPYvobJ3lFZlRb/jhKlu79wWXC08zoQrunCesvsB/RrLDTHk0FV29h1qv3BneOLFVDiwj6BQKBgQC9dXcDmRx7kZcA/dDz13RljWo0kmuYQt1h1dI1a7GgqcIdI5jdwOf3vVN7Ctge6YLaG+ptiaXU+SAMN1HQnqzN5DlKn2Q7hN66I+KQjfOYggnDEscOIPEaY/avAsSVZObZu+bK/XDIbypDDl4dELvVQy8ckd4CCCKC8QduqObu8wKBgQC5bKQzIrvtmaEhqbjvP83CZyiGG/GB3zzogJUKA6nm0oKiURHldoA5UozYyvbu3sBBuw81NQYuMMBVBZgO3XIFc7hHVqyn93dHgzOxUFYk2bhliVg9siFg6n3YQWvxIDkP6NGVhCXPLL+0H33rcBCjgQyxJyUa35rAzovFWu7UswKBgQClvrvNxAcs+2N1lJdWm6jSpvLA50+Ftwlh6+OopHyTJ7AQOfIkHf1RuKntvMDx2iuFkGJ4TbFsLj4hMcw7jHV08jJE3Eid4VHQ2k/9UpJHW4wawrSt4ZfMFKPc27kLUWi8FyyDbVFbqBT68PjYyKjqm4n9nobwlBlNIHv2DYFqjQKBgDWUH+oqujTQtI+elDKFtDXdSwddYa6OS/I+3VH0dw6ce2Tdmhc845YstUgbdbjWIqWboKxWMv/71Ed9A1AgSscqhfAPKnqqdgvy7Gfq98lUJAUq55WEOELh3xUy6jbVgceIFa9nbOltW8N3ahIy4ovsSTeTQRR/0h6uUBLp0KMjAoGAHJBJOAnS8csXYIIMArXcxCUgnC90sMQ9DySaTxmtfTVAy7Gs1TnBLRpwWOg55u1KebVTgx5T6vU+KupNi5KAbuK/1so27XXCo7DAY83leJTn9UC4iyOSOhTyNBwvd8uDyT2XrxbesSTBLe1dT3QtXJwT4iBttKky9lsAQDHB13o=
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhBcqLFQhDttWG9Ffqzf8SNjYP/IzBHxUh9XxHVbUXFtDyCY4L0mZKfOCKKq9q7gC0D3wWEmP+OS4b/5oB7n0DgWExTb2lcStzwzISEyoRagGH38EWH77PgN97tsJw6p06nVTWr+0W60tb1FZeFmCNbqzEpuF22srRztKzfHfoyn8KyL5LcZ15JBPC8uuRT0fSh2txYrjvVuToh8tdMcLEL/LGj1h/E8ol7qSUfHkyQNyeWgP2YrzzmW9QvLuRYUS2ZjhMbbBbGpkq9Bf35kwNG3gvcb0y0cYXV9zR/OLgz0aRF7scDIICUYG9/9o0ezGaH4veaKCUC+8Zx9CqUUdZwIDAQAB
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAigumfaT5OI9WRVkZKC6lU95MaxCwNvcyRo+oQlItuhQLJexyIcLk87i4WWEmkkZOu8SLsPazkn18QeMnMwy98Pm1iGZCBmwFnj3UNq0qm5lfmpao945QKskArKVr/kkRMBNNm6INGpsppZAvBaBsiiSw4jrrgTE9AP3SvPQ2rykiZaU5Kcn7nMUueZt2aYIbJrpQ70mcl18sZILDPL0vNQJ1pIFMJN6B/BxSJDfi5Bbh2fiwOu+qVivBfYbCJuHpx2RWGA7jknGsnXHUHfAekAlFhtwGpa+fvpQPoB1jRPmvi8VQGJA+zU6lunxcRxpTEVGr1ryeeTUFIixQY9XNuQIDAQAB
ALTER TABLE `product_order`
ADD COLUMN `source` varchar(20) NULL COMMENT '支付来源' AFTER `pay_method`;
\ No newline at end of file
......@@ -42,7 +42,7 @@
(
SELECT *
from course_consume_record
WHERE user_id = #{userId}
WHERE user_id = #{p.userId}
and is_del = 0
ORDER BY update_time desc,course_id ASC LIMIT 100000
) t
......@@ -52,6 +52,6 @@
INNER JOIN course c on r.course_id = c.id
INNER JOIN course_chapter chapter on chapter.id = r.chapter_id
INNER JOIN resource res ON res.id = chapter.resource_id
ORDER BY r.update_time DESC;
ORDER BY r.update_time DESC
</select>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment