Browse Source

退款,支付等

一个番茄酱 2 years ago
parent
commit
2b711a1301
33 changed files with 616 additions and 160 deletions
  1. 4 0
      education_family/common/service_base/pom.xml
  2. 1 0
      education_family/infrastructure/api_gateway/pom.xml
  3. 1 4
      education_family/service/service-education/pom.xml
  4. 1 0
      education_family/service/service-education/src/main/java/com/xunwang/education/config/GetHttpParamsConfigurator.java
  5. 4 12
      education_family/service/service-education/src/main/java/com/xunwang/education/controller/InviteInfoController.java
  6. 28 0
      education_family/service/service-education/src/main/java/com/xunwang/education/controller/MpInnerMsgController.java
  7. 1 1
      education_family/service/service-education/src/main/java/com/xunwang/education/entity/MpInnerMsg.java
  8. 3 3
      education_family/service/service-education/src/main/java/com/xunwang/education/entity/socket/Commucation.java
  9. 5 1
      education_family/service/service-education/src/main/java/com/xunwang/education/entity/socket/Type.java
  10. 3 0
      education_family/service/service-education/src/main/java/com/xunwang/education/feign/PayFeign.java
  11. 0 3
      education_family/service/service-education/src/main/java/com/xunwang/education/handler/ChatEndpoint.java
  12. 2 0
      education_family/service/service-payment/src/main/java/com/xunwang/payment/ServicePaymentApplication.java
  13. 56 4
      education_family/service/service-payment/src/main/java/com/xunwang/payment/controller/OrderInfoController.java
  14. 4 6
      education_family/service/service-payment/src/main/java/com/xunwang/payment/controller/WxPayController.java
  15. 2 0
      education_family/service/service-payment/src/main/java/com/xunwang/payment/entity/OrderInfo.java
  16. 35 0
      education_family/service/service-payment/src/main/java/com/xunwang/payment/entity/vo/MyOrder.java
  17. 13 0
      education_family/service/service-payment/src/main/java/com/xunwang/payment/feign/MsgFeign.java
  18. 5 0
      education_family/service/service-payment/src/main/java/com/xunwang/payment/mapper/OrderInfoMapper.java
  19. 10 0
      education_family/service/service-payment/src/main/java/com/xunwang/payment/mapper/xml/OrderInfoMapper.xml
  20. 1 1
      education_family/service/service-payment/src/main/java/com/xunwang/payment/service/impl/OrderInfoServiceImpl.java
  21. 5 4
      education_family/service/service-payment/src/main/java/com/xunwang/payment/task/wxPayTask.java
  22. 1 1
      education_family/service/service-payment/src/main/resources/wxpay.properties
  23. 9 0
      education_family/service/service-ucenter/src/main/java/com/xunwang/ucenter/controller/MiniProgramOpenidUidController.java
  24. 3 3
      education_uni/manifest.json
  25. 11 1
      education_uni/pages.json
  26. 40 38
      education_uni/pages/home/home.vue
  27. BIN
      education_uni/static/boy.png
  28. BIN
      education_uni/static/girl.png
  29. 10 3
      education_uni/subpkg/message_detail/message_detail.vue
  30. 14 6
      education_uni/subpkg/my_got_invitation_detail/my_got_invitation_detail.vue
  31. 4 5
      education_uni/subpkg/my_orders/my_orders.vue
  32. 91 64
      education_uni/subpkg/order_detail/order_detail.vue
  33. 249 0
      education_uni/subpkg/student_order_detail/student_order_detail.vue

+ 4 - 0
education_family/common/service_base/pom.xml

@@ -17,5 +17,9 @@
             <artifactId>common_utils</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 1 - 0
education_family/infrastructure/api_gateway/pom.xml

@@ -36,6 +36,7 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-openfeign</artifactId>
         </dependency>
+
     </dependencies>
 
 

+ 1 - 4
education_family/service/service-education/pom.xml

@@ -18,9 +18,6 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-openfeign</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-websocket</artifactId>
-        </dependency>
+
     </dependencies>
 </project>

+ 1 - 0
education_family/service/service-education/src/main/java/com/xunwang/education/config/GetHttpParamsConfigurator.java

@@ -1,5 +1,6 @@
 package com.xunwang.education.config;
 
+
 import javax.servlet.http.HttpSession;
 import javax.websocket.HandshakeResponse;
 import javax.websocket.server.HandshakeRequest;

+ 4 - 12
education_family/service/service-education/src/main/java/com/xunwang/education/controller/InviteInfoController.java

@@ -1,7 +1,6 @@
 package com.xunwang.education.controller;
 
 
