Commit 1ff9bc6a71516a36247def8ea0a7a83601a97355

Authored by YunaiV
1 parent cebdc190

code review:文章管理

Showing 14 changed files with 33 additions and 79 deletions
sql/mysql/member.sql deleted
1   -ALTER TABLE member_user ADD COLUMN register_terminal tinyint NULL COMMENT '注册终端' AFTER register_ip;
2 0 \ No newline at end of file
sql/mysql/statistics.sql deleted
1   --- 交易统计表
2   -CREATE TABLE trade_statistics
3   -(
4   - id bigint AUTO_INCREMENT COMMENT '编号,主键自增'
5   - PRIMARY KEY,
6   - time datetime NOT NULL COMMENT '统计日期',
7   - order_create_count int DEFAULT 0 NOT NULL COMMENT '创建订单数',
8   - order_pay_count int DEFAULT 0 NOT NULL COMMENT '支付订单商品数',
9   - order_pay_price int DEFAULT 0 NOT NULL COMMENT '总支付金额,单位:分',
10   - order_wallet_pay_price int DEFAULT 0 NOT NULL COMMENT '总支付金额(余额),单位:分',
11   - after_sale_count int DEFAULT 0 NOT NULL COMMENT '退款订单数',
12   - after_sale_refund_price int DEFAULT 0 NOT NULL COMMENT '总退款金额,单位:分',
13   - brokerage_settlement_price int DEFAULT 0 NOT NULL COMMENT '佣金金额(已结算),单位:分',
14   - recharge_pay_count int DEFAULT 0 NOT NULL COMMENT '充值订单数',
15   - recharge_pay_price int DEFAULT 0 NOT NULL COMMENT '充值金额,单位:分',
16   - recharge_refund_count int DEFAULT 0 NOT NULL COMMENT '充值退款订单数',
17   - recharge_refund_price int DEFAULT 0 NOT NULL COMMENT '充值退款金额,单位:分',
18   - creator varchar(64) DEFAULT '' NULL COMMENT '创建者',
19   - create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
20   - updater varchar(64) DEFAULT '' NULL COMMENT '更新者',
21   - update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
22   - deleted bit DEFAULT b'0' NOT NULL COMMENT '是否删除',
23   - tenant_id bigint DEFAULT 0 NOT NULL COMMENT '租户编号'
24   -)
25   - COMMENT '交易统计表';
26   -
27   -CREATE INDEX trade_statistics_time_index
28   - ON trade_statistics (time);
29   -
30   --- 菜单
31   -INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name)
32   -VALUES ('统计管理', '', 1, 4, 0, '/statistics', 'ep:data-line', '', '');
33   -SELECT @parentId := LAST_INSERT_ID();
34   --- 交易统计
35   -INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name)
36   -VALUES ('交易统计', '', 2, 1, @parentId, 'trade', 'fa-solid:credit-card', 'statistics/trade/index', 'TradeStatistics');
37   -SELECT @parentId := LAST_INSERT_ID();
38   -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
39   -VALUES ('交易统计查询', 'statistics:trade:query', 3, 1, @parentId, '', '', '', 0);
40   -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
41   -VALUES ('交易统计导出', 'statistics:trade:export', 3, 2, @parentId, '', '', '', 0);
42   --- 会员统计
43   -INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name)
44   -VALUES ('会员统计', '', 2, 2, @parentId, 'member', 'ep:avatar', 'statistics/member/index', 'MemberStatistics');
45   -SELECT @parentId := LAST_INSERT_ID();
46   -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
47   -VALUES ('会员统计查询', 'statistics:member:query', 3, 1, @parentId, '', '', '', 0);
48   -
49   -
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/article/AppArticleCategoryController.java
... ... @@ -31,6 +31,7 @@ public class AppArticleCategoryController {
31 31 public CommonResult<List<AppArticleCategoryRespVO>> getArticleCategoryList() {
32 32 List<ArticleCategoryDO> categoryList = articleCategoryService.getArticleCategoryListByStatus(
33 33 CommonStatusEnum.ENABLE.getStatus());
  34 + // TODO @puhui999:排序下
34 35 return success(ArticleCategoryConvert.INSTANCE.convertList04(categoryList));
35 36 }
36 37  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/article/AppArticleController.java
... ... @@ -39,7 +39,7 @@ public class AppArticleController {
39 39 @RequestParam(value = "recommendHot", required = false) Boolean recommendHot,
40 40 @RequestParam(value = "recommendBanner", required = false) Boolean recommendBanner) {
41 41 return success(ArticleConvert.INSTANCE.convertList03(
42   - articleService.getArticleCategoryListByRecommendHotAndRecommendBanner(recommendHot, recommendBanner)));
  42 + articleService.getArticleCategoryListByRecommend(recommendHot, recommendBanner)));
