From cfd0118ef446a66f91999afc7b1e46ca607adf50 Mon Sep 17 00:00:00 2001
From: jiangqs <jiangqs>
Date: 星期四, 13 七月 2023 20:32:35 +0800
Subject: [PATCH] 定时任务 统计

---
 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml                                       |   10 
 ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml                                       |    7 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java                            |    2 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ArticleServiceImpl.java           |   47 +
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBasePlatformDto.java                |    2 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppConfigController.java           |   39 +
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticlePageVo.java                       |    5 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AGStockChangeDto.java                  |   34 +
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticleGetVo.java                        |   34 +
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ArticleService.java                    |   31 +
 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopTotalServiceImpl.java               |   99 ++-
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticlePageVo.java                       |   28 +
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java      |   26 
 ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberCouponMapper.xml                              |   14 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/ActivityController.java              |   28 +
 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/activity/ActivityMapper.xml                                 |   26 
 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java            |    1 
 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java            |   13 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/activity/ActivityService.java                   |   20 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java        |   15 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppSimpleActivityGoodsVo.java                 |   11 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java               |    9 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderGoodsServiceImpl.java           |   16 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/SysClassificationService.java          |   10 
 ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/ArticleMapper.xml                                   |   11 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/activity/ActivityMapper.java                     |   21 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/concole/OrderController.java                 |   13 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java          |   10 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java                    |    4 
 ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java                 |   17 
 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java      |   24 
 ruoyi-modules/ruoyi-system/src/test/java/com/ruoyi/system/systemTest.java                                       |   13 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Article.java                       |    3 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java                         |   24 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java                    |   10 
 ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/CustomConfigMapper.xml                              |    6 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/CustomConfigMapper.java                 |    9 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/account/OrderRefund.java                    |   15 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticleGetVo.java                        |   41 +
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteOrderFallbackFactory.java           |    7 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java                           |   10 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtArticleEditDto.java                     |    3 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteActivityService.java                |   42 +
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java                |    6 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/ArticleMapper.java                      |   13 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteActivityFallbackFactory.java        |   22 
 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java              |   25 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java                           |   37 +
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteOrderService.java                   |   10 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtActivityEditDto.java                      |    6 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ActivityTotalChangeDto.java            |   39 +
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtActivityGetVo.java                         |    3 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java                  |   20 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java          |  109 +++
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/SysClassificationServiceImpl.java |   24 
 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/coupon/CouponService.java                     |    2 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java                |  428 ++++++++++++++
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AppArticlePageDto.java                     |   20 
 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberCouponMapper.java                 |   20 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderGoodsService.java                    |    9 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/activity/Activity.java                      |    6 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppClassListVo.java                         |   23 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopTotalChangeDto.java                |    3 
 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java               |   18 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppActivityPageVo.java                        |    4 
 65 files changed, 1,551 insertions(+), 106 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java
index f8a74b0..fa576f5 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java
@@ -22,7 +22,7 @@
 
     String INTEGRAL_USE_FAILED = "积分不够支付";
 
-    String CANCEL_ERROR_ORDER = "只能取消未支付订单";
+    String CANCEL_ERROR_ORDER = "已核销订单不能取消";
 
     String SALESPRICE_MIN = "设置价格不能低于最低限价";
 
@@ -89,4 +89,6 @@
     String COUPON_GET_ALL = "该优惠券已领取完";
 
     String DOUBLE_INTEGRAL_TASK = "任务已完成,请勿重复提交";
+
+    String ACTIVITY_TIME_ERROR = "只能选择大于当前时间作为开始时间";
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java
index bcb5027..43f2194 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java
@@ -46,4 +46,14 @@
      */
     String ACTIVITY_GOODS = "ACTIVITY_GOODS";
 
+    /**
+     * 自动取消订单时间
+     */
+    String AUTO_CANCEL_ORDER_TIME = "AUTO_CANCEL_ORDER_TIME";
+
+    /**
+     * 自动取消订单时间
+     */
+    String PAY_MONEY_INTEGRAL = "PAY_MONEY_INTEGRAL";
+
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AGStockChangeDto.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AGStockChangeDto.java
new file mode 100644
index 0000000..5a39d4d
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AGStockChangeDto.java
@@ -0,0 +1,34 @@
+package com.ruoyi.system.api.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @ClassName ActivityGoodsStockChangeDto
+ * @Description TODO
+ * @Author jqs
+ * @Date 2023/7/13 14:02
+ * @Version 1.0
+ */
+@Data
+public class AGStockChangeDto {
+
+
+    @ApiModelProperty(value = "活动id")
+    private String activityId;
+
+    @ApiModelProperty(value = "活动id")
+    private String goodsId;
+
+    @ApiModelProperty(value = "变化类型1加2减")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "变化数量")
+    private Integer changeNum;
+
+    @ApiModelProperty(value = "商户id")
+    private Long shopId;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ActivityTotalChangeDto.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ActivityTotalChangeDto.java
new file mode 100644
index 0000000..99ae074
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ActivityTotalChangeDto.java
@@ -0,0 +1,39 @@
+package com.ruoyi.system.api.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @ClassName ActivityGoodsStockChangeDto
+ * @Description TODO
+ * @Author jqs
+ * @Date 2023/7/13 14:02
+ * @Version 1.0
+ */
+@Data
+public class ActivityTotalChangeDto {
+
+
+    @ApiModelProperty(value = "活动id")
+    private String activityId;
+
+    @ApiModelProperty(value = "1下单2退款")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "数量变化")
+    private Integer changeNum;
+
+    @ApiModelProperty(value = "金额变化")
+    private BigDecimal money;
+
+    @ApiModelProperty(value = "人数变化")
+    private Integer personNum;
+
+    @ApiModelProperty(value = "退款变化")
+    private Integer refundNum;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBasePlatformDto.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBasePlatformDto.java
index 30eccf6..79e0f6c 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBasePlatformDto.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBasePlatformDto.java
@@ -46,5 +46,5 @@
     private Integer activityType;
 
     @ApiModelProperty(value="活动id")
-    private Long activityId;
+    private String activityId;
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopTotalChangeDto.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopTotalChangeDto.java
index 541144b..36786e6 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopTotalChangeDto.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopTotalChangeDto.java
@@ -19,6 +19,9 @@
     @ApiModelProperty(value = "商户id")
     private Long shopId;
 
+    @ApiModelProperty(value = "1下单2取消")
+    private Integer orderType;
+
     @ApiModelProperty(value = "周期订单金额")
     private BigDecimal cycleMoney;
 
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteActivityFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteActivityFallbackFactory.java
index 2b33d1d..af61e72 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteActivityFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteActivityFallbackFactory.java
@@ -1,7 +1,9 @@
 package com.ruoyi.system.api.factory;
 
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.domain.dto.AGStockChangeDto;
 import com.ruoyi.system.api.domain.dto.ActivityGoodsGetDto;
+import com.ruoyi.system.api.domain.dto.ActivityTotalChangeDto;
 import com.ruoyi.system.api.domain.vo.ActivityGoodsGetVo;
 import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo;
 import com.ruoyi.system.api.service.RemoteActivityService;
@@ -49,6 +51,26 @@
             public R<ActivityGoodsGetVo> getUserActivityGoods(ActivityGoodsGetDto activityGoodsGetDto) {
                 return R.fail("获取用户活动商品信息失败:" + throwable.getMessage());
             }
+
+            @Override
+            public R changeActivityStock(AGStockChangeDto agStockChangeDto) {
+                return R.fail("更新活动库存失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public R changeActivityTotal(ActivityTotalChangeDto activityTotalChangeDto) {
+                return R.fail("更新活动统计:" + throwable.getMessage());
+            }
+
+            @Override
+            public R startActivity(String activityId) {
+                return null;
+            }
+
+            @Override
+            public R endActivity(String activityId) {
+                return null;
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java
index 411ae79..a05ecb1 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java
@@ -50,6 +50,16 @@
                 return R.fail("定时发送"+couponId+"优惠券失败:" + throwable.getMessage());
             }
 
+            @Override
+            public R useMemberCoupon(String memberCouponIds) {
+                return R.fail("使用优惠券失败" + throwable.getMessage());
+            }
+
+            @Override
+            public R backMemberCoupon(String memberCouponIds) {
+                return R.fail("回退优惠券失败" + throwable.getMessage());
+            }
+
 
         };
     }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteOrderFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteOrderFallbackFactory.java
index e57fde3..2f1a959 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteOrderFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteOrderFallbackFactory.java
@@ -61,7 +61,12 @@
 
             @Override
             public R sendGoodsGift(List<BirthdayGiftSendDto> giftSendDtoList) {
-                return null;
+                return R.fail("发送礼物失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public R autoCancelOrder(String orderId) {
+                return R.fail("自动取消订单失败:" + throwable.getMessage());
             }
         };
     }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteActivityService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteActivityService.java
index 3383949..b8c0948 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteActivityService.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteActivityService.java
@@ -2,7 +2,9 @@
 
 import com.ruoyi.common.core.constant.ServiceNameConstants;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.domain.dto.AGStockChangeDto;
 import com.ruoyi.system.api.domain.dto.ActivityGoodsGetDto;
+import com.ruoyi.system.api.domain.dto.ActivityTotalChangeDto;
 import com.ruoyi.system.api.domain.poji.activity.ActivityGoods;
 import com.ruoyi.system.api.domain.vo.ActivityGoodsGetVo;
 import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo;
@@ -55,4 +57,44 @@
      */
     @PostMapping("/activity/getUserActivityGoods")
     public R<ActivityGoodsGetVo> getUserActivityGoods(@RequestBody ActivityGoodsGetDto activityGoodsGetDto);
+
+    /**
+     * @description  更新活动库存
+     * @author  jqs
+     * @date    2023/7/13 15:39
+     * @param agStockChangeDto
+     * @return  R
+     */
+    @PostMapping("/activity/changeActivityStock")
+    public R changeActivityStock(@RequestBody AGStockChangeDto agStockChangeDto);
+
+    /**
+     * @description  更新活动统计
+     * @author  jqs
+     * @date    2023/7/13 16:12
+     * @param activityTotalChangeDto
+     * @return  R
+     */
+    @PostMapping("/activity/changeActivityTotal")
+    public R changeActivityTotal(@RequestBody ActivityTotalChangeDto activityTotalChangeDto);
+
+    /**
+     * @description  开始活动
+     * @author  jqs
+     * @date    2023/7/12 20:30
+     * @param activityId
+     * @return  R
+     */
+    @PostMapping("/startActivity")
+    public R startActivity(@RequestBody String activityId);
+
+    /**
+     * @description  结束活动
+     * @author  jqs
+     * @date    2023/7/12 20:30
+     * @param activityId
+     * @return  R
+     */
+    @PostMapping("/endActivity")
+    public R endActivity(@RequestBody String activityId);
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java
index abc238b..440d8e3 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java
@@ -59,4 +59,24 @@
      */
     @PostMapping("/coupon/autoTimeSendCoupon")
     public R autoTimeSendCoupon(@RequestBody String couponId);
+
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  R
+     */
+    @PostMapping("/coupon/useMemberCoupon")
+    public R useMemberCoupon(@RequestBody String memberCouponIds);
+
+    /**
+     * @description  回退优惠券
+     * @author  jqs
+     * @date    2023/7/13 20:01
+     * @param memberCouponIds
+     * @return  R
+     */
+    @PostMapping("/coupon/backMemberCoupon")
+    public R backMemberCoupon(@RequestBody String memberCouponIds);
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteOrderService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteOrderService.java
index d929ebc..c22ac62 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteOrderService.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteOrderService.java
@@ -66,4 +66,14 @@
      */
     @PostMapping("/order/sendGoodsGift")
     public R sendGoodsGift(@RequestBody List<BirthdayGiftSendDto> giftSendDtoList);
+
+    /**
+     * @description  自动取消订单
+     * @author  jqs
+     * @date    2023/7/13 17:15
+     * @param orderId
+     * @return  R
+     */
+    @PostMapping("/order/autoCancelOrder")
+    public R autoCancelOrder(@RequestBody String orderId);
 }
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
index 8eec9aa..6eb6982 100644
--- a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
@@ -1,5 +1,8 @@
 package com.ruoyi.common.redis.configure;
 
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
 import org.springframework.boot.autoconfigure.AutoConfigureBefore;
 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
 import org.springframework.cache.annotation.CachingConfigurerSupport;