-import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.gson.Gson;
@@ -26,10 +25,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
 
 /**
  * <p>
@@ -142,8 +138,7 @@ public class InviteInfoController {
     public R getSendedInvitation(HttpServletRequest request){
         String id = JwtUtils.getUIdByJwtToken(request);
         QueryWrapper<InviteInfo> wrapper = new QueryWrapper<>();
-        wrapper.eq("from_uid",id);
-        wrapper.eq("read_status","已读");
+        wrapper.eq("from_uid",id).eq("read_status","已读").orderByDesc("datetime");
         List<InviteInfo> list = inviteInfoService.list(wrapper);
         return R.ok().data("list",list);
     }
@@ -154,8 +149,7 @@ public class InviteInfoController {
     public R getSendedInvitationUnread(HttpServletRequest request){
         String id = JwtUtils.getUIdByJwtToken(request);
         QueryWrapper<InviteInfo> wrapper = new QueryWrapper<>();
-        wrapper.eq("from_uid",id);
-        wrapper.eq("read_status","未读");
+        wrapper.eq("from_uid",id).eq("read_status","未读").orderByDesc("datetime");
         List<InviteInfo> list = inviteInfoService.list(wrapper);
         return R.ok().data("list",list);
     }
@@ -165,8 +159,7 @@ public class InviteInfoController {
     public R getReceivedInvitationRead(HttpServletRequest request){
         String id = JwtUtils.getUIdByJwtToken(request);
         QueryWrapper<InviteInfo> wrapper = new QueryWrapper<>();
-        wrapper.eq("to_uid",id);
-        wrapper.eq("read_status","已读");
+        wrapper.eq("to_uid",id).eq("read_status","已读").orderByDesc("datetime");
         List<InviteInfo> list = inviteInfoService.list(wrapper);
         return R.ok().data("list",list);
     }
@@ -176,8 +169,7 @@ public class InviteInfoController {
     public R getReceivedInvitationUnread(HttpServletRequest request){
         String id = JwtUtils.getUIdByJwtToken(request);
         QueryWrapper<InviteInfo> wrapper = new QueryWrapper<>();
-        wrapper.eq("to_uid",id);
-        wrapper.eq("read_status","未读");
+        wrapper.eq("to_uid",id).eq("read_status","未读").orderByDesc("datetime");
         List<InviteInfo> list = inviteInfoService.list(wrapper);
         return R.ok().data("list",list);
     }

+ 28 - 0
education_family/service/service-education/src/main/java/com/xunwang/education/controller/MpInnerMsgController.java

@@ -6,6 +6,10 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.xunwang.commonutils.JwtUtils;
 import com.xunwang.commonutils.R;
 import com.xunwang.education.entity.MpInnerMsg;
+import com.xunwang.education.entity.socket.Commucation;
+import com.xunwang.education.entity.socket.Type;
+import com.xunwang.education.feign.PayFeign;
+import com.xunwang.education.handler.ChatEndpoint;
 import com.xunwang.education.service.MpInnerMsgService;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -16,6 +20,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -33,6 +38,12 @@ public class MpInnerMsgController {
     @Resource
     private MpInnerMsgService mpInnerMsgService;
 
+    @Resource
+    private ChatEndpoint chatEndpoint;
+
+    @Resource
+    private PayFeign payFeign;
+
     @ApiOperation("查询个人消息未读数")
     @GetMapping("/queryUnreadCount/{uid}")
     public int queryUnreadCount(@PathVariable String uid) {
@@ -64,5 +75,22 @@ public class MpInnerMsgController {
         boolean update = mpInnerMsgService.update(mpInnerMsg, wrapper);
         return update ? R.ok() : R.error();
     }
+
+    @ApiOperation("Feign支付完成发送消息")
+    @GetMapping("/notify/paymentSuccess/{uid}/{orderId}")
+    public void notifyPaymentSuccess(@PathVariable String uid, @PathVariable String orderId) throws IOException {
+        // 5.向客户端(被邀请方)主动推送消息
+        chatEndpoint.sendInvited(uid, orderId, Commucation.NOTICE.getMessage(), Type.PAYSUCCESS.getType());
+    }
+
+    @ApiOperation("发送申请退款消息")
+    @GetMapping("/notify/refund")
+    public R notifyRefund(HttpServletRequest request) throws IOException {
+        String studentId = request.getParameter("studentId");
+        String orderId = request.getParameter("orderId");
+        payFeign.updateIsRefund(orderId);
+        chatEndpoint.sendInvited(studentId, orderId, Commucation.REFUND.getMessage(), Type.REFUND.getType());
+        return R.ok();
+    }
 }
 

+ 1 - 1
education_family/service/service-education/src/main/java/com/xunwang/education/entity/MpInnerMsg.java

@@ -45,7 +45,7 @@ public class MpInnerMsg implements Serializable {
     private String msgContent;
 
     @ApiModelProperty(value = "不填,自动日期时间")
-    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     private Date datetime;
 
     @ApiModelProperty(value = "'已读' '未读'")

+ 3 - 3
education_family/service/service-education/src/main/java/com/xunwang/education/entity/socket/Commucation.java

@@ -7,11 +7,11 @@ public enum Commucation {
 
     INVITED("你已收到邀请,请及时查看,邀请号:"),
 
-    SUCCESS("恭喜你支付成功,已通知教员,邀请号:"),
+    NOTICE("对方已成功支付,请保持联系畅通,订单号:"),
 
-    NOTICE("对方已成功支付,请保持联系畅通,邀请号:"),
+    PAYNOTICE("对方已同意,请及时支付,订单号:"),
 
-    PAYNOTICE("对方已同意,请及时支付,订单号:")
+    REFUND("双方协商一致,经教员发起申请退款,订单号:")
     ;
 
     Commucation(String message) {

+ 5 - 1
education_family/service/service-education/src/main/java/com/xunwang/education/entity/socket/Type.java

@@ -7,7 +7,11 @@ public enum Type {
 
     INVITATION("邀请函"),
 
-    PAYNOTICE("支付通知")
+    PAYNOTICE("支付通知"),
+
+    PAYSUCCESS("支付成功"),
+
+    REFUND("申请退款")
     ;
 
     Type(String type) {

+ 3 - 0
education_family/service/service-education/src/main/java/com/xunwang/education/feign/PayFeign.java

@@ -16,4 +16,7 @@ public interface PayFeign {
 
     @GetMapping("payment/order-info/generate/order/{inviteId}")
     R generateOrder(@PathVariable String inviteId);
+
+    @GetMapping("payment/order-info/updateIsRefund/{orderId}")
+    void updateIsRefund(@PathVariable String orderId);
 }

+ 0 - 3
education_family/service/service-education/src/main/java/com/xunwang/education/handler/ChatEndpoint.java

@@ -1,6 +1,5 @@
 package com.xunwang.education.handler;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.xunwang.education.config.GetHttpParamsConfigurator;
 import com.xunwang.education.entity.MpInnerMsg;
@@ -8,11 +7,9 @@ import com.xunwang.education.entity.socket.Commucation;
 import com.xunwang.education.entity.socket.Message;
 import com.xunwang.education.service.MpInnerMsgService;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.catalina.session.StandardSessionFacade;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpSession;
 import javax.websocket.*;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;

+ 2 - 0
education_family/service/service-payment/src/main/java/com/xunwang/payment/ServicePaymentApplication.java

@@ -6,11 +6,13 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @EnableDiscoveryClient // 开启服务发现
 @EnableFeignClients // 开启Feign
 @ComponentScan("com.xunwang")
 @SpringBootApplication
+@EnableScheduling
 @MapperScan("com.xunwang.payment.mapper")
 public class ServicePaymentApplication {
 

+ 56 - 4
education_family/service/service-payment/src/main/java/com/xunwang/payment/controller/OrderInfoController.java

@@ -5,10 +5,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.xunwang.commonutils.JwtUtils;
 import com.xunwang.commonutils.R;
 import com.xunwang.payment.entity.OrderInfo;
+import com.xunwang.payment.entity.vo.MyOrder;
+import com.xunwang.payment.enums.OrderStatus;
+import com.xunwang.payment.feign.MsgFeign;
 import com.xunwang.payment.feign.UserFeign;
+import com.xunwang.payment.mapper.OrderInfoMapper;
 import com.xunwang.payment.service.OrderInfoService;
+import com.xunwang.payment.service.WxPayService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -18,7 +24,9 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * <p>
@@ -39,9 +47,16 @@ public class OrderInfoController {
     @Resource
     private UserFeign userFeign;
 
+    @Resource
+    private MsgFeign msgFeign;
+
     @Resource
     private StringRedisTemplate stringRedisTemplate;
 
+    @Resource
+    private OrderInfoMapper orderInfoMapper;
+
+
     @ApiOperation("根据openId返回订单列表")
     @GetMapping("/list/{openId}")
     public R list(@PathVariable String openId) {
@@ -62,15 +77,15 @@ public class OrderInfoController {
         String uid = JwtUtils.getUIdByJwtToken(request);
         R openIdByUid = userFeign.getOpenIdByUid(uid);
         String openid = (String) openIdByUid.getData().get("openid");
-        List<OrderInfo> orderInfos = orderInfoService.listOrderByCreateTimeDesc(openid);
-        return R.ok().data("list", orderInfos);
+        List<MyOrder> myOrderList = orderInfoMapper.getMyOrderList(openid);
+        return R.ok().data("list", myOrderList);
     }
 
     @ApiOperation("获取订单倒计时")
     @GetMapping("/getCountDown")
     public R getCountDown(HttpServletRequest request) {
-        String inviteId = request.getParameter("inviteId");
-        Long expire = stringRedisTemplate.opsForValue().getOperations().getExpire("countdown:" + inviteId);
+        String orderId = request.getParameter("orderId");
+        Long expire = stringRedisTemplate.opsForValue().getOperations().getExpire("countdown:" + orderId);
         return R.ok().data("time", expire);
     }
 
@@ -82,4 +97,41 @@ public class OrderInfoController {
         return R.ok().data("one", one);
     }
 
+    @GetMapping("/queryOrderStatus")
+    @ApiOperation("查询支付中本地订单状态")
+    public R queryOrderStatus(HttpServletRequest request) {
+        String orderId = request.getParameter("orderId");
+        OrderInfo one = orderInfoService.getOne(new LambdaQueryWrapper<OrderInfo>().eq(OrderInfo::getOrderId, orderId));
+        String status = one.getStatus();
+        String studentId = one.getStudentId();
+        String inviteId = one.getInviteId();
+        if (OrderStatus.SUCCESS.getType().equals(status)) {
+            // 推送支付成功消息
+            msgFeign.notifyPaymentSuccess(studentId, orderId);
+            // 删除redis的倒计时键
+            stringRedisTemplate.delete("countdown:" + orderId);
+            return R.ok().message("支付成功");
+        }
+        return R.ok().message("支付中");
+    }
+
+    @GetMapping("/queryIsRefundOrder")
+    @ApiOperation("查询是否退款订单")
+    public R queryIsRefundOrder(HttpServletRequest request) {
+        String orderId = request.getParameter("orderId");
+        OrderInfo one = orderInfoService.getOne(new LambdaQueryWrapper<OrderInfo>().eq(OrderInfo::getOrderId, orderId));
+        String status = one.getStatus();
+        if ("已退款".equals(status)) {
+            return R.ok().message("已退款");
+        }
+        return R.ok().message("退款中");
+    }
+
+    @ApiOperation("更改申请退款状态")
+    @GetMapping("/updateIsRefund/{orderId}")
+    public void updateIsRefund(@PathVariable String orderId) {
+        OrderInfo orderInfo = new OrderInfo().setIsRefund(1);
+        orderInfoService.update(orderInfo, new LambdaQueryWrapper<OrderInfo>().eq(OrderInfo::getOrderId, orderId));
+    }
+
 }

+ 4 - 6
education_family/service/service-payment/src/main/java/com/xunwang/payment/controller/WxPayController.java

@@ -117,16 +117,14 @@ public class WxPayController {
 
     /**
      * 申请退款
-     *
-     * @param orderNo
-     * @param reason
      * @return
      * @throws IOException
      */
     @ApiOperation("申请退款")
