master:app商品访问量功能完善;

pull/1121/head
liujiang 2025-09-20 21:20:35 +08:00
parent ac7e42ce11
commit 0f881d9459
10 changed files with 214 additions and 3 deletions

View File

@ -0,0 +1,36 @@
package com.ruoyi.web.controller.xkt;
import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.web.controller.xkt.vo.StoreProductStatistics.StoreProdAppViewRankResVO;
import com.ruoyi.web.controller.xkt.vo.notice.NoticeResVO;
import com.ruoyi.xkt.service.IStoreProductStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
*
* @author ruoyi
*/
@Api(tags = "档口商品统计")
@RestController
@RequiredArgsConstructor
@RequestMapping("/rest/v1/store-prod-statistics")
public class StoreProductStatisticsController extends BaseController {
final IStoreProductStatisticsService prodStatisticsService;
@ApiOperation(value = "APP商品访问榜", httpMethod = "GET", response = R.class)
@GetMapping("/app/view-rank")
public R<StoreProdAppViewRankResVO> getAppViewRank() {
return R.ok(BeanUtil.toBean(prodStatisticsService.getAppViewRank(), StoreProdAppViewRankResVO.class));
}
}

View File

@ -0,0 +1,42 @@
package com.ruoyi.web.controller.xkt.vo.StoreProductStatistics;
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
@Data
@Accessors(chain = true)
public class StoreProdAppViewRankResVO {
@ApiModelProperty(value = "商品浏览量列表")
private List<SPAVRViewCountVO> viewCountList;
@Data
public static class SPAVRViewCountVO {
@ApiModelProperty(value = "档口ID")
private Long storeId;
@ApiModelProperty(value = "档口名称")
private String storeName;
@ApiModelProperty(value = "商品主图")
private String mainPicUrl;
@ApiModelProperty(value = "商品ID")
private Long storeProdId;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "商品最低价格")
private BigDecimal price;
@ApiModelProperty(value = "商品浏览量")
private Long viewCount;
}
}

View File

