From 038e23a6b37755d4d11360b3dc6072f7bba22bc5 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Fri, 6 Oct 2023 00:03:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=BC=E5=9B=A2=E6=B4=BB=E5=8A=A8=EF=BC=9A?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=8B=BC=E5=9B=A2=20app-api=20=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppCombinationActivityController.java | 3 +- .../AppCombinationRecordController.java | 119 +++++++++--------- .../AppCombinationRecordDetailRespVO.java | 1 - .../AppCombinationRecordSummaryRespVO.java | 4 +- .../CombinationActivityConvert.java | 5 + .../combination/CombinationRecordMapper.java | 35 +++++- .../combination/CombinationRecordService.java | 51 +++++++- .../CombinationRecordServiceImpl.java | 30 +++-- 8 files changed, 170 insertions(+), 78 deletions(-) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationActivityController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationActivityController.java index 38cd948e3..ee1d5ed17 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationActivityController.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationActivityController.java @@ -27,6 +27,7 @@ import javax.annotation.Resource; import java.util.Collections; import java.util.List; +import static cn.hutool.core.util.ObjectUtil.defaultIfNull; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; @@ -47,7 +48,7 @@ public class AppCombinationActivityController { @Parameter(name = "count", description = "需要展示的数量", example = "6") public CommonResult> getCombinationActivityList( @RequestParam(name = "count", defaultValue = "6") Integer count) { - List list = activityService.getCombinationActivityListByCount(6); + List list = activityService.getCombinationActivityListByCount(defaultIfNull(count, 6)); if (CollUtil.isEmpty(list)) { return success(Collections.emptyList()); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationRecordController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationRecordController.java index ef0e7ff99..113492504 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationRecordController.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationRecordController.java @@ -1,12 +1,17 @@ package cn.iocoder.yudao.module.promotion.controller.app.combination; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.record.AppCombinationRecordDetailRespVO; import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.record.AppCombinationRecordRespVO; import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.record.AppCombinationRecordSummaryRespVO; +import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert; +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO; +import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -14,13 +19,14 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; import javax.validation.constraints.Max; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "用户 APP - 拼团活动") @RestController @@ -28,81 +34,78 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Validated public class AppCombinationRecordController { + @Resource + private CombinationRecordService combinationRecordService; + @GetMapping("/get-summary") @Operation(summary = "获得拼团记录的概要信息", description = "用于小程序首页") // TODO 芋艿:增加 @Cache 缓存,1 分钟过期 public CommonResult getCombinationRecordSummary() { + // 获取所有拼团记录 + Long count = combinationRecordService.getRecordsCount(); AppCombinationRecordSummaryRespVO summary = new AppCombinationRecordSummaryRespVO(); - summary.setUserCount(1024); - summary.setAvatars(new ArrayList<>()); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLjFK35Wvia9lJKHoXfQuHhk0qZbvpPNxrAiaEKF7aL2k4I8kuqrdTWwliamdPHeyAA7DjAg725X2GIQ/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTK1pXgdj5DvBMwrbe8v3tFibSWeQATEsAibt3fllD8XwJ460P2r6KS3WCQvDefuv1bVpDhNCle6CTCA/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTL7KRGHBE62N0awFyBesmmxiaCicf1fJ7E7UCh6zA8GWlT1QC1zT01gG4OxI7BWDESkdPZ5o7tno4hA/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/ouwtwJycbic2JrCoZjETict0klxd1uRuicRneKk00ewMcCClxVcVHQT91Sh9MJGtwibf1fOicD1WpwSP4icJM6eQq1AA/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/RpUrhwens58qc99OcGs993xL4M5QPOe05ekqF9Eia440kRicAlicicIdQWicHBmy2bzLgHzHguWEzHHxnIgeictL7bLA/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/S4tfqmxc8GZGsKc1K4mnhpvtG16gtMrLnTQfDibhr7jJich9LRI5RQKZDoqEjZM3azMib5nic7F4ZXKMEgYyLO08KA/132"); - summary.getAvatars().add("https://static.iocoder.cn/mall/132.jpeg"); + if (count == null || count == 0L) { + summary.setAvatars(Collections.emptyList()); + summary.setUserCount(count); + return success(summary); + } + + summary.setUserCount(count); + // TODO 只返回最近的 7 个 + int num = 7; + summary.setAvatars(convertList(combinationRecordService.getLatestRecordList(num), CombinationRecordDO::getAvatar)); return success(summary); } @GetMapping("/get-head-list") @Operation(summary = "获得最近 n 条拼团记录(团长发起的)") - // TODO @芋艿:注解要补全 + @Parameters({ + @Parameter(name = "activityId", description = "拼团活动编号"), + @Parameter(name = "status", description = "状态"), + @Parameter(name = "count", description = "数量") + }) public CommonResult> getHeadCombinationRecordList( @RequestParam(value = "activityId", required = false) Long activityId, @RequestParam("status") Integer status, @RequestParam(value = "count", defaultValue = "20") @Max(20) Integer count) { - List list = new ArrayList<>(); - for (int i = 1; i <= count; i++) { - AppCombinationRecordRespVO record = new AppCombinationRecordRespVO(); - record.setId((long) i); - record.setNickname("用户" + i); - record.setAvatar("头像" + i); - record.setExpireTime(LocalDateTime.now()); - record.setUserSize(10); - record.setUserCount(i); - record.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - record.setActivityId(1L); - record.setSpuName("活动:" + i); - list.add(record); - } - return success(list); + return success(CombinationActivityConvert.INSTANCE.convertList3( + combinationRecordService.getRecordListWithHead(activityId, status, count))); } @GetMapping("/get-detail") @Operation(summary = "获得拼团记录明细") @Parameter(name = "id", description = "拼团记录编号", required = true, example = "1024") public CommonResult getCombinationRecordDetail(@RequestParam("id") Long id) { - AppCombinationRecordDetailRespVO detail = new AppCombinationRecordDetailRespVO(); - // 团长 - AppCombinationRecordRespVO headRecord = new AppCombinationRecordRespVO(); - headRecord.setId(1L); - headRecord.setNickname("用户" + 1); - headRecord.setAvatar("头像" + 1); - headRecord.setExpireTime(LocalDateTimeUtils.addTime(Duration.ofDays(1))); - headRecord.setUserSize(10); - headRecord.setUserCount(3); - headRecord.setStatus(1); - headRecord.setActivityId(10L); - headRecord.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - headRecord.setCombinationPrice(100); - detail.setHeadRecord(headRecord); - // 团员 - List list = new ArrayList<>(); - for (int i = 1; i <= 2; i++) { - AppCombinationRecordRespVO record = new AppCombinationRecordRespVO(); - record.setId((long) i); - record.setNickname("用户" + i); - record.setAvatar("头像" + i); - record.setExpireTime(LocalDateTime.now()); - record.setUserSize(10); - record.setUserCount(i); - record.setStatus(1); - list.add(record); + // 1、查询这条记录 + CombinationRecordDO record = combinationRecordService.getRecordById(id); + if (record == null) { + return success(null); } - detail.setMemberRecords(list); - // 订单编号 - detail.setOrderId(100L); + + AppCombinationRecordDetailRespVO detail = new AppCombinationRecordDetailRespVO(); + List records; + // 2、判断是否为团长 + if (record.getHeadId() == null) { + detail.setHeadRecord(CombinationActivityConvert.INSTANCE.convert(record)); + // 2.1、查找团员拼团记录 + records = combinationRecordService.getRecordListByHeadId(record.getId()); + } else { + // 2.2、查找团长拼团记录 + CombinationRecordDO headRecord = combinationRecordService.getRecordById(record.getHeadId()); + if (headRecord == null) { + return success(null); + } + + detail.setHeadRecord(CombinationActivityConvert.INSTANCE.convert(headRecord)); + // 2.3、查找团员拼团记录 + records = combinationRecordService.getRecordListByHeadId(headRecord.getId()); + + } + detail.setMemberRecords(CombinationActivityConvert.INSTANCE.convertList3(records)); + + // 3、获取当前用户参团记录订单编号 + CombinationRecordDO userRecord = CollectionUtils.findFirst(records, r -> ObjectUtil.equal(r.getUserId(), getLoginUserId())); + detail.setOrderId(userRecord == null ? null : userRecord.getOrderId()); // 如果没参团,返回 null return success(detail); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordDetailRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordDetailRespVO.java index 07f989d7f..7c310a670 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordDetailRespVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordDetailRespVO.java @@ -16,7 +16,6 @@ public class AppCombinationRecordDetailRespVO { private List memberRecords; @Schema(description = "当前用户参团记录对应的订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - // 如果没参团,返回 null private Long orderId; } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordSummaryRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordSummaryRespVO.java index ef81e9282..5c79f9f73 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordSummaryRespVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordSummaryRespVO.java @@ -10,9 +10,9 @@ import java.util.List; public class AppCombinationRecordSummaryRespVO { @Schema(description = "拼团用户数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer userCount; + private Long userCount; - @Schema(description = "拼团用户头像列表", requiredMode = Schema.RequiredMode.REQUIRED) // 只返回最近的 7 个 + @Schema(description = "拼团用户头像列表", requiredMode = Schema.RequiredMode.REQUIRED) private List avatars; } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java index 3f243275d..ebbb252a3 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java @@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product.CombinationProductRespVO; import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.activity.AppCombinationActivityDetailRespVO; import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.activity.AppCombinationActivityRespVO; +import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.record.AppCombinationRecordRespVO; import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO; import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO; import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO; @@ -141,4 +142,8 @@ public interface CombinationActivityConvert { return convert2(combinationActivity).setProducts(convertList1(products)); } + List convertList3(List records); + + AppCombinationRecordRespVO convert(CombinationRecordDO record); + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationRecordMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationRecordMapper.java index b1ccfc858..91117ad83 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationRecordMapper.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationRecordMapper.java @@ -29,6 +29,7 @@ public interface CombinationRecordMapper extends BaseMapperX selectListByStatus(Integer status) { - return selectList(CombinationRecordDO::getStatus, status); - } - /** * 查询拼团记录 * @@ -63,4 +60,34 @@ public interface CombinationRecordMapper extends BaseMapperX selectLatestList(int count) { + return selectList(new LambdaQueryWrapperX() + .orderByDesc(CombinationRecordDO::getCreateTime) + .last("LIMIT " + count)); + } + + /** + * 获得最近 count 条拼团记录(团长发起的) + * + * @param activityId 拼团活动编号 + * @param status 记录状态 + * @param count 数量 + * @return 拼团记录列表 + */ + default List selectList(Long activityId, Integer status, Integer count) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CombinationRecordDO::getActivityId, activityId) + .eqIfPresent(CombinationRecordDO::getStatus, status) + .eq(CombinationRecordDO::getHeadId, null) // TODO 团长的 headId 是不是 null 还是自己的记录编号来着? + .orderByDesc(CombinationRecordDO::getCreateTime) + .last("LIMIT " + count)); + } + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordService.java index bef9442f1..aeac753ad 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordService.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordService.java @@ -20,8 +20,8 @@ public interface CombinationRecordService { /** * 更新拼团状态 * - * @param status 状态 - * @param userId 用户编号 + * @param status 状态 + * @param userId 用户编号 * @param orderId 订单编号 */ void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId); @@ -48,9 +48,9 @@ public interface CombinationRecordService { /** * 更新拼团状态和开始时间 * - * @param status 状态 - * @param userId 用户编号 - * @param orderId 订单编号 + * @param status 状态 + * @param userId 用户编号 + * @param orderId 订单编号 * @param startTime 开始时间 */ void updateRecordStatusAndStartTimeByUserIdAndOrderId(Integer status, Long userId, Long orderId, LocalDateTime startTime); @@ -86,4 +86,45 @@ public interface CombinationRecordService { */ CombinationValidateJoinRespDTO validateJoinCombination(Long activityId, Long userId, Long skuId, Integer count); + /** + * 获取所有拼团记录数 + * + * @return 记录数 + */ + Long getRecordsCount(); + + /** + * 获取最近的 count 条拼团记录 + * + * @param count 限制数量 + * @return 拼团记录列表 + */ + List getLatestRecordList(int count); + + /** + * 获得最近 n 条拼团记录(团长发起的) + * + * @param activityId 拼团活动编号 + * @param status 状态 + * @param count 数量 + * @return 拼团记录列表 + */ + List getRecordListWithHead(Long activityId, Integer status, Integer count); + + /** + * 获取指定编号的拼团记录 + * + * @param id 拼团记录编号 + * @return 拼团记录 + */ + CombinationRecordDO getRecordById(Long id); + + /** + * 获取指定团长编号的拼团记录 + * + * @param headId 团长编号 + * @return 拼团记录列表 + */ + List getRecordListByHeadId(Long headId); + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java index 7bec69330..f21e1942e 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java @@ -232,13 +232,29 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { .setCombinationPrice(keyValue.getValue().getCombinationPrice()); } - /** - * APP 端获取开团记录 - * - * @return 开团记录 - */ - public List getRecordListByStatus(Integer status) { - return recordMapper.selectListByStatus(status); + @Override + public Long getRecordsCount() { + return recordMapper.selectCount(); + } + + @Override + public List getLatestRecordList(int count) { + return recordMapper.selectLatestList(count); + } + + @Override + public List getRecordListWithHead(Long activityId, Integer status, Integer count) { + return recordMapper.selectList(activityId, status, count); + } + + @Override + public CombinationRecordDO getRecordById(Long id) { + return recordMapper.selectById(id); + } + + @Override + public List getRecordListByHeadId(Long headId) { + return recordMapper.selectList(CombinationRecordDO::getHeadId, headId); } }