-    @PostMapping("/refunds/{orderNo}/{reason}")
-    public R refunds(@PathVariable String orderNo, @PathVariable String reason) throws IOException {
-
+    @GetMapping("/refunds")
+    public R refunds(HttpServletRequest request) throws IOException {
+        String orderNo = request.getParameter("orderNo");
+        String reason = request.getParameter("reason");
         log.info("申请退款");
         wxPayService.refund(orderNo, reason);
         return R.ok();

+ 2 - 0
education_family/service/service-payment/src/main/java/com/xunwang/payment/entity/OrderInfo.java

@@ -91,6 +91,8 @@ public class OrderInfo implements Serializable {
     @ApiModelProperty(value = "订单状态:'待支付' '已支付' ' 已取消' ' 已退款' ' 退款中'")
     private String status;
 
+    private Integer isRefund;
+
     @ApiModelProperty(value = "平台佣金,课酬X60%")
     private BigDecimal commission;
 

+ 35 - 0
education_family/service/service-payment/src/main/java/com/xunwang/payment/entity/vo/MyOrder.java

@@ -0,0 +1,35 @@
+package com.xunwang.payment.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class MyOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "含日期时间唯一id")
+    private String orderId;
+
+    @ApiModelProperty(value = "商品描述")
+    private String requireDetail;
+
+    @ApiModelProperty(value = "下单日期时间")
+    private String datetime;
+
+    private String studentName;
+
+    @ApiModelProperty(value = "订单状态:'待支付' '已支付' ' 已取消' ' 已退款' ' 退款中'")
+    private String status;
+
+}

+ 13 - 0
education_family/service/service-payment/src/main/java/com/xunwang/payment/feign/MsgFeign.java

@@ -0,0 +1,13 @@
+package com.xunwang.payment.feign;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+@FeignClient(name = "SERVICE-EDUCATION")
+public interface MsgFeign {
+
+    @GetMapping("/education/mp-inner-msg/notify/paymentSuccess/{uid}/{orderId}")
+    void notifyPaymentSuccess(@PathVariable String uid, @PathVariable String orderId);
+}
+

+ 5 - 0
education_family/service/service-payment/src/main/java/com/xunwang/payment/mapper/OrderInfoMapper.java

@@ -3,6 +3,9 @@ package com.xunwang.payment.mapper;
 import com.xunwang.payment.entity.InviteInfo;
 import com.xunwang.payment.entity.OrderInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunwang.payment.entity.vo.MyOrder;
+
+import java.util.List;
 
 /**
  * <p>
@@ -27,4 +30,6 @@ public interface OrderInfoMapper extends BaseMapper<OrderInfo> {
      * @return
      */
     String getOpenIdByUid(String uid);
+
+    List<MyOrder> getMyOrderList(String openid);
 }

