ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/DelayTaskEnum.java
@@ -10,10 +10,10 @@ public enum DelayTaskEnum { ORDER_AUTOMATIC_CANCEL("订单延时任务-自动关闭", "超时订单自动关闭"), SECKILL_START_TASK("秒杀商品延时任务", "定时开始任务"), SECKILL_END_TASK("秒杀商品延时任务", "定时结束任务"), GROUP_PURCHASES_START_TASK("团购商品延时任务", "定时开始任务"), GROUP_PURCHASES_END_TASK("团购商品延时任务", "定时结束任务"), SECKILL_START_TASK("秒杀商品延时任务", "秒杀商品定时开始任务"), SECKILL_END_TASK("秒杀商品延时任务", "秒杀商品定时结束任务"), GROUP_PURCHASES_START_TASK("团购商品延时任务", "团购商品定时开始任务"), GROUP_PURCHASES_END_TASK("团购商品延时任务", "团购商品定时结束任务"), ; String name; ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/GoodsSkuFactory.java
@@ -1,20 +1,13 @@ package com.ruoyi.system.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.RemoteFileService; import com.ruoyi.system.api.RemoteLogService; import com.ruoyi.system.api.domain.*; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.feignClient.GoodsSkuClient; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.multipart.MultipartFile; import java.util.List; @Component public class GoodsSkuFactory implements FallbackFactory<GoodsSkuClient> { @@ -32,6 +25,25 @@ return R.fail("更新商品失败:" + cause.getMessage()); } @Override public R<?> startSeckill(Long seckillId) { return R.fail("开始秒杀失败:" + cause.getMessage()); } @Override public R<?> endSeckill(Long seckillId) { return R.fail("结束秒杀失败:" + cause.getMessage()); } @Override public R<?> startGroupPurchase(Long groupPurchaseId) { return R.fail("开始团购失败:" + cause.getMessage()); } @Override public R<?> endGroupPurchase(Long groupPurchaseId) { return R.fail("结束团购失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/GoodsSkuClient.java
@@ -1,15 +1,16 @@ package com.ruoyi.system.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants;; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.factory.GoodsSkuFactory; import com.ruoyi.system.api.factory.SysUserFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; ; @FeignClient(contextId = "GoodsSkuClient", value = ServiceNameConstants.RUOYI_GOODS, fallbackFactory = GoodsSkuFactory.class) public interface GoodsSkuClient { @@ -22,6 +23,15 @@ @PostMapping("/goods-sku/updateGoodsSkuOne") R<Boolean> updateGoodsSkuOne(@RequestBody GoodsSku goodsSku); @GetMapping("/goods-seckill/start/{seckillId}") R<?> startSeckill(@PathVariable("seckillId") Long seckillId); @GetMapping("/goods-seckill/end/{seckillId}") R<?> endSeckill(@PathVariable("seckillId") Long seckillId); @GetMapping("/goods-group-purchase/start/{groupPurchaseId}") R<?> startGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId); @GetMapping("/goods-group-purchase/end/{groupPurchaseId}") R<?> endGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId); } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java
@@ -70,4 +70,9 @@ * 省市区列表key */ public static final String CITY_LIST = "city_list"; /** * 秒杀活动商品key前缀 */ public static final String SECKILL_GOODS = "seckill_goods:"; } ruoyi-common/ruoyi-common-redis/pom.xml
@@ -28,6 +28,12 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-core</artifactId> </dependency> <!-- redis分布式锁框架 --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.19.3</version> </dependency> </dependencies> </project> ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
@@ -1,5 +1,9 @@ package com.ruoyi.common.redis.configure; import java.io.IOException; 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; @@ -8,6 +12,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.serializer.StringRedisSerializer; /** @@ -40,4 +45,24 @@ template.afterPropertiesSet(); return template; } //Redis监听容器 @Bean public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; } @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://192.168.110.188:6379").setPassword("123456"); return Redisson.create(config); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsGroupPurchaseController.java
@@ -1,8 +1,13 @@ package com.ruoyi.goods.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.goods.service.IGoodsGroupPurchaseService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** @@ -13,8 +18,23 @@ * @author mitao * @since 2024-05-16 */ @Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/goods-group-purchase") public class GoodsGroupPurchaseController { private final IGoodsGroupPurchaseService goodsGroupPurchaseService; @GetMapping("/start/{groupPurchaseId}") R<?> startGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId) { goodsGroupPurchaseService.startGroupPurchase(groupPurchaseId); return R.ok(); } @GetMapping("/end/{groupPurchaseId}") R<?> endGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId) { goodsGroupPurchaseService.endGroupPurchase(groupPurchaseId); return R.ok(); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/GoodsSeckillController.java
@@ -1,8 +1,13 @@ package com.ruoyi.goods.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.goods.service.IGoodsSeckillService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** @@ -13,8 +18,34 @@ * @author mitao * @since 2024-05-16 */ @Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/goods-seckill") public class GoodsSeckillController { private final IGoodsSeckillService goodsSeckillService; /** * 开始秒杀 * * @param seckillId 秒杀id */ @GetMapping("/start/{seckillId}") R<?> startSeckill(@PathVariable("seckillId") Long seckillId) { goodsSeckillService.startSeckill(seckillId); return R.ok(); } /** * 结束秒杀 * * @param seckillId 秒杀id */ @GetMapping("/end/{seckillId}") R<?> endSeckill(@PathVariable("seckillId") Long seckillId) { goodsSeckillService.endSeckill(seckillId); return R.ok(); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
@@ -47,4 +47,8 @@ * @param dto 商品上下架状态对象 */ void updStatus(ListStatusDTO dto); void startGroupPurchase(Long groupPurchaseId); void endGroupPurchase(Long groupPurchaseId); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java
@@ -55,4 +55,18 @@ * @return GoodsSeckillVO 商品秒杀视图对象 */ GoodsSeckillVO getDetail(Long id); /** * 开始秒杀 * * @param seckillId 秒杀id */ void startSeckill(Long seckillId); /** * 结束秒杀 * * @param seckillId 秒杀id */ void endSeckill(Long seckillId); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java
@@ -41,6 +41,6 @@ * @param dto 数据传输对象,包含需要更新的SKU的ID和新的上架状态。 其中,ID用于指定要更新的具体SKU,listingStatus用于指定新的上架状态。 * @return 无返回值。 */ void updStatus(ListStatusDTO dto) throws Exception; void updStatus(ListStatusDTO dto); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
@@ -17,6 +17,7 @@ import com.ruoyi.system.api.domain.dto.ListStatusDTO; import com.ruoyi.system.api.feignClient.OrderClient; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** @@ -27,6 +28,7 @@ * @author mitao * @since 2024-05-16 */ @Slf4j @Service @RequiredArgsConstructor public class GoodsGroupPurchaseServiceImpl extends ServiceImpl<GoodsGroupPurchaseMapper, GoodsGroupPurchase> implements IGoodsGroupPurchaseService { @@ -106,4 +108,20 @@ groupPurchase.setListingStatus(dto.getListingStatus()); this.updateById(groupPurchase); } @Override public void startGroupPurchase(Long groupPurchaseId) { log.info(">>>>>>>>>>>>>>>>>>>>团购商品开始团购<<<<<<<<<<<<<<<<<<<<"); GoodsGroupPurchase groupPurchase = this.getById(groupPurchaseId); if (StringUtils.isNotNull(groupPurchase)) { this.lambdaUpdate().set(GoodsGroupPurchase::getStartStatus, StartStatusEnum.STARTED) .eq(GoodsGroupPurchase::getId, groupPurchaseId).update(); //TODO 通知小程勋 } } @Override public void endGroupPurchase(Long groupPurchaseId) { } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
@@ -2,10 +2,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.enums.StartStatusEnum; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.goods.controller.management.DTO.GoodsSeckillDTO; import com.ruoyi.goods.controller.management.DTO.GoodsSeckillQuery; import com.ruoyi.goods.controller.management.DTO.GoodsSeckillUpd; @@ -39,7 +41,7 @@ private final IGoodsSkuService goodsSkuService; private final OrderClient orderClient; private final RedisService redisService; @Override @Transactional(rollbackFor = Exception.class) public void addGoodsSeckill(GoodsSeckillDTO dto) { @@ -117,4 +119,47 @@ vo.setNumberOfPurchasedMembers(num); return vo; } /** * 开始秒杀 * * @param seckillId 秒杀id */ @Override public void startSeckill(Long seckillId) { log.info(">>>>>>>>>>>>>>>>>>>>{}秒杀开始<<<<<<<<<<<<<<<<<<<<", seckillId); GoodsSeckill goodsSeckill = this.getById(seckillId); //秒杀商品不能为空且状态为未开始 if (StringUtils.isNotNull(goodsSeckill) && goodsSeckill.getStartStatus().equals(StartStatusEnum.NOT_STARTED)) { //开始秒杀 this.lambdaUpdate().set(GoodsSeckill::getStartStatus, StartStatusEnum.STARTED) .eq(GoodsSeckill::getId, seckillId).update(); // 将秒杀商品放入缓存 redisService.setCacheObject( CacheConstants.SECKILL_GOODS + goodsSeckill.getId(), goodsSeckill.getSeckillStock()); } //TODO websocket 推送秒杀开始消息 } /** * 结束秒杀 * * @param seckillId 秒杀id */ @Override public void endSeckill(Long seckillId) { log.info(">>>>>>>>>>>>>>>>>>>>{}秒杀结束<<<<<<<<<<<<<<<<<<<<", seckillId); GoodsSeckill goodsSeckill = this.getById(seckillId); if (StringUtils.isNotNull(goodsSeckill) && goodsSeckill.getStartStatus().equals(StartStatusEnum.STARTED)) { //结束秒杀 this.lambdaUpdate().set(GoodsSeckill::getStartStatus, StartStatusEnum.ENDED) .eq(GoodsSeckill::getId, seckillId).update(); // 将秒杀商品从缓存中移除 redisService.deleteObject(CacheConstants.SECKILL_GOODS + goodsSeckill.getId()); } //TODO websocket 推送秒杀结束消息 } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
@@ -161,7 +161,7 @@ */ @Override @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void updStatus(ListStatusDTO dto) throws Exception { public void updStatus(ListStatusDTO dto) { this.lambdaUpdate() .eq(GoodsSku::getId, dto.getId()) .set(GoodsSku::getListingStatus, dto.getListingStatus()) ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/MemberPointsController.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.member.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 会员积分表 前端控制器 * </p> * * @author mitao * @since 2024-05-23 */ @RestController @RequestMapping("/member-points") public class MemberPointsController { } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/pojo/MemberPoints.java
New file @@ -0,0 +1,58 @@ package com.ruoyi.member.domain.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.time.LocalDateTime; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * 会员积分表 * </p> * * @author mitao * @since 2024-05-23 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_member_points") @ApiModel(value = "MemberPoints对象", description = "会员积分表") public class MemberPoints implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "积分") private Integer points; @ApiModelProperty(value = "积分类型 1支付订单") private Integer pointsType; @ApiModelProperty(value = "积分状态 1是加积分,2 是减积分") private Integer pointsStatus; @ApiModelProperty(value = "会员id") private Long memberId; @ApiModelProperty(value = "创建时间") @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)") @TableLogic private Integer delFlag; } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/MemberPointsMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.member.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.member.domain.pojo.MemberPoints; /** * <p> * 会员积分表 Mapper 接口 * </p> * * @author mitao * @since 2024-05-23 */ public interface MemberPointsMapper extends BaseMapper<MemberPoints> { } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/IMemberPointsService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.member.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.member.domain.pojo.MemberPoints; /** * <p> * 会员积分表 服务类 * </p> * * @author mitao * @since 2024-05-23 */ public interface IMemberPointsService extends IService<MemberPoints> { } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.member.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.member.domain.pojo.MemberPoints; import com.ruoyi.member.mapper.MemberPointsMapper; import com.ruoyi.member.service.IMemberPointsService; import org.springframework.stereotype.Service; /** * <p> * 会员积分表 服务实现类 * </p> * * @author mitao * @since 2024-05-23 */ @Service public class MemberPointsServiceImpl extends ServiceImpl<MemberPointsMapper, MemberPoints> implements IMemberPointsService { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/MemberInvoiceController.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.order.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 我的发票 前端控制器 * </p> * * @author mitao * @since 2024-05-23 */ @RestController @RequestMapping("/member-invoice") public class MemberInvoiceController { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/MemberInvoiceOrderController.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.order.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 开票和订单关联 前端控制器 * </p> * * @author mitao * @since 2024-05-23 */ @RestController @RequestMapping("/member-invoice-order") public class MemberInvoiceOrderController { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/MemberInvoiceRiseController.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.order.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 我的发票抬头 前端控制器 * </p> * * @author mitao * @since 2024-05-23 */ @RestController @RequestMapping("/member-invoice-rise") public class MemberInvoiceRiseController { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/MemberInvoice.java
New file @@ -0,0 +1,71 @@ package com.ruoyi.order.domain.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * 我的发票 * </p> * * @author mitao * @since 2024-05-23 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_member_invoice") @ApiModel(value = "MemberInvoice对象", description = "我的发票") public class MemberInvoice implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "创建者") @TableField(value = "create_by", fill = FieldFill.INSERT) private String createBy; @ApiModelProperty(value = "创建时间") @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "更新者") @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) private String updateBy; @ApiModelProperty(value = "更新时间") @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)") @TableLogic private Integer delFlag; @ApiModelProperty(value = "发票金额") private BigDecimal invoiceMoney; @ApiModelProperty(value = "开票状态 1待审核,2 已开票,3 拒绝") private Integer invoiceStatus; @ApiModelProperty(value = "拒绝原因") private String remark; @ApiModelProperty(value = "会员id") private Long memberId; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/MemberInvoiceOrder.java
New file @@ -0,0 +1,50 @@ package com.ruoyi.order.domain.pojo; import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * 开票和订单关联 * </p> * * @author mitao * @since 2024-05-23 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_member_invoice_order") @ApiModel(value="MemberInvoiceOrder对象", description="开票和订单关联") public class MemberInvoiceOrder implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "开票id") private Integer invoiceId; @ApiModelProperty(value = "订单名称") private String orderName; @ApiModelProperty(value = "订单编号") private String orderNo; @ApiModelProperty(value = "订单金额") private BigDecimal orderMoney; @ApiModelProperty(value = "订单id") private Integer orderId; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/MemberInvoiceRise.java
New file @@ -0,0 +1,86 @@ package com.ruoyi.order.domain.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.time.LocalDateTime; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * 我的发票抬头 * </p> * * @author mitao * @since 2024-05-23 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_member_invoice_rise") @ApiModel(value = "MemberInvoiceRise对象", description = "我的发票抬头") public class MemberInvoiceRise implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "发票类型 1 普通,2 专票") private Integer invoiceType; @ApiModelProperty(value = "抬头类型 1 企业单位,2 个人/非企业单位") private Integer riseType; @ApiModelProperty(value = "公司名称") private String corporationName; @ApiModelProperty(value = "公司税号") private String corporationId; @ApiModelProperty(value = "公司地址") private String corporationAddress; @ApiModelProperty(value = "公司电话") private String corporationPhone; @ApiModelProperty(value = "公司开户行") private String corporationOpen; @ApiModelProperty(value = "公司账号") private String corporationAccount; @ApiModelProperty(value = "创建者") @TableField(value = "create_by", fill = FieldFill.INSERT) private String createBy; @ApiModelProperty(value = "创建时间") @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "更新者") @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) private String updateBy; @ApiModelProperty(value = "更新时间") @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)") private Integer delFlag; @ApiModelProperty(value = "1是其他,2 是默认") private Integer isDefault; @ApiModelProperty(value = "会员id") private Long memberId; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/MemberInvoiceMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.order.mapper; import com.ruoyi.order.domain.pojo.MemberInvoice; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 我的发票 Mapper 接口 * </p> * * @author mitao * @since 2024-05-23 */ public interface MemberInvoiceMapper extends BaseMapper<MemberInvoice> { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/MemberInvoiceOrderMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.order.mapper; import com.ruoyi.order.domain.pojo.MemberInvoiceOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 开票和订单关联 Mapper 接口 * </p> * * @author mitao * @since 2024-05-23 */ public interface MemberInvoiceOrderMapper extends BaseMapper<MemberInvoiceOrder> { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/MemberInvoiceRiseMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.order.mapper; import com.ruoyi.order.domain.pojo.MemberInvoiceRise; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 我的发票抬头 Mapper 接口 * </p> * * @author mitao * @since 2024-05-23 */ public interface MemberInvoiceRiseMapper extends BaseMapper<MemberInvoiceRise> { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IMemberInvoiceOrderService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.order.service; import com.ruoyi.order.domain.pojo.MemberInvoiceOrder; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 开票和订单关联 服务类 * </p> * * @author mitao * @since 2024-05-23 */ public interface IMemberInvoiceOrderService extends IService<MemberInvoiceOrder> { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IMemberInvoiceRiseService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.order.service; import com.ruoyi.order.domain.pojo.MemberInvoiceRise; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 我的发票抬头 服务类 * </p> * * @author mitao * @since 2024-05-23 */ public interface IMemberInvoiceRiseService extends IService<MemberInvoiceRise> { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IMemberInvoiceService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.order.service; import com.ruoyi.order.domain.pojo.MemberInvoice; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 我的发票 服务类 * </p> * * @author mitao * @since 2024-05-23 */ public interface IMemberInvoiceService extends IService<MemberInvoice> { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MemberInvoiceOrderServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.order.service.impl; import com.ruoyi.order.domain.pojo.MemberInvoiceOrder; import com.ruoyi.order.mapper.MemberInvoiceOrderMapper; import com.ruoyi.order.service.IMemberInvoiceOrderService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 开票和订单关联 服务实现类 * </p> * * @author mitao * @since 2024-05-23 */ @Service public class MemberInvoiceOrderServiceImpl extends ServiceImpl<MemberInvoiceOrderMapper, MemberInvoiceOrder> implements IMemberInvoiceOrderService { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MemberInvoiceRiseServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.order.service.impl; import com.ruoyi.order.domain.pojo.MemberInvoiceRise; import com.ruoyi.order.mapper.MemberInvoiceRiseMapper; import com.ruoyi.order.service.IMemberInvoiceRiseService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 我的发票抬头 服务实现类 * </p> * * @author mitao * @since 2024-05-23 */ @Service public class MemberInvoiceRiseServiceImpl extends ServiceImpl<MemberInvoiceRiseMapper, MemberInvoiceRise> implements IMemberInvoiceRiseService { } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MemberInvoiceServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.order.service.impl; import com.ruoyi.order.domain.pojo.MemberInvoice; import com.ruoyi.order.mapper.MemberInvoiceMapper; import com.ruoyi.order.service.IMemberInvoiceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 我的发票 服务实现类 * </p> * * @author mitao * @since 2024-05-23 */ @Service public class MemberInvoiceServiceImpl extends ServiceImpl<MemberInvoiceMapper, MemberInvoice> implements IMemberInvoiceService { } ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/MemberInvoiceMapper.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.order.mapper.MemberInvoiceMapper"> </mapper> ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/MemberInvoiceOrderMapper.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.order.mapper.MemberInvoiceOrderMapper"> </mapper> ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/MemberInvoiceRiseMapper.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.order.mapper.MemberInvoiceRiseMapper"> </mapper> ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java
@@ -1,17 +1,19 @@ package com.ruoyi.system; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import com.ruoyi.common.security.annotation.EnableCustomConfig; import com.ruoyi.common.security.annotation.EnableRyFeignClients; import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; /** * 系统模块 * * @author ruoyi */ @EnableAsync @EnableCustomConfig @MapperScan({"com.ruoyi.system.mapper"}) @EnableCustomSwagger2 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java
@@ -4,13 +4,16 @@ import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.system.api.constants.DelayTaskEnum; import com.ruoyi.system.api.feignClient.GoodsSkuClient; import java.util.Date; import lombok.extern.log4j.Log4j2; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @@ -18,12 +21,13 @@ * @author mitao * @date 2024/5/22 */ @Log4j2 @Slf4j @Component public class RedisListener extends KeyExpirationEventMessageListener { private RedisTemplate<String, Object> redisTemplate; @Resource private GoodsSkuClient goodsSkuClient; public RedisListener(RedisMessageListenerContainer listenerContainer, RedisTemplate redisTemplate) { super(listenerContainer); @@ -41,17 +45,23 @@ if(expiredKey.contains("-")){ String[] split = expiredKey.split("-"); String operation=split[0]; Long id = Long.valueOf(split[1]); if(DelayTaskEnum.SECKILL_START_TASK.getCode().equals(operation)){ //自动开始任务 //自动开始秒杀任务 autoStartSeckill(id); }else if(DelayTaskEnum.SECKILL_END_TASK.getCode().equals(operation)){ //自动结束任务 //自动结束秒杀任务 autoEndSeckill(id); }else if(DelayTaskEnum.GROUP_PURCHASES_START_TASK.getCode().equals(operation)){ //自动开始任务 //自动开始团购任务 autoStartGroupPurchase(id); } else if(DelayTaskEnum.GROUP_PURCHASES_END_TASK.getCode().equals(operation)){ //自动结束任务 //自动结束团购任务 autoEndGroupPurchase(id); }else if(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode().equals(operation)){ //自动结束任务 //自动取消订单 autoCancelOrder(id); } //删除失效的key redisTemplate.delete(expiredKey); @@ -74,16 +84,33 @@ } //延时任务表 @Async public void autoStartSeckill(Long seckillId) { log.info("autoStartSeckill scheduler task is running :" + seckillId); goodsSkuClient.startSeckill(seckillId); private void autoStartActivity(String activityId){ log.info("autoStartActivity scheduler task is running :" + activityId); } private void autoEndActivity(String activityId){ log.info("autoEndActivity scheduler task is running :" + activityId); @Async public void autoEndSeckill(Long seckillId) { log.info("autoEndSeckill scheduler task is running :" + seckillId); goodsSkuClient.endSeckill(seckillId); } private void autoCancelOrder(String orderId){ @Async public void autoStartGroupPurchase(Long GroupPurchaseId) { log.info("autoStartGroupPurchase scheduler task is running :" + GroupPurchaseId); goodsSkuClient.startGroupPurchase(GroupPurchaseId); } @Async public void autoEndGroupPurchase(Long GroupPurchaseId) { log.info("autoEndGroupPurchase scheduler task is running :" + GroupPurchaseId); goodsSkuClient.endGroupPurchase(GroupPurchaseId); } @Async public void autoCancelOrder(Long orderId) { log.info("autoCancelOrder scheduler task is running :" + orderId); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomConfigService.java
@@ -1,7 +1,7 @@ package com.ruoyi.system.service; import com.ruoyi.system.domain.pojo.CustomConfig; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.domain.CustomConfig; /** * <p> ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/MemberPointsMapper.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.member.mapper.MemberPointsMapper"> </mapper>