From bbba83ef61527b3bd0a094bb5381d6cce1558f61 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 7 Jan 2024 16:23:02 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=96=20MALL=EF=BC=9Acode=20review=20?= =?UTF-8?q?=E5=95=86=E5=93=81=E7=BB=9F=E8=AE=A1=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/optinal/product_statistics.sql | 34 ------------- .../common/util/object/PageUtils.java | 51 +++++++++++++++++++ .../mybatis/core/util/MyBatisUtils.java | 48 ----------------- .../resources/codegen/vue3/views/index.vue.vm | 18 +++---- .../AppProductBrowseHistoryController.java | 19 +++---- .../vo/AppProductBrowseHistoryPageReqVO.java | 1 + .../history/ProductBrowseHistoryService.java | 8 --- .../ProductBrowseHistoryServiceImpl.java | 6 --- .../product/ProductStatisticsController.java | 8 +-- .../product/vo/ProductStatisticsRespVO.java | 4 +- .../trade/TradeStatisticsController.java | 6 --- .../product/ProductStatisticsDO.java | 2 +- .../job/product/ProductStatisticsJob.java | 1 + .../product/ProductStatisticsServiceImpl.java | 18 +++---- 14 files changed, 77 insertions(+), 147 deletions(-) delete mode 100644 sql/mysql/optinal/product_statistics.sql diff --git a/sql/mysql/optinal/product_statistics.sql b/sql/mysql/optinal/product_statistics.sql deleted file mode 100644 index 6dc546c3e..000000000 --- a/sql/mysql/optinal/product_statistics.sql +++ /dev/null @@ -1,34 +0,0 @@ -CREATE TABLE product_statistics -( - id bigint AUTO_INCREMENT COMMENT '编号,主键自增' PRIMARY KEY, - time date NOT NULL COMMENT '统计日期', - spu_id bigint NOT NULL COMMENT '商品SPU编号', - browse_count int DEFAULT 0 NOT NULL COMMENT '浏览量', - browse_user_count int DEFAULT 0 NOT NULL COMMENT '访客量', - favorite_count int DEFAULT 0 NOT NULL COMMENT '收藏数量', - cart_count int DEFAULT 0 NOT NULL COMMENT '加购数量', - order_count int DEFAULT 0 NOT NULL COMMENT '下单件数', - order_pay_count int DEFAULT 0 NOT NULL COMMENT '支付件数', - order_pay_price int DEFAULT 0 NOT NULL COMMENT '支付金额,单位:分', - after_sale_count int DEFAULT 0 NOT NULL COMMENT '退款件数', - after_sale_refund_price int DEFAULT 0 NOT NULL COMMENT '退款金额,单位:分', - browse_convert_percent int DEFAULT 0 NOT NULL COMMENT '访客支付转化率(百分比)', - creator varchar(64) DEFAULT '' NULL COMMENT '创建者', - create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间', - updater varchar(64) DEFAULT '' NULL COMMENT '更新者', - update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted bit DEFAULT b'0' NOT NULL COMMENT '是否删除', - tenant_id bigint DEFAULT 0 NOT NULL COMMENT '租户编号' -) - COMMENT '商品统计表'; - -CREATE INDEX idx_time - ON product_statistics (time); - -CREATE INDEX idx_spu_id - ON product_statistics (spu_id); - -INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES ('商品统计', '', 2, 6, 2358, 'product', 'fa:product-hunt', 'statistics/product/index', 'ProductStatistics', 0, true, true, true, '', '2023-12-15 18:54:28', '', '2023-12-15 18:54:33', false); -SELECT @parentId1 := LAST_INSERT_ID(); -INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES ('商品统计查询', 'statistics:product:query', 3, 1, @parentId, '', '', '', null, 0, true, true, true, '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', false); -INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES ('商品统计导出', 'statistics:product:export', 3, 2, @parentId, '', '', '', null, 0, true, true, true, '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', false); diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/object/PageUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/object/PageUtils.java index 72403a9bd..0abdf7be2 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/object/PageUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/object/PageUtils.java @@ -1,6 +1,15 @@ package cn.iocoder.yudao.framework.common.util.object; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.func.Func1; +import cn.hutool.core.lang.func.LambdaUtil; +import cn.hutool.core.util.ArrayUtil; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.SortablePageParam; +import cn.iocoder.yudao.framework.common.pojo.SortingField; +import org.springframework.util.Assert; + +import java.util.List; /** * {@link cn.iocoder.yudao.framework.common.pojo.PageParam} 工具类 @@ -9,8 +18,50 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; */ public class PageUtils { + private static final Object[] ORDER_TYPES = new String[]{SortingField.ORDER_ASC, SortingField.ORDER_DESC}; + public static int getStart(PageParam pageParam) { return (pageParam.getPageNo() - 1) * pageParam.getPageSize(); } + /** + * 构建排序字段(默认倒序) + * + * @param func 排序字段的 Lambda 表达式 + * @param 排序字段所属的类型 + * @return 排序字段 + */ + public static SortingField buildSortingField(Func1 func) { + return buildSortingField(func, SortingField.ORDER_DESC); + } + + /** + * 构建排序字段 + * + * @param func 排序字段的 Lambda 表达式 + * @param order 排序类型 {@link SortingField#ORDER_ASC} {@link SortingField#ORDER_DESC} + * @param 排序字段所属的类型 + * @return 排序字段 + */ + public static SortingField buildSortingField(Func1 func, String order) { + Assert.isTrue(ArrayUtil.contains(ORDER_TYPES, order), String.format("字段的排序类型只能是 %s/%s", ORDER_TYPES)); + + String fieldName = LambdaUtil.getFieldName(func); + return new SortingField(fieldName, order); + } + + /** + * 构建默认的排序字段 + * 如果排序字段为空,则设置排序字段;否则忽略 + * + * @param sortablePageParam 排序分页查询参数 + * @param func 排序字段的 Lambda 表达式 + * @param 排序字段所属的类型 + */ + public static void buildDefaultSortingField(SortablePageParam sortablePageParam, Func1 func) { + if (sortablePageParam != null && CollUtil.isEmpty(sortablePageParam.getSortingFields())) { + sortablePageParam.setSortingFields(List.of(buildSortingField(func))); + } + } + } diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java index 11ccc5b99..3da059a6c 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java @@ -1,12 +1,7 @@ package cn.iocoder.yudao.framework.mybatis.core.util; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.lang.func.Func1; -import cn.hutool.core.lang.func.LambdaUtil; -import cn.hutool.core.util.ArrayUtil; import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.SortablePageParam; import cn.iocoder.yudao.framework.common.pojo.SortingField; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.StringPool; @@ -16,7 +11,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; -import org.springframework.util.Assert; import java.util.ArrayList; import java.util.Collection; @@ -91,46 +85,4 @@ public class MyBatisUtils { return new Column(tableName + StringPool.DOT + column); } - - /** - * 构建排序字段(默认倒序) - * - * @param func 排序字段的 Lambda 表达式 - * @param 排序字段所属的类型 - * @return 排序字段 - */ - public static SortingField buildSortingField(Func1 func) { - return buildSortingField(func, SortingField.ORDER_DESC); - } - - /** - * 构建排序字段 - * - * @param func 排序字段的 Lambda 表达式 - * @param order 排序类型 {@link SortingField#ORDER_ASC} {@link SortingField#ORDER_DESC} - * @param 排序字段所属的类型 - * @return 排序字段 - */ - public static SortingField buildSortingField(Func1 func, String order) { - Object[] orderTypes = {SortingField.ORDER_ASC, SortingField.ORDER_DESC}; - Assert.isTrue(ArrayUtil.contains(orderTypes, order), String.format("字段的排序类型只能是%s/%s", orderTypes)); - - String fieldName = LambdaUtil.getFieldName(func); - return new SortingField(fieldName, order); - } - - /** - * 构建默认的排序字段 - * 如果排序字段为空,则设置排序字段;否则忽略 - * - * @param sortablePageParam 排序分页查询参数 - * @param func 排序字段的 Lambda 表达式 - * @param 排序字段所属的类型 - */ - public static void buildDefaultSortingField(SortablePageParam sortablePageParam, Func1 func) { - if (sortablePageParam != null && CollUtil.isEmpty(sortablePageParam.getSortingFields())) { - sortablePageParam.setSortingFields(List.of(buildSortingField(func))); - } - } - } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm index 112d0dbb6..a76dbaa82 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm @@ -252,15 +252,11 @@ import ${subSimpleClassName}List from './components/${subSimpleClassName}List.vu /** ${table.classComment} 列表 */ defineOptions({ name: '${table.className}' }) -// 消息弹窗 -const message = useMessage() -// 国际化 -const { t } = useI18n() +const message = useMessage() // 消息弹窗 +const { t } = useI18n() // 国际化 -// 列表的加载中 -const loading = ref(true) -// 列表的数据 -const list = ref<${simpleClassName}VO[]>([]) +const loading = ref(true) // 列表的加载中 +const list = ref<${simpleClassName}VO[]>([]) // 列表的数据 ## 特殊:树表专属逻辑(树不需要分页接口) #if ( $table.templateType != 2 ) // 列表的总页数 @@ -283,10 +279,8 @@ const queryParams = reactive({ #end #end }) -// 搜索的表单 -const queryFormRef = ref() -// 导出的加载中 -const exportLoading = ref(false) +const queryFormRef = ref() // 搜索的表单 +const exportLoading = ref(false) // 导出的加载中 /** 查询列表 */ const getList = async () => { diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/history/AppProductBrowseHistoryController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/history/AppProductBrowseHistoryController.java index f15c149b1..1cbf56570 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/history/AppProductBrowseHistoryController.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/history/AppProductBrowseHistoryController.java @@ -28,6 +28,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +// TODO 芋艿:后面再看 @Tag(name = "用户 APP - 商品浏览记录") @RestController @RequestMapping("/product/browse-history") @@ -65,10 +66,9 @@ public class AppProductBrowseHistoryController { @Operation(summary = "获得商品浏览记录分页") @PreAuthenticated public CommonResult> getBrowseHistoryPage(AppProductBrowseHistoryPageReqVO reqVO) { - ProductBrowseHistoryPageReqVO pageReqVO = BeanUtils.toBean(reqVO, ProductBrowseHistoryPageReqVO.class); - pageReqVO.setUserId(getLoginUserId()); - // 排除用户已删除的(隐藏的) - pageReqVO.setUserDeleted(false); + ProductBrowseHistoryPageReqVO pageReqVO = BeanUtils.toBean(reqVO, ProductBrowseHistoryPageReqVO.class) + .setUserId(getLoginUserId()) + .setUserDeleted(false); // 排除用户已删除的(隐藏的) PageResult pageResult = productBrowseHistoryService.getBrowseHistoryPage(pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return success(PageResult.empty()); @@ -77,14 +77,9 @@ public class AppProductBrowseHistoryController { // 得到商品 spu 信息 Set spuIds = convertSet(pageResult.getList(), ProductBrowseHistoryDO::getSpuId); Map spuMap = convertMap(productSpuService.getSpuList(spuIds), ProductSpuDO::getId); - - // 转换 VO 结果 - PageResult result = BeanUtils.toBean(pageResult, AppProductBrowseHistoryRespVO.class, - vo -> Optional.ofNullable(spuMap.get(vo.getSpuId())).ifPresent(spu -> { - vo.setSpuName(spu.getName()); - vo.setPicUrl(spu.getPicUrl()); - })); - return success(result); + return success(BeanUtils.toBean(pageResult, AppProductBrowseHistoryRespVO.class, + vo -> Optional.ofNullable(spuMap.get(vo.getSpuId())) + .ifPresent(spu -> vo.setSpuName(spu.getName()).setPicUrl(spu.getPicUrl())))); } } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/history/vo/AppProductBrowseHistoryPageReqVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/history/vo/AppProductBrowseHistoryPageReqVO.java index f2e0387fc..f959fd0d1 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/history/vo/AppProductBrowseHistoryPageReqVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/history/vo/AppProductBrowseHistoryPageReqVO.java @@ -16,6 +16,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class AppProductBrowseHistoryPageReqVO extends PageParam { + @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/history/ProductBrowseHistoryService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/history/ProductBrowseHistoryService.java index 8a1721bd7..b3cfc3d7a 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/history/ProductBrowseHistoryService.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/history/ProductBrowseHistoryService.java @@ -30,14 +30,6 @@ public interface ProductBrowseHistoryService { */ void hideUserBrowseHistory(Long userId, Collection spuId); - /** - * 获得商品浏览记录 - * - * @param id 编号 - * @return 商品浏览记录 - */ - ProductBrowseHistoryDO getBrowseHistory(Long id); - /** * 获取用户记录数量 * diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/history/ProductBrowseHistoryServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/history/ProductBrowseHistoryServiceImpl.java index d6a0ab6ba..4116b9c20 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/history/ProductBrowseHistoryServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/history/ProductBrowseHistoryServiceImpl.java @@ -50,7 +50,6 @@ public class ProductBrowseHistoryServiceImpl implements ProductBrowseHistoryServ .setUserId(userId) .setSpuId(spuId); browseHistoryMapper.insert(browseHistory); - // 返回 return browseHistory.getId(); } @@ -59,11 +58,6 @@ public class ProductBrowseHistoryServiceImpl implements ProductBrowseHistoryServ browseHistoryMapper.updateUserDeletedByUserId(userId, spuIds, true); } - @Override - public ProductBrowseHistoryDO getBrowseHistory(Long id) { - return browseHistoryMapper.selectById(id); - } - @Override public Long getBrowseHistoryCount(Long userId, Boolean userDeleted) { return browseHistoryMapper.selectCountByUserIdAndUserDeleted(userId, userDeleted); diff --git a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/product/ProductStatisticsController.java b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/product/ProductStatisticsController.java index 98c7548b2..28c7b89bf 100644 --- a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/product/ProductStatisticsController.java +++ b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/product/ProductStatisticsController.java @@ -79,13 +79,9 @@ public class ProductStatisticsController { // 处理商品信息 Set spuIds = convertSet(pageResult.getList(), ProductStatisticsDO::getSpuId); Map spuMap = convertMap(productSpuApi.getSpuList(spuIds), ProductSpuRespDTO::getId); - // 拼接返回 return success(BeanUtils.toBean(pageResult, ProductStatisticsRespVO.class, - // 拼接商品信息 - item -> Optional.ofNullable(spuMap.get(item.getSpuId())).ifPresent(spu -> { - item.setName(spu.getName()); - item.setPicUrl(spu.getPicUrl()); - }))); + item -> Optional.ofNullable(spuMap.get(item.getSpuId())) + .ifPresent(spu -> item.setName(spu.getName()).setPicUrl(spu.getPicUrl())))); } } \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/product/vo/ProductStatisticsRespVO.java b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/product/vo/ProductStatisticsRespVO.java index 2a9a2673e..9d93142e3 100644 --- a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/product/vo/ProductStatisticsRespVO.java +++ b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/product/vo/ProductStatisticsRespVO.java @@ -27,7 +27,7 @@ public class ProductStatisticsRespVO { @ExcelProperty("商品SPU编号") private Long spuId; - //region 商品信息 + // region 商品信息 @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "商品名称") @ExcelProperty("商品名称") @@ -37,7 +37,7 @@ public class ProductStatisticsRespVO { @ExcelProperty("商品封面图") private String picUrl; - //endregion + // endregion @Schema(description = "浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "17505") @ExcelProperty("浏览量") diff --git a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/TradeStatisticsController.java b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/TradeStatisticsController.java index bac07d107..43814da20 100644 --- a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/TradeStatisticsController.java +++ b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/TradeStatisticsController.java @@ -49,7 +49,6 @@ public class TradeStatisticsController { @Resource private BrokerageStatisticsService brokerageStatisticsService; - // TODO 芋艿:已经 review @GetMapping("/summary") @Operation(summary = "获得交易统计") @PreAuthorize("@ss.hasPermission('statistics:trade:query')") @@ -75,7 +74,6 @@ public class TradeStatisticsController { ArrayUtil.get(reqVO.getTimes(), 1))); } - // TODO 芋艿:已经 review @GetMapping("/list") @Operation(summary = "获得交易状况明细") @PreAuthorize("@ss.hasPermission('statistics:trade:query')") @@ -85,7 +83,6 @@ public class TradeStatisticsController { return success(TradeStatisticsConvert.INSTANCE.convertList(list)); } - // TODO 芋艿:已经 review @GetMapping("/export-excel") @Operation(summary = "导出获得交易状况明细 Excel") @PreAuthorize("@ss.hasPermission('statistics:trade:export')") @@ -98,7 +95,6 @@ public class TradeStatisticsController { ExcelUtils.write(response, "交易状况.xls", "数据", TradeTrendSummaryExcelVO.class, data); } - // TODO 芋艿:已经 review @GetMapping("/order-count") @Operation(summary = "获得交易订单数量") @PreAuthorize("@ss.hasPermission('statistics:trade:query')") @@ -116,7 +112,6 @@ public class TradeStatisticsController { return success(TradeStatisticsConvert.INSTANCE.convert(undeliveredCount, pickUpCount, afterSaleApplyCount, auditingWithdrawCount)); } - // TODO 芋艿:已经 review @GetMapping("/order-comparison") @Operation(summary = "获得交易订单数量") @PreAuthorize("@ss.hasPermission('statistics:trade:query')") @@ -124,7 +119,6 @@ public class TradeStatisticsController { return success(tradeOrderStatisticsService.getOrderComparison()); } - // TODO 芋艿:已经 review @GetMapping("/order-count-trend") @Operation(summary = "获得订单量趋势统计") @PreAuthorize("@ss.hasPermission('statistics:trade:query')") diff --git a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/dal/dataobject/product/ProductStatisticsDO.java b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/dal/dataobject/product/ProductStatisticsDO.java index 2e2267609..426906d47 100644 --- a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/dal/dataobject/product/ProductStatisticsDO.java +++ b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/dal/dataobject/product/ProductStatisticsDO.java @@ -33,7 +33,7 @@ public class ProductStatisticsDO extends BaseDO { */ private LocalDate time; /** - * 商品SPU编号 + * 商品 SPU 编号 */ private Long spuId; /** diff --git a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/job/product/ProductStatisticsJob.java b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/job/product/ProductStatisticsJob.java index ab0a1fb71..94fa71f7e 100644 --- a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/job/product/ProductStatisticsJob.java +++ b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/job/product/ProductStatisticsJob.java @@ -45,4 +45,5 @@ public class ProductStatisticsJob implements JobHandler { String result = productStatisticsService.statisticsProduct(days); return StrUtil.format("商品统计:\n{}", result); } + } diff --git a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/service/product/ProductStatisticsServiceImpl.java b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/service/product/ProductStatisticsServiceImpl.java index 1b1044f53..2356fef36 100644 --- a/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/service/product/ProductStatisticsServiceImpl.java +++ b/yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/service/product/ProductStatisticsServiceImpl.java @@ -7,7 +7,7 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.SortablePageParam; -import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; +import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.module.statistics.controller.admin.common.vo.DataComparisonRespVO; import cn.iocoder.yudao.module.statistics.controller.admin.product.vo.ProductStatisticsReqVO; import cn.iocoder.yudao.module.statistics.controller.admin.product.vo.ProductStatisticsRespVO; @@ -42,8 +42,7 @@ public class ProductStatisticsServiceImpl implements ProductStatisticsService { @Override public PageResult getProductStatisticsRankPage(ProductStatisticsReqVO reqVO, SortablePageParam pageParam) { - // 默认浏览量倒序 - MyBatisUtils.buildDefaultSortingField(pageParam, ProductStatisticsDO::getBrowseCount); + PageUtils.buildDefaultSortingField(pageParam, ProductStatisticsDO::getBrowseCount); // 默认浏览量倒序 return productStatisticsMapper.selectPageGroupBySpuId(reqVO, pageParam); } @@ -92,31 +91,26 @@ public class ProductStatisticsServiceImpl implements ProductStatisticsService { return dateStr + " 数据已存在,如果需要重新统计,请先删除对应的数据"; } - // 3. 统计数据 StopWatch stopWatch = new StopWatch(dateStr); stopWatch.start(); - - // 分页统计,避免商品表数据较多时,出现超时问题 + // 4. 分页统计,避免商品表数据较多时,出现超时问题 final int pageSize = 100; - for (int pageNo = 1; ; pageNo ++) { + for (int pageNo = 1; ; pageNo++) { IPage page = productStatisticsMapper.selectStatisticsResultPageByTimeBetween( Page.of(pageNo, pageSize, false), beginTime, endTime); if (CollUtil.isEmpty(page.getRecords())) { break; } - + // 4.1 计算访客支付转化率(百分比) for (ProductStatisticsDO record : page.getRecords()) { record.setTime(date.toLocalDate()); - // 计算 访客支付转化率(百分比) if (record.getBrowseUserCount() != null && ObjUtil.notEqual(record.getBrowseUserCount(), 0)) { record.setBrowseConvertPercent(100 * record.getOrderPayCount() / record.getBrowseUserCount()); } } - - // 4. 插入数据 + // 4.2 插入数据 productStatisticsMapper.insertBatch(page.getRecords()); } - return stopWatch.prettyPrint(); }