@@ -12,6 +15,8 @@
 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
 import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.io.IOException;
 
 /**
  * redis配置
@@ -64,4 +69,16 @@
         template.afterPropertiesSet();
         return template;
     }
+
+    @Bean(destroyMethod="shutdown") // 服务停止后调用 shutdown 方法。
+    public RedissonClient redisson() throws IOException {
+        // 1.创建配置
+        Config config = new Config();
+        // 集群模式
+        // config.useClusterServers().addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");
+        // 2.根据 Config 创建出 RedissonClient 示例。
+        config.useSingleServer().setAddress("redis://47.109.78.184:10020").setPassword("hrt123456");
+        return Redisson.create(config);
+    }
+
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/ActivityController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/ActivityController.java
index baeb30f..8844e7d 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/ActivityController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/ActivityController.java
@@ -4,7 +4,9 @@
 import com.ruoyi.goods.service.activity.ActivityGoodsService;
 import com.ruoyi.goods.service.activity.ActivityRecordService;
 import com.ruoyi.goods.service.activity.ActivityService;
+import com.ruoyi.system.api.domain.dto.AGStockChangeDto;
 import com.ruoyi.system.api.domain.dto.ActivityGoodsGetDto;
+import com.ruoyi.system.api.domain.dto.ActivityTotalChangeDto;
 import com.ruoyi.system.api.domain.poji.activity.ActivityGoods;
 import com.ruoyi.system.api.domain.vo.ActivityGoodsGetVo;
 import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo;
@@ -116,4 +118,30 @@
         activityService.endActivity(activityId);
         return R.ok();
     }
+
+    /**
+     * @description  更新活动库存
+     * @author  jqs
+     * @date    2023/7/13 15:39
+     * @param agStockChangeDto
+     * @return  R
+     */
+    @PostMapping("/changeActivityStock")
+    public R changeActivityStock(@RequestBody AGStockChangeDto agStockChangeDto){
+        activityService.changeActivityStock(agStockChangeDto);
+        return R.ok();
+    }
+
+    /**
+     * @description  更新活动统计
+     * @author  jqs
+     * @date    2023/7/13 16:12
+     * @param activityTotalChangeDto
+     * @return  R
+     */
+    @PostMapping("/changeActivityTotal")
+    public R changeActivityTotal(@RequestBody ActivityTotalChangeDto activityTotalChangeDto){
+        activityService.changeActivityTotal(activityTotalChangeDto);
+        return R.ok();
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtActivityEditDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtActivityEditDto.java
index 99fff22..ee540aa 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtActivityEditDto.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtActivityEditDto.java
@@ -1,5 +1,6 @@
 package com.ruoyi.goods.domain.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.system.api.domain.dto.MgtBaseDto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -26,10 +27,15 @@
     @NotNull(message = "活动名称不能为空")
     private String activityName;
 
+    @ApiModelProperty(value = "活动简介")
+    private String activityIntroduce;
+
     @ApiModelProperty(value = "活动开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date activityStartTime;
 
     @ApiModelProperty(value = "活动结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date activityEndTime;
 
     @ApiModelProperty(value = "成团人数")
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/activity/Activity.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/activity/Activity.java
index bbad7ef..73ba653 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/activity/Activity.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/activity/Activity.java
@@ -122,6 +122,12 @@
      */
     @TableField("recommend_flag")
     private Integer recommendFlag;
+    /**
+     * 活动简介
+     */
+    @TableField("activity_introduce")
+    private String activityIntroduce;
+
 
     @Override
     protected Serializable pkVal() {
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppActivityPageVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppActivityPageVo.java
index efd0576..74a8eb4 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppActivityPageVo.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppActivityPageVo.java
@@ -22,6 +22,10 @@
     @ApiModelProperty(value = "活动名称")
     private String activityName;
 
+    @ApiModelProperty(value = "活动简介")
+    private String activityIntroduce;
+
+
     @ApiModelProperty(value = "活动开始时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date activityStartTime;
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppSimpleActivityGoodsVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppSimpleActivityGoodsVo.java
index 877fa7e..bd28c28 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppSimpleActivityGoodsVo.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppSimpleActivityGoodsVo.java
@@ -35,7 +35,7 @@
     private String goodsTag;
 
     @ApiModelProperty(value = "商品调理问题")
-    private BigDecimal goodsNurses;
+    private String goodsNurses;
 
     @ApiModelProperty(value = "商品售价")
     private BigDecimal salesPrice;
@@ -57,4 +57,13 @@
 
     @ApiModelProperty(value = "结束时间")
     private Date endTime;
+
+    @ApiModelProperty(value = "限购标记0否1是")
+    private Integer purchaseLimitationFlag;
+
+    @ApiModelProperty(value = "限购数量")
+    private Integer limitNumber;
+
+    @ApiModelProperty(value = "还可以购买数量")
+    private Integer availableBuyNum;
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtActivityGetVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtActivityGetVo.java
index 2242f41..b82eb1e 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtActivityGetVo.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtActivityGetVo.java
@@ -24,6 +24,9 @@
     @ApiModelProperty(value = "活动名称")
     private String activityName;
 
+    @ApiModelProperty(value = "活动简介")
+    private String activityIntroduce;
+
     @ApiModelProperty(value = "活动开始时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date activityStartTime;
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/activity/ActivityMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/activity/ActivityMapper.java
index 741dab4..1cd14ff 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/activity/ActivityMapper.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/activity/ActivityMapper.java
@@ -6,6 +6,7 @@
 import com.ruoyi.goods.domain.pojo.activity.Activity;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.goods.domain.vo.*;
+import com.ruoyi.system.api.domain.dto.AGStockChangeDto;
 import com.ruoyi.system.api.domain.dto.MerPageDto;
 import org.apache.ibatis.annotations.Param;
 
@@ -87,4 +88,24 @@
      * @return  List<AppActivityPageVo>
      */
     List<AppActivityPageVo> pageAppActivity(Page page, @Param("shopId")Long shopId);
+
+    /**
+     * @description  活动商品库存变化
+     * @author  jqs
+     * @date    2023/7/13 13:53
+     * @param
+     * @return  void
+     */
+    void addActivityGoodsStock(@Param("param")AGStockChangeDto agStockChangeDto);
+
+    void subActivityGoodsStock(@Param("param")AGStockChangeDto agStockChangeDto);
+
+    /**
+     * @description  判断活动是否售罄
+     * @author  jqs
+     * @date    2023/7/13 15:35
+     * @param activityId
+     * @return  Integer
+     */
+    Integer checkSellOut(@Param("activityId")String activityId);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/activity/ActivityService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/activity/ActivityService.java
index acb8310..f044207 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/activity/ActivityService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/activity/ActivityService.java
@@ -7,7 +7,9 @@
 import com.ruoyi.goods.domain.dto.MgtActivityRecordPageDto;
 import com.ruoyi.goods.domain.pojo.activity.Activity;
 import com.ruoyi.goods.domain.vo.*;
+import com.ruoyi.system.api.domain.dto.AGStockChangeDto;
 import com.ruoyi.system.api.domain.dto.ActivityGoodsGetDto;
+import com.ruoyi.system.api.domain.dto.ActivityTotalChangeDto;
 import com.ruoyi.system.api.domain.dto.MerPageDto;
 import com.ruoyi.system.api.domain.vo.ActivityGoodsGetVo;
 
@@ -150,4 +152,22 @@
      * @return  void
      */
     void endActivity(String activityId);
+    
+    /**
+     * @description  活动商品库存变化
+     * @author  jqs
+     * @date    2023/7/13 13:53
+     * @param 
+     * @return  void
+     */
+    void changeActivityTotal(ActivityTotalChangeDto activityTotalChangeDto);
+
+    /**
+     * @description  活动商品库存变化
+     * @author  jqs
+     * @date    2023/7/13 13:53
+     * @param
+     * @return  void
+     */
+    void changeActivityStock(AGStockChangeDto agStockChangeDto);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java
index 77d46a1..584441d 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java
@@ -24,10 +24,7 @@
 import com.ruoyi.system.api.constant.AppErrorConstant;
 import com.ruoyi.system.api.constant.DelayTaskEnum;
 import com.ruoyi.system.api.constant.SecurityConstant;
-import com.ruoyi.system.api.domain.dto.ActivityGoodsGetDto;
-import com.ruoyi.system.api.domain.dto.MerPageDto;
-import com.ruoyi.system.api.domain.dto.MgtBaseBathDto;
-import com.ruoyi.system.api.domain.dto.MgtUserIdByKeywordDto;
+import com.ruoyi.system.api.domain.dto.*;
 import com.ruoyi.system.api.domain.poji.activity.ActivityGoods;
 import com.ruoyi.system.api.domain.poji.config.DelayTask;
 import com.ruoyi.system.api.domain.vo.ActivityGoodsGetVo;
@@ -37,6 +34,9 @@
 import com.ruoyi.system.api.service.RemoteConfigService;
 import com.ruoyi.system.api.service.RemoteMemberService;
 import com.ruoyi.system.api.service.RemoteShopService;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -84,6 +84,8 @@
     @Resource
     private RedisService redisService;
 
+    @Autowired
+    private RedissonClient redissonClient;
 
     /**
      * @param mgtActivityEditDto
@@ -130,13 +132,12 @@
         // 根据当前时间和活动时间判断活动状态
         if (nowTime.compareTo(activityStartTime) < 0) {
             activity.setActivityStatus(0);
-        } else if (nowTime.compareTo(activityStartTime) >= 0 && nowTime.compareTo(activityEndTime) <= 0) {
-            activity.setActivityStatus(1);
-        } else if (nowTime.compareTo(activityEndTime) > 0) {
-            activity.setActivityStatus(2);
+        } else {
+            throw new ServiceException(AppErrorConstant.ACTIVITY_TIME_ERROR);
         }
         // 设置活动信息
         activity.setActivityName(mgtActivityEditDto.getActivityName());
+        activity.setActivityIntroduce(mgtActivityEditDto.getActivityIntroduce());
         activity.setActivityStartTime(activityStartTime);
         activity.setActivityEndTime(activityEndTime);
         activity.setGroupBuyNumber(mgtActivityEditDto.getGroupBuyNumber());
@@ -164,6 +165,7 @@
                         activityGoods.setActivityPrice(dto.getActivityPrice());
                         activityGoods.setActivitySubscription(dto.getActivitySubscription());
                         activityGoods.setActivityNumber(dto.getActivityNumber());
+                        activityGoods.setSalesNumber(0);
                         activityGoods.setActivityDeadline(activity.getActivityEndTime());
                         activityGoods.setSellOutFlag(0);
                         activityGoods.setPurchaseLimitationFlag(activity.getPurchaseLimitationFlag());
@@ -173,6 +175,38 @@
             ).collect(Collectors.toList());
             if (!activityGoodsList.isEmpty()) {
                 activityGoodsService.saveBatch(activityGoodsList);
+            }
+        }
+        //如果活动在1小时内生成自动开始任务的延时任务
+        Date checkTime = DateUtils.addMinutes(new Date(),61);
+        if(checkTime.compareTo(activityStartTime)>0){
+            String activityId = activity.getActivityId();
+            long currentTimeMillis = System.currentTimeMillis();
+            long startTimeDifference = currentTimeMillis - activityStartTime.getTime();
+            long endTimeDifference = currentTimeMillis - activityEndTime.getTime();
+            // 查询延时任务
+            DelayTask startDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.ACTIVITY_START_TASK.getCode() + "-" + activityId).getData();
+            // 如果延时任务为空,创建延时任务控制活动定时开始和结束
+            if (startDelayTask == null) {
+                redisService.setCacheObject(DelayTaskEnum.ACTIVITY_START_TASK.getCode() + "-" + activityId, activityStartTime, startTimeDifference, TimeUnit.MILLISECONDS);
+                startDelayTask = new DelayTask();
+                startDelayTask.setDelFlag(0);
+                startDelayTask.setCreateTime(new Date());
+                startDelayTask.setEndTime(activityStartTime);
+                startDelayTask.setRedisKey(DelayTaskEnum.ACTIVITY_START_TASK.getCode() + "-" + activityId);
+                remoteConfigService.addDelayTask(startDelayTask);
+            }
+            // 查询延时任务
+            DelayTask endDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.ACTIVITY_START_TASK.getCode() + "-" + activityId).getData();
+            // 如果延时任务为空,创建延时任务控制活动定时开始和结束
+            if (endDelayTask == null) {
+                redisService.setCacheObject(DelayTaskEnum.ACTIVITY_END_TASK.getCode() + "-" + activityId, activityEndTime, endTimeDifference, TimeUnit.MILLISECONDS);
+                endDelayTask = new DelayTask();
+                endDelayTask.setDelFlag(0);
+                endDelayTask.setCreateTime(new Date());
+                endDelayTask.setEndTime(activityEndTime);
+                endDelayTask.setRedisKey(DelayTaskEnum.ACTIVITY_END_TASK.getCode() + "-" + activityId);
+                remoteConfigService.addDelayTask(endDelayTask);
             }
         }
     }
@@ -469,4 +503,63 @@
             this.saveOrUpdate(activity);
         }
     }
+
+    /**
+     * @description  活动商品库存变化
+     * @author  jqs
+     * @date    2023/7/13 13:53
+     * @param
+     * @return  void
+     */
+    @Override
+    public void changeActivityTotal(ActivityTotalChangeDto activityTotalChangeDto){
+
+        RLock lock = redissonClient.getLock("activity_clock_"+activityTotalChangeDto.getActivityId());
+        try {
+            lock.lock(30, TimeUnit.SECONDS);
+            //判断活动商品是否售罄,是则停止活动
+            /*Integer noSellOut = activityMapper.checkSellOut(activityTotalChangeDto.getActivityId());
+            if(noSellOut==0){
+                endActivity(activityTotalChangeDto.getActivityId());
+            }*/
+            //更新活动统计
+            ActivityTotal activityTotal = activityTotalService.getById(activityTotalChangeDto.getActivityId());
+            if(activityTotalChangeDto.getChangeType()==1){
+                activityTotal.setOrderTotal(activityTotal.getOrderTotal()+activityTotalChangeDto.getChangeNum());
+                activityTotal.setPersonTotal(activityTotal.getPersonTotal()+activityTotalChangeDto.getPersonNum());
+                activityTotal.setOrderMoneyTotal(activityTotal.getOrderMoneyTotal().add(activityTotalChangeDto.getMoney()));
+            }else{
+                activityTotal.setOrderTotal(activityTotal.getOrderTotal()-activityTotalChangeDto.getChangeNum());
+                activityTotal.setPersonTotal(activityTotal.getPersonTotal()-activityTotalChangeDto.getPersonNum());
+                activityTotal.setRefundTotal(activityTotal.getRefundTotal()+activityTotalChangeDto.getRefundNum());
+                activityTotal.setOrderMoneyTotal(activityTotal.getOrderMoneyTotal().subtract(activityTotalChangeDto.getMoney()));
+            }
+            activityTotalService.saveOrUpdate(activityTotal);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * @description  活动商品库存变化
+     * @author  jqs
+     * @date    2023/7/13 13:53
+     * @param
+     * @return  void
+     */
+    @Override
+    public void changeActivityStock(AGStockChangeDto agStockChangeDto){
+        RLock lock = redissonClient.getLock("stock_clock_"+agStockChangeDto.getActivityId()+"_"+agStockChangeDto.getGoodsId());
+        try {
+            lock.lock(30, TimeUnit.SECONDS);
+            if(agStockChangeDto.getChangeType()==1){
+                activityMapper.addActivityGoodsStock(agStockChangeDto);
+            }else{
+                //更新库存
+                activityMapper.subActivityGoodsStock(agStockChangeDto);
+            }
+        } finally {
+            lock.unlock();
+        }
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java
index d086cb6..1e5f1b5 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java
@@ -566,6 +566,12 @@
             // 设置销售百分比和时间戳
             appSimpleActivityGoodsVo.setSalesPercent(salesPercent);
             appSimpleActivityGoodsVo.setTimestamp(appSimpleActivityGoodsVo.getEndTime().getTime());
+            //限购判断
+            if(appSimpleActivityGoodsVo.getPurchaseLimitationFlag()==1){
+                Integer buyNum = activityRecordService.getUserActivityGoodsNum(appSimpleActivityGoodsVo.getGoodsId(),appActivityGoodsPageDto.getActivityId(),appActivityGoodsPageDto.getUserId());
+                Integer limitBuyNum = appSimpleActivityGoodsVo.getLimitNumber() - buyNum;
+                appSimpleActivityGoodsVo.setAvailableBuyNum(limitBuyNum);
+            }
         }
         // 返回结果
         return appSimpleGoodsVoList;
diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/activity/ActivityMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/activity/ActivityMapper.xml
index 284797e..7b50681 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/activity/ActivityMapper.xml
+++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/activity/ActivityMapper.xml
@@ -126,13 +126,35 @@
             ta.activity_end_time activityEndTime,
             CASE ta.activity_status
                 WHEN 0 THEN '未开始'
-                WHEN 1 THEN '进行中'
+                WHEN 1 THEN '抢购中'
                 WHEN 2 THEN '已结束'
                 END activityStatus,
             ta.propaganda_poster propagandaPoster,
+            ta.activity_introduce activityIntroduce
         FROM t_activity ta
-        WHERE ta.del_flag = 0 AND FIND_IN_SET(#{shopId}, ta.applicable_shop) &gt; 0
+        WHERE ta.del_flag = 0 AND (ta.shop_flag = 1 OR (ta.shop_flag = 2 AND FIND_IN_SET(#{shopId}, ta.applicable_shop) &gt; 0))
         group by ta.activity_id
         ORDER BY ta.activity_status ASC,ta.create_time DESC
     </select>
+
+    <update id="addActivityGoodsStock">
+        UPDATE t_activity_goods
+        SET sales_number = sales_number - #{param.changeNum},
+            sell_out_flag =  0,
+            sell_out_time = NULL
+        WHERE activity_id = #{param.activityId} AND goods_id = #{param.goodsId}
+    </update>
+
+    <update id="subActivityGoodsStock">
+        UPDATE t_activity_goods
+        SET sales_number = sales_number + #{param.changeNum},
+            sell_out_flag = CASE WHEN sales_number + #{param.changeNum} = activity_number THEN 1 ELSE sell_out_flag END,
+            sell_out_time = CASE WHEN sales_number + #{param.changeNum} = activity_number THEN NOW() ELSE sell_out_time END
+        WHERE activity_id = #{param.activityId} AND goods_id = #{param.goodsId} AND sales_number + #{param.changeNum} &lt;= activity_number
+    </update>
+
+    <select id="checkSellOut" resultType="java.lang.Integer">
+        SELECT COUNT(ag_id) FROM t_activity_goods
+        WHERE del_flag = 0 AND activity_id = #{activityId} AND sell_out_flag = 0
+    </select>
 </mapper>
diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml
index 3c4e25e..9a8a9ef 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml
+++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml
@@ -263,7 +263,7 @@
         END goodsTag,
         IFNULL(tsg.sales_price,tg.sales_price) salesPrice,
         tgf.file_url goodsPicture,
-        tg.goods_tags goodsNurses
+        tg.goods_nurses goodsNurses
         FROM t_goods tg
         LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1
         LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{param.shopId}
@@ -290,7 +290,7 @@
         GREATEST(tg.sales_price, IFNULL(tsg.sales_price, 0.00)) salesPrice,
         tag.activity_price activityPrice,
         tgf.file_url goodsPicture,
-        tg.goods_tags goodsNurses,
+        tg.goods_nurses goodsNurses,
         tag.activity_number activityNumber,
         tag.sales_number salesNumber,
         tag.activity_deadline endTime
@@ -474,10 +474,12 @@
         GREATEST(tg.sales_price, IFNULL(tsg.sales_price, 0.00)) salesPrice,
         tag.activity_price activityPrice,
         tgf.file_url goodsPicture,
-        tg.goods_tags goodsNurses,
+        tg.goods_nurses goodsNurses,
         tag.activity_number activityNumber,
         tag.sales_number salesNumber,
-        tag.activity_deadline endTime
+        tag.activity_deadline endTime,
+        tag.purchase_limitation_flag purchaseLimitationFlag,
+        tag.limit_number limitNumber
         FROM t_activity_goods tag
         INNER JOIN t_goods tg ON tg.goods_id = tag.goods_id
         LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1
diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java
index 4de2aa3..a2d3a23 100644
--- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java
+++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java
@@ -99,4 +99,29 @@
         return R.ok();
     }
 
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  R
+     */
+    @PostMapping("/useMemberCoupon")
+    public R useMemberCoupon(@RequestBody String memberCouponIds){
+        memberCouponService.useMemberCoupon(memberCouponIds);
+        return R.ok();
+    }
+
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  R
+     */
+    @PostMapping("/backMemberCoupon")
+    public R backMemberCoupon(@RequestBody String memberCouponIds){
+        memberCouponService.backMemberCoupon(memberCouponIds);
+        return R.ok();
+    }
 }
diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberCouponMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberCouponMapper.java
index d560ee6..3ab8f3f 100644
--- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberCouponMapper.java
+++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberCouponMapper.java
@@ -46,4 +46,24 @@
      * @return  void
      */
     void timingCheckMemberCoupon();
+
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  void
+     */
+    void useMemberCoupon(@Param("memberCouponIds")String memberCouponIds);
+
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  void
+     */
+    void backMemberCoupon(@Param("memberCouponIds")String memberCouponIds);
+
+
 }
diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/coupon/CouponService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/coupon/CouponService.java
index f7e6f8a..baf8025 100644
--- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/coupon/CouponService.java
+++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/coupon/CouponService.java
@@ -190,4 +190,6 @@
      * @return  void
      */
     void autoTimeSendCoupon(String couponId);
+
+
 }
diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java
index 6f8c7c8..1f7a536 100644
--- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java
+++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java
@@ -1124,4 +1124,5 @@
         memberCouponService.save(memberCoupon);
         memberCouponRecordService.updateMemberCouponRecord(coupon,userId,1);
     }
+
 }
diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java
index 93cce9d..e127461 100644
--- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java
+++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java
@@ -225,4 +225,28 @@
     public void timingCheckMemberCoupon(){
         memberCouponMapper.timingCheckMemberCoupon();
     }
+
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  void
+     */
+    @Override
+    public void useMemberCoupon(String memberCouponIds){
+        memberCouponMapper.useMemberCoupon(memberCouponIds);
+    }
+
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  void
+     */
+    @Override
+    public void backMemberCoupon(String memberCouponIds){
+        memberCouponMapper.backMemberCoupon(memberCouponIds);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
index 5308a00..cf95a7c 100644
--- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
+++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
@@ -1391,10 +1391,15 @@
         }
         //消费变动
         if (memberTotalChangeDto.getPayMoney() != null) {
-            memberTotal.setTotalPayMoney(memberTotal.getTotalPayMoney().add(memberTotalChangeDto.getPayMoney()));
-            memberTotal.setTotalPayCount(memberTotal.getTotalPayCount() + 1);
-            memberTotal.setLastPayMoney(memberTotalChangeDto.getPayMoney());
-            memberTotal.setLastPayTime(memberTotalChangeDto.getPayTime());
+            if(memberTotalChangeDto.getPayMoney().compareTo(BigDecimal.ZERO)>=0){
+                memberTotal.setTotalPayMoney(memberTotal.getTotalPayMoney().add(memberTotalChangeDto.getPayMoney()));
+                memberTotal.setTotalPayCount(memberTotal.getTotalPayCount() + 1);
+                memberTotal.setLastPayMoney(memberTotalChangeDto.getPayMoney());
+                memberTotal.setLastPayTime(memberTotalChangeDto.getPayTime());
+            }else{
+                memberTotal.setTotalPayMoney(memberTotal.getTotalPayMoney().add(memberTotalChangeDto.getPayMoney()));
+                memberTotal.setTotalPayCount(memberTotal.getTotalPayCount() - 1);
+            }
         }
         //服务次数变动
         if (memberTotalChangeDto.getServiceCount() != null) {
diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java
index ddab223..3c8875d 100644
--- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java
+++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java
@@ -75,4 +75,22 @@
      * @return  void
      */
     void timingCheckMemberCoupon();
+
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  void
+     */
+    void useMemberCoupon(String memberCouponIds);
+
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  void
+     */
+    void backMemberCoupon(String memberCouponIds);
 }
diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberCouponMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberCouponMapper.xml
index 26da9b2..d19f0ce 100644
--- a/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberCouponMapper.xml
+++ b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberCouponMapper.xml
@@ -189,8 +189,18 @@
     </select>
 
     <update id="timingCheckMemberCoupon">
-        UPDATE t_member_coupon
-        SET coupon_status = 0
+        UPDATE t_member_coupon SET coupon_status = 0
         WHERE del_flag = 0 AND  coupon_status = 1 AND deadline_time &lt; CURDATE()
     </update>
+
+    <update id="useMemberCoupon">
+        UPDATE t_member_coupon SET coupon_status = 2
+        WHERE del_flag = 0 AND coupon_status = 1 AND FIND_IN_SET(id, #{memberCouponIds}) &gt; 0
+    </update>
+
+    <update id="backMemberCoupon">
+        UPDATE t_member_coupon SET coupon_status = 1
+        WHERE del_flag = 0 AND coupon_status = 2 AND FIND_IN_SET(id, #{memberCouponIds}) &gt; 0
+    </update>
+
 </mapper>
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/concole/OrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/concole/OrderController.java
index fb973f8..f3a8f1d 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/concole/OrderController.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/concole/OrderController.java
@@ -107,5 +107,16 @@
         return R.ok();
     }
 
-
+    /**
+     * @description  自动取消订单
+     * @author  jqs
+     * @date    2023/7/13 17:15
+     * @param orderId
+     * @return  R
+     */
+    @PostMapping("/autoCancelOrder")
+    public R autoCancelOrder(@RequestBody String orderId){
+        orderService.autoCancelOrder(orderId);
+        return R.ok();
+    }
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/account/OrderRefund.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/account/OrderRefund.java
index e15e486..4cfa669 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/account/OrderRefund.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/account/OrderRefund.java
@@ -1,15 +1,16 @@
 package com.ruoyi.order.domain.pojo.account;
 
-import java.util.Date;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
-
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * <p>
@@ -66,7 +67,7 @@
      * 退款金额
      */
     @TableField("refund_money")
-    private String refundMoney;
+    private BigDecimal refundMoney;
     /**
      * 退款理由
      */
@@ -76,7 +77,7 @@
      * 订单金额
      */
     @TableField("order_money")
-    private String orderMoney;
+    private BigDecimal orderMoney;
     /**
      * 退款出资商户
 REFUND_SOURCE_PARTNER_ADVANCE : 电商平台垫付,需要向微信支付申请开通
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java
index 989adcd..95d4645 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java
@@ -165,7 +165,7 @@
      * 活动id
      */
     @TableField("activity_id")
-    private Long activityId;
+    private String activityId;
 
     /**
      * 活动名称
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java
index 5b5a7f4..55acdf9 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java
@@ -523,5 +523,13 @@
      */
     List<MgtShopAllOrderPageVo> pageMgtShopAllOrder(Page page, @Param("param")MgtShopAllOrderPageDto mgtShopAllOrderPageDto);
 
-
+    /**
+     * @description  统计用户活动参与次数
+     * @author  jqs
+     * @date    2023/7/13 18:27
+     * @param userId
+     * @param activityId
+     * @return  Integer
+     */
+    Integer countUserActivityByActivity(@Param("userId")Long userId, @Param("activityId")String activityId);
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderGoodsServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderGoodsServiceImpl.java
index 9517583..05b018d 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderGoodsServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderGoodsServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.order.service.impl.order;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.order.domain.pojo.order.OrderGoods;
 import com.ruoyi.order.domain.vo.AppUserOrderGoodsPageVo;
@@ -50,4 +51,19 @@
     public List<MgtOrderGoodsDetailVo> listMgtVoByOrderId(String orderId){
         return orderGoodsMapper.listMgtVoByOrderId(orderId);
     }
+
+    /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/13 17:25
+     * @param orderId
+     * @return  List<OrderGoods>
+     */
+    @Override
+    public List<OrderGoods> listByOrderId(String orderId){
+        LambdaQueryWrapper<OrderGoods> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OrderGoods::getDelFlag,0);
+        queryWrapper.eq(OrderGoods::getOrderId,orderId);
+        return this.list(queryWrapper);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
index a0fa97a..6b2ad45 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -6,12 +6,14 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.uuid.IdUtils;
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.common.security.utils.CodeFactoryUtil;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.order.domain.dto.*;
+import com.ruoyi.order.domain.pojo.account.OrderRefund;
 import com.ruoyi.order.domain.pojo.order.ConsumerGoods;
 import com.ruoyi.order.domain.pojo.order.Order;
 import com.ruoyi.order.domain.pojo.order.OrderGoods;
@@ -23,8 +25,10 @@
 import com.ruoyi.order.service.order.OrderService;
 import com.ruoyi.order.service.order.UserServiceRecordService;
 import com.ruoyi.system.api.constant.AppErrorConstant;
+import com.ruoyi.system.api.constant.DelayTaskEnum;
 import com.ruoyi.system.api.constant.SecurityConstant;
 import com.ruoyi.system.api.domain.dto.*;
+import com.ruoyi.system.api.domain.poji.config.DelayTask;
 import com.ruoyi.system.api.domain.poji.goods.Goods;
 import com.ruoyi.system.api.domain.poji.goods.GoodsFile;
 import com.ruoyi.system.api.domain.poji.goods.ShopGoods;
@@ -35,11 +39,15 @@
 import com.ruoyi.system.api.domain.poji.sys.SysUser;
 import com.ruoyi.system.api.domain.vo.*;
 import com.ruoyi.system.api.service.*;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -96,6 +104,9 @@
     @Resource
     private RedisService redisService;
 
+    @Autowired
+    private RedissonClient redissonClient;
+
     /**
      * @description: buyGoods
      * @param: appSureOrderDto
@@ -106,9 +117,12 @@
     @Override
     public AppSureOrderVo buyGoods(AppSureOrderDto appSureOrderDto) {
         Long userId = appSureOrderDto.getUserId();
+        // 初始化订单对象
         AppSureOrderVo appSureOrderVo = new AppSureOrderVo();
+        // 初始化订单商品列表
         List<AppSureOrderGoodsVo> appSureOrderGoodsVoList = new ArrayList<>();
         AppSureOrderGoodsVo appSureOrderGoodsVo;
+        // 获取购买商品列表
         List<AppBuyGoodsDto> appBuyGoodsDtoList = appSureOrderDto.getAppBuyGoodsDtoList();
         String goodsId;
         Integer buyNum;
@@ -118,8 +132,11 @@
         BigDecimal goodsPrice;
         BigDecimal goodsTotalPrice;
         BigDecimal goodsRealPrice;
+        // 获取用户优惠券列表
         List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(userId).getData();
+        // 初始化商品优惠券列表
         List<AppMemberCouponVo> appGoodsMemberCouponVoList;
+        // 将优惠券列表转换为Map,以优惠券ID为键
         Map<String, AppMemberCouponVo> appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity()));
         AppMemberCouponVo appMemberCouponVo;
         Integer couponType;
@@ -129,27 +146,31 @@
         BigDecimal goodsDeposit;
         GoodsFile goodsFile;
         Integer useCoupon;
+        // 初始化订单相关金额
         BigDecimal orderGoodsMoney = new BigDecimal("0.00");
         BigDecimal couponDiscount = new BigDecimal("0.00");
         BigDecimal orderPayDeposit = new BigDecimal("0.00");
         BigDecimal orderPayMoney = new BigDecimal("0.00");
+        // 遍历购买商品列表
         for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) {
             appSureOrderGoodsVo = new AppSureOrderGoodsVo();
             useCoupon = 0;
             goodsId = appBuyGoodsDto.getGoodsId();
             buyNum = appBuyGoodsDto.getBuyNum();
             memberCouponId = appBuyGoodsDto.getMemberCouponId();
+            // 获取商品信息
             goods = remoteGoodsService.getGoods(goodsId).getData();
+            // 设置订单商品信息
             appSureOrderGoodsVo.setGoodsId(goodsId);
             appSureOrderGoodsVo.setGoodsName(goods.getGoodsName());
             appSureOrderGoodsVo.setGoodsIntroduction(goods.getGoodsIntroduction());
             appSureOrderGoodsVo.setGoodsType(goods.getGoodsType());
-            //商品图片
+            // 获取商品图片
             goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData();
             appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl());
             appSureOrderGoodsVo.setBuyNum(buyNum);
             goodsPrice = goods.getSalesPrice();
-            //商户定制价格
+            // 获取商户定制价格
             AppShopGoodsGetDto appShopGoodsGetDto = new AppShopGoodsGetDto();
             appShopGoodsGetDto.setGoodsId(goods.getGoodsId());
             appShopGoodsGetDto.setShopId(appSureOrderDto.getShopId());
@@ -161,6 +182,7 @@
             buyNumBig = BigDecimal.valueOf(buyNum);
             goodsTotalPrice = goodsPrice.multiply(buyNumBig);
             goodsRealPrice = goodsTotalPrice;
+            // 处理优惠券
             if (memberCouponId != null) {
                 appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId);
                 if (StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId)) {
@@ -193,28 +215,45 @@
                 goodsDeposit = new BigDecimal("0.00");
             }
             appSureOrderGoodsVo.setGoodsDeposit(goodsDeposit);
+            // 计算订单总金额
             orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice);
             couponDiscount = couponDiscount.add(discountMoney);
             orderPayDeposit = orderPayDeposit.add(goodsDeposit);
             orderPayMoney = orderPayMoney.add(goodsRealPrice);
-            //商品关联优惠券
+            // 获取商品关联优惠券
             appGoodsMemberCouponVoList = new ArrayList<>();
             if (appMemberCouponVoList != null && !appMemberCouponVoList.isEmpty()) {
                 for (AppMemberCouponVo entity : appMemberCouponVoList) {
                     if (StringUtils.isBlank(entity.getRelGoodsIds())) {
-                        appGoodsMemberCouponVoList.add(entity);
+                        if (entity.getCouponType() == 1 && entity.getMoneyThreshold() != null && entity.getDiscountMoney() != null) {
+                            moneyThreshold = entity.getMoneyThreshold();
+                            if (goodsTotalPrice.compareTo(moneyThreshold) >= 0) {
+                                appGoodsMemberCouponVoList.add(entity);
+                            }
+                        }else{
+                            appGoodsMemberCouponVoList.add(entity);
+                        }
                     } else if (entity.getRelGoodsIds().contains(goodsId)) {
-                        appGoodsMemberCouponVoList.add(entity);
+                        if (entity.getCouponType() == 1 && entity.getMoneyThreshold() != null && entity.getDiscountMoney() != null) {
+                            moneyThreshold = entity.getMoneyThreshold();
+                            if (goodsTotalPrice.compareTo(moneyThreshold) >= 0) {
+                                appGoodsMemberCouponVoList.add(entity);
+                            }
+                        }else{
+                            appGoodsMemberCouponVoList.add(entity);
+                        }
                     }
                 }
                 appSureOrderGoodsVo.setAppMemberCouponVoList(appGoodsMemberCouponVoList);
             }
             appSureOrderGoodsVoList.add(appSureOrderGoodsVo);
         }
+        // 设置订单相关金额
         appSureOrderVo.setOrderGoodsMoney(orderGoodsMoney);
         appSureOrderVo.setCouponDiscount(couponDiscount);
         appSureOrderVo.setOrderPayDeposit(orderPayDeposit);
         appSureOrderVo.setOrderPayMoney(orderPayMoney);
+        // 设置订单商品列表
         appSureOrderVo.setAppSureOrderGoodsVoList(appSureOrderGoodsVoList);
         return appSureOrderVo;
     }
@@ -348,6 +387,8 @@
         String orderGoodsId;
         // 创建商品类型集合,用于记录订单中所有商品的类型
         HashSet<String> goodsTypeSet = new HashSet<>();
+        //使用优惠券
+        StringJoiner memberCouponSJ = new StringJoiner(",");
         // 遍历购买的商品列表
         for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) {
             appSureOrderGoodsVo = new AppSureOrderGoodsVo();
@@ -411,6 +452,7 @@
                         useCoupon = 1;
                     }
                 }
+                memberCouponSJ.add(memberCouponId);
             }
             appSureOrderGoodsVo.setUseCoupon(useCoupon);
             appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice);
@@ -511,6 +553,22 @@
         appPlaceOrderVo.setOrderId(orderId);
         appPlaceOrderVo.setOrderNo(orderNo);
         // 调用支付
+        //使用优惠券
+        if(memberCouponSJ!=null){
+            remoteCouponService.useMemberCoupon(memberCouponSJ.toString());
+        }
+        //生成自动取消订单延时任务
+        Integer delayTime = 30;
+        if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){
+            delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME);
+        }
+        redisService.setCacheObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId, orderId, delayTime.longValue(), TimeUnit.MINUTES);
+        DelayTask delayTask = new DelayTask();
+        delayTask.setDelFlag(0);
+        delayTask.setCreateTime(new Date());
+        delayTask.setEndTime(DateUtils.addMinutes(new Date(),delayTime));
+        delayTask.setRedisKey(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId);
+        remoteConfigService.addDelayTask(delayTask);
         return appPlaceOrderVo;
     }
 
@@ -533,11 +591,18 @@
         String goodsId = appPlaceActivityDto.getGoodsId();
         Integer buyNum = appPlaceActivityDto.getBuyNum();
         //redis库存控制极简版
-        Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId);
-        if(surpNum==null||surpNum<buyNum){
-            throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL);
-        }else{
-            redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId,surpNum-buyNum);
+        String goodsLock = "goods_lock_"+activityId+"_"+goodsId;
+        RLock redissonLock = redissonClient.getLock(goodsLock);
+        try{
+            redissonLock.lock(30, TimeUnit.SECONDS);
+            Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId);
+            if(surpNum==null||surpNum<buyNum){
+                throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL);
+            }else{
+                redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId,surpNum-buyNum);
+            }
+        }finally{
+            redissonLock.unlock();
         }
         // 定义购买数量,服务数量,商品数量
         BigDecimal buyNumBig;
@@ -665,7 +730,7 @@
         order.setDelFlag(0);
         order.setOrderStatus(1);
         order.setOrderNo(orderNo);
-        order.setOrderFrom(1);
+        order.setOrderFrom(2);
         order.setShopId(appPlaceActivityDto.getShopId());
         order.setUserId(userId);
         order.setOrderMoney(orderGoodsMoney);
@@ -705,7 +770,28 @@
         // 设置订单ID和订单号
         appPlaceOrderVo.setOrderId(orderId);
         appPlaceOrderVo.setOrderNo(orderNo);
+        //改变活动库存
+        AGStockChangeDto agStockChangeDto = new AGStockChangeDto();
+        agStockChangeDto.setActivityId(activityId);
+        agStockChangeDto.setGoodsId(goodsId);
+        agStockChangeDto.setChangeType(2);
+        agStockChangeDto.setChangeNum(buyNum);
+        agStockChangeDto.setShopId(order.getShopId());
+        agStockChangeDto.setUserId(order.getUserId());
+        remoteActivityService.changeActivityStock(agStockChangeDto);
         // 调用支付
+        //生成自动取消订单延时任务
+        Integer delayTime = 30;
+        if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){
+            delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME);
+        }
+        redisService.setCacheObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId, orderId, delayTime.longValue(), TimeUnit.MINUTES);
+        DelayTask delayTask = new DelayTask();
+        delayTask.setDelFlag(0);
+        delayTask.setCreateTime(new Date());
+        delayTask.setEndTime(DateUtils.addMinutes(new Date(),delayTime));
+        delayTask.setRedisKey(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId);
+        remoteConfigService.addDelayTask(delayTask);
         return appPlaceOrderVo;
     }
 
@@ -790,12 +876,13 @@
     @Override
     public void cancelOrder(String orderId) {
         Order order = this.getById(orderId);
-        if (order.getOrderStatus() != 1) {
+        if (order.getOrderStatus() == 1) {
+            this.autoCancelOrder(orderId);
+        }else if(order.getOrderStatus() == 2){
+            this.refundOrder(orderId);
+        }else{
             throw new ServiceException(AppErrorConstant.CANCEL_ERROR_ORDER);
         }
-        order.setOrderStatus(0);
-        order.setCancelTime(new Date());
-        this.saveOrUpdate(order);
     }
 
     /**
@@ -1428,6 +1515,7 @@
         }
         ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto();
         shopTotalChangeDto.setShopId(order.getShopId());
+        shopTotalChangeDto.setOrderType(1);
         shopTotalChangeDto.setCycleMoney(cycleMoney);
         shopTotalChangeDto.setServiceMoney(serviceMoney);
         shopTotalChangeDto.setExperienceMoney(experienceMoney);
@@ -2802,4 +2890,314 @@
         }
         return shopAllOrderPageVoList;
     }
+
+    /**
+     * @description 自动取消订单
+     * @author  jqs
+     * @date    2023/7/13 17:15
+     * @param orderId
+     * @return  void
+     */
+    @Override
+    public void autoCancelOrder(String orderId){
+        //更新订单信息
+        Order order = this.getById(orderId);
+        order.setOrderStatus(0);
+        order.setCancelTime(new Date());
+        this.saveOrUpdate(order);
+        //活动订单回退库存
+        if(order.getOrderFrom()==2){
+            List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
+            if(orderGoodsList!=null&&!orderGoodsList.isEmpty()){
+                for(OrderGoods orderGoods : orderGoodsList){
+                    //redis库存控制极简版
+                    String goodsLock = "goods_lock_"+order.getActivityId()+"_"+orderGoods.getGoodsId();
+                    RLock redissonLock = redissonClient.getLock(goodsLock);
+                    try{
+                        redissonLock.lock(30, TimeUnit.SECONDS);
+                        Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+order.getActivityId()+"-"+orderGoods.getGoodsId());
+                        redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+order.getActivityId()+"-"+orderGoods.getGoodsId(),surpNum+orderGoods.getBuyNum());
+                    }finally{
+                        redissonLock.unlock();
+                    }
+                    //改变活动库存
+                    AGStockChangeDto agStockChangeDto = new AGStockChangeDto();
+                    agStockChangeDto.setActivityId(order.getActivityId());
+                    agStockChangeDto.setGoodsId(orderGoods.getGoodsId());
+                    agStockChangeDto.setChangeType(1);
+                    agStockChangeDto.setChangeNum(orderGoods.getBuyNum());
+                    agStockChangeDto.setShopId(order.getShopId());
+                    agStockChangeDto.setUserId(order.getUserId());
+                    remoteActivityService.changeActivityStock(agStockChangeDto);
+                }
+            }
+        }else{
+            if(order.getCouponMoney().compareTo(BigDecimal.ZERO)>0){
+                //回退优惠券
+                List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
+                if(orderGoodsList!=null&&!orderGoodsList.isEmpty()) {
+                    StringJoiner memberCouponSJ = new StringJoiner(",");
+                    for (OrderGoods orderGoods : orderGoodsList) {
+                        memberCouponSJ.add(orderGoods.getCouponId());
+                    }
+                    if(memberCouponSJ!=null){
+                        remoteCouponService.backMemberCoupon(memberCouponSJ.toString());
+
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * @description  订单支付回调
+     * @author  jqs
+     * @date    2023/7/13 17:57
+     * @param orderId
+     * @return  void
+     */
+    @Override
+    public void payBack(String orderId) {
+        // 更新订单状态
+        Order order = this.getById(orderId);
+        order.setOrderStatus(2);
+        order.setPayTime(new Date());
+        this.saveOrUpdate(order);
+        // 初始化各类商品的收款金额
+        BigDecimal cycleMoney = new BigDecimal("0.00");
+        BigDecimal experienceMoney = new BigDecimal("0.00");
+        BigDecimal serviceMoney = new BigDecimal("0.00");
+        BigDecimal goodsMoney = new BigDecimal("0.00");
+        // 初始化各类商品的存在状态
+        Boolean haveCycle = false;
+        Boolean haveService = false;
+        Boolean haveExperience = false;
+        Boolean haveGoods = false;
+        // 获取订单中的所有商品
+        List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
+        // 遍历订单中的所有商品,根据商品类型累加收款金额,并标记商品存在状态
+        for (OrderGoods orderGoods : orderGoodsList) {
+            switch (orderGoods.getGoodsType()) {
+                case 1:
+                    cycleMoney = cycleMoney.add(orderGoods.getGoodsReceivableMoney());
+                    haveCycle = true;
+                    break;
+                case 2:
+                    serviceMoney = serviceMoney.add(orderGoods.getGoodsReceivableMoney());
+                    haveService = true;
+                    break;
+                case 3:
+                    experienceMoney = experienceMoney.add(orderGoods.getGoodsReceivableMoney());
+                    haveExperience = true;
+                    break;
+                case 4:
+                    goodsMoney = goodsMoney.add(orderGoods.getGoodsReceivableMoney());
+                    haveGoods = true;
+                    break;
+                default:
+                    break;
+            }
+        }
+        // 更新商户统计信息
+        ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto();
+        shopTotalChangeDto.setShopId(order.getShopId());
+        shopTotalChangeDto.setOrderType(1);
+        shopTotalChangeDto.setCycleMoney(cycleMoney);
+        shopTotalChangeDto.setServiceMoney(serviceMoney);
+        shopTotalChangeDto.setExperienceMoney(experienceMoney);
+        shopTotalChangeDto.setGoodsMoney(goodsMoney);
+        remoteShopService.changeShopTotal(shopTotalChangeDto);
+        // 初始化会员统计信息
+        MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto();
+        memberTotalChangeDto.setUserId(order.getUserId());
+        // 如果存在积分兑换比例,则计算积分
+        if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) {
+            Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL);
+            BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue);
+            BigDecimal integralBig = moneyValueBig.multiply(order.getPayMoney());
+            Integer integral = Integer.valueOf(integralBig.toString());
+            memberTotalChangeDto.setChangeIntegral(integral);
+            memberTotalChangeDto.setTypeIntegral(1);
+        }
+        // 设置会员支付金额和支付时间
+        memberTotalChangeDto.setPayMoney(order.getPayMoney());
+        memberTotalChangeDto.setPayTime(new Date());
+        // 根据商品存在状态,设置会员统计信息
+        if (haveCycle) {
+            memberTotalChangeDto.setCycleOrderChange(1);
+        }
+        if (haveService) {
+            memberTotalChangeDto.setServiceOrderChange(1);
+        }
+        if (haveExperience) {
+            memberTotalChangeDto.setExperienceOrderChange(1);
+        }
+        if (haveGoods) {
+            memberTotalChangeDto.setGoodsOrderChange(1);
+        }
+        // 更新会员统计信息
+        remoteMemberService.changeMemberTotal(memberTotalChangeDto);
+        // 如果订单来源于活动,则更新活动统计信息
+        if (order.getOrderFrom() == 2) {
+            ActivityTotalChangeDto activityTotalChangeDto = new ActivityTotalChangeDto();
+            activityTotalChangeDto.setActivityId(order.getActivityId());
+            activityTotalChangeDto.setChangeType(1);
+            activityTotalChangeDto.setChangeNum(1);
+            activityTotalChangeDto.setMoney(order.getPayMoney());
+            Integer userActivityNum = orderMapper.countUserActivityByActivity(order.getUserId(), order.getActivityId());
+            if (userActivityNum == 1) {
+                activityTotalChangeDto.setPersonNum(1);
+            } else {
+                activityTotalChangeDto.setPersonNum(0);
+            }
+            activityTotalChangeDto.setUserId(order.getUserId());
+            remoteActivityService.changeActivityTotal(activityTotalChangeDto);
+        }
+    }
+
+    /**
+     * @description  订单退款
+     * @author  jqs
+     * @date    2023/7/13 18:36
+     * @param orderId
+     * @return  void
+     */
+    @Override
+    public void refundOrder(String orderId){
+        //更新订单信息
+        Order order = this.getById(orderId);
+        order.setOrderStatus(0);
+        order.setCancelTime(new Date());
+        this.saveOrUpdate(order);
+        OrderRefund orderRefund = new OrderRefund();
+        String refundId = IdUtils.simpleUUID();
+        orderRefund.setRefundId(refundId);
+        orderRefund.setDelFlag(0);
+        orderRefund.setRefundType(1);
+        orderRefund.setOrderId(order.getOrderId());
+        orderRefund.setUserId(order.getUserId());
+        orderRefund.setShopId(order.getShopId());
+        orderRefund.setRefundMoney(order.getPayMoney());
+        orderRefund.setOrderMoney(order.getPayMoney());
+        orderRefund.setCreateTime(new Date());
+        // 初始化各类商品的收款金额
+        BigDecimal cycleMoney = new BigDecimal("0.00");
+        BigDecimal experienceMoney = new BigDecimal("0.00");
+        BigDecimal serviceMoney = new BigDecimal("0.00");
+        BigDecimal goodsMoney = new BigDecimal("0.00");
+        // 初始化各类商品的存在状态
+        Boolean haveCycle = false;
+        Boolean haveService = false;
+        Boolean haveExperience = false;
+        Boolean haveGoods = false;
+        List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
+        if(orderGoodsList!=null&&!orderGoodsList.isEmpty()){
+            StringJoiner memberCouponSJ = new StringJoiner(",");
+            for(OrderGoods orderGoods : orderGoodsList){
+                if(order.getOrderFrom()==2){
+                    //redis库存控制极简版
+                    //活动订单回退库存
+                    String goodsLock = "goods_lock_"+order.getActivityId()+"_"+orderGoods.getGoodsId();
+                    RLock redissonLock = redissonClient.getLock(goodsLock);
+                    try{
+                        redissonLock.lock(30, TimeUnit.SECONDS);
+                        Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+order.getActivityId()+"-"+orderGoods.getGoodsId());
+                        redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+order.getActivityId()+"-"+orderGoods.getGoodsId(),surpNum+orderGoods.getBuyNum());
+                    }finally{
+                        redissonLock.unlock();
+                    }
+                    //改变活动库存
+                    AGStockChangeDto agStockChangeDto = new AGStockChangeDto();
+                    agStockChangeDto.setActivityId(order.getActivityId());
+                    agStockChangeDto.setGoodsId(orderGoods.getGoodsId());
+                    agStockChangeDto.setChangeType(1);
+                    agStockChangeDto.setChangeNum(orderGoods.getBuyNum());
+                    agStockChangeDto.setShopId(order.getShopId());
+                    agStockChangeDto.setUserId(order.getUserId());
+                    remoteActivityService.changeActivityStock(agStockChangeDto);
+                }else{
+                    memberCouponSJ.add(orderGoods.getCouponId());
+                }
+                switch (orderGoods.getGoodsType()) {
+                    case 1:
+                        cycleMoney = cycleMoney.add(orderGoods.getGoodsReceivableMoney());
+                        haveCycle = true;
+                        break;
+                    case 2:
+                        serviceMoney = serviceMoney.add(orderGoods.getGoodsReceivableMoney());
+                        haveService = true;
+                        break;
+                    case 3:
+                        experienceMoney = experienceMoney.add(orderGoods.getGoodsReceivableMoney());
+                        haveExperience = true;
+                        break;
+                    case 4:
+                        goodsMoney = goodsMoney.add(orderGoods.getGoodsReceivableMoney());
+                        haveGoods = true;
+                        break;
+                    default:
+                        break;
+                }
+            }
+            //回退优惠券
+            if(memberCouponSJ!=null){
+                remoteCouponService.backMemberCoupon(memberCouponSJ.toString());
+            }
+        }
+        // 更新商户统计信息
+        ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto();
+        shopTotalChangeDto.setOrderType(2);
+        shopTotalChangeDto.setShopId(order.getShopId());
+        shopTotalChangeDto.setCycleMoney(cycleMoney);
+        shopTotalChangeDto.setServiceMoney(serviceMoney);
+        shopTotalChangeDto.setExperienceMoney(experienceMoney);
+        shopTotalChangeDto.setGoodsMoney(goodsMoney);
+        remoteShopService.changeShopTotal(shopTotalChangeDto);
+        // 初始化会员统计信息
+        MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto();
+        memberTotalChangeDto.setUserId(order.getUserId());
+        // 如果存在积分兑换比例,则计算积分
+        /*if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) {
+            Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL);
+            BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue);
+            BigDecimal integralBig = moneyValueBig.multiply(order.getPayMoney());
+            Integer integral = Integer.valueOf(integralBig.toString());
+            memberTotalChangeDto.setChangeIntegral(integral);
+            memberTotalChangeDto.setTypeIntegral(2);
+        }*/
+        // 设置会员支付金额和支付时间
+        memberTotalChangeDto.setPayMoney(order.getPayMoney().negate());
+        // 根据商品存在状态,设置会员统计信息
+        if (haveCycle) {
+            memberTotalChangeDto.setCycleOrderChange(-1);
+        }
+        if (haveService) {
+            memberTotalChangeDto.setServiceOrderChange(-1);
+        }
+        if (haveExperience) {
+            memberTotalChangeDto.setExperienceOrderChange(-1);
+        }
+        if (haveGoods) {
+            memberTotalChangeDto.setGoodsOrderChange(-1);
+        }
+        // 更新会员统计信息
+        remoteMemberService.changeMemberTotal(memberTotalChangeDto);
+        // 如果订单来源于活动,则更新活动统计信息
+        if (order.getOrderFrom() == 2) {
+            ActivityTotalChangeDto activityTotalChangeDto = new ActivityTotalChangeDto();
+            activityTotalChangeDto.setActivityId(order.getActivityId());
+            activityTotalChangeDto.setChangeType(2);
+            activityTotalChangeDto.setChangeNum(1);
+            activityTotalChangeDto.setRefundNum(1);
+            activityTotalChangeDto.setMoney(order.getPayMoney());
+            Integer userActivityNum = orderMapper.countUserActivityByActivity(order.getUserId(), order.getActivityId());
+            if (userActivityNum > 0) {
+                activityTotalChangeDto.setPersonNum(1);
+            } else {
+                activityTotalChangeDto.setPersonNum(0);
+            }
+            activityTotalChangeDto.setUserId(order.getUserId());
+            remoteActivityService.changeActivityTotal(activityTotalChangeDto);
+        }
+    }
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderGoodsService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderGoodsService.java
index dbe8b1a..8fb0ee2 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderGoodsService.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderGoodsService.java
@@ -34,4 +34,13 @@
      * @return  List<MgtOrderGoodsDetailVo>
      */
     List<MgtOrderGoodsDetailVo> listMgtVoByOrderId(String orderId);
+
+    /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/13 17:25
+     * @param orderId
+     * @return  List<OrderGoods>
+     */
+    List<OrderGoods> listByOrderId(String orderId);
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
index 8db8bc2..233b0fb 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
@@ -398,4 +398,28 @@
      * @return  List<MgtShopAllOrderPageVo>
      */
     List<MgtShopAllOrderPageVo> pageMgtShopAllOrder(Page page, MgtShopAllOrderPageDto mgtShopAllOrderPageDto);
+
+    /**
+     * @description 自动取消订单
+     * @author  jqs
+     * @date    2023/7/13 17:15
+     * @param orderId
+     * @return  void
+     */
+    void autoCancelOrder(String orderId);
+
+    /**
+     * @description  订单支付回调
+     * @author  jqs
+     * @date    2023/7/13 17:57
+     * @param orderId
+     * @return  void
+     */
+    void payBack(String orderId);
+
+    /**
+     * 取消订单
+     * @param orderId
+     */
+    void refundOrder(String orderId);
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
index 0fc8589..23e3b35 100644
--- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
+++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -1456,4 +1456,11 @@
         </if>
         ORDER BY toc.create_time DESC
     </select>
+
+
+    <select id="countUserActivityByActivity" resultType="java.lang.Integer">
+        SELECT COUNT(order_id)
+        FROM t_order
+        WHERE del_flag = 0 AND order_from =2 AND user_id = #{userId} AND activity_id = #{activityId} AND order_status &gt; 0
+    </select>
 </mapper>
diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopTotalServiceImpl.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopTotalServiceImpl.java
index 73ece42..eecc004 100644
--- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopTotalServiceImpl.java
+++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopTotalServiceImpl.java
@@ -5,15 +5,15 @@
 import com.ruoyi.shop.mapper.shop.ShopTotalMapper;
 import com.ruoyi.shop.service.shop.ShopTotalService;
 import com.ruoyi.system.api.domain.dto.ShopTotalChangeDto;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.TimeUnit;
 
 /**
  * <p>
@@ -26,8 +26,9 @@
 @Service
 public class ShopTotalServiceImpl extends ServiceImpl<ShopTotalMapper, ShopTotal> implements ShopTotalService {
 
-    private Lock lock = new ReentrantLock();
-    private ExecutorService executor = Executors.newSingleThreadExecutor();
+    @Autowired
+    private RedissonClient redissonClient;
+
     @Resource
     private ShopTotalMapper shopTotalMapper;
 
@@ -39,14 +40,14 @@
      */
     @Override
     public void changeShopTotal(ShopTotalChangeDto shopTotalChangeDto) {
-        executor.execute(() -> {
-            lock.lock();
-            try {
-                handleShopTotal(shopTotalChangeDto);
-            } finally {
-                lock.unlock();
-            }
-        });
+        //redis库存控制极简版
+        RLock redissonLock = redissonClient.getLock("shop_total_"+shopTotalChangeDto.getShopId());
+        try{
+            redissonLock.lock(30, TimeUnit.SECONDS);
+            handleShopTotal(shopTotalChangeDto);
+        }finally{
+            redissonLock.unlock();
+        }
     }
 
     @Override
@@ -59,34 +60,52 @@
         ShopTotal shopTotal = this.getById(shopTotalChangeDto.getShopId());
         //订单变化
         BigDecimal payMoney = BigDecimal.ZERO;
-        Boolean haveOrder = false;
-        if(shopTotalChangeDto.getCycleMoney()!=null){
-            shopTotal.setTotalCycleMoney(shopTotal.getTotalCycleMoney().add(shopTotalChangeDto.getCycleMoney()));
-            payMoney = payMoney.add(shopTotalChangeDto.getCycleMoney());
-            shopTotal.setTotalCycleOrder(shopTotal.getTotalCycleOrder()+1);
-            haveOrder = true;
-        }
-        if(shopTotalChangeDto.getExperienceMoney()!=null){
-            shopTotal.setTotalExperienceMoney(shopTotal.getTotalExperienceMoney().add(shopTotalChangeDto.getExperienceMoney()));
-            payMoney = payMoney.add(shopTotalChangeDto.getExperienceMoney());
-            shopTotal.setTotalExperienceOrder(shopTotal.getTotalExperienceOrder()+1);
-            haveOrder = true;
-        }
-        if(shopTotalChangeDto.getServiceMoney()!=null){
-            shopTotal.setTotalServiceMoney(shopTotal.getTotalServiceMoney().add(shopTotalChangeDto.getServiceMoney()));
-            payMoney = payMoney.add(shopTotalChangeDto.getServiceMoney());
-            shopTotal.setTotalServiceOrder(shopTotal.getTotalServiceOrder()+1);
-            haveOrder = true;
-        }
-        if(shopTotalChangeDto.getGoodsMoney()!=null){
-            shopTotal.setTotalGoodsMoney(shopTotal.getTotalGoodsMoney().add(shopTotalChangeDto.getGoodsMoney()));
-            payMoney = payMoney.add(shopTotalChangeDto.getGoodsMoney());
-            shopTotal.setTotalGoodsOrder(shopTotal.getTotalGoodsOrder()+1);
-            haveOrder = true;
-        }
-        if(haveOrder){
+        if(shopTotalChangeDto.getOrderType()==1){
+            if(shopTotalChangeDto.getCycleMoney()!=null){
+                shopTotal.setTotalCycleMoney(shopTotal.getTotalCycleMoney().add(shopTotalChangeDto.getCycleMoney()));
+                payMoney = payMoney.add(shopTotalChangeDto.getCycleMoney());
+                shopTotal.setTotalCycleOrder(shopTotal.getTotalCycleOrder()+1);
+            }
+            if(shopTotalChangeDto.getExperienceMoney()!=null){
+                shopTotal.setTotalExperienceMoney(shopTotal.getTotalExperienceMoney().add(shopTotalChangeDto.getExperienceMoney()));
+                payMoney = payMoney.add(shopTotalChangeDto.getExperienceMoney());
+                shopTotal.setTotalExperienceOrder(shopTotal.getTotalExperienceOrder()+1);
+            }
+            if(shopTotalChangeDto.getServiceMoney()!=null){
+                shopTotal.setTotalServiceMoney(shopTotal.getTotalServiceMoney().add(shopTotalChangeDto.getServiceMoney()));
+                payMoney = payMoney.add(shopTotalChangeDto.getServiceMoney());
+                shopTotal.setTotalServiceOrder(shopTotal.getTotalServiceOrder()+1);
+            }
+            if(shopTotalChangeDto.getGoodsMoney()!=null){
+                shopTotal.setTotalGoodsMoney(shopTotal.getTotalGoodsMoney().add(shopTotalChangeDto.getGoodsMoney()));
+                payMoney = payMoney.add(shopTotalChangeDto.getGoodsMoney());
+                shopTotal.setTotalGoodsOrder(shopTotal.getTotalGoodsOrder()+1);
+            }
             shopTotal.setTotalOrderMoney(shopTotal.getTotalOrderMoney().add(payMoney));
             shopTotal.setTotalOrder(shopTotal.getTotalOrder()+1);
+        }else{
+            if(shopTotalChangeDto.getCycleMoney()!=null){
+                shopTotal.setTotalCycleMoney(shopTotal.getTotalCycleMoney().subtract(shopTotalChangeDto.getCycleMoney()));
+                payMoney = payMoney.add(shopTotalChangeDto.getCycleMoney());
+                shopTotal.setTotalCycleOrder(shopTotal.getTotalCycleOrder()-1);
+            }
+            if(shopTotalChangeDto.getExperienceMoney()!=null){
+                shopTotal.setTotalExperienceMoney(shopTotal.getTotalExperienceMoney().subtract(shopTotalChangeDto.getExperienceMoney()));
+                payMoney = payMoney.add(shopTotalChangeDto.getExperienceMoney());
+                shopTotal.setTotalExperienceOrder(shopTotal.getTotalExperienceOrder()-1);
+            }
+            if(shopTotalChangeDto.getServiceMoney()!=null){
+                shopTotal.setTotalServiceMoney(shopTotal.getTotalServiceMoney().subtract(shopTotalChangeDto.getServiceMoney()));
+                payMoney = payMoney.add(shopTotalChangeDto.getServiceMoney());
+                shopTotal.setTotalServiceOrder(shopTotal.getTotalServiceOrder()-1);
+            }
+            if(shopTotalChangeDto.getGoodsMoney()!=null){
+                shopTotal.setTotalGoodsMoney(shopTotal.getTotalGoodsMoney().subtract(shopTotalChangeDto.getGoodsMoney()));
+                payMoney = payMoney.add(shopTotalChangeDto.getGoodsMoney());
+                shopTotal.setTotalGoodsOrder(shopTotal.getTotalGoodsOrder()-1);
+            }
+            shopTotal.setTotalOrderMoney(shopTotal.getTotalOrderMoney().subtract(payMoney));
+            shopTotal.setTotalOrder(shopTotal.getTotalOrder()-1);
         }
         //活动变化
         if(shopTotalChangeDto.getActivityCount()!=null){
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java
index 0435d5d..4b312f5 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java
@@ -335,6 +335,13 @@
         return R.ok();
     }
 
+    @RequestMapping(value = "/listOperTitle", method = RequestMethod.POST)
+    @ApiOperation(value = "获取操作类型列表")
+    public R<List<String>> pageOperLog() {
+        List<String> operTitleList = customConfigService.listOperTitle();
+        return R.ok(operTitleList);
+    }
+
     @RequestMapping(value = "/pageOperLog", method = RequestMethod.POST)
     @ApiOperation(value = "分页获取操作日志")
     public R<Page<MgtOperLogPageVo>> pageOperLog(@RequestBody MgtOperLogPageDto mgtOperLogPageDto) {
@@ -421,6 +428,14 @@
         return R.ok(page.setRecords(mgtArticlePageVoList));
     }
 
+    @RequestMapping(value = "/getArticle", method = RequestMethod.POST)
+    @ApiOperation(value = "获取文章")
+    public R<MgtArticleGetVo> getArticle(@RequestBody MgtBaseGetDto mgtBaseGetDto) {
+        mgtBaseGetDto.setUserId(SecurityUtils.getUserId());
+        MgtArticleGetVo mgtArticleGetVo = articleService.getArticle(Long.valueOf(mgtBaseGetDto.getId()));
+        return R.ok(mgtArticleGetVo);
+    }
+
     @RequestMapping(value = "/editArticle", method = RequestMethod.POST)
     @Log(title = "文章管理", businessType = BusinessType.UPDATE,operContent = "修改文章")
     @ApiOperation(value = "修改文章")
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppConfigController.java
index 9627499..cbcb54f 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppConfigController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppConfigController.java
@@ -1,9 +1,15 @@
 package com.ruoyi.system.controller.miniapp;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.domain.dto.MgtBaseGetDto;
 import com.ruoyi.system.domain.dto.AppAgreementDto;
-import com.ruoyi.system.domain.vo.AppAgreementVo;
+import com.ruoyi.system.domain.dto.AppArticlePageDto;
+import com.ruoyi.system.domain.vo.*;
 import com.ruoyi.system.service.config.AgreementService;
+import com.ruoyi.system.service.config.ArticleService;
+import com.ruoyi.system.service.config.SysClassificationService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -12,6 +18,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * @author jqs34
@@ -29,6 +36,12 @@
     @Resource
     private AgreementService agreementService;
 
+    @Resource
+    private SysClassificationService sysClassificationService;
+
+    @Resource
+    private ArticleService articleService;
+
 
     @RequestMapping(value = "/getAppAgreement", method = RequestMethod.POST)
     @ApiOperation(value = "获取协议")
@@ -37,5 +50,29 @@
         return R.ok(appAgreementVo);
     }
 
+    @RequestMapping(value = "/listArticleClass", method = RequestMethod.POST)
+    @ApiOperation(value = "获取文章分类")
+    public R<List<AppClassListVo>> listArticleClass(){
+        List<AppClassListVo> classVoList = sysClassificationService.listByType(1);
+        return R.ok(classVoList);
+    }
+
+    @RequestMapping(value = "/listArticleByClass", method = RequestMethod.POST)
+    @ApiOperation(value = "通过分类获取文章列表")
+    public R<Page<AppArticlePageVo>> listArticleByClass(@RequestBody AppArticlePageDto appArticlePageDto){
+        Page<AppArticlePageVo> page = new Page<>();
+        page.setSize(appArticlePageDto.getPageSize());
+        page.setCurrent(appArticlePageDto.getPageNum());
+        List<AppArticlePageVo> appClassListVoList = articleService.listArticleByClass(page, appArticlePageDto.getClassId());
+        return R.ok(page.setRecords(appClassListVoList));
+    }
+
+    @RequestMapping(value = "/getArticle", method = RequestMethod.POST)
+    @ApiOperation(value = "获取文章")
+    public R<AppArticleGetVo> getArticle(@RequestBody MgtBaseGetDto mgtBaseGetDto) {
+        mgtBaseGetDto.setUserId(SecurityUtils.getUserId());
+        AppArticleGetVo appArticleGetVo = articleService.getAppArticle(Long.valueOf(mgtBaseGetDto.getId()));
+        return R.ok(appArticleGetVo);
+    }
 
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AppArticlePageDto.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AppArticlePageDto.java
new file mode 100644
index 0000000..36d8be5
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AppArticlePageDto.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.domain.dto;
+
+import com.ruoyi.system.api.domain.dto.AppPageDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @ClassName AppArticlePageDto
+ * @Description TODO
+ * @Author jqs
+ * @Date 2023/7/13 11:28
+ * @Version 1.0
+ */
+@Data
+public class AppArticlePageDto extends AppPageDto {
+
+    @ApiModelProperty(value = "分类id")
+    private Long classId;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtArticleEditDto.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtArticleEditDto.java
index 98678b8..0897a47 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtArticleEditDto.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtArticleEditDto.java
@@ -26,6 +26,9 @@
     @ApiModelProperty(value = "文章标题")
     private String articleTitle;
 
+    @ApiModelProperty(value = "文章简介")
+    private String articleIntroduce;
+
     @ApiModelProperty(value = "文章详情")
     private String articleDetail;
 
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Article.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Article.java
index e032702..514a314 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Article.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Article.java
@@ -89,6 +89,9 @@
     @TableField("update_user_id")
     private Long updateUserId;
 
+    @TableField("article_introduce")
+    private String articleIntroduce;
+
 
     @Override
     protected Serializable pkVal() {
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticleGetVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticleGetVo.java
new file mode 100644
index 0000000..30e1f45
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticleGetVo.java
@@ -0,0 +1,34 @@
+package com.ruoyi.system.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @ClassName AppArticleGetVo
+ * @Description TODO
+ * @Author jqs
+ * @Date 2023/7/13 11:56
+ * @Version 1.0
+ */
+@Data
+public class AppArticleGetVo {
+
+
+    @ApiModelProperty(value = "文章id")
+    private Long articleId;
+
+    @ApiModelProperty(value = "文章标题")
+    private String articleTitle;
+
+    @ApiModelProperty(value = "文章简介")
+    private String articleIntroduce;
+
+    @ApiModelProperty(value = "文章详情")
+    private String articleDetail;
+
+    @ApiModelProperty(value = "文章封面")
+    private String articleCover;
+
+    @ApiModelProperty(value = "文章视频")
+    private String articleVideo;
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticlePageVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticlePageVo.java
new file mode 100644
index 0000000..f800cfb
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticlePageVo.java
@@ -0,0 +1,28 @@
+package com.ruoyi.system.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @ClassName AppArticlePageVo
+ * @Description TODO
+ * @Author jqs
+ * @Date 2023/7/13 11:35
+ * @Version 1.0
+ */
+@Data
+public class AppArticlePageVo {
+
+
+    @ApiModelProperty(value = "文章id")
+    private Long articleId;
+
+    @ApiModelProperty(value = "文章标题")
+    private String articleTitle;
+
+    @ApiModelProperty(value = "文章简介")
+    private String articleIntroduce;
+
+    @ApiModelProperty(value = "文章封面")
+    private String articleCover;
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppClassListVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppClassListVo.java
new file mode 100644
index 0000000..a9b69c8
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppClassListVo.java
@@ -0,0 +1,23 @@
+package com.ruoyi.system.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @ClassName AppClassListVo
+ * @Description TODO
+ * @Author jqs
+ * @Date 2023/7/13 11:19
+ * @Version 1.0
+ */
+@Data
+public class AppClassListVo {
+
+
+    @ApiModelProperty(value = "分类id")
+    private Long classId;
+
+
+    @ApiModelProperty(value = "分类名字")
+    private String className;
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticleGetVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticleGetVo.java
new file mode 100644
index 0000000..4ba883b
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticleGetVo.java
@@ -0,0 +1,41 @@
+package com.ruoyi.system.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @ClassName MgtArticleGetVo
+ * @Description TODO
+ * @Author jqs
+ * @Date 2023/7/13 10:58
+ * @Version 1.0
+ */
+@Data
+public class MgtArticleGetVo {
+
+    @ApiModelProperty(value = "文章id")
+    private Long articleId;
+
+    @ApiModelProperty(value = "文章分类id")
+    private Long classId;
+
+    @ApiModelProperty(value = "文章排序")
+    private Integer articleSort;
+
+    @ApiModelProperty(value = "文章标题")
+    private String articleTitle;
+
+    @ApiModelProperty(value = "文章简介")
+    private String articleIntroduce;
+
+    @ApiModelProperty(value = "文章详情")
+    private String articleDetail;
+
+    @ApiModelProperty(value = "文章封面")
+    private String articleCover;
+
+    @ApiModelProperty(value = "文章视频")
+    private String articleVideo;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticlePageVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticlePageVo.java
index 05855d0..75cca7a 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticlePageVo.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticlePageVo.java
@@ -27,9 +27,12 @@
     @ApiModelProperty(value = "文章标题")
     private String articleTitle;
 
+    @ApiModelProperty(value = "文章简介")
+    private String articleIntroduce;
+
     @ApiModelProperty(value = "文章封面")
     private String articleCover;
 
-    @ApiModelProperty(value = "文章标题")
+    @ApiModelProperty(value = "创建时间")
     private Date createTime;
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java
index 6f84050..78e9c3a 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java
@@ -4,8 +4,10 @@
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.system.api.constant.DelayTaskEnum;
+import com.ruoyi.system.api.service.RemoteActivityService;
 import com.ruoyi.system.api.service.RemoteConfigService;
 import com.ruoyi.system.api.service.RemoteCouponService;
+import com.ruoyi.system.api.service.RemoteOrderService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.connection.Message;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -33,6 +35,10 @@
 
     private RemoteCouponService remoteCouponService;
 
+    private RemoteActivityService remoteActivityService;
+
+    private RemoteOrderService remoteOrderService;
+
     public RedisListener(RedisMessageListenerContainer listenerContainer,
                          RedisTemplate redisTemplate) {
         super(listenerContainer);
@@ -51,9 +57,19 @@
                     String[] split = expiredKey.split("-");
                     String operation=split[0];
                     if(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode().equals(operation)){
-                        //自动关闭订单
+                        //自动发送优惠券
                         autoTimeSendCoupon(split[1]);
+                    }else if(DelayTaskEnum.ACTIVITY_START_TASK.getCode().equals(operation)){
+                        //自动开始任务
+                        autoStartActivity(split[1]);
+                    }else if(DelayTaskEnum.ACTIVITY_END_TASK.getCode().equals(operation)){
+                        //自动结束任务
+                        autoEndActivity(split[1]);
+                    }else if(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode().equals(operation)){
+                        //自动结束任务
+                        autoCancelOrder(split[1]);
                     }
+
                     //删除失效的key
                     redisTemplate.delete(expiredKey);
                 }
@@ -83,5 +99,24 @@
         remoteConfigService.deleteDelayTask(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode()+"-"+couponId);
     }
 
+    private void autoStartActivity(String activityId){
+        log.info("autoStartActivity scheduler task is running :" + activityId);
+        remoteActivityService.startActivity(activityId);
+        //删除定时任务
+        remoteConfigService.deleteDelayTask(DelayTaskEnum.ACTIVITY_START_TASK.getCode()+"-"+activityId);
+    }
 
+    private void autoEndActivity(String activityId){
+        log.info("autoEndActivity scheduler task is running :" + activityId);
+        remoteActivityService.endActivity(activityId);
+        //删除定时任务
+        remoteConfigService.deleteDelayTask(DelayTaskEnum.ACTIVITY_END_TASK.getCode()+"-"+activityId);
+    }
+
+    private void autoCancelOrder(String orderId){
+        log.info("autoCancelOrder scheduler task is running :" + orderId);
+        remoteOrderService.autoCancelOrder(orderId);
+        //删除定时任务
+        remoteConfigService.deleteDelayTask(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode()+"-"+orderId);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/ArticleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/ArticleMapper.java
index 587d35f..7572d4b 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/ArticleMapper.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/ArticleMapper.java
@@ -1,9 +1,10 @@
 package com.ruoyi.system.mapper.config;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.system.domain.dto.MgtArticlePageDto;
 import com.ruoyi.system.domain.pojo.config.Article;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.domain.vo.AppArticlePageVo;
 import com.ruoyi.system.domain.vo.MgtArticlePageVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -37,4 +38,14 @@
      * @return  List<MgtArticlePageVo>
      */
     List<MgtArticlePageVo> pageArticle(Page page,@Param("param") MgtArticlePageDto mgtArticlePageDto);
+
+
+    /**
+     * @description  通过分类id获取文章
+     * @author  jqs
+     * @date    2023/7/13 11:37
+     * @param classId
+     * @return  List<AppClassListVo>
+     */
+    List<AppArticlePageVo> listArticleByClass(Page page, @Param("classId")Long classId);
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/CustomConfigMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/CustomConfigMapper.java
index 232106d..d486b76 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/CustomConfigMapper.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/CustomConfigMapper.java
@@ -37,4 +37,13 @@
      * @return  List<MgtOperLogPageVo>
      */
     List<MgtOperLogPageVo> pageOperLog(Page page, MgtOperLogPageDto mgtOperLogPageDto);
+
+    /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/13 15:52
+     * @param
+     * @return  List<String>
+     */
+    List<String> listOperTitle();
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ArticleService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ArticleService.java
index 87099f0..a5adeaa 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ArticleService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ArticleService.java
@@ -6,6 +6,9 @@
 import com.ruoyi.system.domain.dto.MgtArticleEditDto;
 import com.ruoyi.system.domain.dto.MgtArticlePageDto;
 import com.ruoyi.system.domain.pojo.config.Article;
+import com.ruoyi.system.domain.vo.AppArticleGetVo;
+import com.ruoyi.system.domain.vo.AppArticlePageVo;
+import com.ruoyi.system.domain.vo.MgtArticleGetVo;
 import com.ruoyi.system.domain.vo.MgtArticlePageVo;
 
 import java.util.List;
@@ -56,4 +59,32 @@
      * @return  void
      */
     void deleteArticle(MgtBaseGetDto mgtBaseGetDto);
+
+
+    /**
+     * @description  获取文章
+     * @author  jqs
+     * @date    2023/7/13 11:00
+     * @param articleId
+     * @return  MgtArticleGetVo
+     */
+    MgtArticleGetVo getArticle(Long articleId);
+
+    /**
+     * @description  通过分类id获取文章
+     * @author  jqs
+     * @date    2023/7/13 11:37
+     * @param classId
+     * @return  List<AppClassListVo>
+     */
+    List<AppArticlePageVo> listArticleByClass(Page page, Long classId);
+
+    /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/13 11:57
+     * @param articleId
+     * @return  AppArticleGetVo
+     */
+    AppArticleGetVo getAppArticle (Long articleId);
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java
index fffbd88..16de6be 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java
@@ -87,6 +87,15 @@
     List<MgtOperLogPageVo> pageOperLog(Page page, MgtOperLogPageDto mgtOperLogPageDto);
 
     /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/13 15:53
+     * @param
+     * @return  List<String>
+     */
+    List<String> listOperTitle();
+
+    /**
      * @description  获取单个自定义配置
      * @author  jqs
      * @date    2023/6/9 15:40
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/SysClassificationService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/SysClassificationService.java
index 59267fd..4809513 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/SysClassificationService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/SysClassificationService.java
@@ -5,6 +5,7 @@
 import com.ruoyi.system.api.domain.poji.config.SysClassification;
 import com.ruoyi.system.domain.dto.MgtClassificationEditDto;
 import com.ruoyi.system.domain.dto.MgtClassificationPageDto;
+import com.ruoyi.system.domain.vo.AppClassListVo;
 import com.ruoyi.system.domain.vo.MgtClassificationPageVo;
 
 import java.util.List;
@@ -56,4 +57,13 @@
      * @return  void
      */
     void deleteClassification(Long classId);
+
+    /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/13 11:21
+     * @param
+     * @return  List<AppClassListVo>
+     */
+    List<AppClassListVo> listByType(Integer classType);
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ArticleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ArticleServiceImpl.java
index 13b007b..f414ccb 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ArticleServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ArticleServiceImpl.java
@@ -4,11 +4,15 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.bean.BeanUtils;
 import com.ruoyi.system.api.constant.AppErrorConstant;
 import com.ruoyi.system.api.domain.dto.MgtBaseGetDto;
 import com.ruoyi.system.domain.dto.MgtArticleEditDto;
 import com.ruoyi.system.domain.dto.MgtArticlePageDto;
 import com.ruoyi.system.domain.pojo.config.Article;
+import com.ruoyi.system.domain.vo.AppArticleGetVo;
+import com.ruoyi.system.domain.vo.AppArticlePageVo;
+import com.ruoyi.system.domain.vo.MgtArticleGetVo;
 import com.ruoyi.system.domain.vo.MgtArticlePageVo;
 import com.ruoyi.system.mapper.config.ArticleMapper;
 import com.ruoyi.system.service.config.ArticleService;
@@ -85,6 +89,7 @@
         article.setClassId(mgtArticleEditDto.getClassId());
         article.setArticleSort(mgtArticleEditDto.getArticleSort());
         article.setArticleTitle(mgtArticleEditDto.getArticleTitle());
+        article.setArticleIntroduce(mgtArticleEditDto.getArticleIntroduce());
         article.setArticleDetail(mgtArticleEditDto.getArticleDetail());
         article.setArticleCover(mgtArticleEditDto.getArticleCover());
         article.setArticleVideo(mgtArticleEditDto.getArticleVideo());
@@ -109,4 +114,46 @@
         article.setUpdateUserId(mgtBaseGetDto.getUserId());
         this.saveOrUpdate(article);
     }
+
+    /**
+     * @description  获取文章
+     * @author  jqs
+     * @date    2023/7/13 11:00
+     * @param articleId
+     * @return  MgtArticleGetVo
+     */
+    @Override
+    public MgtArticleGetVo getArticle(Long articleId){
+        MgtArticleGetVo mgtArticleGetVo = new MgtArticleGetVo();
+        Article article = this.getById(articleId);
+        BeanUtils.copyProperties(article,mgtArticleGetVo);
+        return mgtArticleGetVo;
+    }
+
+    /**
+     * @description  通过分类id获取文章
+     * @author  jqs
+     * @date    2023/7/13 11:37
+     * @param classId
+     * @return  List<AppClassListVo>
+     */
+    @Override
+    public List<AppArticlePageVo> listArticleByClass(Page page, Long classId){
+        return articleMapper.listArticleByClass(page, classId);
+    }
+
+    /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/13 11:57
+     * @param articleId
+     * @return  AppArticleGetVo
+     */
+    @Override
+    public AppArticleGetVo getAppArticle (Long articleId){
+        AppArticleGetVo appArticleGetVo = new AppArticleGetVo();
+        Article article = this.getById(articleId);
+        BeanUtils.copyProperties(article,appArticleGetVo);
+        return appArticleGetVo;
+    }
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java
index c795cc2..f25a3be 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java
@@ -4,7 +4,9 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.system.api.constant.ConfigEnum;
+import com.ruoyi.system.api.constant.SecurityConstant;
 import com.ruoyi.system.api.domain.poji.config.Activeness;
 import com.ruoyi.system.api.domain.vo.AppOtherConfigGetVo;
 import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo;
@@ -64,6 +66,9 @@
 
     @Resource
     private StaffSuggestService staffSuggestService;
+
+    @Resource
+    private RedisService redisService;
 
     /**
      * @param key
@@ -257,30 +262,39 @@
             customConfig.setCreateTime(updateTime);
             customConfig.setUpdateTime(updateTime);
             switch (configEnum) {
+                //分享小程序可获得积分
                 case SHARE_INTEGRAL:
                     customConfig.setConfigValue(mgtOtherConfigEditDto.getShareIntegral().toString());
                     this.saveOrUpdate(customConfig);
                     break;
+                //平台建议可获得积分
                 case SUGGEST_PLATFORM_INTEGRAL:
                     customConfig.setConfigValue(mgtOtherConfigEditDto.getSuggestPlatformIntegral().toString());
                     this.saveOrUpdate(customConfig);
                     break;
+                //每日签到可获得积分
                 case SIGN_IN_INTEGRAL:
                     customConfig.setConfigValue(mgtOtherConfigEditDto.getSignInIntegral().toString());
                     this.saveOrUpdate(customConfig);
                     break;
+                //门店建议可获得积分
                 case SUGGEST_SHOP_INTEGRAL:
                     customConfig.setConfigValue(mgtOtherConfigEditDto.getSuggestShopIntegral().toString());
                     this.saveOrUpdate(customConfig);
                     break;
+                //C端订单自动取消时间
                 case ORDER_AUTO_CANCEL_TIME:
                     customConfig.setConfigValue(mgtOtherConfigEditDto.getOrderAutoCancelTime().toString());
+                    redisService.setCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME,mgtOtherConfigEditDto.getOrderAutoCancelTime());
                     this.saveOrUpdate(customConfig);
                     break;
+                //购物满1元可获得积分
                 case PAY_MONEY_INTEGRAL:
                     customConfig.setConfigValue(mgtOtherConfigEditDto.getPayMoneyIntegral().toString());
+                    redisService.setCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL,mgtOtherConfigEditDto.getPayMoneyIntegral());
                     this.saveOrUpdate(customConfig);
                     break;
+                //首页风格
                 case HOME_STYLE:
                     customConfig.setConfigValue(mgtOtherConfigEditDto.getHomeStyle().toString());
                     this.saveOrUpdate(customConfig);
@@ -533,6 +547,18 @@
     }
 
     /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/13 15:52
+     * @param
+     * @return  List<String>
+     */
+    @Override
+    public List<String> listOperTitle(){
+        return customConfigMapper.listOperTitle();
+    }
+
+    /**
      * @description  获取单个自定义配置
      * @author  jqs
      * @date    2023/6/9 15:40
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/SysClassificationServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/SysClassificationServiceImpl.java
index bb5b412..f05ddba 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/SysClassificationServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/SysClassificationServiceImpl.java
@@ -9,6 +9,7 @@
 import com.ruoyi.system.api.service.RemoteGoodsService;
 import com.ruoyi.system.domain.dto.MgtClassificationEditDto;
 import com.ruoyi.system.domain.dto.MgtClassificationPageDto;
+import com.ruoyi.system.domain.vo.AppClassListVo;
 import com.ruoyi.system.domain.vo.MgtClassificationPageVo;
 import com.ruoyi.system.mapper.config.SysClassificationMapper;
 import com.ruoyi.system.service.config.ArticleService;
@@ -17,6 +18,7 @@
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -131,4 +133,26 @@
             remoteGoodsService.deleteGoodsClass(classId);
         }
     }
+
+    /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/13 11:21
+     * @param
+     * @return  List<AppClassListVo>
+     */
+    @Override
+    public List<AppClassListVo> listByType(Integer classType){
+        LambdaQueryWrapper<SysClassification> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysClassification::getDelFlag,0)
+                .eq(SysClassification::getClassType,classType);
+        List<SysClassification> sysClassificationList = this.list(queryWrapper);
+        List<AppClassListVo> classListVos = sysClassificationList.stream().map(sysClassification ->{
+            AppClassListVo appClassListVo = new AppClassListVo();
+            appClassListVo.setClassId(sysClassification.getClassId());
+            appClassListVo.setClassName(sysClassification.getClassName());
+            return appClassListVo;
+        }).collect(Collectors.toList());
+        return classListVos;
+    }
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/ArticleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/ArticleMapper.xml
index f8c9f56..97066fa 100644
--- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/ArticleMapper.xml
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/ArticleMapper.xml
@@ -11,6 +11,7 @@
         ta.article_id articleId,
         tsc.class_name className,
         ta.article_sort articleSort,
+        ta.article_introduce articleIntroduce,
         ta.article_title articleTitle,
         ta.article_cover articleCover,
         ta.create_time createTime
@@ -29,4 +30,14 @@
         ORDER BY ta.create_time DESC
     </select>
 
+    <select id="listArticleByClass" resultType="com.ruoyi.system.domain.vo.AppArticlePageVo">
+        SELECT
+        ta.article_id articleId,
+        ta.article_introduce articleIntroduce,
+        ta.article_title articleTitle,
+        ta.article_cover articleCover
+        FROM t_article ta
+        WHERE ta.del_flag = 0 AND ta.class_id = #{classId}
+        ORDER BY ta.article_sort DESC
+    </select>
 </mapper>
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/CustomConfigMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/CustomConfigMapper.xml
index ac6b3f3..5b5d47f 100644
--- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/CustomConfigMapper.xml
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/CustomConfigMapper.xml
@@ -14,7 +14,7 @@
         SELECT
         oper_time operTime,
         oper_name operName,
-        oper_title operTitle,
+        title operTitle,
         oper_ip operIp,
         oper_content operContent
         FROM sys_oper_log
@@ -22,4 +22,8 @@
         ORDER BY oper_time DESC
     </select>
 
+    <select id="listOperTitle" resultType="java.lang.String">
+        SELECT DISTINCT title FROM sys_oper_log
+        WHERE operator_type = 1
+    </select>
 </mapper>
diff --git a/ruoyi-modules/ruoyi-system/src/test/java/com/ruoyi/system/systemTest.java b/ruoyi-modules/ruoyi-system/src/test/java/com/ruoyi/system/systemTest.java
index a7689d4..0f8acae 100644
--- a/ruoyi-modules/ruoyi-system/src/test/java/com/ruoyi/system/systemTest.java
+++ b/ruoyi-modules/ruoyi-system/src/test/java/com/ruoyi/system/systemTest.java
@@ -1,14 +1,9 @@
 package com.ruoyi.system;
 
 
-import com.ruoyi.system.domain.vo.MgtPopGetVo;
-import com.ruoyi.system.service.config.PopService;
-import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import javax.annotation.Resource;
 
 /**
  * @ClassName systemTest
@@ -21,13 +16,7 @@
 @SpringBootTest(classes = RuoYiSystemApplication.class)
 public class systemTest {
 
-    @Resource
-    private PopService popService;
 
-    @Test
-    public void test1(){
-        MgtPopGetVo mgtPopGetVo = popService.getMgtPop(1L);
-        System.out.println(mgtPopGetVo);
-    }
+
 
 }

--
Gitblit v1.7.1