43 43 }
44 44  
45 45 @RequestMapping("/page")
... ... @@ -55,4 +55,5 @@ public class AppArticleController {
55 55 return success(ArticleConvert.INSTANCE.convert01(articleService.getArticle(id)));
56 56 }
57 57  
  58 + // TODO @puhui999:增加浏览量,实现一个接口;先简单做,用户规模不大,只 +1 即可;ps:uniapp 那边也要接下噢
58 59 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java
... ... @@ -210,6 +210,7 @@ public interface CombinationActivityConvert {
210 210 * @param virtualGroupHeadRecord 虚拟成团团长记录
211 211 * @return 虚拟记录列表
212 212 */
  213 + // TODO @puhui999:1)方法名,建议改成 convertVirtualRecordList(CombinationRecordDO headRecord);2)第 220 到 225 可以搞成 mapstruct 一个方法,默认都 copy 进去,然后 set 第 226 到 232 的字段
213 214 default List<CombinationRecordDO> convertVirtualGroupList(CombinationRecordDO virtualGroupHeadRecord) {
214 215 List<CombinationRecordDO> createRecords = new ArrayList<>();
215 216 // 计算需要创建的虚拟成团记录数量
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationRecordMapper.java
... ... @@ -140,7 +140,7 @@ public interface CombinationRecordMapper extends BaseMapperX&lt;CombinationRecordDO
140 140 }
141 141  
142 142 default List<CombinationRecordDO> selectListByHeadId(Long headId) {
143   - return selectList(new LambdaQueryWrapperX<CombinationRecordDO>().eq(CombinationRecordDO::getHeadId, headId));
  143 + return selectList(CombinationRecordDO::getHeadId, headId);
144 144 }
145 145  
146 146 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/article/ArticleCategoryServiceImpl.java
... ... @@ -56,6 +56,7 @@ public class ArticleCategoryServiceImpl implements ArticleCategoryService {
56 56 // 校验存在
57 57 validateArticleCategoryExists(id);
58 58 // 校验是不是存在关联文章
  59 + // TODO @puhui999:最好获得数量哈;
59 60 List<ArticleDO> articleList = articleService.getArticleByCategoryId(id);
60 61 if (CollUtil.isNotEmpty(articleList)) {
61 62 throw exception(ARTICLE_CATEGORY_DELETE_FAIL_HAVE_ARTICLES);
... ... @@ -83,6 +84,7 @@ public class ArticleCategoryServiceImpl implements ArticleCategoryService {
83 84  
84 85 @Override
85 86 public List<ArticleCategoryDO> getArticleCategoryListByStatus(Integer status) {
  87 + // TODO @puhui999:selectListByStatus
86 88 return articleCategoryMapper.selectList(ArticleCategoryDO::getStatus, status);
87 89 }
88 90  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/article/ArticleService.java
... ... @@ -62,7 +62,7 @@ public interface ArticleService {
62 62 * @param recommendBanner 是否轮播图
63 63 * @return 文章详情列表
64 64 */
65   - List<ArticleDO> getArticleCategoryListByRecommendHotAndRecommendBanner(Boolean recommendHot, Boolean recommendBanner);
  65 + List<ArticleDO> getArticleCategoryListByRecommend(Boolean recommendHot, Boolean recommendBanner);
66 66  
67 67 /**
68 68 * 获得文章详情分页
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/article/ArticleServiceImpl.java
... ... @@ -30,6 +30,7 @@ public class ArticleServiceImpl implements ArticleService {
30 30  
31 31 @Resource
32 32 private ArticleMapper articleMapper;
  33 +
33 34 @Resource
34 35 private ArticleCategoryService articleCategoryService;
35 36  
... ... @@ -89,7 +90,7 @@ public class ArticleServiceImpl implements ArticleService {
89 90 }
90 91  
91 92 @Override
92   - public List<ArticleDO> getArticleCategoryListByRecommendHotAndRecommendBanner(Boolean recommendHot, Boolean recommendBanner) {
  93 + public List<ArticleDO> getArticleCategoryListByRecommend(Boolean recommendHot, Boolean recommendBanner) {
93 94 return articleMapper.selectList(recommendHot, recommendBanner);
94 95 }
95 96  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
... ... @@ -351,9 +351,10 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
351 351 convertSet(headExpireRecords, CombinationRecordDO::getActivityId));
352 352 Map<Long, CombinationActivityDO> activityMap = convertMap(activities, CombinationActivityDO::getId);
353 353  
354   - // 3. 改成“每个团”,处理一次哈;这样 handleExpireRecord、handleVirtualGroupRecord 都改成按团处理,每个是一个小事务;
  354 + // 3. 逐个处理拼团,过期 or 虚拟成团
355 355 KeyValue<Integer, Integer> keyValue = new KeyValue<>(0, 0); // 统计过期拼团和虚拟成团
356 356 for (CombinationRecordDO recordDO : headExpireRecords) {
  357 + // TODO @puhui999:recordDO 非必要的情况下,不用带 DO;直接 record;
357 358 try {
358 359 CombinationActivityDO activity = activityMap.get(recordDO.getActivityId());
359 360 if (activity == null || !activity.getVirtualGroup()) { // 取不到活动的或者不是虚拟拼团的
... ... @@ -366,9 +367,9 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
366 367 keyValue.setValue(keyValue.getValue() + 1);
367 368 }
368 369 } catch (Exception ignored) { // 处理异常继续循环
  370 + // TODO @puhui999:需要打印异常日志
369 371 }
370 372 }
371   -
372 373 return keyValue;
373 374 }
374 375  
... ... @@ -379,6 +380,8 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
379 380 */
380 381 @Transactional(rollbackFor = Exception.class)
381 382 public void handleExpireRecord(CombinationRecordDO headExpireRecord) {
  383 + // TODO @puhui999:这里的 null 其实不用判断。真出现,应该要处个 npe,因为就是要错哈;
  384 + // TODO @puhui999:headExpireRecord 可以简化成 headRecord
382 385 if (headExpireRecord == null) {
383 386 return;
384 387 }
... ... @@ -386,14 +389,13 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
386 389 // 1.更新拼团记录
387 390 List<CombinationRecordDO> headsAndRecords = updateBatchCombinationRecords(headExpireRecord,
388 391 CombinationRecordStatusEnum.FAILED);
  392 + // TODO @puhui999:这里的 null 其实不用判断。真出现,应该要处个 npe,因为就是要错哈;
389 393 if (headsAndRecords == null) {
390 394 return;
391 395 }
392 396  
393 397 // 2.订单取消
394   - headsAndRecords.forEach(item -> {
395   - tradeOrderApi.cancelPaidOrder(item.getUserId(), item.getOrderId());
396   - });
  398 + headsAndRecords.forEach(item -> tradeOrderApi.cancelPaidOrder(item.getUserId(), item.getOrderId()));
397 399 }
398 400  
399 401 /**
... ... @@ -403,6 +405,8 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
403 405 */
404 406 @Transactional(rollbackFor = Exception.class)
405 407 public void handleVirtualGroupRecord(CombinationRecordDO virtualGroupHeadRecord) {
  408 + // TODO @puhui999:这里的 null 其实不用判断。真出现,应该要处个 npe,因为就是要错哈;
  409 + // TODO @puhui999:headExpireRecord 可以简化成 headRecord
406 410 if (virtualGroupHeadRecord == null) {
407 411 return;
408 412 }
... ... @@ -413,18 +417,21 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
413 417 updateBatchCombinationRecords(virtualGroupHeadRecord, CombinationRecordStatusEnum.SUCCESS);
414 418 }
415 419  
  420 + // TODO @puhui999:写下方法注释;
416 421 private List<CombinationRecordDO> updateBatchCombinationRecords(CombinationRecordDO headRecord, CombinationRecordStatusEnum status) {
417 422 // 1. 查询团成员(包含团长)
418 423 List<CombinationRecordDO> records = combinationRecordMapper.selectListByHeadId(headRecord.getId());
  424 + // TODO @puhui999:是不是不用判断空哈;例如说,就一个团长,然后过期。
419 425 if (CollUtil.isEmpty(records)) {
420 426 return null;
421 427 }
422 428 records.add(headRecord);// 把团长加进去
423 429  
424   - // 2.批量更新拼团记录 status 和 失败/成团时间
  430 + // 2. 批量更新拼团记录 status 和 endTime
425 431 List<CombinationRecordDO> updateRecords = new ArrayList<>(records.size());
426 432 LocalDateTime now = LocalDateTime.now();
427 433 records.forEach(item -> {
  434 + // TODO @puhui999:record 改成 updateRecord
428 435 CombinationRecordDO record = new CombinationRecordDO().setId(item.getId())
429 436 .setStatus(status.getStatus()).setEndTime(now);
430 437 if (CombinationRecordStatusEnum.isSuccess(status.getStatus())) { // 虚拟成团完事更改状态成功后还需要把参与人数修改为成团需要人数
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
... ... @@ -92,20 +92,12 @@ public interface TradeOrderMapper extends BaseMapperX&lt;TradeOrderDO&gt; {
92 92 default TradeOrderDO selectOneByPickUpVerifyCode(String pickUpVerifyCode) {
93 93 return selectOne(TradeOrderDO::getPickUpVerifyCode, pickUpVerifyCode);
94 94 }
95   -
96   - /**
97   - * 只针对 combinationActivityId 的查询
98   - *
99   - * @param userId 用户编号
100   - * @param activityId 拼团活动编号
101   - * @param status 订单状态
102   - * @return 交易订单
103   - */
104   - default TradeOrderDO selectByUserIdAndCombinationActivityIdAndStatus(Long userId, Long activityId, Integer status) {
  95 +
  96 + default TradeOrderDO selectByUserIdAndCombinationActivityIdAndStatus(Long userId, Long combinationActivityId, Integer status) {
105 97 return selectOne(new LambdaQueryWrapperX<TradeOrderDO>()
106 98 .eq(TradeOrderDO::getUserId, userId)
107 99 .eq(TradeOrderDO::getStatus, status)
108   - .eq(TradeOrderDO::getCombinationActivityId, activityId)
  100 + .eq(TradeOrderDO::getCombinationActivityId, combinationActivityId)
109 101 );
110 102 }
111 103  
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java
... ... @@ -42,11 +42,11 @@ public interface TradeOrderQueryService {
42 42 * 获得指定用户,指定活动,指定状态的交易订单
43 43 *
44 44 * @param userId 用户编号
45   - * @param activityId 活动编号
  45 + * @param combinationActivityId 活动编号
46 46 * @param status 订单状态
47 47 * @return 交易订单
48 48 */
49   - TradeOrderDO getCombinationActivityOrderByUserIdAndCombinationActivityIdAndStatus(Long userId, Long activityId, Integer status);
  49 + TradeOrderDO getOrderByUserIdAndStatusAndCombination(Long userId, Long combinationActivityId, Integer status);
50 50  
51 51 /**
52 52 * 获得订单列表
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
... ... @@ -71,8 +71,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
71 71 }
72 72  
73 73 @Override
74   - public TradeOrderDO getCombinationActivityOrderByUserIdAndCombinationActivityIdAndStatus(Long userId, Long activityId, Integer status) {
75   - return tradeOrderMapper.selectByUserIdAndCombinationActivityIdAndStatus(userId, activityId, status);
  74 + public TradeOrderDO getOrderByUserIdAndStatusAndCombination(Long userId, Long combinationActivityId, Integer status) {
  75 + return tradeOrderMapper.selectByUserIdAndCombinationActivityIdAndStatus(userId, combinationActivityId, status);
76 76 }
77 77  
78 78 @Override
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java
... ... @@ -49,7 +49,7 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler {
49 49 order.getCombinationHeadId(), item.getSkuId(), item.getCount());
50 50  
51 51 // 2. 校验该用户是否存在未支付的拼团活动订单,避免一个拼团可以下多个单子了
52   - TradeOrderDO activityOrder = orderQueryService.getCombinationActivityOrderByUserIdAndCombinationActivityIdAndStatus(
  52 + TradeOrderDO activityOrder = orderQueryService.getOrderByUserIdAndStatusAndCombination(
53 53 order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus());
54 54 if (activityOrder != null) {
55 55 throw exception(ORDER_CREATE_FAIL_EXIST_UNPAID);
... ... @@ -69,9 +69,8 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler {
69 69 CombinationRecordCreateRespDTO combinationRecord = combinationRecordApi.createCombinationRecord(
70 70 TradeOrderConvert.INSTANCE.convert(order, item));
71 71  
72   - // 3. 更新拼团相关信息到订单
73   - // 为什么几个字段都要更新?原因是:
74   - // 如果创建订单时自己是团长的情况下 combinationHeadId 是为 null 的,设置团长编号这个操作时在订单是否后创建拼团记录时才设置的。
  72 + // 3. 更新拼团相关信息到订单。为什么几个字段都要更新?
  73 + // 原因是:如果创建订单时自己是团长的情况下 combinationHeadId 是为 null 的,设置团长编号这个操作时在订单是否后创建拼团记录时才设置的。
75 74 orderUpdateService.updateOrderCombinationInfo(order.getId(), order.getCombinationActivityId(),
76 75 combinationRecord.getCombinationRecordId(), combinationRecord.getCombinationHeadId());
77 76 }
... ...