Procházet zdrojové kódy

Merge remote-tracking branch 'origin/sit' into uat-20260202

dujian před 2 měsíci
rodič
revize
cd3f823c8a
21 změnil soubory, kde provedl 401 přidání a 140 odebrání
  1. 1 1
      alien-entity/src/main/java/shop/alien/entity/store/dto/CuisineTypeResponseDto.java
  2. 4 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/StoreRenovationRequirementDto.java
  3. 10 6
      alien-entity/src/main/java/shop/alien/entity/storePlatform/StoreOperationalActivity.java
  4. 7 2
      alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityDTO.java
  5. 10 2
      alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityDetailVo.java
  6. 7 1
      alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityVO.java
  7. 15 2
      alien-entity/src/main/resources/mapper/storePlatform/StoreOperationalActivityMapper.xml
  8. 45 3
      alien-store-platform/doc/OPERATIONAL_ACTIVITY_README.md
  9. 4 6
      alien-store-platform/src/main/java/shop/alien/storeplatform/controller/OperationalActivityController.java
  10. 53 11
      alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/OperationalActivityServiceImpl.java
  11. 1 1
      alien-store/src/main/java/shop/alien/store/controller/OperationalActivityController.java
  12. 31 0
      alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java
  13. 2 2
      alien-store/src/main/java/shop/alien/store/controller/StoreOperationalActivityController.java
  14. 4 0
      alien-store/src/main/java/shop/alien/store/controller/StorePriceController.java
  15. 1 1
      alien-store/src/main/java/shop/alien/store/service/LifeDiscountCouponStoreFriendService.java
  16. 3 3
      alien-store/src/main/java/shop/alien/store/service/impl/CommonRatingServiceImpl.java
  17. 131 98
      alien-store/src/main/java/shop/alien/store/service/impl/LifeDiscountCouponStoreFriendServiceImpl.java
  18. 28 0
      alien-store/src/main/java/shop/alien/store/service/impl/LifeUserViolationServiceImpl.java
  19. 22 0
      alien-store/src/main/java/shop/alien/store/service/impl/OperationalActivityServiceImpl.java
  20. 1 1
      alien-store/src/main/java/shop/alien/store/service/impl/StoreCuisineServiceImpl.java
  21. 21 0
      alien-store/src/main/java/shop/alien/store/service/impl/StoreOperationalActivityServiceImpl.java

+ 1 - 1
alien-entity/src/main/java/shop/alien/entity/store/dto/CuisineTypeResponseDto.java