+ 10 - 0
education_family/service/service-payment/src/main/java/com/xunwang/payment/mapper/xml/OrderInfoMapper.xml

@@ -19,4 +19,14 @@
         where
             uid = #{uid}
     </select>
+
+    <select id="getMyOrderList" resultType="com.xunwang.payment.entity.vo.MyOrder">
+        select
+            order_id, require_detail, datetime, student_name, status
+        from
+            order_info
+        where
+            open_id = #{id}
+        order by datetime desc
+    </select>
 </mapper>

+ 1 - 1
education_family/service/service-payment/src/main/java/com/xunwang/payment/service/impl/OrderInfoServiceImpl.java

@@ -96,7 +96,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
         int insert = baseMapper.insert(orderInfo);
 
         // 支付倒计时存入redis中
-        stringRedisTemplate.opsForValue().set("countdown:" + inviteId, "1", 15, TimeUnit.MINUTES);
+        stringRedisTemplate.opsForValue().set("countdown:" + orderInfo.getOrderId(), "1", 15, TimeUnit.MINUTES);
         return orderInfo;
     }
 

+ 5 - 4
education_family/service/service-payment/src/main/java/com/xunwang/payment/task/wxPayTask.java

@@ -6,6 +6,7 @@ import com.xunwang.payment.service.OrderInfoService;
 import com.xunwang.payment.service.RefundService;
 import com.xunwang.payment.service.WxPayService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -25,9 +26,9 @@ public class wxPayTask {
     private RefundService refundInfoService;
 
     /**
-     * 从第0秒开始每隔30执行1次,查询创建超过5分钟,并且未支付的订单
+     * 从第0秒开始每隔2分钟执行1次,查询创建超过5分钟,并且未支付的订单
      */
-    // @Scheduled(cron = "0/30 * * * * ?")
+    @Scheduled(cron = "0 0/2 * * * ?")
     public void orderConfirm() throws Exception {
         log.info("orderConfirm 被执行");
 
@@ -44,9 +45,9 @@ public class wxPayTask {
     }
 
     /**
-     * 从第0秒开始每隔30执行1次,查询创建超过5分钟,并且未退款的退款单
+     * 从第0秒开始每隔2分钟执行1次,查询创建超过5分钟,并且未退款的退款单
      */
-    // @Scheduled(cron = "0/30 * * * * ?")
+    @Scheduled(cron = "0 0/2 * * * ?")
     public void refundConfirm() throws Exception {
         log.info("orderConfirm 被执行");
 

+ 1 - 1
education_family/service/service-payment/src/main/resources/wxpay.properties

@@ -12,5 +12,5 @@ wxpay.appid=wxf2d10b5ab2b20723
 # \u5FAE\u4FE1\u670D\u52A1\u5668\u5730\u5740
 wxpay.domain=https://api.mch.weixin.qq.com
 # \u63A5\u6536\u7ED3\u679C\u901A\u77E5\u5730\u5740
-wxpay.notify-domain=https://885d-125-71-216-35.ngrok.io
+wxpay.notify-domain=https://f5cb-101-204-146-11.ngrok.io
 

+ 9 - 0
education_family/service/service-ucenter/src/main/java/com/xunwang/ucenter/controller/MiniProgramOpenidUidController.java

@@ -66,5 +66,14 @@ public class MiniProgramOpenidUidController {
         String openid = one.getOpenid();
         return R.ok().data("openid", openid);
     }
+
+    @ApiOperation("根据uid获取手机号")
+    @GetMapping("/getPhoneByUid")
+    public R getPhoneByUid(HttpServletRequest request) {
+        String uid = request.getParameter("uid");
+        MpOpenidUid one = uidService.getOne(new LambdaQueryWrapper<MpOpenidUid>().eq(MpOpenidUid::getUid, uid));
+        String phone = one.getPhone();
+        return R.ok().data("phone", phone);
+    }
 }
 

+ 3 - 3
education_uni/manifest.json

@@ -59,9 +59,9 @@
         },
         "usingComponents" : true,
         "permission" : {
-            "scope.userLocation" : {
-                "desc" : "允许位置信息将为你推荐最近的资源"
-            }
+			"scope.userFuzzyLocation" : {
+			    "desc" : "允许位置信息将为你推荐最近的资源"
+			}
         },
         "requiredPrivateInfos" : [ "choosePoi", "getFuzzyLocation", "chooseLocation" ]
     },

