diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/WebsiteController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/WebsiteController.java index 8062a90ab..ec4914fd5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/WebsiteController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/WebsiteController.java @@ -4,6 +4,12 @@ import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.core.controller.XktBaseController; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.Page; +import com.ruoyi.web.controller.xkt.vo.advertRound.app.index.APPIndexHotSaleRightFixVO; +import com.ruoyi.web.controller.xkt.vo.advertRound.app.index.APPIndexMidBrandVO; +import com.ruoyi.web.controller.xkt.vo.advertRound.app.category.APPCateVO; +import com.ruoyi.web.controller.xkt.vo.advertRound.app.own.APPOwnGuessLikeVO; +import com.ruoyi.web.controller.xkt.vo.advertRound.pc.PCDownloadVO; +import com.ruoyi.web.controller.xkt.vo.advertRound.pc.PCUserCenterVO; import com.ruoyi.web.controller.xkt.vo.advertRound.pc.index.*; import com.ruoyi.web.controller.xkt.vo.advertRound.pc.newArrival.*; import com.ruoyi.web.controller.xkt.vo.advertRound.pc.store.PCStoreMidBannerVO; @@ -46,6 +52,11 @@ public class WebsiteController extends XktBaseController { return R.ok(websiteService.search(BeanUtil.toBean(searchVO, IndexSearchDTO.class))); } + // TODO APP 首页 热卖精选、人气爆品、新品榜 PC 首页 新品馆 列表 + // TODO APP 首页 热卖精选、人气爆品、新品榜 PC 首页 新品馆 列表 + // TODO APP 首页 热卖精选、人气爆品、新品榜 PC 首页 新品馆 列表 + + @ApiOperation(value = "PC 首页 顶部横向轮播图", httpMethod = "GET", response = R.class) @GetMapping("/pc/index/top/left") public R> getPcIndexTopLeftBanner() { @@ -148,6 +159,52 @@ public class WebsiteController extends XktBaseController { return R.ok(BeanUtil.copyToList(websiteService.getPicSearchList(), PicSearchAdvertVO.class)); } + /*@ApiOperation(value = "PC 搜索结果", httpMethod = "GET", response = R.class) + @GetMapping("pc/search-result") + public R> getSearchResultList() { + return R.ok(BeanUtil.copyToList(websiteService.getSearchResultList(), PicSearchAdvertVO.class)); + }*/ + @ApiOperation(value = "PC 用户中心", httpMethod = "GET", response = R.class) + @GetMapping("/pc/user-center") + public R> getPcUserCenterList() { + return R.ok(BeanUtil.copyToList(websiteService.getPcUserCenterList(), PCUserCenterVO.class)); + } + + @ApiOperation(value = "PC 用户中心", httpMethod = "GET", response = R.class) + @GetMapping("/pc/download") + public R> getPcDownloadList() { + return R.ok(BeanUtil.copyToList(websiteService.getPcDownloadList(), PCDownloadVO.class)); + } + + @ApiOperation(value = "APP 首页顶部轮播图", httpMethod = "GET", response = R.class) + @GetMapping("/app/top/banner") + public R> getAppIndexTopBanner() { + return R.ok(BeanUtil.copyToList(websiteService.getAppIndexTopBanner(), PCDownloadVO.class)); + } + + @ApiOperation(value = "APP 首页品牌好货", httpMethod = "GET", response = R.class) + @GetMapping("/app/mid/brand") + public R> getAppIndexMidBrand() { + return R.ok(BeanUtil.copyToList(websiteService.getAppIndexMidBrand(), APPIndexMidBrandVO.class)); + } + + @ApiOperation(value = "APP 首页热卖精选右侧固定位置", httpMethod = "GET", response = R.class) + @GetMapping("/app/hot-sale/right-fix") + public R> getAppIndexHotSaleRightFix() { + return R.ok(BeanUtil.copyToList(websiteService.getAppIndexHotSaleRightFix(), APPIndexHotSaleRightFixVO.class)); + } + + @ApiOperation(value = "APP 分类页", httpMethod = "GET", response = R.class) + @GetMapping("/app/cate") + public R> getAppCateList() { + return R.ok(BeanUtil.copyToList(websiteService.getAppCateList(), APPCateVO.class)); + } + + @ApiOperation(value = "APP 个人中心猜你喜欢", httpMethod = "GET", response = R.class) + @GetMapping("/app/own/guess-like") + public R> getAppOwnGuessLikeList() { + return R.ok(BeanUtil.copyToList(websiteService.getAppOwnGuessLikeList(), APPOwnGuessLikeVO.class)); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/category/APPCateVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/category/APPCateVO.java new file mode 100644 index 000000000..00356f8fd --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/category/APPCateVO.java @@ -0,0 +1,31 @@ +package com.ruoyi.web.controller.xkt.vo.advertRound.app.category; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP分类页") +@Data +@Accessors(chain = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class APPCateVO { + + @ApiModelProperty(value = "1推广图") + private Integer displayType; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "推广图路径") + private String fileUrl; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/index/APPIndexHotSaleRightFixVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/index/APPIndexHotSaleRightFixVO.java new file mode 100644 index 000000000..37443557f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/index/APPIndexHotSaleRightFixVO.java @@ -0,0 +1,33 @@ +package com.ruoyi.web.controller.xkt.vo.advertRound.app.index; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP首页热卖精选右侧固定广告位") +@Data +@Accessors(chain = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class APPIndexHotSaleRightFixVO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/index/APPIndexMidBrandVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/index/APPIndexMidBrandVO.java new file mode 100644 index 000000000..a264dfc9f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/index/APPIndexMidBrandVO.java @@ -0,0 +1,33 @@ +package com.ruoyi.web.controller.xkt.vo.advertRound.app.index; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP首页品牌好货") +@Data +@Accessors(chain = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class APPIndexMidBrandVO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/index/APPIndexTopBannerVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/index/APPIndexTopBannerVO.java new file mode 100644 index 000000000..2baafb874 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/index/APPIndexTopBannerVO.java @@ -0,0 +1,29 @@ +package com.ruoyi.web.controller.xkt.vo.advertRound.app.index; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP 首页顶部轮播图") +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@Accessors(chain = true) +public class APPIndexTopBannerVO { + + @ApiModelProperty(value = "1推广图") + private Integer displayType; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "推广图路径") + private String fileUrl; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/own/APPOwnGuessLikeVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/own/APPOwnGuessLikeVO.java new file mode 100644 index 000000000..704ddefec --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/app/own/APPOwnGuessLikeVO.java @@ -0,0 +1,38 @@ +package com.ruoyi.web.controller.xkt.vo.advertRound.app.own; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP我的猜你喜欢") +@Data +@Accessors(chain = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class APPOwnGuessLikeVO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "商品货号") + private String prodArtNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + @ApiModelProperty(value = "标签列表") + private List tagList; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/pc/PCDownloadVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/pc/PCDownloadVO.java new file mode 100644 index 000000000..bfe39d3af --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/pc/PCDownloadVO.java @@ -0,0 +1,35 @@ +package com.ruoyi.web.controller.xkt.vo.advertRound.pc; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("PC 下载页") +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class PCDownloadVO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "商品货号") + private String prodArtNum; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + @ApiModelProperty(value = "商品标题") + private String prodTitle; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/pc/PCSearchResultVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/pc/PCSearchResultVO.java new file mode 100644 index 000000000..8111eb7c2 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/pc/PCSearchResultVO.java @@ -0,0 +1,33 @@ +package com.ruoyi.web.controller.xkt.vo.advertRound.pc; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("PC 搜索结果") +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class PCSearchResultVO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "商品货号") + private String prodArtNum; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/pc/PCUserCenterVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/pc/PCUserCenterVO.java new file mode 100644 index 000000000..75f7cbd89 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/advertRound/pc/PCUserCenterVO.java @@ -0,0 +1,35 @@ +package com.ruoyi.web.controller.xkt.vo.advertRound.pc; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("PC 用户中心") +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class PCUserCenterVO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "商品货号") + private String prodArtNum; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + @ApiModelProperty(value = "商品标题") + private String prodTitle; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeFactory/StoreFactoryVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeFactory/StoreFactoryVO.java index dcca1d2d4..5883914e0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeFactory/StoreFactoryVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeFactory/StoreFactoryVO.java @@ -29,8 +29,9 @@ public class StoreFactoryVO { private String facName; @ApiModelProperty(value = "工厂地址") private String facAddress; + @ApiModelProperty(value = "联系人") + private String facContact; @ApiModelProperty(value = "工厂联系电话") - @Pattern(regexp = "^1[3-9]\\d{9}$", message = "联系电话格式不正确,请输入有效的中国大陆手机号") private String facPhone; @ApiModelProperty(value = "备注") private String remark; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index c21ecde1e..d6eef7219 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -135,13 +135,40 @@ public class CacheConstants * 以图搜款 */ public static final String PIC_SEARCH = "pic_search"; - + /** + * PC 用户中心 + */ + public static final String PC_USER_CENTER = "pc_user_center"; + /** + * PC 下载页 + */ + public static final String PC_DOWNLOAD = "pc_download"; /** * APP 广告 */ public static final String APP_ADVERT = "app_advert:"; + /** + * APP 首页顶部轮播图 + */ + public static final String APP_INDEX_TOP_BANNER = "app_index_top_banner"; + /** + * APP 首页中部品牌好货 + */ + public static final String APP_INDEX_MID_BRAND = "app_index_mid_brand"; + /** + * APP 首页热卖精选 右侧固定位置 + */ + public static final String APP_INDEX_HOT_SALE_RIGHT_FIX = "app_index_hot_sale_right_fix"; + /** + * APP 分类页 + */ + public static final String APP_CATE = "app_cate"; + /** + * APP 我的猜你喜欢 + */ + public static final String APP_OWN_GUESS_LIKE = "app_own_guess_like"; /** * 图片搜索统计 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AdType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AdType.java index db8cd0c5f..05f3d171d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AdType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AdType.java @@ -78,7 +78,7 @@ public enum AdType { // PC搜索结果 PC_SEARCH_RESULT(401, "电脑端搜索结果", "/url"), - // PC用户中心 + // PC用户中心 18个位置 PC_USER_CENTER(402, "电脑端用户中心", "/url"), // PC下载页 PC_DOWNLOAD(403, "电脑端下载页", "/url"), diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreFactory.java b/xkt/src/main/java/com/ruoyi/xkt/domain/StoreFactory.java index 154ef42f9..826bfa85e 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreFactory.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/StoreFactory.java @@ -24,43 +24,40 @@ public class StoreFactory extends XktBaseEntity { */ @TableId private Long id; - /** * store.id */ @Excel(name = "store.id") private Long storeId; - /** * 工厂名称 */ @Excel(name = "工厂名称") private String facName; - /** * 工厂地址 */ @Excel(name = "工厂地址") private String facAddress; - + /** + * 联系人 + */ + private String facContact; /** * 工厂联系电话 */ @Excel(name = "工厂联系电话") private String facPhone; - /** * 备注 */ private String remark; - /** * 工厂状态 */ @Excel(name = "工厂状态") private String facStatus; - @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/category/APPCateDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/category/APPCateDTO.java new file mode 100644 index 000000000..4e1b7d09e --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/category/APPCateDTO.java @@ -0,0 +1,29 @@ +package com.ruoyi.xkt.dto.advertRound.app.category; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP分类页") +@Data +@Accessors(chain = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class APPCateDTO { + + @ApiModelProperty(value = "1推广图") + private Integer displayType; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "推广图路径") + private String fileUrl; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/index/APPIndexHotSaleRightFixDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/index/APPIndexHotSaleRightFixDTO.java new file mode 100644 index 000000000..ce1da2231 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/index/APPIndexHotSaleRightFixDTO.java @@ -0,0 +1,33 @@ +package com.ruoyi.xkt.dto.advertRound.app.index; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP首页热卖精选右侧固定广告位") +@Data +@Accessors(chain = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class APPIndexHotSaleRightFixDTO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/index/APPIndexMidBrandDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/index/APPIndexMidBrandDTO.java new file mode 100644 index 000000000..32a527eda --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/index/APPIndexMidBrandDTO.java @@ -0,0 +1,33 @@ +package com.ruoyi.xkt.dto.advertRound.app.index; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP首页品牌好货") +@Data +@Accessors(chain = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class APPIndexMidBrandDTO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/index/APPIndexTopBannerDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/index/APPIndexTopBannerDTO.java new file mode 100644 index 000000000..0ff9ff6cd --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/index/APPIndexTopBannerDTO.java @@ -0,0 +1,29 @@ +package com.ruoyi.xkt.dto.advertRound.app.index; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP 首页顶部轮播图") +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@Accessors(chain = true) +public class APPIndexTopBannerDTO { + + @ApiModelProperty(value = "1推广图") + private Integer displayType; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "推广图路径") + private String fileUrl; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/own/APPOwnGuessLikeDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/own/APPOwnGuessLikeDTO.java new file mode 100644 index 000000000..d8d5c3a4b --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/own/APPOwnGuessLikeDTO.java @@ -0,0 +1,38 @@ +package com.ruoyi.xkt.dto.advertRound.app.own; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("APP我的猜你喜欢列表") +@Data +@Accessors(chain = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class APPOwnGuessLikeDTO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品货号") + private String prodArtNum; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + @ApiModelProperty(value = "标签列表") + private List tagList; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/PCDownloadDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/PCDownloadDTO.java new file mode 100644 index 000000000..5d7a9a358 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/PCDownloadDTO.java @@ -0,0 +1,37 @@ +package com.ruoyi.xkt.dto.advertRound.pc; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("PC 下载页") +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@Accessors(chain = true) +public class PCDownloadDTO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "商品货号") + private String prodArtNum; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + @ApiModelProperty(value = "商品标题") + private String prodTitle; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/PCUserCenterDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/PCUserCenterDTO.java new file mode 100644 index 000000000..5ac1d5ec0 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/PCUserCenterDTO.java @@ -0,0 +1,37 @@ +package com.ruoyi.xkt.dto.advertRound.pc; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("PC 用户中心") +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@Accessors(chain = true) +public class PCUserCenterDTO { + + @ApiModelProperty(value = "2商品") + private Integer displayType; + @ApiModelProperty(value = "档口商品ID") + private Long storeProdId; + @ApiModelProperty(value = "商品货号") + private String prodArtNum; + @ApiModelProperty(value = "排序") + private Integer orderNum; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "商品第一张主图路径") + private String mainPicUrl; + @ApiModelProperty(value = "商品标题") + private String prodTitle; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/storeFactory/StoreFactoryDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/storeFactory/StoreFactoryDTO.java index 3977c2537..1289e78c6 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/storeFactory/StoreFactoryDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/storeFactory/StoreFactoryDTO.java @@ -26,6 +26,8 @@ public class StoreFactoryDTO { private String facName; @ApiModelProperty(value = "工厂地址") private String facAddress; + @ApiModelProperty(value = "联系人") + private String facContact; @ApiModelProperty(value = "工厂联系电话") private String facPhone; @ApiModelProperty("备注") diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/storeFactory/StoreFactoryResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/storeFactory/StoreFactoryResDTO.java index 034bc62a3..189d0f085 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/storeFactory/StoreFactoryResDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/storeFactory/StoreFactoryResDTO.java @@ -28,6 +28,8 @@ public class StoreFactoryResDTO { private String facName; @ApiModelProperty(value = "工厂地址") private String facAddress; + @ApiModelProperty(value = "联系人") + private String facContact; @ApiModelProperty(value = "工厂联系电话") private String facPhone; @ApiModelProperty("备注") diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IWebsiteService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IWebsiteService.java index b75b25976..30fb40f13 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IWebsiteService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IWebsiteService.java @@ -1,6 +1,13 @@ package com.ruoyi.xkt.service; import com.ruoyi.common.core.page.Page; +import com.ruoyi.xkt.dto.advertRound.app.category.APPCateDTO; +import com.ruoyi.xkt.dto.advertRound.app.index.APPIndexHotSaleRightFixDTO; +import com.ruoyi.xkt.dto.advertRound.app.index.APPIndexMidBrandDTO; +import com.ruoyi.xkt.dto.advertRound.app.index.APPIndexTopBannerDTO; +import com.ruoyi.xkt.dto.advertRound.app.own.APPOwnGuessLikeDTO; +import com.ruoyi.xkt.dto.advertRound.pc.PCDownloadDTO; +import com.ruoyi.xkt.dto.advertRound.pc.PCUserCenterDTO; import com.ruoyi.xkt.dto.advertRound.pc.index.*; import com.ruoyi.xkt.dto.advertRound.pc.newArrival.*; import com.ruoyi.xkt.dto.advertRound.pc.store.PCStoreMidBannerDTO; @@ -146,4 +153,52 @@ public interface IWebsiteService { */ List getPicSearchList(); + /** + * PC 用户中心 + * + * @return List + */ + List getPcUserCenterList(); + + /** + * PC 下载页 + * + * @return List + */ + List getPcDownloadList(); + + /** + * APP 首页顶部轮播图 + * + * @return List + */ + List getAppIndexTopBanner(); + + /** + * APP 首页中部品牌好货 + * + * @return List + */ + List getAppIndexMidBrand(); + + /** + * APP 首页热卖精选右侧固定位置 + * + * @return List + */ + List getAppIndexHotSaleRightFix(); + + /** + * APP 分类页 + * + * @return List + */ + List getAppCateList(); + + /** + * APP 我的猜你喜欢列表 + * + * @return List + */ + List getAppOwnGuessLikeList(); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsiteServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsiteServiceImpl.java index 6a10db2c7..4aabaf82b 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsiteServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsiteServiceImpl.java @@ -14,6 +14,13 @@ import com.ruoyi.common.enums.AdType; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.framework.es.EsClientWrapper; import com.ruoyi.xkt.domain.*; +import com.ruoyi.xkt.dto.advertRound.app.category.APPCateDTO; +import com.ruoyi.xkt.dto.advertRound.app.index.APPIndexHotSaleRightFixDTO; +import com.ruoyi.xkt.dto.advertRound.app.index.APPIndexMidBrandDTO; +import com.ruoyi.xkt.dto.advertRound.app.index.APPIndexTopBannerDTO; +import com.ruoyi.xkt.dto.advertRound.app.own.APPOwnGuessLikeDTO; +import com.ruoyi.xkt.dto.advertRound.pc.PCDownloadDTO; +import com.ruoyi.xkt.dto.advertRound.pc.PCUserCenterDTO; import com.ruoyi.xkt.dto.advertRound.pc.index.*; import com.ruoyi.xkt.dto.advertRound.pc.newArrival.*; import com.ruoyi.xkt.dto.advertRound.pc.store.PCStoreMidBannerDTO; @@ -302,8 +309,8 @@ public class WebsiteServiceImpl implements IWebsiteService { if (CollectionUtils.isEmpty(cateSaleList)) { return new ArrayList<>(); } - List prodPriceAndMainPicList = this.storeProdMapper - .selectPriceAndMainPicList(cateSaleList.stream().map(CateSaleRankDTO::getStoreProdId).collect(Collectors.toList())); + List prodPriceAndMainPicList = this.storeProdMapper.selectPriceAndMainPicList(cateSaleList.stream() + .map(CateSaleRankDTO::getStoreProdId).collect(Collectors.toList())); // 档口商品的价格及商品主图map Map prodPriceAndMainPicMap = prodPriceAndMainPicList.stream().collect(Collectors .toMap(StoreProdPriceAndMainPicDTO::getStoreProdId, Function.identity())); @@ -1049,7 +1056,6 @@ public class WebsiteServiceImpl implements IWebsiteService { * 以图搜款 广告 * * @return List - * @param count 返回的数量 */ @Override @Transactional(readOnly = true) @@ -1082,11 +1088,15 @@ public class WebsiteServiceImpl implements IWebsiteService { // 商品标签 List prodTagList = this.dailyProdTagMapper.selectList(new LambdaQueryWrapper() .eq(DailyProdTag::getDelFlag, Constants.UNDELETED).in(DailyProdTag::getStoreProdId, storeProdIdList)); - Map> prodTagMap = prodTagList.stream().collect(Collectors.groupingBy(DailyProdTag::getStoreProdId, Collectors.mapping(DailyProdTag::getTag, Collectors.toList()))); + Map> prodTagMap = prodTagList.stream().collect(Collectors.groupingBy(DailyProdTag::getStoreProdId, Collectors + .collectingAndThen(Collectors.toList(), list -> list.stream() + .sorted(Comparator.comparing(DailyProdTag::getType)).map(DailyProdTag::getTag).collect(Collectors.toList())))); // 档口标签 List storeTagList = this.dailyStoreTagMapper.selectList(new LambdaQueryWrapper() .eq(DailyStoreTag::getDelFlag, Constants.UNDELETED).in(DailyStoreTag::getStoreId, storeList.stream().map(Store::getId).collect(Collectors.toList()))); - Map> storeTagMap = storeTagList.stream().collect(Collectors.groupingBy(DailyStoreTag::getStoreId, Collectors.mapping(DailyStoreTag::getTag, Collectors.toList()))); + Map> storeTagMap = storeTagList.stream().collect(Collectors + .groupingBy(DailyStoreTag::getStoreId, Collectors.collectingAndThen(Collectors.toList(), list -> list.stream() + .sorted(Comparator.comparing(DailyStoreTag::getType)).map(DailyStoreTag::getTag).collect(Collectors.toList())))); List launchingList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.LAUNCHING.getValue())).collect(Collectors.toList()); List expiredList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.EXPIRED.getValue())).collect(Collectors.toList()); // 从正在播放的图搜热款广告或者历史广告中筛选10条 @@ -1097,6 +1107,374 @@ public class WebsiteServiceImpl implements IWebsiteService { return picSearchList; } + /** + * PC 用户中心 + * + * @return List + */ + @Override + @Transactional(readOnly = true) + public List getPcUserCenterList() { + // 从redis中获取 用户中心数据 + List pcUserCenterList; + List redisList = redisCache.getCacheObject(CacheConstants.PC_ADVERT + CacheConstants.PC_USER_CENTER); + if (CollectionUtils.isNotEmpty(redisList)) { + return redisList; + } + List oneMonthList = this.getOneMonthAdvertList(Collections.singletonList(AdType.PC_USER_CENTER.getValue())); + if (CollectionUtils.isEmpty(oneMonthList)) { + return new ArrayList<>(); + } + List prodPriceAndMainPicList = this.storeProdMapper.selectPriceAndMainPicList(oneMonthList.stream() + .map(AdvertRound::getProdIdStr).map(Long::parseLong).collect(Collectors.toList())); + // 档口商品的价格及商品主图map + Map prodPriceAndMainPicMap = prodPriceAndMainPicList.stream().collect(Collectors + .toMap(StoreProdPriceAndMainPicDTO::getStoreProdId, Function.identity())); + List launchingList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.LAUNCHING.getValue())).collect(Collectors.toList()); + List expiredList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.EXPIRED.getValue())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(launchingList)) { + pcUserCenterList = expiredList.stream().map(x -> this.getPcUserCenterDTO(x, prodPriceAndMainPicMap)).limit(18).collect(Collectors.toList()); + for (int i = 0; i < pcUserCenterList.size(); i++) { + pcUserCenterList.get(i).setOrderNum(i + 1); + } + } else { + pcUserCenterList = launchingList.stream().map(x -> this.getPcUserCenterDTO(x, prodPriceAndMainPicMap) + .setOrderNum(this.positionToNumber(x.getPosition()))).limit(18).collect(Collectors.toList()); + } + // 放到redis 中 过期时间1天 + redisCache.setCacheObject(CacheConstants.PC_ADVERT + CacheConstants.PC_USER_CENTER, pcUserCenterList, 1, TimeUnit.DAYS); + return pcUserCenterList; + } + + /** + * PC 下载页 + * + * @return List + */ + @Override + @Transactional(readOnly = true) + public List getPcDownloadList() { + // 从redis中获取 下载页数据 + List pcDownloadList; + List redisList = redisCache.getCacheObject(CacheConstants.PC_ADVERT + CacheConstants.PC_DOWNLOAD); + if (CollectionUtils.isNotEmpty(redisList)) { + return redisList; + } + List oneMonthList = this.getOneMonthAdvertList(Collections.singletonList(AdType.PC_DOWNLOAD.getValue())); + if (CollectionUtils.isEmpty(oneMonthList)) { + return new ArrayList<>(); + } + List prodPriceAndMainPicList = this.storeProdMapper.selectPriceAndMainPicList(oneMonthList.stream() + .map(AdvertRound::getProdIdStr).map(Long::parseLong).collect(Collectors.toList())); + Map prodPriceAndMainPicMap = prodPriceAndMainPicList.stream().collect(Collectors + .toMap(StoreProdPriceAndMainPicDTO::getStoreProdId, Function.identity())); + List launchingList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.LAUNCHING.getValue())).collect(Collectors.toList()); + List expiredList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.EXPIRED.getValue())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(launchingList)) { + pcDownloadList = expiredList.stream().map(advertRound -> this.getPcDownload(advertRound, prodPriceAndMainPicMap)).limit(10).collect(Collectors.toList()); + for (int i = 0; i < pcDownloadList.size(); i++) { + pcDownloadList.get(i).setOrderNum(i + 1); + } + } else { + pcDownloadList = launchingList.stream().map(advertRound -> this.getPcDownload(advertRound, prodPriceAndMainPicMap) + .setOrderNum(this.positionToNumber(advertRound.getPosition()))).limit(10).collect(Collectors.toList()); + } + // 放到redis 中 过期时间1天 + redisCache.setCacheObject(CacheConstants.PC_ADVERT + CacheConstants.PC_DOWNLOAD, pcDownloadList, 1, TimeUnit.DAYS); + return pcDownloadList; + } + + /** + * APP 首页顶部轮播图 + * + * @return List + */ + @Override + @Transactional(readOnly = true) + public List getAppIndexTopBanner() { + List appIndexTopBannerList; + // 从redis中获取数据 + List redisList = redisCache.getCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_INDEX_TOP_BANNER); + if (CollectionUtils.isNotEmpty(redisList)) { + return redisList; + } + List oneMonthList = this.getOneMonthAdvertList(Collections.singletonList(AdType.APP_HOME_TOP_BANNER.getValue())); + if (CollectionUtils.isEmpty(oneMonthList)) { + return new ArrayList<>(); + } + Map fileMap = fileMapper.selectList(new LambdaQueryWrapper().eq(SysFile::getDelFlag, Constants.UNDELETED) + .in(SysFile::getId, oneMonthList.stream().map(AdvertRound::getPicId).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList()))) + .stream().collect(Collectors.toMap(SysFile::getId, Function.identity())); + List launchingList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.LAUNCHING.getValue())).collect(Collectors.toList()); + List expiredList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.EXPIRED.getValue())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(launchingList)) { + List tempList = new ArrayList<>(); + expiredList.stream().collect(Collectors.groupingBy(AdvertRound::getStoreId)) + .forEach((storeId, list) -> { + AdvertRound advertRound = list.get(0); + tempList.add(new APPIndexTopBannerDTO().setDisplayType(AdDisplayType.PICTURE.getValue()).setStoreId(storeId) + .setFileUrl(ObjectUtils.isNotEmpty(fileMap.get(advertRound.getPicId())) ? fileMap.get(advertRound.getPicId()).getFileUrl() : "")); + }); + appIndexTopBannerList = tempList.stream().limit(5).collect(Collectors.toList()); + for (int i = 0; i < appIndexTopBannerList.size(); i++) { + appIndexTopBannerList.get(i).setOrderNum(i + 1); + } + } else { + appIndexTopBannerList = launchingList.stream().map(x -> new APPIndexTopBannerDTO().setDisplayType(AdDisplayType.PICTURE.getValue()) + .setStoreId(x.getStoreId()).setOrderNum(this.positionToNumber(x.getPosition())) + .setFileUrl(ObjectUtils.isNotEmpty(fileMap.get(x.getPicId())) ? fileMap.get(x.getPicId()).getFileUrl() : "")) + .collect(Collectors.toList()); + } + // 放到redis 中 过期时间1天 + redisCache.setCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_INDEX_TOP_BANNER, appIndexTopBannerList, 1, TimeUnit.DAYS); + return appIndexTopBannerList; + } + + /** + * APP 首页中部品牌好货 + * + * @return List + */ + @Override + @Transactional(readOnly = true) + public List getAppIndexMidBrand() { + List appIndexMidBrandList; + // 从redis 中获取数据 + List redisList = redisCache.getCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_INDEX_MID_BRAND); + if (CollectionUtils.isNotEmpty(redisList)) { + return redisList; + } + List oneMonthList = this.getOneMonthAdvertList(Collections.singletonList(AdType.APP_HOME_RECOMMEND_PRODUCT.getValue())); + if (CollectionUtils.isEmpty(oneMonthList)) { + return new ArrayList<>(); + } + List prodPriceAndMainPicList = this.storeProdMapper.selectPriceAndMainPicList(oneMonthList.stream() + .map(AdvertRound::getProdIdStr).map(Long::parseLong).collect(Collectors.toList())); + Map prodPriceAndMainPicMap = prodPriceAndMainPicList.stream().collect(Collectors + .toMap(StoreProdPriceAndMainPicDTO::getStoreProdId, Function.identity())); + List launchingList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.LAUNCHING.getValue())).collect(Collectors.toList()); + List expiredList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.EXPIRED.getValue())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(launchingList)) { + appIndexMidBrandList = this.getAppIndexMidBrandList(expiredList, 5, prodPriceAndMainPicMap); + } else { + appIndexMidBrandList = launchingList.stream().map(x -> { + final Long storeProdId = Long.parseLong(x.getProdIdStr()); + return new APPIndexMidBrandDTO().setDisplayType(AdDisplayType.PRODUCT.getValue()).setStoreProdId(storeProdId).setOrderNum(this.positionToNumber(x.getPosition())) + .setPrice(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMinPrice() : null) + .setMainPicUrl(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMainPicUrl() : ""); + }).limit(5).collect(Collectors.toList()); + if (appIndexMidBrandList.size() < 5) { + appIndexMidBrandList.addAll(this.getAppIndexMidBrandList(expiredList, 5 - appIndexMidBrandList.size(), prodPriceAndMainPicMap)); + } + } + for (int i = 0; i < appIndexMidBrandList.size(); i++) { + appIndexMidBrandList.get(i).setOrderNum(i + 1); + } + // 放到redis中,过期时间为1天 + redisCache.setCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_INDEX_MID_BRAND, appIndexMidBrandList, 1, TimeUnit.DAYS); + return appIndexMidBrandList; + } + + /** + * APP 首页中部 品牌好货 + * + * @param advertRoundList 品牌好货列表 + * @param limitCount 筛选的数量 + * @param prodPriceAndMainPicMap 商品价格和主图map + * @return List + */ + private List getAppIndexMidBrandList(List advertRoundList, int limitCount, Map prodPriceAndMainPicMap) { + return advertRoundList.stream().map(x -> { + final Long storeProdId = Long.parseLong(x.getProdIdStr()); + return new APPIndexMidBrandDTO().setDisplayType(AdDisplayType.PRODUCT.getValue()).setStoreProdId(storeProdId) + .setPrice(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMinPrice() : null) + .setMainPicUrl(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMainPicUrl() : ""); + }).limit(limitCount).collect(Collectors.toList()); + } + + /** + * APP 首页热卖精选右侧固定位置 + * + * @return List + */ + @Override + @Transactional(readOnly = true) + public List getAppIndexHotSaleRightFix() { + // 从redis中获取数据 + List appIndexHotSaleRightFixList; + // 从redis 中获取数据 + List redisList = redisCache.getCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_INDEX_HOT_SALE_RIGHT_FIX); + if (CollectionUtils.isNotEmpty(redisList)) { + return redisList; + } + List oneMonthList = this.getOneMonthAdvertList(Collections.singletonList(AdType.APP_HOME_HOT_RECOMMEND_FIXED_PROD.getValue())); + if (CollectionUtils.isEmpty(oneMonthList)) { + return new ArrayList<>(); + } + List prodPriceAndMainPicList = this.storeProdMapper.selectPriceAndMainPicList(oneMonthList.stream() + .map(AdvertRound::getProdIdStr).map(Long::parseLong).collect(Collectors.toList())); + Map prodPriceAndMainPicMap = prodPriceAndMainPicList.stream().collect(Collectors + .toMap(StoreProdPriceAndMainPicDTO::getStoreProdId, Function.identity())); + List launchingList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.LAUNCHING.getValue())).collect(Collectors.toList()); + List expiredList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.EXPIRED.getValue())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(launchingList)) { + appIndexHotSaleRightFixList = expiredList.stream().map(x -> { + Long storeProdId = Long.parseLong(x.getProdIdStr()); + return new APPIndexHotSaleRightFixDTO().setDisplayType(AdDisplayType.PRODUCT.getValue()).setStoreProdId(storeProdId) + .setMainPicUrl(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMainPicUrl() : ""); + }).limit(5).collect(Collectors.toList()); + for (int i = 0; i < appIndexHotSaleRightFixList.size(); i++) { + appIndexHotSaleRightFixList.get(i).setOrderNum(i + 1); + } + } else { + appIndexHotSaleRightFixList = launchingList.stream().map(x -> { + Long storeProdId = Long.parseLong(x.getProdIdStr()); + return new APPIndexHotSaleRightFixDTO().setDisplayType(AdDisplayType.PRODUCT.getValue()).setStoreProdId(storeProdId).setOrderNum(this.positionToNumber(x.getPosition())) + .setMainPicUrl(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMainPicUrl() : ""); + }).limit(5).collect(Collectors.toList()); + } + // 放到redis中,有效期1天 + redisCache.setCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_INDEX_HOT_SALE_RIGHT_FIX, appIndexHotSaleRightFixList, 1, TimeUnit.DAYS); + return appIndexHotSaleRightFixList; + } + + /** + * APP 分类页 + * + * @return List + */ + @Override + @Transactional(readOnly = true) + public List getAppCateList() { + List appCateList; + // 从redis中获取数据 + List redisList = redisCache.getCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_CATE); + if (CollectionUtils.isNotEmpty(redisList)) { + return redisList; + } + List oneMonthList = this.getOneMonthAdvertList(Collections.singletonList(AdType.APP_CATEGORY_TOP_BANNER.getValue())); + if (CollectionUtils.isEmpty(oneMonthList)) { + return new ArrayList<>(); + } + Map fileMap = fileMapper.selectList(new LambdaQueryWrapper().eq(SysFile::getDelFlag, Constants.UNDELETED) + .in(SysFile::getId, oneMonthList.stream().map(AdvertRound::getPicId).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList()))) + .stream().collect(Collectors.toMap(SysFile::getId, Function.identity())); + List launchingList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.LAUNCHING.getValue())).collect(Collectors.toList()); + List expiredList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.EXPIRED.getValue())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(launchingList)) { + List tempList = new ArrayList<>(); + expiredList.stream().collect(Collectors.groupingBy(AdvertRound::getStoreId)) + .forEach((storeId, list) -> { + AdvertRound advertRound = list.get(0); + tempList.add(new APPCateDTO().setDisplayType(AdDisplayType.PICTURE.getValue()).setStoreId(advertRound.getStoreId()) + .setFileUrl(ObjectUtils.isNotEmpty(fileMap.get(advertRound.getPicId())) ? fileMap.get(advertRound.getPicId()).getFileUrl() : "")); + }); + appCateList = tempList.stream().limit(5).collect(Collectors.toList()); + for (int i = 0; i < appCateList.size(); i++) { + appCateList.get(i).setOrderNum(i + 1); + } + } else { + appCateList = launchingList.stream().map(x -> new APPCateDTO().setDisplayType(AdDisplayType.PICTURE.getValue()) + .setStoreId(x.getStoreId()).setOrderNum(this.positionToNumber(x.getPosition())) + .setFileUrl(ObjectUtils.isNotEmpty(fileMap.get(x.getPicId())) ? fileMap.get(x.getPicId()).getFileUrl() : "")) + .collect(Collectors.toList()); + } + // 放到redis中,有效期1天 + redisCache.setCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_CATE, appCateList, 1, TimeUnit.DAYS); + return appCateList; + } + + /** + * APP 我的猜你喜欢列表 + * + * @return List + */ + @Override + @Transactional(readOnly = true) + public List getAppOwnGuessLikeList() { + List appOwnGuessLikeList; + // 从redis中获取缓存数据 + List redisList = redisCache.getCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_OWN_GUESS_LIKE); + if (CollectionUtils.isNotEmpty(redisList)) { + return redisList; + } + List oneMonthList = this.getOneMonthAdvertList(Collections.singletonList(AdType.APP_USER_CENTER_GUESS_YOU_LIKE.getValue())); + if (CollectionUtils.isEmpty(oneMonthList)) { + return new ArrayList<>(); + } + List storeProdIdList = oneMonthList.stream().map(AdvertRound::getProdIdStr).map(Long::parseLong).collect(Collectors.toList()); + // 商品标签 + List prodTagList = this.dailyProdTagMapper.selectList(new LambdaQueryWrapper() + .eq(DailyProdTag::getDelFlag, Constants.UNDELETED).in(DailyProdTag::getStoreProdId, storeProdIdList)); + Map> prodTagMap = prodTagList.stream().collect(Collectors.groupingBy(DailyProdTag::getStoreProdId, Collectors + .collectingAndThen(Collectors.toList(), list -> list.stream() + .sorted(Comparator.comparing(DailyProdTag::getType)).map(DailyProdTag::getTag).collect(Collectors.toList())))); + + List prodPriceAndMainPicList = this.storeProdMapper.selectPriceAndMainPicList(oneMonthList.stream() + .map(AdvertRound::getProdIdStr).map(Long::parseLong).collect(Collectors.toList())); + Map prodPriceAndMainPicMap = prodPriceAndMainPicList.stream().collect(Collectors + .toMap(StoreProdPriceAndMainPicDTO::getStoreProdId, Function.identity())); + List launchingList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.LAUNCHING.getValue())).collect(Collectors.toList()); + List expiredList = oneMonthList.stream().filter(x -> Objects.equals(x.getLaunchStatus(), AdLaunchStatus.EXPIRED.getValue())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(launchingList)) { + appOwnGuessLikeList = expiredList.stream().map(x -> { + final Long storeProdId = Long.parseLong(x.getProdIdStr()); + return new APPOwnGuessLikeDTO().setDisplayType(AdDisplayType.PRODUCT.getValue()).setStoreProdId(storeProdId) + .setTagList(ObjectUtils.isNotEmpty(prodTagMap.get(storeProdId)) ? prodTagMap.get(storeProdId) : null) + .setPrice(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMinPrice() : null) + .setProdArtNum(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getProdArtNum() : "") + .setMainPicUrl(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMainPicUrl() : ""); + }).limit(20).collect(Collectors.toList()); + for (int i = 0; i < appOwnGuessLikeList.size(); i++) { + appOwnGuessLikeList.get(i).setOrderNum(i + 1); + } + } else { + appOwnGuessLikeList = launchingList.stream().map(x -> { + final Long storeProdId = Long.parseLong(x.getProdIdStr()); + return new APPOwnGuessLikeDTO().setDisplayType(AdDisplayType.PRODUCT.getValue()).setStoreProdId(storeProdId).setOrderNum(this.positionToNumber(x.getPosition())) + .setTagList(ObjectUtils.isNotEmpty(prodTagMap.get(storeProdId)) ? prodTagMap.get(storeProdId) : null) + .setPrice(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMinPrice() : null) + .setProdArtNum(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getProdArtNum() : "") + .setMainPicUrl(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMainPicUrl() : ""); + }).limit(20).collect(Collectors.toList()); + } + // 放到redis中,有效期1天 + redisCache.setCacheObject(CacheConstants.APP_ADVERT + CacheConstants.APP_OWN_GUESS_LIKE, appOwnGuessLikeList, 1, TimeUnit.DAYS); + return appOwnGuessLikeList; + } + + + /** + * 获取PC 下载页数据 + * + * @param advertRound 下载页广告 + * @param prodPriceAndMainPicMap 商品价格和图片 + * @return PCDownloadDTO + */ + private PCDownloadDTO getPcDownload(AdvertRound advertRound, Map prodPriceAndMainPicMap) { + final Long storeProdId = Long.parseLong(advertRound.getProdIdStr()); + return new PCDownloadDTO().setDisplayType(AdDisplayType.PRODUCT.getValue()) + .setPrice(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMinPrice() : null) + .setProdArtNum(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getProdArtNum() : "") + .setMainPicUrl(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMainPicUrl() : ""); + } + + /** + * 获取PC 用户中心 广告列表 + * + * @param advertRound 用户中心 + * @param prodPriceAndMainPicMap 商品价格及主图等map + * @return PCUserCenterDTO + */ + private PCUserCenterDTO getPcUserCenterDTO(AdvertRound advertRound, Map prodPriceAndMainPicMap) { + final Long storeProdId = Long.parseLong(advertRound.getProdIdStr()); + return new PCUserCenterDTO().setDisplayType(AdDisplayType.PRODUCT.getValue()) + .setPrice(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMinPrice() : null) + .setProdArtNum(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getProdArtNum() : "") + .setMainPicUrl(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getMainPicUrl() : "") + .setProdTitle(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(storeProdId)) ? prodPriceAndMainPicMap.get(storeProdId).getProdTitle() : ""); + } + /** * 获取以图搜款的广告 *