@ -3173,6 +3173,7 @@ CREATE TABLE `store`
`template_num` int UNSIGNED NULL DEFAULT NULL COMMENT '档口模板ID',
`store_status` tinyint UNSIGNED NULL DEFAULT NULL COMMENT '档口状态',
`stock_sys` int UNSIGNED NULL DEFAULT NULL COMMENT '库存系统',
`view_count` bigint UNSIGNED NULL DEFAULT NULL COMMENT '浏览量',
`reject_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拒绝理由',
`version` bigint UNSIGNED NOT NULL COMMENT '版本号',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志0代表存在 2代表删除',

View File

@ -0,0 +1,43 @@
package com.ruoyi.xkt.dto.StoreProductStatistics;
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
@Data
@Accessors(chain = true)
public class StoreProdAppViewRankResDTO {
@ApiModelProperty(value = "商品浏览量列表")
private List<SPAVRViewCountDTO> viewCountList;
@Data
public static class SPAVRViewCountDTO {
@ApiModelProperty(value = "档口ID")
private Long storeId;
@ApiModelProperty(value = "档口名称")
private String storeName;
@ApiModelProperty(value = "商品主图")
private String mainPicUrl;
@ApiModelProperty(value = "商品ID")
private Long storeProdId;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "商品最低价格")
private BigDecimal price;
@ApiModelProperty(value = "商品浏览量")
private Long viewCount;
}
}

View File

@ -32,6 +32,8 @@ public class ShopCartPageResDTO {
private String prodTitle;
@ApiModelProperty(value = "商品状态")
private String prodStatus;
@ApiModelProperty(value = "标注尺码")
private String standardSize;
@ApiModelProperty(value = "进货车明细列表")
List<ShopCartPageDetailResDTO> detailList;

View File

@ -2,6 +2,7 @@ package com.ruoyi.xkt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.xkt.domain.StoreProductStatistics;
import com.ruoyi.xkt.dto.StoreProductStatistics.StoreProdAppViewRankResDTO;
import com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO;
import com.ruoyi.xkt.dto.picture.ProductImgSearchCountDTO;
import org.apache.ibatis.annotations.Param;
@ -44,5 +45,12 @@ public interface StoreProductStatisticsMapper extends BaseMapper<StoreProductSta
*/
List<DailyStoreTagDTO> downloadTop10Prod(@Param("oneMonthAgo") Date oneMonthAgo, @Param("yesterday") Date yesterday);
/**
* APP10
*
* @param threeMonthAgo
* @param yesterday
* @return List<StoreProdAppViewRankResDTO.SPAVRViewCountDTO>
*/
List<StoreProdAppViewRankResDTO.SPAVRViewCountDTO> selectTop10ProdViewCount(@Param("threeMonthAgo") Date threeMonthAgo, @Param("yesterday") Date yesterday);
}

View File

@ -0,0 +1,18 @@
package com.ruoyi.xkt.service;
import com.ruoyi.xkt.dto.StoreProductStatistics.StoreProdAppViewRankResDTO;
/**
*
*
* @author ruoyi
*/
public interface IStoreProductStatisticsService {
/**
* 访
*
* @return StoreProdAppViewRankResDTO
*/
StoreProdAppViewRankResDTO getAppViewRank();
}

View File

@ -128,11 +128,11 @@ public class ShoppingCartServiceImpl implements IShoppingCartService {
sizes -> sizes.stream().sorted().map(String::valueOf).collect(Collectors.joining(",")))));
shoppingCartList.forEach(x -> {
x.setMainPicUrl(mainPicMap.getOrDefault(x.getStoreProdId(), null));
x.setStandardSize(prodStandardSizeMap.getOrDefault(x.getStoreProdId(), ""));
x.getDetailList()
.forEach(detail -> {
StoreProductColorSize prodColorSize = priceSizeMap.get(x.getStoreProdId().toString() + detail.getStoreColorId().toString() + detail.getSize());
detail.setStandardSize(prodStandardSizeMap.getOrDefault(x.getStoreProdId(), ""))
.setAmount((ObjectUtils.isNotEmpty(prodColorSize)
detail.setAmount((ObjectUtils.isNotEmpty(prodColorSize)
? prodColorSize.getPrice() : BigDecimal.ZERO).multiply(new BigDecimal(detail.getQuantity())))
.setPrice(ObjectUtils.isNotEmpty(prodColorSize) ? prodColorSize.getPrice() : null)
.setStoreProdColorSizeId(ObjectUtils.isNotEmpty(prodColorSize) ? prodColorSize.getId() : null);

View File

@ -0,0 +1,37 @@
package com.ruoyi.xkt.service.impl;
import com.ruoyi.xkt.dto.StoreProductStatistics.StoreProdAppViewRankResDTO;
import com.ruoyi.xkt.mapper.StoreProductStatisticsMapper;
import com.ruoyi.xkt.service.IStoreProductStatisticsService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.Date;
/**
*
*
* @author ruoyi
*/
@Service
@RequiredArgsConstructor
public class StoreProductStatisticsServiceImpl implements IStoreProductStatisticsService {
final StoreProductStatisticsMapper prodStatisticsMapper;
/**
* 访
*
* @return StoreProdAppViewRankResDTO
*/
@Override
@Transactional(readOnly = true)
public StoreProdAppViewRankResDTO getAppViewRank() {
final Date yesterday = java.sql.Date.valueOf(LocalDate.now().minusDays(1));
final Date threeMonthAgo = java.sql.Date.valueOf(LocalDate.now().minusDays(1).minusMonths(3));
return new StoreProdAppViewRankResDTO().setViewCountList(prodStatisticsMapper.selectTop10ProdViewCount(threeMonthAgo, yesterday));
}
}

View File

@ -57,5 +57,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LIMIT 10
</select>
<select id="selectTop10ProdViewCount">
SELECT
sps.store_id,
s.store_name,
sps.store_prod_id,
sp.prod_art_num,
spcp.min_price AS price,
sps.view_count,
sf.file_url AS mainPicUrl
FROM
store_product_statistics sps
JOIN store s ON sps.store_id = s.id
JOIN store_product sp ON sps.store_prod_id = sp.id
JOIN store_product_file spf ON sps.store_prod_id = spf.store_prod_id AND spf.del_flag = 0 AND spf.file_type = 1 AND spf.order_num = 1
JOIN sys_file sf ON spf.file_id = sf.id
LEFT JOIN ( SELECT store_prod_id, MIN( price ) AS min_price FROM store_product_color_size GROUP BY store_prod_id ) spcp ON sp.id = spcp.store_prod_id
WHERE
sps.del_flag = 0
AND sps.voucher_date BETWEEN #{threeMonthAgo} AND #{yesterday}
ORDER BY
sps.view_count DESC
LIMIT 10
</select>
</mapper>