+ 11 - 1
education_uni/pages.json

@@ -2,7 +2,8 @@
 	"pages": [{
 		"path": "pages/home/home",
 		"style": {
-			"enablePullDownRefresh": false
+			"enablePullDownRefresh": false,
+			"navigationStyle": "custom"
 		}
 
 	}, {
@@ -204,6 +205,15 @@
                     "enablePullDownRefresh": false
                 }
                 
+                }
+                ,{
+                    "path" : "student_order_detail/student_order_detail",
+                    "style" :                                                                                    
+                {
+                    "navigationBarTitleText": "订单详情",
+                    "enablePullDownRefresh": false
+                }
+                
                 }
             ]
 	}],

+ 40 - 38
education_uni/pages/home/home.vue

@@ -37,10 +37,13 @@
 		    </view>
 			<view v-for="(Info,index) in hotTeacherList" :key="index">
 				<view class="hotTeacher">
+					<view class="studentGrade">
+						明星级
+					</view>
 				
-					<image class="teachImg" src="../../static/zly.jpeg"></image>
-						<view class="hotTeacherText">
-							<view class="teachTitle">{{Info.name}}</view>
+					<image class="teachImg" :src="Info.profilePhoto"></image>
+					<view class="hotTeacherText">
+						<view class="teachTitle">{{Info.name}}</view>
 						<view class="teachDistance">距你<text>{{Info.kil}}</text>km</view>
 					</view>
 				</view>
@@ -55,36 +58,25 @@
 		        <image class="hotIcon" src="../../static/hot.png"></image>
 		        <view>热门学员</view>
 		    </view>
-		    <view class="hotStudent">
-		        <view class="studentGrade">
-		            明星级
-		        </view>
-		        <image class="studentImg" src="../../static/zly.jpeg"></image>
-		        <view class="hotStudentText">
-		            <view class="studentTitle">赵同学</view>
-		            <view class="studentDistance">距你<text>xx</text>km</view>
-		        </view>
-		    </view>
-		    <view class="hotTeacher">
-		        <view class="studentGrade">
-		            明星级
-		        </view>
-		        <image class="teachImg" src="../../static/zly.jpeg"></image>
-		        <view class="hotTeacherText">
-		            <view class="teachTitle">李同学</view>
-		            <view class="studentDistance">距你<text>xx</text>km</view>
-		        </view>
-		    </view>
-		    <view class="hotTeacher">
-		        <view class="studentGrade">
-		            明星级
-		        </view>
-		        <image class="teachImg" src="../../static/zly.jpeg"></image>
-		        <view class="hotTeacherText">
-		            <view class="teachTitle">龙同学</view>
-		            <view class="studentDistance">距你<text>xx</text>km</view>
-		        </view>
-		    </view>
+			
+			<view v-for="(item, index) in hotstuNeed" :key="index">
+				<view class="hotStudent">
+					<view class="studentGrade">
+						明星级
+					</view>
+					
+					<template v-if="item.sex === '女'">
+						<image class="teachImg" src="../../static/girl.png"></image>
+					</template>
+					<template v-else>
+						<image class="teachImg" src="../../static/boy.png"></image>
+					</template>
+					<view class="hotStudentText">
+						<view class="studentTitle">{{item.name}}</view>
+						<view class="studentDistance">距你<text>{{item.kil}}</text>km</view>
+					</view>
+				</view>
+			</view>
 		</view>
 		
 		<!-- 攻略 -->
@@ -147,7 +139,7 @@
 				info: [],
 				current: 0,
 				hotTeacherList: [],
-				hotStudent: []
+				hotstuNeed: []
 			}
 		},
 		created() {
@@ -174,12 +166,22 @@
 					let arr = result.data.teacher[i].locationAl.split(",")
 					let kil = this.space(arr[0], arr[1], this.location.latitude, this.location.longitude)
 					result.data.teacher[i].kil = kil
+					
+					let str = result.data.teacher[i].profilePhoto
+					result.data.teacher[i].profilePhoto = 'data:image/png;base64,' + str
 				}
 				this.hotTeacherList = result.data.teacher
