jiangqs
2023-07-13 cfd0118ef446a66f91999afc7b1e46ca607adf50
定时任务 统计
58个文件已修改
7个文件已添加
1657 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AGStockChangeDto.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ActivityTotalChangeDto.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBasePlatformDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopTotalChangeDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteActivityFallbackFactory.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteOrderFallbackFactory.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteActivityService.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteOrderService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/ActivityController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtActivityEditDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/activity/Activity.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppActivityPageVo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppSimpleActivityGoodsVo.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtActivityGetVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/activity/ActivityMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/activity/ActivityService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/activity/ActivityMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberCouponMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/coupon/CouponService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberCouponMapper.xml 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/concole/OrderController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/account/OrderRefund.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderGoodsServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java 428 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderGoodsService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopTotalServiceImpl.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppConfigController.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AppArticlePageDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtArticleEditDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Article.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticleGetVo.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticlePageVo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppClassListVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticleGetVo.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticlePageVo.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/ArticleMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/CustomConfigMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ArticleService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/SysClassificationService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ArticleServiceImpl.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/SysClassificationServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/ArticleMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/CustomConfigMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/test/java/com/ruoyi/system/systemTest.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 = "只能选择大于当前时间作为开始时间";
}
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";
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AGStockChangeDto.java
New file
@@ -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;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ActivityTotalChangeDto.java
New file
@@ -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;
}
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;
}
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;
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;
            }
        };
    }
}
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());
            }
        };
    }
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());
            }
        };
    }
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);
}
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);
}
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);
}
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);
    }
}
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();
    }
}
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 = "成团人数")
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() {
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;
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;
}
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;
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);
}
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);
}
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();
        }
    }
}
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;
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>
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
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();
    }
}
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);
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/coupon/CouponService.java
@@ -190,4 +190,6 @@
     * @return  void
     */
    void autoTimeSendCoupon(String couponId);
}
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);
    }
}
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);
    }
}
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) {
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);
}
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>
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();
    }
}
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 : 电商平台垫付,需要向微信支付申请开通
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;
    /**
     * 活动名称
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);
}
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);
    }
}
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);
        }
    }
}
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);
}
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);
}
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>
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){
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 = "修改文章")
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);
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AppArticlePageDto.java
New file
@@ -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;
}
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;
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() {
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticleGetVo.java
New file
@@ -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;
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppArticlePageVo.java
New file
@@ -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;
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppClassListVo.java
New file
@@ -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;
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtArticleGetVo.java
New file
@@ -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;
}
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;
}
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);
    }
}
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);
}
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();
}
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);
}
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
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);
}
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;
    }
}
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
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;
    }
}
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>
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>
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);
    }
}