Преглед изворни кода

添加营销活动代金券展示

lutong пре 2 месеци
родитељ
комит
1c4a6bd5c7

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/storePlatform/StoreOperationalActivity.java

@@ -71,6 +71,10 @@ public class StoreOperationalActivity {
     @TableField("coupon_quantity")
     private Integer couponQuantity;
 
+    @ApiModelProperty(value = "代金券发放数量")
+    @TableField("voucher_quantity")
+    private Integer voucherQuantity;
+
     @ApiModelProperty(value = "状态:0-草稿, 1-待审核, 2-未开始, 3-审核拒绝, 4-已售罄, 5-进行中, 6-已下架, 7-已结束, 8-审核成功(2+手动下架)")
     @TableField("status")
     private Integer status;

+ 7 - 2
alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityDTO.java

@@ -1,6 +1,5 @@
 package shop.alien.entity.storePlatform.vo;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.JsonNode;
 import io.swagger.annotations.ApiModel;
@@ -47,7 +46,7 @@ public class StoreOperationalActivityDTO {
     @ApiModelProperty(value = "活动规则:VERIFY_AND_COMMENT-核销并评论, VERIFY-核销, CHECK_IN-打卡", required = true)
     private String activityRule;
 
-    @ApiModelProperty(value = "奖励类型:COUPON-优惠券, RED_PACKET-红包")
+    @ApiModelProperty(value = "奖励类型:COUPON-优惠券, RED_PACKET-红包, VOUCHER-代金券")
     private String rewardType;
 
     @ApiModelProperty(value = "优惠券ID")
@@ -56,6 +55,12 @@ public class StoreOperationalActivityDTO {
     @ApiModelProperty(value = "优惠券发放数量")
     private Integer couponQuantity;
 
+    @ApiModelProperty(value = "代金券ID")
+    private Integer voucherId;
+
+    @ApiModelProperty(value = "代金券发放数量")
+    private Integer voucherQuantity;
+
     @ApiModelProperty(value = "状态:0-禁用, 1-启用")
     private Integer status;
 

+ 10 - 2
alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityDetailVo.java

@@ -1,6 +1,5 @@
 package shop.alien.entity.storePlatform.vo;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.annotations.ApiModel;
@@ -18,7 +17,7 @@ import java.util.List;
  */
 @Data
 @JsonInclude
-@ApiModel(value = "StoreOperationalActivityDetailVo", description = "运营活动详情返回对象")
+@ApiModel(value = "StoreOperationalActivityDetailVo", description = "运营活动详情返回对象,包含活动基本信息、优惠券信息、代金券信息等")
 public class StoreOperationalActivityDetailVo {
 
     @ApiModelProperty(value = "主键")
@@ -56,6 +55,12 @@ public class StoreOperationalActivityDetailVo {
     @ApiModelProperty(value = "优惠券发放数量")
     private Integer couponQuantity;
 
+    @ApiModelProperty(value = "代金券ID")
+    private Integer voucherId;
+
+    @ApiModelProperty(value = "代金券发放数量")
+    private Integer voucherQuantity;
+
     @ApiModelProperty(value = "状态")
     private Integer status;
 
@@ -89,6 +94,9 @@ public class StoreOperationalActivityDetailVo {
     @ApiModelProperty(value = "优惠券名称")
     private String couponName;
 
+    @ApiModelProperty(value = "代金券名称")
+    private String voucherName;
+
     @ApiModelProperty(value = "商户名称")
     private String storeName;
 

+ 7 - 1
alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityVO.java

@@ -16,7 +16,7 @@ import shop.alien.entity.storePlatform.StoreOperationalActivity;
  */
 @Data
 @JsonInclude
-@ApiModel(value = "StoreOperationalActivityVO", description = "运营活动返回对象")
+@ApiModel(value = "StoreOperationalActivityVO", description = "运营活动返回对象,包含活动基本信息、优惠券信息、代金券信息、活动图片等")
 public class StoreOperationalActivityVO extends StoreOperationalActivity {
 
     @ApiModelProperty(value = "活动状态名称")
@@ -31,6 +31,9 @@ public class StoreOperationalActivityVO extends StoreOperationalActivity {
     @ApiModelProperty(value = "优惠券名称")
     private String couponName;
 
+    @ApiModelProperty(value = "代金券名称")
+    private String voucherName;
+
     @ApiModelProperty(value = "商户名称")
     private String storeName;
 
@@ -43,6 +46,9 @@ public class StoreOperationalActivityVO extends StoreOperationalActivity {
     @ApiModelProperty(value = "剩余优惠券数量")
     private Integer remainingCouponQuantity;
 
+    @ApiModelProperty(value = "剩余代金券数量")
+    private Integer remainingVoucherQuantity;
+
     @ApiModelProperty(value = "活动标题图片")
     private StoreImg activityTitleImg;
 

+ 2 - 1
alien-entity/src/main/resources/mapper/storePlatform/StoreOperationalActivityMapper.xml

@@ -16,6 +16,7 @@
         <result column="coupon_id" property="couponId" />
         <result column="voucher_id" property="voucherId" />
         <result column="coupon_quantity" property="couponQuantity" />
+        <result column="voucher_quantity" property="voucherQuantity" />
         <result column="status" property="status" />
         <result column="delete_flag" property="deleteFlag" />
         <result column="created_time" property="createdTime" />
@@ -38,7 +39,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, store_id, activity_name, promotional_image, start_time, end_time, participation_limit, activity_rule, reward_type, coupon_id, voucher_id, coupon_quantity, status, delete_flag, created_time, created_user_id, updated_time, updated_user_id, approval_comments, activity_type, signup_start_time, signup_end_time, activity_limit_people, activity_details, result_type, result_text, result_media_url, audit_time, upload_img_type, audit_status
+        id, store_id, activity_name, promotional_image, start_time, end_time, participation_limit, activity_rule, reward_type, coupon_id, voucher_id, coupon_quantity, voucher_quantity, status, delete_flag, created_time, created_user_id, updated_time, updated_user_id, approval_comments, activity_type, signup_start_time, signup_end_time, activity_limit_people, activity_details, result_type, result_text, result_media_url, audit_time, upload_img_type, audit_status
     </sql>
 
 </mapper>

+ 45 - 3
alien-store-platform/doc/OPERATIONAL_ACTIVITY_README.md

@@ -20,9 +20,11 @@ CREATE TABLE `store_operational_activity` (
     `end_time` DATETIME NOT NULL COMMENT '活动结束时间',
     `participation_limit` int DEFAULT 0 COMMENT '用户可参与次数,0表示不限制',
     `activity_rule` VARCHAR(50) NOT NULL COMMENT '活动规则:VERIFY_AND_COMMENT-核销并评论, VERIFY-核销, CHECK_IN-打卡',
-    `reward_type` VARCHAR(50) DEFAULT NULL COMMENT '奖励类型:COUPON-优惠券, RED_PACKET-红包',
-    `coupon_id` int DEFAULT NULL COMMENT '优惠券ID,关联优惠券表',
+    `reward_type` VARCHAR(50) DEFAULT NULL COMMENT '奖励类型:COUPON-优惠券, RED_PACKET-红包, VOUCHER-代金券',
+    `coupon_id` int DEFAULT NULL COMMENT '优惠券ID,关联优惠券表 life_discount_coupon',
+    `voucher_id` int DEFAULT NULL COMMENT '代金券ID,关联代金券表 life_coupon(评论有礼时可二选一或同时配置)',
     `coupon_quantity` int DEFAULT NULL COMMENT '优惠券发放数量',
+    `voucher_quantity` int DEFAULT NULL COMMENT '代金券发放数量',
     `status` int DEFAULT 1 COMMENT '状态:0-禁用, 1-启用',
     `delete_flag` int NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
     `created_time` datetime(1) NOT NULL COMMENT '创建时间',
@@ -55,9 +57,11 @@ CREATE TABLE `store_operational_activity` (
 - `endTime`: 活动结束时间
 - `participationLimit`: 用户可参与次数(0表示不限制)
 - `activityRule`: 活动规则(VERIFY_AND_COMMENT-核销并评论, VERIFY-核销, CHECK_IN-打卡)
-- `rewardType`: 奖励类型(COUPON-优惠券, RED_PACKET-红包)
+- `rewardType`: 奖励类型(COUPON-优惠券, RED_PACKET-红包, VOUCHER-代金券
 - `couponId`: 优惠券ID
+- `voucherId`: 代金券ID
 - `couponQuantity`: 优惠券发放数量
+- `voucherQuantity`: 代金券发放数量
 - `status`: 状态(0-禁用, 1-启用)
 - `deleteFlag`: 删除标记(逻辑删除)
 - `createdTime`: 创建时间(自动填充)
@@ -243,6 +247,7 @@ GET /operationalActivity/page?current=1&size=10&storeId=1&status=1
 ### 奖励类型(reward_type)
 - `COUPON`: 优惠券
 - `RED_PACKET`: 红包
+- `VOUCHER`: 代金券
 
 ### 活动状态(status)
 - `0`: 禁用
@@ -262,6 +267,7 @@ GET /operationalActivity/page?current=1&size=10&storeId=1&status=1
 3. **状态管理**: 活动状态由系统根据当前时间自动判断
 4. **参数校验**: DTO 中包含必填项校验,需要确保必填字段不为空
 5. **优惠券关联**: 如果奖励类型为优惠券,需要填写 couponId 和 couponQuantity
+6. **代金券关联**: 如果奖励类型为代金券,需要填写 voucherId 和 voucherQuantity。评论有礼活动可同时配置优惠券和代金券
 
 ---
 
@@ -275,6 +281,38 @@ GET /operationalActivity/page?current=1&size=10&storeId=1&status=1
 
 ---
 
+## 数据库表结构修改 SQL
+
+### 添加代金券相关字段
+
+如果数据库表中还没有 `voucher_id` 和 `voucher_quantity` 字段,请执行以下 SQL:
+
+```sql
+-- 添加代金券ID字段(如果不存在)
+ALTER TABLE `store_operational_activity` 
+ADD COLUMN `voucher_id` int DEFAULT NULL COMMENT '代金券ID,关联代金券表 life_coupon(评论有礼时可二选一或同时配置)' 
+AFTER `coupon_id`;
+
+-- 添加代金券发放数量字段(如果不存在)
+ALTER TABLE `store_operational_activity` 
+ADD COLUMN `voucher_quantity` int DEFAULT NULL COMMENT '代金券发放数量' 
+AFTER `coupon_quantity`;
+
+-- 添加代金券ID索引(可选)
+ALTER TABLE `store_operational_activity` 
+ADD INDEX `idx_voucher_id` (`voucher_id`);
+```
+
+### 更新奖励类型注释
+
+```sql
+-- 更新 reward_type 字段注释,添加 VOUCHER-代金券
+ALTER TABLE `store_operational_activity` 
+MODIFY COLUMN `reward_type` VARCHAR(50) DEFAULT NULL COMMENT '奖励类型:COUPON-优惠券, RED_PACKET-红包, VOUCHER-代金券';
+```
+
+---
+
 ## 更新日志
 
 ### 2025-11-26
@@ -283,3 +321,7 @@ GET /operationalActivity/page?current=1&size=10&storeId=1&status=1
 - 支持活动状态管理
 - 支持分页查询
 
+### 最新更新
+- 添加代金券支持:创建活动时可同时配置优惠券和代金券
+- 更新 DTO、实体类、Mapper 以支持代金券字段
+- 更新 AI 参数模板,包含代金券发放数量信息

+ 4 - 6
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/OperationalActivityController.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.storePlatform.vo.OperationalActivityUpdateResultVo;
@@ -12,7 +11,6 @@ import shop.alien.entity.storePlatform.vo.StoreOperationalActivityDTO;
 import shop.alien.entity.storePlatform.vo.StoreOperationalActivityVO;
 import shop.alien.storeplatform.service.OperationalActivityService;
 
-import java.util.List;
 import java.util.Optional;
 
 import static shop.alien.storeplatform.service.impl.OperationalActivityServiceImpl.failureReasonHolder;
@@ -34,7 +32,7 @@ public class OperationalActivityController {
 
     private final OperationalActivityService activityService;
 
-    @ApiOperation("创建运营活动")
+    @ApiOperation(value = "创建运营活动", notes = "支持配置优惠券和代金券作为奖励,可同时配置或二选一")
     @ApiOperationSupport(order = 1)
     @PostMapping("/create")
     public R<String> createActivity(@RequestBody StoreOperationalActivityDTO dto) {
@@ -60,7 +58,7 @@ public class OperationalActivityController {
         }
     }
 
-    @ApiOperation("更新运营活动")
+    @ApiOperation(value = "更新运营活动", notes = "支持更新优惠券和代金券配置")
     @ApiOperationSupport(order = 2)
     @PostMapping("/update")
     public R<OperationalActivityUpdateResultVo> updateActivity(@RequestBody StoreOperationalActivityDTO dto) {
@@ -99,7 +97,7 @@ public class OperationalActivityController {
         }
     }
 
-    @ApiOperation("根据ID获取活动详情")
+    @ApiOperation(value = "根据ID获取活动详情", notes = "返回活动详细信息,包括优惠券和代金券的名称、ID、数量等信息")
     @ApiOperationSupport(order = 4)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", value = "活动ID", dataType = "Integer", paramType = "query", required = true)
@@ -116,7 +114,7 @@ public class OperationalActivityController {
         }
     }
 
-    @ApiOperation("根据商户ID获取活动列表")
+    @ApiOperation(value = "根据商户ID获取活动列表", notes = "分页查询活动列表,返回活动基本信息、优惠券和代金券信息、活动图片等")
     @ApiOperationSupport(order = 5)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "storeId", value = "商户ID", dataType = "Integer", paramType = "query", required = true)

+ 53 - 11
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/OperationalActivityServiceImpl.java

@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import com.alibaba.fastjson.JSONObject;
+import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.LifeDiscountCoupon;
 import shop.alien.entity.store.LifeNotice;
 import shop.alien.entity.store.StoreImg;
@@ -26,6 +27,7 @@ import shop.alien.entity.storePlatform.StoreOperationalActivity;
 import shop.alien.entity.storePlatform.StoreOperationalActivitySignup;
 import shop.alien.entity.storePlatform.vo.StoreOperationalActivityDTO;
 import shop.alien.entity.storePlatform.vo.StoreOperationalActivityVO;
+import shop.alien.mapper.LifeCouponMapper;
 import shop.alien.mapper.LifeDiscountCouponMapper;
 import shop.alien.mapper.LifeNoticeMapper;
 import shop.alien.mapper.StoreImgMapper;
@@ -71,6 +73,8 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
 
     private final LifeDiscountCouponMapper lifeDiscountCouponMapper;
 
+    private final LifeCouponMapper lifeCouponMapper;
+
     private final StoreOperationalActivitySignupMapper signupMapper;
 
     private final StoreUserMapper storeUserMapper;
@@ -106,6 +110,7 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
             + "用户可参与次数:%s\n"
             + "活动规则:%s\n"
             + "优惠券发放数量:%s\n"
+            + "代金券发放数量:%s\n"
             + "图片描述:%s";
 
     @Override
@@ -208,7 +213,8 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
                                 dto.getEndTime(),
                                 dto.getParticipationLimit(),
                                 dto.getActivityRule(),
-                                dto.getCouponQuantity(),
+                                dto.getCouponQuantity() != null ? dto.getCouponQuantity() : 0,
+                                dto.getVoucherQuantity() != null ? dto.getVoucherQuantity() : 0,
                                 dto.getImgDescribe()
                         );
                         requestBody.put("text", filled);
@@ -369,7 +375,8 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
                             dto.getEndTime(),
                             dto.getParticipationLimit(),
                             dto.getActivityRule(),
-                            dto.getCouponQuantity(),
+                            dto.getCouponQuantity() != null ? dto.getCouponQuantity() : 0,
+                            dto.getVoucherQuantity() != null ? dto.getVoucherQuantity() : 0,
                             dto.getImgDescribe()
                     );
                     requestBody.put("text", filled);
@@ -486,15 +493,22 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
         } else if (activity.getStatus() == 7) {
             vo.setStatusName("已结束");
         }
-//
-//        // 设置优惠券名称与优惠券类型(判空处理)
-//        if (activity.getCouponId() != null) {
-//            LifeDiscountCoupon coupon = lifeDiscountCouponMapper.selectById(activity.getCouponId());
-//            if (coupon != null) {
-//                vo.setCouponName(coupon.getName());
-//                vo.setCouponType(coupon.getType());
-//            }
-//        }
+
+        // 设置优惠券名称(判空处理)
+        if (activity.getCouponId() != null) {
+            LifeDiscountCoupon coupon = lifeDiscountCouponMapper.selectById(activity.getCouponId());
+            if (coupon != null) {
+                vo.setCouponName(coupon.getName());
+            }
+        }
+
+        // 设置代金券名称(判空处理)
+        if (activity.getVoucherId() != null) {
+            LifeCoupon voucher = lifeCouponMapper.selectById(String.valueOf(activity.getVoucherId()));
+            if (voucher != null) {
+                vo.setVoucherName(voucher.getName());
+            }
+        }
 
         StoreImg activityTitleImg = imgMapper.selectOne(new LambdaQueryWrapper<StoreImg>()
                 .eq(StoreImg::getStoreId, vo.getStoreId())
@@ -564,6 +578,34 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
                 }
             }
 
+            // 设置代金券名称(判空处理)
+            if (activity.getVoucherId() != null) {
+                LifeCoupon voucher = lifeCouponMapper.selectById(String.valueOf(activity.getVoucherId()));
+                if (voucher != null) {
+                    vo.setVoucherName(voucher.getName());
+                }
+            }
+
+            // 查询活动标题图片
+            StoreImg activityTitleImg = imgMapper.selectOne(new LambdaQueryWrapper<StoreImg>()
+                    .eq(StoreImg::getStoreId, vo.getStoreId())
+                    .eq(StoreImg::getImgType, 26)
+                    .eq(StoreImg::getDeleteFlag, 0)
+                    .eq(StoreImg::getBusinessId, activity.getId()));
+            if (activityTitleImg != null) {
+                vo.setActivityTitleImgUrl(activityTitleImg.getImgUrl());
+            }
+
+            // 查询活动详情图片
+            StoreImg activityDetailImg = imgMapper.selectOne(new LambdaQueryWrapper<StoreImg>()
+                    .eq(StoreImg::getStoreId, vo.getStoreId())
+                    .eq(StoreImg::getImgType, 27)
+                    .eq(StoreImg::getDeleteFlag, 0)
+                    .eq(StoreImg::getBusinessId, activity.getId()));
+            if (activityDetailImg != null) {
+                vo.setActivityDetailImgUrl(activityDetailImg.getImgUrl());
+            }
+
             voRecords.add(vo);
         }
 

+ 1 - 1
alien-store/src/main/java/shop/alien/store/controller/OperationalActivityController.java

@@ -26,7 +26,7 @@ public class OperationalActivityController {
 
     private final OperationalActivityService activityService;
 
-    @ApiOperation("根据活动ID获取详情")
+    @ApiOperation(value = "根据活动ID获取详情", notes = "返回活动详细信息,包括优惠券和代金券的名称、ID、数量等信息")
     @ApiOperationSupport(order = 4)
     @ApiImplicitParam(name = "id", value = "活动ID", dataTypeClass = Integer.class, paramType = "path", required = true)
     @GetMapping("/detail/{id}")

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

@@ -33,7 +33,7 @@ public class StoreOperationalActivityController {
     private final StoreOperationalActivityService operationalActivityService;
     private final StoreOperationalActivityAchievementService achievementService;
 
-    @ApiOperation("查询活动详情")
+    @ApiOperation(value = "查询活动详情", notes = "返回活动详细信息,包括优惠券和代金券的名称、ID、数量等信息")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", value = "活动ID", dataTypeClass = Integer.class, paramType = "query", required = true),
@@ -59,7 +59,7 @@ public class StoreOperationalActivityController {
         }
     }
 
-    @ApiOperation("服务中台-查询活动详情")
+    @ApiOperation(value = "服务中台-查询活动详情", notes = "返回活动详细信息,包括优惠券和代金券的名称、ID、数量等信息")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", value = "活动ID", dataTypeClass = Integer.class, paramType = "query", required = true),

+ 22 - 0
alien-store/src/main/java/shop/alien/store/service/impl/OperationalActivityServiceImpl.java

@@ -9,6 +9,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.LifeDiscountCoupon;
 import shop.alien.entity.store.LifeNotice;
 import shop.alien.entity.store.StoreImg;
@@ -17,6 +18,7 @@ import shop.alien.entity.store.StoreUser;
 import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.entity.storePlatform.StoreOperationalActivity;
 import shop.alien.entity.storePlatform.vo.StoreOperationalActivityVO;
+import shop.alien.mapper.LifeCouponMapper;
 import shop.alien.mapper.LifeDiscountCouponMapper;
 import shop.alien.mapper.LifeNoticeMapper;
 import shop.alien.mapper.StoreImgMapper;
@@ -52,6 +54,8 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
 
     private final LifeDiscountCouponMapper lifeDiscountCouponMapper;
 
+    private final LifeCouponMapper lifeCouponMapper;
+
     private final StoreInfoMapper storeInfoMapper;
 
     private final LifeNoticeMapper lifeNoticeMapper;
@@ -168,6 +172,7 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
             vo.setStatusName(resolveStatusName(activity.getStatus()));
             vo.setActivityTypeName(resolveActivityTypeName(activity.getActivityType()));
 
+            // 设置优惠券名称(判空处理)
             if (activity.getCouponId() != null) {
                 LifeDiscountCoupon coupon = lifeDiscountCouponMapper.selectById(activity.getCouponId());
                 if (coupon != null) {
@@ -175,6 +180,14 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
                 }
             }
 
+            // 设置代金券名称(判空处理)
+            if (activity.getVoucherId() != null) {
+                LifeCoupon voucher = lifeCouponMapper.selectById(String.valueOf(activity.getVoucherId()));
+                if (voucher != null) {
+                    vo.setVoucherName(voucher.getName());
+                }
+            }
+
             attachStoreInfo(vo, storeCache);
             fillActivityImages(vo);
             voRecords.add(vo);
@@ -203,6 +216,7 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
         vo.setStatusName(resolveStatusName(activity.getStatus()));
         vo.setActivityTypeName(resolveActivityTypeName(activity.getActivityType()));
 
+        // 设置优惠券名称(判空处理)
         if (activity.getCouponId() != null) {
             LifeDiscountCoupon coupon = lifeDiscountCouponMapper.selectById(activity.getCouponId());
             if (coupon != null) {
@@ -210,6 +224,14 @@ public class OperationalActivityServiceImpl implements OperationalActivityServic
             }
         }
 
+        // 设置代金券名称(判空处理)
+        if (activity.getVoucherId() != null) {
+            LifeCoupon voucher = lifeCouponMapper.selectById(String.valueOf(activity.getVoucherId()));
+            if (voucher != null) {
+                vo.setVoucherName(voucher.getName());
+            }
+        }
+
         attachStoreInfo(vo, new LinkedHashMap<>());
         fillActivityImages(vo);
         return vo;

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

@@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.LifeDiscountCoupon;
 import shop.alien.entity.store.LifeNotice;
 import shop.alien.entity.store.StoreImg;
@@ -18,6 +19,7 @@ import shop.alien.entity.storePlatform.StoreOperationalActivitySignup;
 import shop.alien.entity.storePlatform.vo.StoreOperationalActivityDetailVo;
 import shop.alien.entity.storePlatform.vo.StoreOperationalActivityMySignupVo;
 import shop.alien.entity.storePlatform.vo.StoreOperationalActivitySignupCheckVo;
+import shop.alien.mapper.LifeCouponMapper;
 import shop.alien.mapper.LifeDiscountCouponMapper;
 import shop.alien.mapper.LifeNoticeMapper;
 import shop.alien.mapper.StoreImgMapper;
@@ -54,6 +56,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
     private final StoreOperationalActivityAchievementMapper achievementMapper;
     private final StoreImgMapper imgMapper;
     private final LifeDiscountCouponMapper lifeDiscountCouponMapper;
+    private final LifeCouponMapper lifeCouponMapper;
     private final StoreInfoMapper storeInfoMapper;
     private final StoreOperationalActivitySignupMapper signupMapper;
     private final BaseRedisService baseRedisService;
@@ -89,6 +92,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
         // 详情按钮状态计算
         vo.setDetailStatus(resolveDetailStatus(activity, signupStatus));
 
+        // 设置优惠券名称(判空处理)
         if (activity.getCouponId() != null) {
             LifeDiscountCoupon coupon = lifeDiscountCouponMapper.selectById(activity.getCouponId());
             if (coupon != null) {
@@ -96,6 +100,14 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
             }
         }
 
+        // 设置代金券名称(判空处理)
+        if (activity.getVoucherId() != null) {
+            LifeCoupon voucher = lifeCouponMapper.selectById(String.valueOf(activity.getVoucherId()));
+            if (voucher != null) {
+                vo.setVoucherName(voucher.getName());
+            }
+        }
+
         // 店铺信息与活动图片
         attachStoreInfo(vo);
         fillActivityImages(vo);
@@ -130,6 +142,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
         // 详情按钮状态计算
         vo.setDetailStatus(resolveDetailStatus(activity, signupStatus));
 
+        // 设置优惠券名称(判空处理)
         if (activity.getCouponId() != null) {
             LifeDiscountCoupon coupon = lifeDiscountCouponMapper.selectById(activity.getCouponId());
             if (coupon != null) {
@@ -137,6 +150,14 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
             }
         }
 
+        // 设置代金券名称(判空处理)
+        if (activity.getVoucherId() != null) {
+            LifeCoupon voucher = lifeCouponMapper.selectById(String.valueOf(activity.getVoucherId()));
+            if (voucher != null) {
+                vo.setVoucherName(voucher.getName());
+            }
+        }
+
         // 店铺信息与活动图片
         attachStoreInfo(vo);
         fillActivityImages(vo);