New file |
| | |
| | | package com.ruoyi.system.api.constants; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import lombok.Getter; |
| | | |
| | | @JsonFormat(shape = JsonFormat.Shape.OBJECT) |
| | | @Getter |
| | | public enum DelayTaskEnum { |
| | | |
| | | ORDER_AUTOMATIC_CANCEL("订单延时任务-自动关闭", "超时订单自动关闭"), |
| | | SECKILL_START_TASK("秒杀商品延时任务", "定时开始任务"), |
| | | SECKILL_END_TASK("秒杀商品延时任务", "定时结束任务"), |
| | | GROUP_PURCHASES_START_TASK("团购商品延时任务", "定时开始任务"), |
| | | GROUP_PURCHASES_END_TASK("团购商品延时任务", "定时结束任务"), |
| | | ; |
| | | |
| | | String name; |
| | | String code; |
| | | |
| | | private static Map<String, DelayTaskEnum> valueMap = new HashMap<>(); |
| | | |
| | | static { |
| | | for (DelayTaskEnum gender : DelayTaskEnum.values()) { |
| | | valueMap.put(gender.name, gender); |
| | | } |
| | | } |
| | | |
| | | DelayTaskEnum(String name, String code) { |
| | | this.code = code; |
| | | this.name = name; |
| | | } |
| | | |
| | | public static String getByName(String name) { |
| | | DelayTaskEnum result = valueMap.get(name); |
| | | if (result == null) { |
| | | throw new IllegalArgumentException("No element matches " + name); |
| | | } |
| | | return result.code; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | 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 java.io.Serializable; |
| | | import java.util.Date; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.experimental.Accessors; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author jqs |
| | | * @since 2023-05-29 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @Accessors(chain = true) |
| | | @TableName("t_delay_task") |
| | | public class DelayTask implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 延时任务id |
| | | */ |
| | | @TableId(value = "task_id", type = IdType.AUTO) |
| | | private Long taskId; |
| | | /** |
| | | * 删除标记 |
| | | */ |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | /** |
| | | * 键值 |
| | | */ |
| | | @TableField("redis_key") |
| | | private String redisKey; |
| | | /** |
| | | * 执行时间 |
| | | */ |
| | | @TableField("end_time") |
| | | private Date endTime; |
| | | |
| | | @TableField("create_time") |
| | | private Date createTime; |
| | | |
| | | } |
| | |
| | | public R<Integer> getSeckillMembers(Long id) { |
| | | return R.fail("获取秒杀商品已购会员数失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Integer> getGroupPurchasesGoodsNum(Long id) { |
| | | return R.fail("获取团购商品已购数量失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | |
| | | } |
| | |
| | | */ |
| | | @GetMapping("/order/seckill-members/{id}") |
| | | R<Integer> getSeckillMembers(@PathVariable("id") Long id); |
| | | |
| | | /** |
| | | * 获取团购商品已购数量 |
| | | * |
| | | * @param id 团购商品id |
| | | * @return 团购商品已购数量 |
| | | */ |
| | | @GetMapping("/order/group-purchase-num/{id}") |
| | | R<Integer> getGroupPurchasesGoodsNum(@PathVariable("id") Long id); |
| | | } |
| | |
| | | import org.mybatis.spring.annotation.MapperScan; |
| | | import org.springframework.boot.SpringApplication; |
| | | import org.springframework.boot.autoconfigure.SpringBootApplication; |
| | | import org.springframework.scheduling.annotation.EnableScheduling; |
| | | |
| | | /** |
| | | * 系统模块 |
| | |
| | | @MapperScan({"com.ruoyi.goods.mapper"}) |
| | | @EnableCustomSwagger2 |
| | | @EnableRyFeignClients |
| | | @EnableScheduling |
| | | @SpringBootApplication |
| | | public class RuoYiGoodsApplication |
| | | { |
New file |
| | |
| | | package com.ruoyi.goods.controller.management.DTO; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author mitao |
| | | * @date 2024/5/22 |
| | | */ |
| | | @Data |
| | | @ApiModel(value = "团购商品数据传输对象", description = "团购商品数据传输对象") |
| | | public class GoodsGroupPurchaseDTO { |
| | | |
| | | @ApiModelProperty(value = "团购商品id", notes = "添加不传,更新必传") |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "商品id", notes = "添加必传,更新不传") |
| | | private Long goodsSkuId; |
| | | |
| | | @ApiModelProperty(value = "分享标题") |
| | | private String shareTitle; |
| | | |
| | | @ApiModelProperty(value = "分享图片") |
| | | private String sharePic; |
| | | |
| | | @ApiModelProperty(value = "团购价格") |
| | | private BigDecimal groupPurchasePrice; |
| | | |
| | | @ApiModelProperty(value = "成团人数") |
| | | private Integer groupSize; |
| | | |
| | | @ApiModelProperty(value = "限购数量") |
| | | private Integer limitNumber; |
| | | |
| | | @ApiModelProperty(value = "团购开始时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime startTime; |
| | | |
| | | @ApiModelProperty(value = "团购结束时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime endTime; |
| | | |
| | | @ApiModelProperty(value = "参团说明") |
| | | private String description; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.goods.controller.management.DTO; |
| | | |
| | | |
| | | import com.ruoyi.common.core.web.page.BasePage; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | /** |
| | | * @author mitao |
| | | * @date 2024/5/22 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ApiModel(value = "团购商品查询对象", description = "团购商品查询对象") |
| | | public class GoodsGroupPurchaseQuery extends BasePage { |
| | | |
| | | private static final long serialVersionUID = -5336934411126155565L; |
| | | |
| | | @ApiModelProperty("商品名称") |
| | | private String goodsSkuName; |
| | | |
| | | } |
| | |
| | | import com.ruoyi.common.core.web.page.BasePage; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import javax.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.hibernate.validator.constraints.Range; |
| | | |
| | | /** |
| | | * @author mitao |
| | |
| | | |
| | | @ApiModelProperty(value = "上架状态 上架中 已下架", notes = "参数传文字") |
| | | private ListingStatusEnum listingStatus; |
| | | |
| | | @ApiModelProperty(value = "查询类型 1=仅上架商品 2=全部") |
| | | @NotNull(message = "查询类型不能为空") |
| | | @Range(min = 1, max = 2, message = "查询类型必须为1或2") |
| | | private Integer queryType; |
| | | } |
| | |
| | | package com.ruoyi.goods.controller.management; |
| | | |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.utils.page.PageDTO; |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseDTO; |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseQuery; |
| | | import com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO; |
| | | import com.ruoyi.goods.service.IGoodsGroupPurchaseService; |
| | | import com.ruoyi.system.api.domain.dto.ListStatusDTO; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.validation.annotation.Validated; |
| | | 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.PutMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | |
| | | @Api(value = "管理后台商品团购相关接口", tags = {"管理后台接口"}) |
| | | public class MgtGoodsGroupPurchaseController { |
| | | |
| | | private final IGoodsGroupPurchaseService goodsGroupPurchaseService; |
| | | |
| | | /** |
| | | * 获取团购商品列表的分页数据 |
| | | * |
| | | * @param query 团购商品查询对象 |
| | | * @return PageDTO < GoodsGroupPurchaseVO> |
| | | */ |
| | | @ApiOperation(value = "获取团购商品列表的分页数据", notes = "获取团购商品列表的分页数据") |
| | | @PostMapping("/page") |
| | | public R<PageDTO<GoodsGroupPurchaseVO>> getGoodsGroupPurchasePage( |
| | | GoodsGroupPurchaseQuery query) { |
| | | return R.ok(goodsGroupPurchaseService.getGoodsGroupPurchasePage(query)); |
| | | } |
| | | |
| | | /** |
| | | * 添加/编辑 团购商品 |
| | | * |
| | | * @param dto 团购商品数据传输对象 |
| | | */ |
| | | @ApiOperation(value = "添加/编辑 团购商品", notes = "添加/编辑 团购商品") |
| | | @PostMapping("/save") |
| | | public R<Void> saveGoodsGroupPurchase(GoodsGroupPurchaseDTO dto) { |
| | | goodsGroupPurchaseService.saveGoodsGroupPurchase(dto); |
| | | return R.ok(); |
| | | } |
| | | |
| | | /** |
| | | * 查看详情 |
| | | * |
| | | * @param id 团购商品id |
| | | * @return GoodsGroupPurchaseVO |
| | | */ |
| | | @ApiOperation(value = " 查看详情", notes = "查看详情") |
| | | @GetMapping("/detail/{id}") |
| | | public R<GoodsGroupPurchaseVO> getGoodsGroupPurchaseDetail(@PathVariable("id") Long id) { |
| | | return R.ok(goodsGroupPurchaseService.getGoodsGroupPurchaseDetail(id)); |
| | | } |
| | | |
| | | /** |
| | | * 下架/上架 团购商品 |
| | | * |
| | | * @param dto 商品上下架状态对象 |
| | | */ |
| | | @ApiOperation(value = "下架/上架 团购商品", notes = "下架 /上架 团购商品") |
| | | @PutMapping("/upd-status") |
| | | public R<Void> updStatus(@Validated @RequestBody ListStatusDTO dto) { |
| | | goodsGroupPurchaseService.updStatus(dto); |
| | | return R.ok(); |
| | | } |
| | | } |
| | |
| | | return R.ok(); |
| | | } |
| | | |
| | | /** |
| | | * 查看详情 |
| | | * |
| | | * @param id 秒杀商品id |
| | | * @return GoodsSeckillVO 商品秒杀视图对象 |
| | | */ |
| | | @ApiOperation("查看详情") |
| | | @GetMapping("/detail/{id}") |
| | | public R<GoodsSeckillVO> getDetail(@PathVariable("id") Long id) { |
New file |
| | |
| | | package com.ruoyi.goods.controller.management.VO; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.ruoyi.common.core.enums.GroupStatusEnum; |
| | | import com.ruoyi.common.core.enums.ListingStatusEnum; |
| | | import com.ruoyi.common.core.enums.StartStatusEnum; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author mitao |
| | | * @date 2024/5/22 |
| | | */ |
| | | @Data |
| | | @ApiModel(value = "团购商品视图对象", description = "团购商品视图对象") |
| | | public class GoodsGroupPurchaseVO { |
| | | |
| | | @ApiModelProperty(value = "商品团购id") |
| | | @TableId(value = "id", type = IdType.ASSIGN_ID) |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "商品名称") |
| | | private String goodsSkuName; |
| | | |
| | | @ApiModelProperty(value = "团购价格") |
| | | private BigDecimal groupPurchasePrice; |
| | | |
| | | @ApiModelProperty(value = "成团人数") |
| | | private Integer groupSize; |
| | | |
| | | @ApiModelProperty(value = "当前人数") |
| | | private Integer currentNumber; |
| | | |
| | | @ApiModelProperty(value = "限购数量") |
| | | private Integer limitNumber; |
| | | |
| | | @ApiModelProperty(value = "已购商品数") |
| | | private Integer buyNumber; |
| | | |
| | | @ApiModelProperty(value = "团购开始时间") |
| | | private LocalDateTime startTime; |
| | | |
| | | @ApiModelProperty(value = "团购结束时间") |
| | | private LocalDateTime endTime; |
| | | |
| | | @ApiModelProperty(value = "参团说明") |
| | | private String description; |
| | | |
| | | @ApiModelProperty(value = "分享标题") |
| | | private String shareTitle; |
| | | |
| | | @ApiModelProperty(value = "分享图片") |
| | | private String sharePic; |
| | | |
| | | @ApiModelProperty(value = "开始状态 0=未开始 1=已开始 2=已结束 ") |
| | | private StartStatusEnum startStatus; |
| | | |
| | | @ApiModelProperty(value = "上架状态 0=已上架 1=已下架") |
| | | private ListingStatusEnum listingStatus; |
| | | |
| | | @ApiModelProperty(value = "成团状态 0=待成团 1=已成团 2=成团失败") |
| | | private GroupStatusEnum groupStatus; |
| | | |
| | | } |
| | |
| | | @TableField("limit_number") |
| | | private Integer limitNumber; |
| | | |
| | | @ApiModelProperty(value = "当前人数") |
| | | @TableField("current_number") |
| | | private Integer currentNumber; |
| | | |
| | | @ApiModelProperty(value = "团购开始时间") |
| | | @TableField("start_time") |
| | | private LocalDateTime startTime; |
| | |
| | | package com.ruoyi.goods.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO; |
| | | import com.ruoyi.goods.domain.GoodsGroupPurchase; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | */ |
| | | public interface GoodsGroupPurchaseMapper extends BaseMapper<GoodsGroupPurchase> { |
| | | |
| | | /** |
| | | * @param goodsSkuName 商品名称 |
| | | * @param page 分页参数 |
| | | * @return Page<GoodsGroupPurchaseVO> |
| | | */ |
| | | Page<GoodsGroupPurchaseVO> getGoodsGroupPurchasePage(@Param("goodsSkuName") String goodsSkuName, |
| | | @Param("page") Page<GoodsGroupPurchaseVO> page); |
| | | } |
| | |
| | | package com.ruoyi.goods.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.common.core.utils.page.PageDTO; |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseDTO; |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseQuery; |
| | | import com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO; |
| | | import com.ruoyi.goods.domain.GoodsGroupPurchase; |
| | | import com.ruoyi.system.api.domain.dto.ListStatusDTO; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | */ |
| | | public interface IGoodsGroupPurchaseService extends IService<GoodsGroupPurchase> { |
| | | |
| | | /** |
| | | * 获取团购商品列表的分页数据 |
| | | * |
| | | * @param query 团购商品查询对象 |
| | | * @return PageDTO < GoodsGroupPurchaseVO> |
| | | */ |
| | | PageDTO<GoodsGroupPurchaseVO> getGoodsGroupPurchasePage(GoodsGroupPurchaseQuery query); |
| | | |
| | | /** |
| | | * 添加/编辑 团购商品 |
| | | * |
| | | * @param dto 团购商品数据传输对象 |
| | | */ |
| | | void saveGoodsGroupPurchase(GoodsGroupPurchaseDTO dto); |
| | | |
| | | /** |
| | | * 查看详情 |
| | | * |
| | | * @param id 团购商品id |
| | | * @return GoodsGroupPurchaseVO 团购商品视图对象 |
| | | */ |
| | | GoodsGroupPurchaseVO getGoodsGroupPurchaseDetail(Long id); |
| | | |
| | | /** |
| | | * 下架/上架 团购商品 |
| | | * |
| | | * @param dto 商品上下架状态对象 |
| | | */ |
| | | void updStatus(ListStatusDTO dto); |
| | | } |
| | |
| | | */ |
| | | void updGoodsSeckill(GoodsSeckillUpd upd); |
| | | |
| | | /** |
| | | * 上架/下架 秒杀商品 |
| | | * |
| | | * @param dto 商品上下架状态对象 |
| | | */ |
| | | void updStatus(ListStatusDTO dto); |
| | | |
| | | /** |
| | | * 查看详情 |
| | | * |
| | | * @param id 秒杀商品id |
| | | * @return GoodsSeckillVO 商品秒杀视图对象 |
| | | */ |
| | | GoodsSeckillVO getDetail(Long id); |
| | | } |
| | |
| | | * @param dto 数据传输对象,包含需要更新的SKU的ID和新的上架状态。 其中,ID用于指定要更新的具体SKU,listingStatus用于指定新的上架状态。 |
| | | * @return 无返回值。 |
| | | */ |
| | | void updStatus(ListStatusDTO dto); |
| | | void updStatus(ListStatusDTO dto) throws Exception; |
| | | |
| | | } |
| | |
| | | Page<GoodsBrand> page = this.lambdaQuery() |
| | | .like(StringUtils.isNotEmpty(query.getBrandName()), GoodsBrand::getBrandName, |
| | | query.getBrandName()) |
| | | .page(new Page<GoodsBrand>(query.getPageCurr(), query.getPageSize())); |
| | | .page(new Page<>(query.getPageCurr(), query.getPageSize())); |
| | | if (StringUtils.isEmpty(page.getRecords())) { |
| | | return PageDTO.empty(page.getTotal(), page.getPages()); |
| | | } |
| | |
| | | * |
| | | * @param dto 商品品牌数据传输对象,包含商品品牌的信息。 如果dto中的id为空,则认为是新品牌,调用save方法保存; |
| | | * 如果id不为空,则认为是更新已有品牌,调用updateById方法更新。 |
| | | * @return 无返回值 |
| | | */ |
| | | @Override |
| | | public void saveGoodsBrand(GoodsBrandDTO dto) { |
| | |
| | | package com.ruoyi.goods.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.core.enums.ListingStatusEnum; |
| | | import com.ruoyi.common.core.enums.StartStatusEnum; |
| | | import com.ruoyi.common.core.exception.ServiceException; |
| | | 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.goods.controller.management.DTO.GoodsGroupPurchaseDTO; |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseQuery; |
| | | import com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO; |
| | | import com.ruoyi.goods.domain.GoodsGroupPurchase; |
| | | import com.ruoyi.goods.mapper.GoodsGroupPurchaseMapper; |
| | | import com.ruoyi.goods.service.IGoodsGroupPurchaseService; |
| | | import com.ruoyi.system.api.domain.dto.ListStatusDTO; |
| | | import com.ruoyi.system.api.feignClient.OrderClient; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | |
| | | * @since 2024-05-16 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class GoodsGroupPurchaseServiceImpl extends ServiceImpl<GoodsGroupPurchaseMapper, GoodsGroupPurchase> implements IGoodsGroupPurchaseService { |
| | | |
| | | private final OrderClient orderClient; |
| | | |
| | | /** |
| | | * 获取团购商品列表的分页数据 |
| | | * |
| | | * @param query 团购商品查询对象 |
| | | * @return PageDTO < GoodsGroupPurchaseVO> |
| | | */ |
| | | @Override |
| | | public PageDTO<GoodsGroupPurchaseVO> getGoodsGroupPurchasePage(GoodsGroupPurchaseQuery query) { |
| | | return PageDTO.of( |
| | | baseMapper.getGoodsGroupPurchasePage(query.getGoodsSkuName(), |
| | | new Page<>(query.getPageCurr(), query.getPageSize()))); |
| | | } |
| | | |
| | | /** |
| | | * 添加/编辑 团购商品 |
| | | * |
| | | * @param dto 团购商品数据传输对象 |
| | | */ |
| | | @Override |
| | | public void saveGoodsGroupPurchase(GoodsGroupPurchaseDTO dto) { |
| | | GoodsGroupPurchase goodsGroupPurchase = BeanUtils.copyBean(dto, GoodsGroupPurchase.class); |
| | | if (StringUtils.isNull(dto.getId())) { |
| | | this.save(goodsGroupPurchase); |
| | | } else { |
| | | GoodsGroupPurchase groupPurchase = this.getById(dto.getId()); |
| | | if (StringUtils.isNull(groupPurchase)) { |
| | | throw new ServiceException("团购商品不存在"); |
| | | } |
| | | this.updateById(goodsGroupPurchase); |
| | | } |
| | | //TODO 添加调度任务 处理团购商品开始结束 |
| | | } |
| | | |
| | | /** |
| | | * 查看详情 |
| | | * |
| | | * @param id 团购商品id |
| | | * @return GoodsGroupPurchaseVO 团购商品视图对象 |
| | | */ |
| | | @Override |
| | | public GoodsGroupPurchaseVO getGoodsGroupPurchaseDetail(Long id) { |
| | | GoodsGroupPurchase groupPurchase = this.getById(id); |
| | | if (StringUtils.isNull(groupPurchase)) { |
| | | throw new ServiceException("团购商品不存在"); |
| | | } |
| | | GoodsGroupPurchaseVO vo = BeanUtils.copyBean(groupPurchase, |
| | | GoodsGroupPurchaseVO.class); |
| | | //远程调用订单服务查询商品购买总数 |
| | | Integer num = orderClient.getGroupPurchasesGoodsNum(groupPurchase.getId()).getData(); |
| | | vo.setBuyNumber(num); |
| | | return vo; |
| | | } |
| | | |
| | | /** |
| | | * 下架/上架 团购商品 |
| | | * |
| | | * @param dto 商品上下架状态对象 |
| | | */ |
| | | @Override |
| | | public void updStatus(ListStatusDTO dto) { |
| | | GoodsGroupPurchase groupPurchase = this.getById(dto.getId()); |
| | | if (StringUtils.isNull(groupPurchase)) { |
| | | throw new ServiceException("团购商品不存在"); |
| | | } |
| | | //判断商品状态 |
| | | if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF) |
| | | && groupPurchase.getStartStatus().equals(StartStatusEnum.STARTED)) { |
| | | throw new ServiceException("该商品已开始团购,不能下架"); |
| | | } |
| | | //修改状态 |
| | | groupPurchase.setListingStatus(dto.getListingStatus()); |
| | | this.updateById(groupPurchase); |
| | | } |
| | | } |
| | |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsSeckillDTO; |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsSeckillQuery; |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsSeckillUpd; |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsSkuInfoDTO; |
| | | import com.ruoyi.goods.controller.management.VO.GoodsSeckillVO; |
| | | import com.ruoyi.goods.domain.GoodsSeckill; |
| | | import com.ruoyi.goods.domain.GoodsSku; |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void addGoodsSeckill(GoodsSeckillDTO dto) { |
| | | List<GoodsSkuInfoDTO> goodsSkuList = dto.getGoodsSkuList(); |
| | | List<GoodsSeckill> goodsSeckills = BeanUtils.copyList(dto.getGoodsSkuList(), |
| | | GoodsSeckill.class); |
| | | for (GoodsSeckill goodsSeckill : goodsSeckills) { |
| | |
| | | goodsSeckill.setStartStatus(StartStatusEnum.NOT_STARTED); |
| | | } |
| | | this.saveBatch(goodsSeckills); |
| | | //TODO 添加调度任务控制开始结束 |
| | | } |
| | | |
| | | /** |
| | | * 获取秒杀商品列表的分页数据 |
| | | * |
| | | * @param query 秒杀商品查询对象 |
| | | * @return |
| | | * @return PageDTO<GoodsSeckillVO> |
| | | */ |
| | | @Override |
| | | public PageDTO<GoodsSeckillVO> getGoodsSeckillPage(GoodsSeckillQuery query) { |
| | | Page<GoodsSeckillVO> page = baseMapper.getGoodsSeckillPage(query.getGoodsSkuName(), |
| | | new Page<GoodsSeckillVO>(query.getPageCurr(), query.getPageSize()) |
| | | ); |
| | | return PageDTO.of(page); |
| | | return PageDTO.of(baseMapper.getGoodsSeckillPage(query.getGoodsSkuName(), |
| | | new Page<>(query.getPageCurr(), query.getPageSize()) |
| | | )); |
| | | } |
| | | |
| | | /** |
| | |
| | | .update(); |
| | | } |
| | | |
| | | /** |
| | | * 查看详情 |
| | | * |
| | | * @param id 秒杀商品id |
| | | * @return GoodsSeckillVO 商品秒杀视图对象 |
| | | */ |
| | | @Override |
| | | public GoodsSeckillVO getDetail(Long id) { |
| | | GoodsSeckill goodsSeckill = this.getById(id); |
| | |
| | | } |
| | | GoodsSeckillVO vo = BeanUtils.copyBean(goodsSeckill, GoodsSeckillVO.class); |
| | | GoodsSku goods = goodsSkuService.getById(goodsSeckill.getGoodsSkuId()); |
| | | Optional.of(goods).ifPresent(goodsSku -> { |
| | | vo.setGoodsSkuName(goodsSku.getSkuName()); |
| | | }); |
| | | Optional.of(goods).ifPresent(goodsSku -> vo.setGoodsSkuName(goodsSku.getSkuName())); |
| | | Integer num = orderClient.getSeckillMembers(goodsSeckill.getGoodsSkuId()).getData(); |
| | | vo.setNumberOfPurchasedMembers(num); |
| | | return vo; |
| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.fasterxml.jackson.core.JsonProcessingException; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.ruoyi.common.core.enums.ListingStatusEnum; |
| | | import com.ruoyi.common.core.exception.ServiceException; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | import com.ruoyi.common.core.utils.page.BeanUtils; |
| | |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsSkuDTO; |
| | | import com.ruoyi.goods.controller.management.DTO.GoodsSkuQuery; |
| | | import com.ruoyi.goods.controller.management.VO.GoodsSkuVO; |
| | | import com.ruoyi.goods.domain.GoodsGroupPurchase; |
| | | import com.ruoyi.goods.domain.GoodsInfoTitleValue; |
| | | import com.ruoyi.goods.domain.GoodsSeckill; |
| | | import com.ruoyi.goods.domain.GoodsSku; |
| | | import com.ruoyi.goods.mapper.GoodsSkuMapper; |
| | | import com.ruoyi.goods.service.IGoodsGroupPurchaseService; |
| | | import com.ruoyi.goods.service.IGoodsInfoTitleValueService; |
| | | import com.ruoyi.goods.service.IGoodsSeckillService; |
| | | import com.ruoyi.goods.service.IGoodsSkuService; |
| | | import com.ruoyi.system.api.domain.dto.ListStatusDTO; |
| | | import java.util.List; |
| | |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Propagation; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | /** |
| | |
| | | public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> implements IGoodsSkuService { |
| | | |
| | | private final IGoodsInfoTitleValueService goodsInfoTitleValueService; |
| | | private final IGoodsSeckillService goodsSeckillService; |
| | | private final IGoodsGroupPurchaseService goodsGroupPurchaseService; |
| | | private static final ObjectMapper objectMapper = new ObjectMapper(); |
| | | |
| | | /** |
| | |
| | | query.getSkuName()) |
| | | .eq(StringUtils.isNotNull(query.getListingStatus() |
| | | ), GoodsSku::getListingStatus, query.getListingStatus()) |
| | | .page(new Page<GoodsSku>(query.getPageCurr(), query.getPageSize())); |
| | | |
| | | .eq(query.getQueryType().equals(1), GoodsSku::getListingStatus, |
| | | ListingStatusEnum.ON_SHELVES) |
| | | .page(new Page<>(query.getPageCurr(), query.getPageSize())); |
| | | return PageDTO.of(page, GoodsSkuVO.class); |
| | | } |
| | | |
| | |
| | | * 更新商品SKU的状态。 |
| | | * |
| | | * @param dto 数据传输对象,包含需要更新的SKU的ID和新的上架状态。 其中,ID用于指定要更新的具体SKU,listingStatus用于指定新的上架状态。 |
| | | * @return 无返回值。 |
| | | */ |
| | | @Override |
| | | public void updStatus(ListStatusDTO dto) { |
| | | @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) |
| | | public void updStatus(ListStatusDTO dto) throws Exception { |
| | | this.lambdaUpdate() |
| | | .eq(GoodsSku::getId, dto.getId()) |
| | | .set(GoodsSku::getListingStatus, dto.getListingStatus()) |
| | | .update(); |
| | | //关联的秒杀商品和团购商品同步下架 |
| | | if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF)) { |
| | | updateGoodsStatus(dto); |
| | | } |
| | | } |
| | | |
| | | private void updateGoodsStatus(ListStatusDTO dto) { |
| | | goodsSeckillService.lambdaUpdate() |
| | | .set(GoodsSeckill::getListingStatus, |
| | | ListingStatusEnum.REMOVED_FROM_THE_SHELF) |
| | | .eq(GoodsSeckill::getListingStatus, ListingStatusEnum.ON_SHELVES) |
| | | .eq(GoodsSeckill::getGoodsSkuId, dto.getId()).update(); |
| | | goodsGroupPurchaseService.lambdaUpdate() |
| | | .set(GoodsGroupPurchase::getListingStatus, |
| | | ListingStatusEnum.REMOVED_FROM_THE_SHELF) |
| | | .eq(GoodsGroupPurchase::getListingStatus, |
| | | ListingStatusEnum.ON_SHELVES) |
| | | .eq(GoodsGroupPurchase::getGoodsSkuId, dto.getId()).update(); |
| | | } |
| | | } |
| | |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.goods.mapper.GoodsGroupPurchaseMapper"> |
| | | |
| | | <select id="getGoodsGroupPurchasePage" |
| | | resultType="com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO"> |
| | | SELECT |
| | | tgp.*, |
| | | tgs.goods_sku_name |
| | | FROM |
| | | t_goods_group_purchase tgp |
| | | LEFT JOIN t_goods_sku tgs ON tgp.goods_sku_id = tgs.id |
| | | <where> |
| | | <if test="goodsSkuName != null and goodsSkuName != ''"> |
| | | AND tgs.goods_sku_name LIKE CONCAT('%',#{goodsSkuName},'%') |
| | | </if> |
| | | </where> |
| | | </select> |
| | | </mapper> |
| | |
| | | <mapper namespace="com.ruoyi.goods.mapper.GoodsSeckillMapper"> |
| | | <select id="getGoodsSeckillPage" |
| | | resultType="com.ruoyi.goods.controller.management.VO.GoodsSeckillVO"> |
| | | select |
| | | SELECT |
| | | gs.id, |
| | | gsku.goods_sku_name, |
| | | gs.seckill_price, |
| | |
| | | gs.start_time, |
| | | gs.end_time, |
| | | gs.start_status |
| | | from t_goods_seckill gs |
| | | left join t_goods_sku gsku on gs.goods_sku_id = gsku.id |
| | | FROM |
| | | t_goods_seckill gs |
| | | LEFT JOIN t_goods_sku gsku ON gs.goods_sku_id = gsku.id |
| | | <where> |
| | | <if test="goodsSkuName != null and goodsSkuName != ''"> |
| | | and gsku.goods_sku_name like concat('%',#{goodsSkuName},'%') |
| | | AND gsku.goods_sku_name LIKE CONCAT('%',#{goodsSkuName},'%') |
| | | </if> |
| | | </where> |
| | | order by gs.create_time desc |
| | | ORDER BY gs.create_time DESC |
| | | </select> |
| | | </mapper> |
| | |
| | | R<Integer> getSeckillMembers(@PathVariable("id") Long id) { |
| | | return R.ok(orderService.getSeckillMembers(id)); |
| | | } |
| | | |
| | | /** |
| | | * 获取团购商品已购数量 |
| | | * |
| | | * @param id 团购商品id |
| | | * @return 团购商品已购数量 |
| | | */ |
| | | @InnerAuth |
| | | @GetMapping("/group-purchase-num/{id}") |
| | | R<Integer> getGroupPurchasesGoodsNum(@PathVariable("id") Long id) { |
| | | return R.ok(orderService.getGroupPurchasesGoodsNum(id)); |
| | | } |
| | | } |
| | |
| | | void saveOrderOne(OrderDTO OrderDTO); |
| | | |
| | | Integer getSeckillMembers(Long id); |
| | | |
| | | /** |
| | | * 获取团购商品已购数量 |
| | | * |
| | | * @param id 团购商品id |
| | | * @return 团购商品已购数量 |
| | | */ |
| | | Integer getGroupPurchasesGoodsNum(Long id); |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.core.enums.OrderStatusEnum; |
| | | import com.ruoyi.order.domain.pojo.Order; |
| | | import com.ruoyi.order.domain.pojo.OrderMall; |
| | | import com.ruoyi.order.mapper.OrderMapper; |
| | | import com.ruoyi.order.service.IOrderMallService; |
| | | import com.ruoyi.order.service.IOrderService; |
| | | import com.ruoyi.order.util.OrderUtil; |
| | | import com.ruoyi.system.api.domain.dto.OrderDTO; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | import javax.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | |
| | | |
| | | @Resource |
| | | private IOrderService orderService; |
| | | @Resource |
| | | private IOrderMallService orderMallService; |
| | | @Override |
| | | public void saveOrderOne(OrderDTO OrderDTO) { |
| | | Order order=new Order(); |
| | |
| | | return baseMapper.getSeckillMembers(id); |
| | | } |
| | | |
| | | /** |
| | | * 获取团购商品已购数量 |
| | | * |
| | | * @param id 团购商品id |
| | | * @return 团购商品已购数量 |
| | | */ |
| | | @Override |
| | | public Integer getGroupPurchasesGoodsNum(Long id) { |
| | | Set<Long> orderIdSet = orderMallService.lambdaQuery().eq(OrderMall::getActivityId, id) |
| | | .list() |
| | | .stream().map(OrderMall::getOrderId).collect( |
| | | Collectors.toSet()); |
| | | List<Order> list = this.lambdaQuery().in(Order::getId, orderIdSet) |
| | | .in(Order::getOrderStatus, OrderStatusEnum.TO_BE_SHIPPED, |
| | | OrderStatusEnum.GOODS_TO_BE_RECEIVED, OrderStatusEnum.FINISHED).list(); |
| | | return list.stream().map(Order::getGoodsQuantity).reduce(0, Integer::sum); |
| | | } |
| | | } |
| | |
| | | <mapper namespace="com.ruoyi.order.mapper.OrderMapper"> |
| | | |
| | | <select id="getSeckillMembers" resultType="java.lang.Integer"> |
| | | select ifnull(count(1), 0) |
| | | form t_order_mall left om join t_order o |
| | | on om.order_id = o.id |
| | | where om.goods_sku_id = #{id} |
| | | group by o.member_id |
| | | </select> |
| | | SELECT ifnull(count(1), 0) form t_order_mall LEFT om |
| | | JOIN t_order o |
| | | ON om.order_id = o.id |
| | | WHERE |
| | | om.goods_sku_id = #{id} |
| | | AND o.order_status IN (2 |
| | | , 3 |
| | | , 4) |
| | | GROUP BY |
| | | o.member_id |
| | | </select> |
| | | </mapper> |
New file |
| | |
| | | package com.ruoyi.system.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.system.api.domain.DelayTask; |
| | | |
| | | ; |
| | | |
| | | /** |
| | | * <p> |
| | | * 服务类 |
| | | * </p> |
| | | * |
| | | * @author jqs |
| | | * @since 2023-05-29 |
| | | */ |
| | | public interface DelayTaskService extends IService<DelayTask> { |
| | | |
| | | /** |
| | | * @param key |
| | | * @return DelayTask |
| | | * @description |
| | | * @author jqs |
| | | * @date 2023/7/12 11:39 |
| | | */ |
| | | DelayTask getDelayTask(String key); |
| | | |
| | | /** |
| | | * @param delayTask |
| | | * @return void |
| | | * @description |
| | | * @author jqs |
| | | * @date 2023/7/12 11:37 |
| | | */ |
| | | void addDelayTask(DelayTask delayTask); |
| | | |
| | | /** |
| | | * @param key |
| | | * @return DelayTask |
| | | * @description |
| | | * @author jqs |
| | | * @date 2023/7/12 11:39 |
| | | */ |
| | | void deleteDelayTask(String key); |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.system.api.domain.DelayTask; |
| | | import com.ruoyi.system.mapper.DelayTaskMapper; |
| | | import com.ruoyi.system.service.DelayTaskService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | | * <p> |
| | | * 服务实现类 |
| | | * </p> |
| | | * |
| | | * @author jqs |
| | | * @since 2023-05-29 |
| | | */ |
| | | @Service |
| | | public class DelayTaskServiceImpl extends ServiceImpl<DelayTaskMapper, DelayTask> implements |
| | | DelayTaskService { |
| | | |
| | | |
| | | /** |
| | | * @param key |
| | | * @return DelayTask |
| | | * @description |
| | | * @author jqs |
| | | * @date 2023/7/12 11:38 |
| | | */ |
| | | @Override |
| | | public DelayTask getDelayTask(String key) { |
| | | LambdaQueryWrapper<DelayTask> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(DelayTask::getDelFlag, 0); |
| | | queryWrapper.eq(DelayTask::getRedisKey, key); |
| | | DelayTask delayTask = this.getOne(queryWrapper, false); |
| | | return delayTask; |
| | | } |
| | | |
| | | /** |
| | | * @param delayTask |
| | | * @return void |
| | | * @description |
| | | * @author jqs |
| | | * @date 2023/7/12 11:37 |
| | | */ |
| | | @Override |
| | | public void addDelayTask(DelayTask delayTask) { |
| | | this.saveOrUpdate(delayTask); |
| | | } |
| | | |
| | | /** |
| | | * @param key |
| | | * @return DelayTask |
| | | * @description |
| | | * @author jqs |
| | | * @date 2023/7/12 11:39 |
| | | */ |
| | | @Override |
| | | public void deleteDelayTask(String key) { |
| | | LambdaUpdateWrapper<DelayTask> updateWrapper = new LambdaUpdateWrapper<>(); |
| | | updateWrapper.eq(DelayTask::getDelFlag, 0); |
| | | updateWrapper.eq(DelayTask::getRedisKey, key); |
| | | updateWrapper.set(DelayTask::getDelFlag, 1); |
| | | this.update(updateWrapper); |
| | | } |
| | | } |
New file |
| | |
| | | <?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.system.mapper.config.DelayTaskMapper"> |
| | | |
| | | |
| | | </mapper> |