package cn.iocoder.yudao.module.promotion.controller.app.bargain; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; import cn.iocoder.yudao.module.promotion.controller.app.bargain.vo.activity.AppBargainActivityDetailRespVO; import cn.iocoder.yudao.module.promotion.controller.app.bargain.vo.activity.AppBargainActivityRespVO; import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert; import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO; import cn.iocoder.yudao.module.promotion.enums.bargain.BargainRecordStatusEnum; import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService; import cn.iocoder.yudao.module.promotion.service.bargain.BargainRecordService; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.security.PermitAll; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import jakarta.annotation.Resource; import java.time.Duration; import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; @Tag(name = "用户 App - 砍价活动") @RestController @RequestMapping("/promotion/bargain-activity") @Validated public class AppBargainActivityController { /** * {@link AppBargainActivityRespVO} 缓存,通过它异步刷新 {@link #getBargainActivityList0(Integer)} 所要的首页数据 */ private final LoadingCache> bargainActivityListCache = buildAsyncReloadingCache(Duration.ofSeconds(10L), new CacheLoader>() { @Override public List load(Integer count) { return getBargainActivityList0(count); } }); @Resource private BargainActivityService bargainActivityService; @Resource private BargainRecordService bargainRecordService; @Resource private ProductSpuApi spuApi; @GetMapping("/list") @Operation(summary = "获得砍价活动列表", description = "用于小程序首页") @Parameter(name = "count", description = "需要展示的数量", example = "6") @PermitAll public CommonResult> getBargainActivityList( @RequestParam(name = "count", defaultValue = "6") Integer count) { return success(bargainActivityListCache.getUnchecked(count)); } private ListgetBargainActivityList0(Integer count) { List list = bargainActivityService.getBargainActivityListByCount(count); if (CollUtil.isEmpty(list)) { return Collections.emptyList(); } // 拼接数据 List spuList = spuApi.getSpuList(convertList(list, BargainActivityDO::getSpuId)); return BargainActivityConvert.INSTANCE.convertAppList(list, spuList); } @GetMapping("/page") @Operation(summary = "获得砍价活动分页") @PermitAll public CommonResult> getBargainActivityPage(PageParam pageReqVO) { PageResult result = bargainActivityService.getBargainActivityPage(pageReqVO); if (CollUtil.isEmpty(result.getList())) { return success(PageResult.empty(result.getTotal())); } // 拼接数据 List spuList = spuApi.getSpuList(convertList(result.getList(), BargainActivityDO::getSpuId)); return success(BargainActivityConvert.INSTANCE.convertAppPage(result, spuList)); } @GetMapping("/get-detail") @Operation(summary = "获得砍价活动详情") @Parameter(name = "id", description = "活动编号", example = "1") @PermitAll public CommonResult getBargainActivityDetail(@RequestParam("id") Long id) { BargainActivityDO activity = bargainActivityService.getBargainActivity(id); if (activity == null) { return success(null); } // 拼接数据 Integer successUserCount = bargainRecordService.getBargainRecordUserCount(id, BargainRecordStatusEnum.SUCCESS.getStatus()); ProductSpuRespDTO spu = spuApi.getSpu(activity.getSpuId()); return success(BargainActivityConvert.INSTANCE.convert(activity, successUserCount, spu)); } }