Kaynağa Gözat

复制接口

lutong 2 ay önce
ebeveyn
işleme
39b7a7d909

+ 126 - 0
alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityPlatformDetailVo.java

@@ -0,0 +1,126 @@
+package shop.alien.entity.storePlatform.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 运营活动详情返回对象(用户端)
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel(value = "StoreOperationalActivityDetailVo", description = "运营活动详情返回对象")
+public class StoreOperationalActivityPlatformDetailVo {
+
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "商户ID")
+    private Integer storeId;
+
+    @ApiModelProperty(value = "活动名称")
+    private String activityName;
+
+    @ApiModelProperty(value = "活动宣传图URL")
+    private String promotionalImage;
+
+    @ApiModelProperty(value = "活动开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startTime;
+
+    @ApiModelProperty(value = "活动结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endTime;
+
+    @ApiModelProperty(value = "用户可参与次数,0表示不限制")
+    private Integer participationLimit;
+
+    @ApiModelProperty(value = "活动规则")
+    private String activityRule;
+
+    @ApiModelProperty(value = "奖励类型")
+    private String rewardType;
+
+    @ApiModelProperty(value = "优惠券ID")
+    private Integer couponId;
+
+    @ApiModelProperty(value = "优惠券发放数量")
+    private Integer couponQuantity;
+
+    @ApiModelProperty(value = "状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "拒绝原因")
+    private String approvalComments;
+
+    @ApiModelProperty(value = "活动类型")
+    private String activityType;
+
+    @ApiModelProperty(value = "报名开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date signupStartTime;
+
+    @ApiModelProperty(value = "报名结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date signupEndTime;
+
+    @ApiModelProperty(value = "活动限制人数")
+    private Integer activityLimitPeople;
+
+    @ApiModelProperty(value = "活动详情")
+    private String activityDetails;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "活动状态名称")
+    private String statusName;
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    @ApiModelProperty(value = "商户名称")
+    private String storeName;
+
+    @ApiModelProperty(value = "活动标题图片URL")
+    private String activityTitleImgUrl;
+
+    @ApiModelProperty(value = "活动详情图片URL")
+    private String activityDetailImgUrl;
+
+    @ApiModelProperty(value = "活动详情图片URL列表")
+    private List<String> activityDetailImgUrlList;
+
+    @ApiModelProperty(value = "当前报名人数")
+    private Integer currentSignupCount;
+
+    @ApiModelProperty(value = "当前通过人数")
+    private Integer currentApprovedCount;
+
+    @ApiModelProperty(value = "是否已报名")
+    private Boolean signedUp;
+
+    @ApiModelProperty(value = "是否在报名时间内")
+    private Boolean inSignupTime;
+
+    @ApiModelProperty(value = "详情按钮状态:0-活动已结束,1-报名已截止,2-等待活动开始,3-报名成功,4-已报名,5-立即报名")
+    private Integer detailStatus;
+
+    @ApiModelProperty(value = "结果类型:0-文字, 1-图片")
+    private Integer resultType;
+
+    @ApiModelProperty(value = "结果文字")
+    private String resultText;
+
+    @ApiModelProperty(value = "结果图片地址")
+    private String resultMediaUrl;
+}

+ 35 - 23
alien-store/src/main/java/shop/alien/store/controller/StoreOperationalActivityController.java

@@ -1,34 +1,19 @@
 package shop.alien.store.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiOperationSupport;
-import io.swagger.annotations.ApiSort;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import java.util.List;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
-import shop.alien.entity.storePlatform.vo.StoreOperationalActivitySignupCheckVo;
-import shop.alien.entity.storePlatform.vo.StoreOperationalActivityDetailVo;
-import shop.alien.entity.storePlatform.vo.StoreOperationalActivityAchievementCaseDetailVo;
-import shop.alien.entity.storePlatform.vo.StoreOperationalActivityAchievementCaseVo;
-import shop.alien.entity.storePlatform.vo.StoreOperationalActivityAchievementVo;
-import shop.alien.entity.storePlatform.vo.StoreOperationalActivityMySignupVo;
-import shop.alien.store.dto.StoreOperationalActivitySignupDto;
+import shop.alien.entity.storePlatform.vo.*;
 import shop.alien.store.dto.StoreOperationalActivityAchievementDto;
 import shop.alien.store.dto.StoreOperationalActivityCaseQueryDto;
-import shop.alien.store.service.StoreOperationalActivityService;
+import shop.alien.store.dto.StoreOperationalActivitySignupDto;
 import shop.alien.store.service.StoreOperationalActivityAchievementService;
+import shop.alien.store.service.StoreOperationalActivityService;
+
+import java.util.List;
 
 /**
  * 运营活动详情控制器
@@ -74,6 +59,33 @@ public class StoreOperationalActivityController {
         }
     }
 
+    @ApiOperation("服务中台-查询活动详情")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "活动ID", dataTypeClass = Integer.class, paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataTypeClass = Integer.class, paramType = "query", required = true)
+    })
+    @GetMapping("/platform/detail")
+    public R<StoreOperationalActivityDetailVo> getActivityDetailForPlatform(@RequestParam("id") Integer id,
+                                                                             @RequestParam("userId") Integer userId) {
+        /*
+         * 服务中台活动详情接口:
+         * 1. id 与 userId 必传,分别用于活动查询与用户报名状态判断。
+         * 2. 业务计算在服务层完成,控制器仅做参数透传与异常转换。
+         */
+        log.info("StoreOperationalActivityController.getActivityDetailForPlatform id={}, userId={}", id, userId);
+        try {
+            StoreOperationalActivityDetailVo result = operationalActivityService.getActivityDetailForPlatform(id, userId);
+            return R.data(result);
+        } catch (IllegalArgumentException e) {
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("StoreOperationalActivityController.getActivityDetailForPlatform ERROR: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+
     @ApiOperation("报名校验")
     @ApiOperationSupport(order = 2)
     @ApiImplicitParams({

+ 14 - 0
alien-store/src/main/java/shop/alien/store/service/StoreOperationalActivityService.java

@@ -29,6 +29,20 @@ public interface StoreOperationalActivityService {
     StoreOperationalActivityDetailVo getActivityDetail(Integer id, Integer userId);
 
     /**
+     * 查询活动详情。
+     * <p>
+     * 说明:
+     * 1. id 为活动主键,userId 用于判断报名相关状态。
+     * 2. 若活动不存在,返回 null。
+     * </p>
+     *
+     * @param id 活动ID
+     * @param userId 用户ID
+     * @return 活动详情
+     */
+    StoreOperationalActivityDetailVo getActivityDetailForPlatform(Integer id, Integer userId);
+
+    /**
      * 报名校验:是否已满、是否已成功报名。
      *
      * @param activityId 活动ID

+ 41 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreOperationalActivityServiceImpl.java

@@ -91,6 +91,47 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
     }
 
     @Override
+    public StoreOperationalActivityDetailVo getActivityDetailForPlatform(Integer id, Integer userId) {
+        /**
+         * 活动详情查询:
+         * 1. 校验活动ID有效性;
+         * 2. 组装详情数据(报名状态、报名人数、活动图片等);
+         * 3. 根据用户报名状态计算 detailStatus。
+         */
+        log.info("StoreOperationalActivityController.getActivityDetailForPlatform id={}, userId={}", id, userId);
+        if (id == null) {
+            throw new IllegalArgumentException("活动ID不能为空");
+        }
+        StoreOperationalActivity activity = activityMapper.selectById(id);
+        if (activity == null) {
+            return null;
+        }
+
+        StoreOperationalActivityDetailVo vo = new StoreOperationalActivityDetailVo();
+        BeanUtils.copyProperties(activity, vo);
+        vo.setStatusName(resolveStatusName(activity.getStatus()));
+        // 报名状态相关字段填充
+        fillSignupFlags(vo, activity, userId);
+        // 报名人数统计
+        fillSignupCounts(vo);
+        Integer signupStatus = resolveCurrentUserSignupStatus(activity.getId(), userId);
+        // 详情按钮状态计算
+        vo.setDetailStatus(resolveDetailStatus(activity, signupStatus));
+
+        if (activity.getCouponId() != null) {
+            LifeDiscountCoupon coupon = lifeDiscountCouponMapper.selectById(activity.getCouponId());
+            if (coupon != null) {
+                vo.setCouponName(coupon.getName());
+            }
+        }
+
+        // 店铺信息与活动图片
+        attachStoreInfo(vo);
+        fillActivityImages(vo);
+        return vo;
+    }
+
+    @Override
     public StoreOperationalActivitySignupCheckVo checkSignup(Integer activityId, Integer userId) {
         log.info("StoreOperationalActivityServiceImpl.checkSignup: activityId={}, userId={}", activityId, userId);
         if (activityId == null) {