@@ -96,7 +96,7 @@ public class CuisineTypeResponseDto {
 
         @ApiModelProperty("提交时间")
         @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-        private Date createTime;
+        private Date createdTime;
 
         @ApiModelProperty("审核时间")
         @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/StoreRenovationRequirementDto.java

@@ -1,5 +1,6 @@
 package shop.alien.entity.store.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@@ -112,5 +113,8 @@ public class StoreRenovationRequirementDto {
 
     @ApiModelProperty(value = "是否已与发布商铺发生沟通(true:已沟通, false:未沟通)")
     private Boolean hasCommunicated;
+
+    @ApiModelProperty(value = "审核失败原因")
+    private String auditReason;
 }
 

+ 10 - 6
alien-entity/src/main/java/shop/alien/entity/storePlatform/StoreOperationalActivity.java

@@ -55,7 +55,7 @@ public class StoreOperationalActivity {
     @TableField("activity_rule")
     private String activityRule;
 
-    @ApiModelProperty(value = "奖励类型:COUPON-优惠券, RED_PACKET-红包")
+    @ApiModelProperty(value = "奖励类型:COUPON-优惠券, RED_PACKET-红包, VOUCHER-代金券")
     @TableField("reward_type")
     private String rewardType;
 
@@ -63,15 +63,19 @@ public class StoreOperationalActivity {
     @TableField("coupon_id")
     private Integer couponId;
 
-//    @ApiModelProperty(value = "代金券ID,关联代金券表 life_coupon(评论有礼时可二选一或同时配置)")
-//    @TableField("voucher_id")
-//    private Integer voucherId;
+    @ApiModelProperty(value = "代金券ID,关联代金券表 life_coupon(评论有礼时可二选一或同时配置)")
+    @TableField("voucher_id")
+    private Integer voucherId;
 
     @ApiModelProperty(value = "优惠券发放数量")
     @TableField("coupon_quantity")
     private Integer couponQuantity;
 
-    @ApiModelProperty(value = "状态:1-待审核, 2-未开始, 3-审核拒绝, 4-已售罄, 5-进行中, 6-已下架, 7-已结束, 8-审核成功")
+    @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;
 
@@ -82,7 +86,7 @@ public class StoreOperationalActivity {
 
     @ApiModelProperty(value = "创建时间")
     @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.S", timezone = "GMT+8")
     private Date createdTime;
 
     @ApiModelProperty(value = "创建人ID")

+ 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;
 

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

@@ -14,19 +14,32 @@
         <result column="activity_rule" property="activityRule" />
         <result column="reward_type" property="rewardType" />
         <result column="coupon_id" property="couponId" />
-<!--        <result column="voucher_id" property="voucherId" />-->
+        <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" />
         <result column="created_user_id" property="createdUserId" />
         <result column="updated_time" property="updatedTime" />
         <result column="updated_user_id" property="updatedUserId" />
+        <result column="approval_comments" property="approvalComments" />
+        <result column="activity_type" property="activityType" />
+        <result column="signup_start_time" property="signupStartTime" />
+        <result column="signup_end_time" property="signupEndTime" />
+        <result column="activity_limit_people" property="activityLimitPeople" />
+        <result column="activity_details" property="activityDetails" />
+        <result column="result_type" property="resultType" />
+        <result column="result_text" property="resultText" />
+        <result column="result_media_url" property="resultMediaUrl" />
+        <result column="audit_time" property="auditTime" />
+        <result column="upload_img_type" property="uploadImgType" />
+        <result column="audit_status" property="auditStatus" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, store_id, activity_name, promotional_image, start_time, end_time, participation_limit, activity_rule, reward_type, coupon_id, coupon_quantity, status, delete_flag, created_time, created_user_id, updated_time, updated_user_id
+        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}")

+ 31 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java

@@ -1653,10 +1653,41 @@ public class StoreInfoController {
             Set<Integer> excludedStoreIds = new HashSet<>(blacklistedStoreIds);
             excludedStoreIds.addAll(followedStoreIds);
             
+            // 查询所有有头图的店铺ID(img_type 为 20 或 21)
+            Set<Integer> storesWithHeadImg = new HashSet<>();
+            try {
+                LambdaQueryWrapper<StoreImg> headImgWrapper = new LambdaQueryWrapper<>();
+                headImgWrapper.in(StoreImg::getImgType, Arrays.asList(20, 21)) // 20:头图单图模式, 21:头图多图模式
+                             .eq(StoreImg::getDeleteFlag, 0);
+                List<StoreImg> headImgList = storeImgMapper.selectList(headImgWrapper);
+                
+                if (!CollectionUtils.isEmpty(headImgList)) {
+                    for (StoreImg storeImg : headImgList) {
+                        if (storeImg.getStoreId() != null) {
+                            storesWithHeadImg.add(storeImg.getStoreId());
+                        }
+                    }
+                }
+                log.info("查询到有头图的店铺数量: {}", storesWithHeadImg.size());
+            } catch (Exception e) {
+                log.error("查询有头图的店铺失败 - error: {}", e.getMessage(), e);
+                // 如果查询失败,返回空结果
+                return R.data(new Page<>(pageNum, pageSize, 0));
+            }
+            
+            // 如果没有有头图的店铺,直接返回空结果
+            if (storesWithHeadImg.isEmpty()) {
+                log.info("没有找到有头图的店铺");
+                return R.data(new Page<>(pageNum, pageSize, 0));
+            }
+            
             // 构建查询条件
             LambdaQueryWrapper<StoreInfo> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(StoreInfo::getDeleteFlag, 0); // 未删除
             
+            // 只查询有头图的店铺
+            queryWrapper.in(StoreInfo::getId, storesWithHeadImg);
+            
             // 排除被拉黑和已关注的店铺
             if (!excludedStoreIds.isEmpty()) {
                 queryWrapper.notIn(StoreInfo::getId, excludedStoreIds);

+ 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),

+ 4 - 0
alien-store/src/main/java/shop/alien/store/controller/StorePriceController.java

@@ -360,6 +360,10 @@ public class StorePriceController {
         LambdaQueryWrapper<StorePrice> queryWrapper = new LambdaQueryWrapper<>();
         if(null==origin){
             queryWrapper.eq(StorePrice::getShelfStatus, 1);
+        }else if(origin==0){
+            queryWrapper.in(StorePrice::getShelfStatus, 1,2);
+        }else{
+            queryWrapper.eq(StorePrice::getShelfStatus, origin);
         }
         if (storeId != null) {
             queryWrapper.eq(StorePrice::getStoreId, storeId);

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/LifeDiscountCouponStoreFriendService.java

@@ -74,5 +74,5 @@ public interface LifeDiscountCouponStoreFriendService extends IService<LifeDisco
      * @param voucherId 代金券ID(life_coupon),为null则不发代金券
      * @return 发放数量(优惠券+代金券),0表示未发放
      */
-//    int issueCouponForGoodRating(Integer userId, Integer storeId);
+    int issueCouponForGoodRating(Integer userId, Integer storeId);
 }

+ 3 - 3
alien-store/src/main/java/shop/alien/store/service/impl/CommonRatingServiceImpl.java

@@ -237,9 +237,9 @@ public class CommonRatingServiceImpl extends ServiceImpl<CommonRatingMapper, Com
                             .orderByDesc(StoreOperationalActivity::getId)
                             .last("LIMIT 1");
                     StoreOperationalActivity activity = storeOperationalActivityMapper.selectOne(activityWrapper);
-//                    if (activity == null || (activity.getCouponId() == null && activity.getVoucherId() == null)) {
-//                        return;
-//                    }
+                    if (activity == null || (activity.getCouponId() == null && activity.getVoucherId() == null)) {
+                        return;
+                    }
                     Integer limit = activity.getParticipationLimit();
                     if (limit != null && limit > 0) {
                         int passedCount = commonRatingMapper.countPassedGoodRatingsByUserAndStore(commonRating.getUserId(), businessId);

+ 131 - 98
alien-store/src/main/java/shop/alien/store/service/impl/LifeDiscountCouponStoreFriendServiceImpl.java

@@ -15,7 +15,9 @@ import org.springframework.stereotype.Service;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.dto.LifeDiscountCouponStoreFriendDto;
 import shop.alien.entity.store.vo.*;
+import shop.alien.entity.storePlatform.StoreOperationalActivity;
 import shop.alien.mapper.*;
+import shop.alien.mapper.storePlantform.StoreOperationalActivityMapper;
 import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.LifeDiscountCouponStoreFriendService;
 import shop.alien.util.common.constant.DiscountCouponEnum;
@@ -71,6 +73,8 @@ public class LifeDiscountCouponStoreFriendServiceImpl extends ServiceImpl<LifeDi
 
     private final WebSocketProcess webSocketProcess;
 
+    private final StoreOperationalActivityMapper storeOperationalActivityMapper;
+
     @Override
     public List<LifeDiscountCouponStoreFriendVo> getFriendCouponList(UserLoginInfo userLoginInfo, String friendUserId) {
         List<LifeDiscountCouponStoreFriendVo> result = new ArrayList<>();
@@ -145,7 +149,7 @@ public class LifeDiscountCouponStoreFriendServiceImpl extends ServiceImpl<LifeDi
                 return true;
             }
             for (LifeDiscountCouponStoreFriendDto couponDto : coupons) {
-                if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(couponDto.getVoucherId())) {
+                if (StringUtils.isNotEmpty(couponDto.getVoucherId())) {
                     // 代金券:入参为 voucherId,对应 life_coupon 表
                     if (!handleVoucherFriendCoupon(userLoginInfo, lifeDiscountCouponStoreFriendDto, couponDto)) {
                         return false;
@@ -425,7 +429,7 @@ public class LifeDiscountCouponStoreFriendServiceImpl extends ServiceImpl<LifeDi
                 lifeNotice.setReceiverId("user_" + lifeUser.getUserPhone());
                 //存入信息
                 String text = storeInfo.getStoreName() + "赠送了您他的好友店铺优惠券,快去我的券包查看吧~";
-                com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
+                JSONObject jsonObject = new JSONObject();
                 jsonObject.put("message", text);
                 lifeNotice.setContext(jsonObject.toJSONString());
                 //存入类型
@@ -649,102 +653,131 @@ public class LifeDiscountCouponStoreFriendServiceImpl extends ServiceImpl<LifeDi
     }
 
     /**
+     * 好评送券:用户好评且AI审核通过后,按运营活动配置的优惠券/代金券ID发放到用户券包,发放成功后扣减库存;按券类型发送对应通知。
+     *
+     * @param userId  评价用户ID(life用户)
+     * @param storeId 店铺ID(businessId)
+     * @return 发放数量(优惠券+代金券),0表示未发放
+     */
+    @Override
+    public int issueCouponForGoodRating(Integer userId, Integer storeId) {
+        if (userId == null || storeId == null) {
+            return 0;
+        }
+        // 查询运营活动配置(评论有礼)
+        Date now = new Date();
+        LambdaQueryWrapper<StoreOperationalActivity> activityWrapper = new LambdaQueryWrapper<>();
+        activityWrapper.eq(StoreOperationalActivity::getStoreId, storeId)
+                .eq(StoreOperationalActivity::getActivityType, "COMMENT")
+                .in(StoreOperationalActivity::getStatus, 5, 8)
+                .le(StoreOperationalActivity::getStartTime, now)
+                .ge(StoreOperationalActivity::getEndTime, now)
+                .orderByDesc(StoreOperationalActivity::getId)
+                .last("LIMIT 1");
+        StoreOperationalActivity activity = storeOperationalActivityMapper.selectOne(activityWrapper);
+        if (activity == null || (activity.getCouponId() == null && activity.getVoucherId() == null)) {
+            return 0;
+        }
+        // 调用4参数方法进行发放
+        return issueCouponForGoodRating(userId, storeId, activity.getCouponId(), activity.getVoucherId());
+    }
+
+    /**
      * 好评送券:按优惠券/代金券ID发放到用户券包,发放成功后扣减库存;根据是优惠券还是代金券发送对应通知。
      */
-//    @Override
-//    public int issueCouponForGoodRating(Integer userId, Integer storeId, Integer couponId, Integer voucherId) {
-//        if (userId == null || storeId == null) {
-//            return 0;
-//        }
-//        if ((couponId == null || couponId <= 0) && (voucherId == null || voucherId <= 0)) {
-//            return 0;
-//        }
-//        int commenterUserId = userId.intValue();
-//        StoreInfo storeInfo = storeInfoMapper.selectById(storeId);
-//        LifeUser lifeUser = lifeUserMapper.selectById(commenterUserId);
-//        int grantedCoupon = 0;
-//        int grantedVoucher = 0;
-//
-//        // 按优惠券ID发放:发放1张,扣减库存,发优惠券通知
-//        if (couponId != null && couponId > 0) {
-//            LifeDiscountCoupon coupon = lifeDiscountCouponMapper.selectById(couponId);
-//            if (coupon != null && String.valueOf(storeId).equals(coupon.getStoreId())
-//                    && coupon.getSingleQty() != null && coupon.getSingleQty() > 0) {
-//                try {
-//                    LifeDiscountCouponUser lifeDiscountCouponUser = new LifeDiscountCouponUser();
-//                    lifeDiscountCouponUser.setCouponId(coupon.getId());
-//                    lifeDiscountCouponUser.setUserId(commenterUserId);
-//                    lifeDiscountCouponUser.setReceiveTime(new Date());
-//                    lifeDiscountCouponUser.setExpirationTime(coupon.getValidDate());
-//                    lifeDiscountCouponUser.setStatus(Integer.parseInt(DiscountCouponEnum.WAITING_USED.getValue()));
-//                    lifeDiscountCouponUser.setDeleteFlag(0);
-//                    lifeDiscountCouponUserMapper.insert(lifeDiscountCouponUser);
-//                    coupon.setSingleQty(coupon.getSingleQty() - 1);
-//                    lifeDiscountCouponMapper.updateById(coupon);
-//                    grantedCoupon = 1;
-//                } catch (Exception e) {
-//
-//                }
-//            }
-//        }
-//
-//        // 按代金券ID发放:发放1张,扣减库存,发代金券通知
-//        if (voucherId != null && voucherId > 0) {
-//            LifeCoupon lifeCoupon = lifeCouponMapper.selectById(voucherId);
-//            if (lifeCoupon != null && String.valueOf(storeId).equals(lifeCoupon.getStoreId())
-//                    && lifeCoupon.getSingleQty() != null && lifeCoupon.getSingleQty() > 0) {
-//                try {
-//                    LifeDiscountCouponUser lifeDiscountCouponUser = new LifeDiscountCouponUser();
-//                    lifeDiscountCouponUser.setVoucherId(lifeCoupon.getId());
-//                    lifeDiscountCouponUser.setUserId(commenterUserId);
-//                    lifeDiscountCouponUser.setReceiveTime(new Date());
-//                    if (lifeCoupon.getEndDate() != null) {
-//                        lifeDiscountCouponUser.setExpirationTime(lifeCoupon.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
-//                    }
-//                    lifeDiscountCouponUser.setStatus(Integer.parseInt(DiscountCouponEnum.WAITING_USED.getValue()));
-//                    lifeDiscountCouponUser.setDeleteFlag(0);
-//                    lifeDiscountCouponUserMapper.insert(lifeDiscountCouponUser);
-//                    lifeCoupon.setSingleQty(lifeCoupon.getSingleQty() - 1);
-//                    lifeCouponMapper.updateById(lifeCoupon);
-//                    grantedVoucher = 1;
-//                } catch (Exception e) {
-//
-//                }
-//            }
-//        }
-//
-//        // 根据发放的是优惠券还是代金券发送对应通知
-//        if (lifeUser != null && storeInfo != null) {
-//            if (grantedCoupon > 0) {
-//                LifeNotice couponNotice = new LifeNotice();
-//                couponNotice.setSenderId("system");
-//                couponNotice.setReceiverId("user_" + lifeUser.getUserPhone());
-//                String couponText = "您对店铺「" + storeInfo.getStoreName() + "」的好评已通过审核,已为您发放优惠券,快去我的券包查看吧~";
-//                JSONObject couponJson = new JSONObject();
-//                couponJson.put("message", couponText);
-//                couponNotice.setContext(couponJson.toJSONString());
-//                couponNotice.setNoticeType(1);
-//                couponNotice.setTitle("好评送券");
-//                couponNotice.setIsRead(0);
-//                couponNotice.setDeleteFlag(0);
-//                lifeNoticeMapper.insert(couponNotice);
-//            }
-//            if (grantedVoucher > 0) {
-//                LifeNotice voucherNotice = new LifeNotice();
-//                voucherNotice.setSenderId("system");
-//                voucherNotice.setReceiverId("user_" + lifeUser.getUserPhone());
-//                String voucherText = "您对店铺「" + storeInfo.getStoreName() + "」的好评已通过审核,已为您发放代金券,快去我的券包查看吧~";
-//                JSONObject voucherJson = new JSONObject();
-//                voucherJson.put("message", voucherText);
-//                voucherNotice.setContext(voucherJson.toJSONString());
-//                voucherNotice.setNoticeType(1);
-//                voucherNotice.setTitle("好评送代金券");
-//                voucherNotice.setIsRead(0);
-//                voucherNotice.setDeleteFlag(0);
-//                lifeNoticeMapper.insert(voucherNotice);
-//            }
-//        }
-//
-//        return grantedCoupon + grantedVoucher;
-//    }
+    public int issueCouponForGoodRating(Integer userId, Integer storeId, Integer couponId, Integer voucherId) {
+        if (userId == null || storeId == null) {
+            return 0;
+        }
+        if ((couponId == null || couponId <= 0) && (voucherId == null || voucherId <= 0)) {
+            return 0;
+        }
+        int commenterUserId = userId.intValue();
+        StoreInfo storeInfo = storeInfoMapper.selectById(storeId);
+        LifeUser lifeUser = lifeUserMapper.selectById(commenterUserId);
+        int grantedCoupon = 0;
+        int grantedVoucher = 0;
+
+        // 按优惠券ID发放:发放1张,扣减库存,发优惠券通知
+        if (couponId != null && couponId > 0) {
+            LifeDiscountCoupon coupon = lifeDiscountCouponMapper.selectById(couponId);
+            if (coupon != null && String.valueOf(storeId).equals(coupon.getStoreId())
+                    && coupon.getSingleQty() != null && coupon.getSingleQty() > 0) {
+                try {
+                    LifeDiscountCouponUser lifeDiscountCouponUser = new LifeDiscountCouponUser();
+                    lifeDiscountCouponUser.setCouponId(coupon.getId());
+                    lifeDiscountCouponUser.setUserId(commenterUserId);
+                    lifeDiscountCouponUser.setReceiveTime(new Date());
+                    lifeDiscountCouponUser.setExpirationTime(coupon.getValidDate());
+                    lifeDiscountCouponUser.setStatus(Integer.parseInt(DiscountCouponEnum.WAITING_USED.getValue()));
+                    lifeDiscountCouponUser.setDeleteFlag(0);
+                    lifeDiscountCouponUserMapper.insert(lifeDiscountCouponUser);
+                    coupon.setSingleQty(coupon.getSingleQty() - 1);
+                    lifeDiscountCouponMapper.updateById(coupon);
+                    grantedCoupon = 1;
+                } catch (Exception e) {
+
+                }
+            }
+        }
+
+        // 按代金券ID发放:发放1张,扣减库存,发代金券通知
+        if (voucherId != null && voucherId > 0) {
+            LifeCoupon lifeCoupon = lifeCouponMapper.selectById(voucherId);
+            if (lifeCoupon != null && String.valueOf(storeId).equals(lifeCoupon.getStoreId())
+                    && lifeCoupon.getSingleQty() != null && lifeCoupon.getSingleQty() > 0) {
+                try {
+                    LifeDiscountCouponUser lifeDiscountCouponUser = new LifeDiscountCouponUser();
+                    lifeDiscountCouponUser.setVoucherId(lifeCoupon.getId());
+                    lifeDiscountCouponUser.setUserId(commenterUserId);
+                    lifeDiscountCouponUser.setReceiveTime(new Date());
+                    if (lifeCoupon.getEndDate() != null) {
+                        lifeDiscountCouponUser.setExpirationTime(lifeCoupon.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
+                    }
+                    lifeDiscountCouponUser.setStatus(Integer.parseInt(DiscountCouponEnum.WAITING_USED.getValue()));
+                    lifeDiscountCouponUser.setDeleteFlag(0);
+                    lifeDiscountCouponUserMapper.insert(lifeDiscountCouponUser);
+                    lifeCoupon.setSingleQty(lifeCoupon.getSingleQty() - 1);
+                    lifeCouponMapper.updateById(lifeCoupon);
+                    grantedVoucher = 1;
+                } catch (Exception e) {
+
+                }
+            }
+        }
+
+        // 根据发放的是优惠券还是代金券发送对应通知
+        if (lifeUser != null && storeInfo != null) {
+            if (grantedCoupon > 0) {
+                LifeNotice couponNotice = new LifeNotice();
+                couponNotice.setSenderId("system");
+                couponNotice.setReceiverId("user_" + lifeUser.getUserPhone());
+                String couponText = "您对店铺「" + storeInfo.getStoreName() + "」的好评已通过审核,已为您发放优惠券,快去我的券包查看吧~";
+                JSONObject couponJson = new JSONObject();
+                couponJson.put("message", couponText);
+                couponNotice.setContext(couponJson.toJSONString());
+                couponNotice.setNoticeType(1);
+                couponNotice.setTitle("好评送券");
+                couponNotice.setIsRead(0);
+                couponNotice.setDeleteFlag(0);
+                lifeNoticeMapper.insert(couponNotice);
+            }
+            if (grantedVoucher > 0) {
+                LifeNotice voucherNotice = new LifeNotice();
+                voucherNotice.setSenderId("system");
+                voucherNotice.setReceiverId("user_" + lifeUser.getUserPhone());
+                String voucherText = "您对店铺「" + storeInfo.getStoreName() + "」的好评已通过审核,已为您发放代金券,快去我的券包查看吧~";
+                JSONObject voucherJson = new JSONObject();
+                voucherJson.put("message", voucherText);
+                voucherNotice.setContext(voucherJson.toJSONString());
+                voucherNotice.setNoticeType(1);
+                voucherNotice.setTitle("好评送代金券");
+                voucherNotice.setIsRead(0);
+                voucherNotice.setDeleteFlag(0);
+                lifeNoticeMapper.insert(voucherNotice);
+            }
+        }
+
+        return grantedCoupon + grantedVoucher;
+    }
 }

+ 28 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeUserViolationServiceImpl.java

@@ -786,6 +786,17 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
                         .map(String::trim)
                         .filter(StringUtils::isNotEmpty)
                         .collect(Collectors.toList());
+                // 如果包含视频,则过滤掉图片(视频封面/第一帧),只保留用户实际上传的视频
+                boolean hasVideo = imagePathList.stream().anyMatch(url -> {
+                    String ext = url.substring(url.lastIndexOf(".") + 1).toLowerCase();
+                    return videoFileType.contains(ext);
+                });
+                if (hasVideo) {
+                    imagePathList = imagePathList.stream().filter(url -> {
+                        String ext = url.substring(url.lastIndexOf(".") + 1).toLowerCase();
+                        return videoFileType.contains(ext);
+                    }).collect(Collectors.toList());
+                }
                 item.setDynamicsImg(imagePathList);
             }
         }
@@ -811,6 +822,17 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
                         .map(String::trim)
                         .filter(StringUtils::isNotEmpty)
                         .collect(Collectors.toList());
+                // 如果包含视频,则过滤掉图片(视频封面/第一帧),只保留用户实际上传的视频
+                boolean hasVideo = imagePathList.stream().anyMatch(url -> {
+                    String ext = url.substring(url.lastIndexOf(".") + 1).toLowerCase();
+                    return videoFileType.contains(ext);
+                });
+                if (hasVideo) {
+                    imagePathList = imagePathList.stream().filter(url -> {
+                        String ext = url.substring(url.lastIndexOf(".") + 1).toLowerCase();
+                        return videoFileType.contains(ext);
+                    }).collect(Collectors.toList());
+                }
                 item.setDynamicsImg(imagePathList);
             }
         }
@@ -835,6 +857,12 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
                 list.add(map);
             }
 
+            // 如果包含视频,则过滤掉图片(视频封面),只保留用户实际上传的视频
+            boolean hasVideo = list.stream().anyMatch(map -> "video".equals(map.get("type")));
+            if (hasVideo) {
+                list = list.stream().filter(map -> "video".equals(map.get("type"))).collect(Collectors.toList());
+            }
+
             item.setImgList(list);
         }
 

+ 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;

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/impl/StoreCuisineServiceImpl.java

@@ -176,7 +176,7 @@ public class StoreCuisineServiceImpl extends ServiceImpl<StoreCuisineMapper, Sto
         data.setPeopleLimit(base.getPeopleLimit());
         data.setUsageRule(base.getUsageRule());
         data.setRawJson(base.getRawJson());
-        data.setCreateTime(base.getCreatedTime());
+        data.setCreatedTime(base.getCreatedTime());
         data.setAuditTime(base.getAuditTime());
         data.setAuditStatus(base.getStatus());
         data.setShelfStatus(base.getShelfStatus());

+ 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);