+				console.log("teacher",result)
 			},
 			async hotStudent(){
 				const { data: result } = await uni.$http.get('/education/home/getHottestStuNeed')
-				this.hotStudent = result.data.stuNeed
+				for (let i = 0; i < result.data.stuNeed.length; i++) {
+					let arr = result.data.stuNeed[i].locationAl.split(",")
+					let kil = this.space(arr[0], arr[1], this.location.latitude, this.location.longitude)
+					result.data.stuNeed[i].kil = kil
+				}
+				this.hotstuNeed = result.data.stuNeed
+				
 			},
 			submit() {
 				this.$refs.form.validate().then(res => {
@@ -234,13 +236,13 @@
 	}
 
 	.swiper-box {
-		height: 350rpx;
+		height: 500rpx;
 	}
 
 	.swiper-item {
 		display: block;
-		height: 350rpx;
-		line-height: 350rpx;
+		height: 500rpx;
+		line-height: 500rpx;
 		text-align: center;
 
 		image {

BIN
education_uni/static/boy.png


BIN
education_uni/static/girl.png


+ 10 - 3
education_uni/subpkg/message_detail/message_detail.vue

@@ -41,15 +41,22 @@
 				this.updateUserInfo(this.userinfo)
 			},
 			gotoInvite() {
-				if (this.msg.small.charAt(0) === 'O') {
-					console.log('jjjj')
+				if (this.msg.msgTitle === '支付通知') {
 					uni.navigateTo({
 						url: '/subpkg/order_detail/order_detail?orderId='+encodeURIComponent(this.msg.small)
 					})
-				} else {
+				} else if (this.msg.msgTitle === '邀请函'){
 					uni.navigateTo({
 						url: '/subpkg/my_got_invitation_detail/my_got_invitation_detail?item='+encodeURIComponent(this.msg.small)
 					})
+				} else if (this.msg.msgTitle === '支付成功') {
+					uni.navigateTo({
+						url: '/subpkg/student_order_detail/student_order_detail?orderId='+encodeURIComponent(this.msg.small)
+					})
+				} else if (this.msg.msgTitle === '申请退款') {
+					uni.navigateTo({
+						url: '/subpkg/student_order_detail/student_order_detail?orderId='+encodeURIComponent(this.msg.small)
+					})
 				}
 			}
 		}

+ 14 - 6
education_uni/subpkg/my_got_invitation_detail/my_got_invitation_detail.vue

@@ -109,12 +109,13 @@
 				const { data: result } = await uni.$http.get('/education/invite-info/refuse',queryObj)
 				if (result.code == 20000) {
 					uni.$showMsg('拒绝邀请成功')
-				}
-				setTimeout(() => {
-					uni.navigateTo({
-						url: '/subpkg/my_got_invitation/my_got_invitation'
+					this.Info.operateStatus = '拒绝'
+					setTimeout(() => {
+						uni.navigateTo({
+							url: '/subpkg/my_got_invitation/my_got_invitation'
+						}, 3000)
 					})
-				}, 1000)
+				}
 				
 			},
 			async agree(){
@@ -129,7 +130,14 @@
 				
 				const identify = result.data.identify
 				if ('教员' === identify) {
-					return uni.$showMsg('已通知对方完成支付')
+					uni.$showMsg('已通知对方完成支付')
+					this.Info.operateStatus = '同意'
+					setTimeout(() => {
+						
+						uni.navigateTo({
+							url: '/subpkg/my_got_invitation/my_got_invitation'
+						}, 3000)
+					})
 				}
 				if ('学员' === identify) {
 					const infos = result.data.info

+ 4 - 5
education_uni/subpkg/my_orders/my_orders.vue

@@ -1,9 +1,9 @@
 <template>
 	<view>
 		<view class="orderWrapper">
-		    <view class="myOrder" bindtap="toOrderDetatil" v-for="item in orders" :key="item.id">
+		    <view class="myOrder" bindtap="toOrderDetatil" v-for="(item, index) in orders" :key="index">
 		        <!-- 订单左侧部分 -->
-		        <view class="orderContent" @click="gotoDetail(item)">
+		        <view class="orderContent" @click="gotoDetail(item.orderId)">
 		            <view>
 		                <text>订单号</text>
 		                <text class="orderDetail">{{item.orderId}}</text>
@@ -58,15 +58,14 @@
 			async getOrdersByUid() {
 				const { data: result } = await uni.$http.get('/payment/order-info/list/uid')
 				this.orders = result.data.list
-				console.log(this.orders[0])
 				for (let i = 0; i < this.orders.length; i++) {
 					const arr = this.orders[i].datetime.split(" ")
 					this.orders[i].date = arr[0]
 				}
 			},
-			gotoDetail(item) {
+			gotoDetail(id) {
 				uni.navigateTo({
-					url: '/subpkg/order_detail/order_detail?item=' + encodeURIComponent(JSON.stringify(item))
+					url: '/subpkg/order_detail/order_detail?orderId=' + id
 				})
 				
 			}

+ 91 - 64
education_uni/subpkg/order_detail/order_detail.vue

@@ -13,7 +13,6 @@
 		                <text class="orderDetail">{{info.studentName}}学员</text>
 		            </view>
 		        </view>
-		        <!-- <image class="headImg" src="../../images/zly.jpeg"></image> -->
 		    </view>
 		    <!-- 中部区域:订单详情 -->
 		    <view class="orderMid">
@@ -49,26 +48,24 @@
 		        </view>
 		    </view>
 			
-			<uni-countdown :font-size="30" :showDay="false" :hour="0" :minute="minute" :second="second" color="#FFFFFF" :background-color="background" />
+			<view v-if="countDown">
+				<uni-countdown :font-size="30" :showDay="false" :hour="0" :minute="minute" :second="second" color="#FFFFFF" background-color="red" />
+			</view>
 		    
 		    <view class="payWrapper">
-		        <view v-if="pay" class="pay">
-		            <!-- <view v-if="{{payStatus == '已支付' && payDays < 5 && id == 'teacher'}}" class="paidSucceed">
-		                <view class="payStatus">查看手机号</view>
-		                <view class="payStatus">申请退款</view>
-		            </view>
-		            <view v-else-if="{{payStatus == '退款中' && id == 'student'}}" class="paidSucceed">
-		                <view class="payStatus">查看手机号</view>
-		                <view class="payStatus">同意退款</view>
-		            </view> -->
-		            <view class="paidSucceed">
-		                <view class="payStatus">查看手机号</view>
-		            </view>
-		        </view>
-		        <view class="paidSucceed">
+		        <view class="paidSucceed" v-if="!pay">
 					<button :disabled="disabled" type="primary" style="border-radius: 20%;" @click="paymentButton">{{payment}}</button>
 		        </view>
+				<view class="pay" v-if="observed">
+					<view class="paidSucceed">
+					    <button class="payButton" @click="getPhone" type="primary">查看手机号</button>
+					    <button class="payButton" :disabled="buttonDisabled" @click="applyForRefund" type="warn">{{refundButton}}</button>
+					</view>
+				</view>
 		    </view>
+			<view v-if="showPhone">
+				<text>{{phone}}</text>
+			</view>
 		</view>
 	</view>
 </template>
@@ -77,50 +74,81 @@
 	export default {
 		data() {
 			return {
-				background: 'red',
+				time: 0,
+				observed: false,
+				buttonDisabled: false,
+				timer: '',
+				refundButton: '申请退款',
+				phone: '',
+				showPhone: false,
+				countDown: true,
 				payment: '教员支付',
 				disabled: false,
 				minute: 0,
 				second: 0,
 				info: {},
 				pay: false, //是否支付
-				show: false,    //是否显示倒计时、提示信息和教员支付按钮
-				payDays: 4, //订单支付完成后的天数
 			};
 		},
 		onLoad(option) {
-			if (option.item !== undefined) {
-				this.info = JSON.parse(decodeURIComponent(option.item))
-				this.getCountDown(this.info.inviteId)
-			}
 			if (option.orderId !== undefined) {
-				this.getOne(decodeURIComponent(option.orderId))
+				this.getOne(option.orderId)
+				this.getCountDown(option.orderId)
 			}
 		},
 		methods: {
+			// 申请退款
+			async applyForRefund() {
+				this.buttonDisabled = true
+				const queryObj = {
+					studentId: this.info.studentId,
+					orderId: this.info.orderId
+				}
+				const {data: result} = await uni.$http.get('/education/mp-inner-msg/notify/refund', queryObj)
+				if (result.success) {
+					return uni.$showMsg('已通知该学员,请耐心等待')
+				} 
+			},
+			// 获取手机号
+			async getPhone() {
+				const {data: result} = await uni.$http.get('/ucenter/mini-program-openid-uid/getPhoneByUid', {uid: this.info.studentId})
+				this.phone = result.data.phone
+				this.showPhone = true
+			},
 			// 获取订单信息
 			async getOne(id) {
+				console.log(id)
 				const queryObj = {
 					orderId: id
 				}
-				const {data: result} = await uni.$http.get('/payment/order-info/getOrderInfoByOrderId', queryObj)
+				const {data: result} = await uni.$http.get('/payment/order-info/getOrderInfoByOrderId', {orderId: id})
 				this.info = result.data.one
-				this.getCountDown(this.info.inviteId)
+				// 判断支付状态
+				if (this.info.status !== '未支付') {
+					this.countDown = false
+					this.pay = true
+				} 
+				if (this.info.status === '未支付' && this.time == -2){
+					this.disabled = true
+					this.info.status = '已超时'
+				}
+				if (this.info.status === '支付成功') {
+					this.observed = true
+				}
+				if (this.info.isRefund === 1) {
+					this.buttonDisabled = true
+				}
 			},
 			// 倒计时
 			async getCountDown(id) {
 				const queryObj = {
-					inviteId: id
+					orderId: id
 				}
 				const { data: result } = await uni.$http.get('/payment/order-info/getCountDown',queryObj)
-				const time = result.data.time
-				console.log(time)
-				if (time != -2) {
-					this.minute = time / 60
-					this.second = time % 60
-				} else {
-					this.disabled = true
-					this.info.status = '已超时'
+				this.time = result.data.time
+				if (this.time != -2) {
+					this.minute = this.time / 60
+					this.second = this.time % 60
 				}
 			},
 			async paymentButton() {
@@ -128,7 +156,6 @@
 					inviteId: this.info.inviteId
 				}
 				const {data: result} = await uni.$http.get('/payment/wx-pay/jsapi', queryObj)
-				console.log(result)
 				
 				// 微信官方调起支付
 				wx.requestPayment({
@@ -138,24 +165,11 @@
 					signType: 'RSA',
 					paySign: result.data.paySign,
 					success: res => {
-					  wx.showToast({
-						title: '支付成功',
-						icon: 'none',
-						duration: 2000
-					  })
-					  this.payment = '支付完成'
-					  this.info.status = '支付成功'
-					  this.background = 'green'
-					  this.minute = 0
-					  this.second = 0
-					  // 调用查单接口,更改订单状态
-					  // 启动定时器
-					 //  this.timer = setInterval(() => {
-						// this.queryOrderStatus()
-					 //  }, 1000)
+						this.timer = setInterval(() => {
+							this.queryOrderStatus()
+						}, 1000)
 					},
 					fail: res => {
-					  this.queryOrderStatus()
 					  wx.showToast({
 						title: '支付失败',
 						icon: 'none',
@@ -163,6 +177,27 @@
 					  })
 					}
 				})
+				
+			},
+			queryOrderStatus() {
+				// 验证本地订单状态,并推送消息
+				uni.request({
+				    url: 'http://192.168.0.214:8222/payment/order-info/queryOrderStatus?orderId=' + this.info.orderId, 
+				    success: (res) => {
+				        if (res.data.message === '支付成功') {
+							clearInterval(this.timer)
+							wx.showToast({
+								title: '支付成功',
+								icon: 'none',
+								duration: 2000
+							})
+							
+							this.info.status = '支付成功'
+							this.countDown = false
+							this.pay = true
+						}
+				    }
+				});
 			}
 		}
 	}
@@ -269,18 +304,6 @@
     display: flex;
     justify-content: center;
 }
-/* 支付按钮 */
-.payStatus{
-    display: flex;
-    margin-top: 100rpx;
-    border-radius: 30rpx;
-    background-color: #8FAADC;
-    color: white;
-    text-align: center;
-    width: 25%;
-    justify-content: center;
-    padding: 10rpx;
-}
 
 .paidSucceed{
     display: flex;
@@ -288,6 +311,10 @@
     justify-content: space-around;
 }
 
+.payButton{
+	border-radius: 30rpx;
+}
+
 .pay{
     /* display: flex; */
     width: 100%;

+ 249 - 0
education_uni/subpkg/student_order_detail/student_order_detail.vue

@@ -0,0 +1,249 @@
+<template>
+	<view>
+		<view class="orderWrapper">
+		    <!-- 头部区域:订单号、头像 -->
+		    <view class="orderHead">
+		        <view class="orderHeadTitle">
+		            <view>
+		                <text>订单号</text>
+		                <text class="orderDetail">{{info.orderId}}</text>
+		            </view>
+		            <view>
+		                <text>对方</text>
+		                <text class="orderDetail">{{info.teacherName}}教员</text>
+		            </view>
+		        </view>
+		    </view>
+		    <!-- 中部区域:订单详情 -->
+		    <view class="orderMid">
+		        <view>
+		            <text>对方ID</text>
+		            <text class="orderDetail">{{info.teacherId}}</text>
+		        </view>
+		        <view>
+		            <text>需求号</text>
+		            <text class="courseNum" bindtap="toNeedDetail">{{info.requireId}}</text>
+		        </view>
+		        <view>
+		            <text>课程号</text>
+		            <text class="courseNum" bindtap="toCourseDetail">{{info.courseId}}</text>
+		        </view>
+		        <view>
+		            <text>需求金额</text>
+		            <text class="orderDetail">{{info.requireSalary/100}}</text>
+		        </view>
+		    </view>
+		    <view class="orderBottom">
+		        <view>
+		            <text>订单内容</text>
+		            <text class="orderDetail">{{info.requireDetail}}</text>
+		        </view>
+		        <view>
+		            <text>支付日期</text>
+		            <text class="orderDetail">{{info.datetime}}</text>
+		        </view>
+		        <view>
+		            <text>订单状态</text>
+		            <text class="orderPayStatus">{{info.status}}</text>
+		        </view>
+		    </view>
+		    
+		    <view class="payWrapper">
+				<view class="pay" v-if="!payment">
+					<view class="paidSucceed">
+					    <button class="payButton" @click="getPhone" type="primary">查看手机号</button>
+					    <button class="payButton" :disabled="buttonDisabled" @click="applyForRefund" type="warn">{{refundButton}}</button>
+					</view>
+				</view>
+		    </view>
+			<view v-if="showPhone">
+				<text>{{phone}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				buttonDisabled: true,
+				timer: '',
+				refundButton: '同意退款',
+				phone: '',
+				showPhone: false,
+				disabled: false,
+				minute: 0,
+				second: 0,
+				info: {},
+				payment: false, //是否退款
+			};
+		},
+		onLoad(option) {
+			if (option.orderId !== undefined) {
+				this.getOne(decodeURIComponent(option.orderId))
+			}
+		},
+		methods: {
+			// 申请退款
+			async applyForRefund() {
+				const queryObj = {
+					orderNo: this.info.orderId,
+					reason: '五天无理由'
+				}
+				const {data: result} = await uni.$http.get('/payment/wx-pay/refunds', queryObj)
+				if (result.message === '成功') {
+					this.refundButton = '退款处理中'
+					this.timer = setInterval(() => {
+						this.queryIsRefundOrder()
+					}, 1000)
+				} 
+				
+			},
+			// 获取手机号
+			async getPhone() {
+				const {data: result} = await uni.$http.get('/ucenter/mini-program-openid-uid/getPhoneByUid', {uid: this.info.teacherId})
+				this.phone = result.data.phone
+				this.showPhone = true
+			},
+			// 获取订单信息
+			async getOne(id) {
+				const queryObj = {
+					orderId: id
+				}
+				const {data: result} = await uni.$http.get('/payment/order-info/getOrderInfoByOrderId', queryObj)
+				this.info = result.data.one
+				if (this.info.isRefund === 1) this.buttonDisabled = false
+				if (this.info.status === '已退款') this.payment = true
+			},
+			async queryIsRefundOrder() {
+				const {data: result} = await uni.$http.get('/payment/order-info/queryIsRefundOrder', {orderId: this.info.orderId})
+				if('已退款' === result.message) {
+					this.showPhone = false
+					clearInterval(this.timer)
+					this.payment = true
+					uni.$showMsg('退款成功')
+				}
+			}
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+/* 设置全局边距 */
+.orderWrapper{
+    padding-left: 20rpx;
+    /* background-color: yellowgreen; */
+}
+
+/* 头部区域 */
+.orderHead{
+    display: flex;
+    position: relative;
+    height: 200rpx;
+    padding-top: 20rpx;
+}
+
+/* 头像 */
+.headImg{
+    width: 160rpx;
+    height: 160rpx;
+    border-radius: 30rpx;
+    position: absolute;
+    right: 30rpx;
+}
+
+.orderHeadTitle{
+    display: flex;
+    flex-direction: column;
+    height: 80px;
+    justify-content: space-around;
+}
+
+/* 设置内容样式 */
+.orderDetail,
+.courseNum,
+.orderPayStatus{
+    margin-left: 20rpx;
+    font-weight: bold;
+}
+
+.courseNum{
+    color: #00B0F0;
+    text-decoration: underline;
+}
+
+/* 支付状态字体样式 */
+.orderPayStatus{
+    color: red;
+}
+
+/* 中部区域 */
+.orderMid{
+    height: 220rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+}
+
+/* 底部区域 */
+.orderBottom{
+    margin-top: 40rpx;
+    height: 260rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+}
+
+/* 支付倒计时 */
+.orderPay{
+    margin-top: 40rpx;
+    display: flex;
+    align-items: baseline;
+}
+/* 倒计时时间格式 */
+.orderPayTime{
+    padding-left: 20rpx;
+    font-weight: bold;
+    font-size: 40rpx;
+    color: red;    
+}
+
+/* 提醒信息 */
+.warning{
+    display: flex;
+    justify-content: center;    
+    margin-top: 60rpx;
+}
+/* 提醒信息详情 */
+.warningDetail{
+    width: 80%;
+    display: flex;
+    flex-direction: column;
+    font-size: 44rpx;
+    font-weight: bold;
+    color: red;
+}
+
+/* 支付及查看信息按钮居中排列 */
+.payWrapper{
+    display: flex;
+    justify-content: center;
+}
+
+.payButton{
+	border-radius: 30rpx;
+}
+
+.paidSucceed{
+    display: flex;
+    width: 100%;
+    justify-content: space-around;
+}
+
+.pay{
+    /* display: flex; */
+    width: 100%;
+}
+</style>