浏览代码

feat(store): 添加报名人信息并优化活动查询功能

- 在 StoreOperationalActivityAchievementCaseDetailVo 和 StoreOperationalActivityAchievementCaseVo 中添加报名人姓名和手机号字段
- 将查询参数从 hasResult(上传情况)改为 activityStatus(活动状态)
- 更新数据库查询映射文件,添加报名人信息查询
- 修改服务层方法签名以支持活动状态查询
- 新增定时任务处理报名时间已过的待审核记录
- 完善活动状态筛选逻辑,支持多种状态组合查询
fcw 2 月之前
父节点
当前提交
468fb9b686

+ 6 - 0
alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityAchievementCaseDetailVo.java

@@ -59,6 +59,12 @@ public class StoreOperationalActivityAchievementCaseDetailVo {
     @ApiModelProperty(value = "上传情况:0-未上传, 1-已上传")
     private Integer hasResult;
 
+    @ApiModelProperty(value = "报名人姓名(signupName)")
+    private String signupName;
+
+    @ApiModelProperty(value = "报名人手机号(signupPhone)")
+    private String signupPhone;
+
     @ApiModelProperty(value = "成果列表")
     private List<StoreOperationalActivityAchievementCaseItemVo> achievementList;
 }

+ 6 - 0
alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityAchievementCaseVo.java

@@ -72,4 +72,10 @@ public class StoreOperationalActivityAchievementCaseVo {
 
     @ApiModelProperty(value = "用户头像")
     private String userImage;
+
+    @ApiModelProperty(value = "报名人姓名(signupName)")
+    private String signupName;
+
+    @ApiModelProperty(value = "报名人手机号(signupPhone)")
+    private String signupPhone;
 }

+ 3 - 3
alien-entity/src/main/java/shop/alien/mapper/storePlantform/StoreOperationalActivityAchievementMapper.java

@@ -54,17 +54,17 @@ public interface StoreOperationalActivityAchievementMapper extends BaseMapper<St
                                                                         @Param("userId") Integer userId);
 
     /**
-     * 商家端分页查询案例列表(按商户ID、上传情况、活动名称筛选)
+     * 商家端分页查询案例列表(按商户ID、活动状态、活动名称筛选)
      *
      * @param page 分页
      * @param storeId 商户ID
-     * @param hasResult 上传情况:0-未上传, 1-已上传
+     * @param activityStatus 活动状态
      * @param activityName 活动名称(模糊查询)
      * @return 分页列表
      */
     IPage<StoreOperationalActivityAchievementCaseVo> selectStoreCasePage(
             IPage<?> page,
             @Param("storeId") Integer storeId,
-            @Param("hasResult") Integer hasResult,
+            @Param("activityStatus") Integer activityStatus,
             @Param("activityName") String activityName);
 }

+ 12 - 12
alien-entity/src/main/resources/mapper/storePlatform/StoreOperationalActivityAchievementMapper.xml

@@ -68,7 +68,9 @@
             signup.phone AS phone,
             signup.created_time AS createdTime,
             u.user_image AS userImage,
-            u.user_phone AS userPhone
+            u.user_phone AS userPhone,
+            signup.user_name AS signupName,
+            signup.phone AS signupPhone
         FROM store_operational_activity act
         LEFT JOIN life_user u ON u.id = #{userId}
         LEFT JOIN store_operational_activity_signup signup ON signup.activity_id = #{activityId}
@@ -111,6 +113,8 @@
             u.user_name AS userName,
             u.user_image AS userImage,
             u.user_phone AS userPhone,
+            signup.user_name AS signupName,
+            signup.phone AS signupPhone,
             CASE
                 WHEN (act.result_media_url IS NOT NULL AND act.result_media_url != '')
                     OR (act.result_text IS NOT NULL AND act.result_text != '') THEN 1
@@ -142,17 +146,13 @@
         WHERE ach.delete_flag = 0
           AND act.delete_flag = 0
           AND act.store_id = #{storeId}
-        <if test="hasResult != null">
-            <choose>
-                <when test="hasResult == 0">
-                    AND ((act.result_media_url IS NULL OR act.result_media_url = '')
-                    AND (act.result_text IS NULL OR act.result_text = ''))
-                </when>
-                <when test="hasResult == 1">
-                    AND ((act.result_media_url IS NOT NULL AND act.result_media_url != '')
-                    OR (act.result_text IS NOT NULL AND act.result_text != ''))
-                </when>
-            </choose>
+        <if test="activityStatus != null">
+            <if test="activityStatus == 5">
+                AND act.status IN (4, 5)
+            </if>
+            <if test="activityStatus != 5">
+                AND act.status = #{activityStatus}
+            </if>
         </if>
         <if test="activityName != null and activityName != ''">
             AND act.activity_name LIKE CONCAT('%', #{activityName}, '%')

+ 74 - 0
alien-job/src/main/java/shop/alien/job/store/StoreOperationalActivityJob.java

@@ -7,7 +7,9 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import shop.alien.entity.storePlatform.StoreOperationalActivity;
+import shop.alien.entity.storePlatform.StoreOperationalActivitySignup;
 import shop.alien.mapper.storePlantform.StoreOperationalActivityMapper;
+import shop.alien.mapper.storePlantform.StoreOperationalActivitySignupMapper;
 
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -27,6 +29,7 @@ import java.util.List;
 public class StoreOperationalActivityJob {
 
     private final StoreOperationalActivityMapper activityMapper;
+    private final StoreOperationalActivitySignupMapper signupMapper;
 
     /**
      * 营销活动状态更新任务
@@ -136,10 +139,81 @@ public class StoreOperationalActivityJob {
                 log.info("【定时任务】未开始活动更新完成,活动ID列表: {},更新数量: {}", notStartActivityIds, updateCount);
             }
 
+            // 处理报名时间已过但未审核通过的报名记录
+            // 使用当前实际时间(包含时分秒)进行比较
+            processExpiredSignups(new Date());
+
             log.info("【定时任务】营销活动状态更新任务执行完成");
         } catch (Exception e) {
             log.error("【定时任务】营销活动状态更新任务执行异常", e);
         }
     }
+
+    /**
+     * 处理报名时间已过但未审核通过的报名记录
+     * 如果报名人员没有在报名时间内审核通过,一律改为审核拒绝
+     *
+     * @param now 当前时间
+     */
+    private void processExpiredSignups(Date now) {
+        log.info("【定时任务】开始处理报名时间已过的待审核报名记录...");
+        
+        try {
+            // 查询所有有报名结束时间的活动
+            LambdaQueryWrapper<StoreOperationalActivity> activityWrapper = new LambdaQueryWrapper<>();
+            activityWrapper.isNotNull(StoreOperationalActivity::getSignupEndTime)
+                    .eq(StoreOperationalActivity::getDeleteFlag, 0);
+            
+            List<StoreOperationalActivity> activities = activityMapper.selectList(activityWrapper);
+            log.info("【定时任务】查询到有报名结束时间的活动数量: {}", activities.size());
+
+            int totalRejectedCount = 0;
+
+            for (StoreOperationalActivity activity : activities) {
+                Date signupEndTime = activity.getSignupEndTime();
+                if (signupEndTime == null) {
+                    continue;
+                }
+
+                // 如果当前时间 > 报名结束时间,说明报名时间已过
+                if (now.compareTo(signupEndTime) > 0) {
+                    // 查询该活动下所有待审核(status=0)的报名记录
+                    LambdaQueryWrapper<StoreOperationalActivitySignup> signupWrapper = new LambdaQueryWrapper<>();
+                    signupWrapper.eq(StoreOperationalActivitySignup::getActivityId, activity.getId())
+                            .eq(StoreOperationalActivitySignup::getStatus, 0) // 0-待审核
+                            .eq(StoreOperationalActivitySignup::getDeleteFlag, 0);
+                    
+                    List<StoreOperationalActivitySignup> pendingSignups = signupMapper.selectList(signupWrapper);
+                    
+                    if (!pendingSignups.isEmpty()) {
+                        // 批量更新为拒绝状态
+                        List<Integer> signupIds = new ArrayList<>();
+                        for (StoreOperationalActivitySignup signup : pendingSignups) {
+                            signupIds.add(signup.getId());
+                        }
+                        
+                        LambdaUpdateWrapper<StoreOperationalActivitySignup> updateWrapper = new LambdaUpdateWrapper<>();
+                        updateWrapper.in(StoreOperationalActivitySignup::getId, signupIds)
+                                .set(StoreOperationalActivitySignup::getStatus, 1) // 1-拒绝
+                                .set(StoreOperationalActivitySignup::getRejectReason, "报名时间已过,未在规定时间内审核通过")
+                                .set(StoreOperationalActivitySignup::getAuditTime, now);
+                        
+                        int updateCount = signupMapper.update(null, updateWrapper);
+                        totalRejectedCount += updateCount;
+                        log.info("【定时任务】活动ID: {} 报名时间已过,将 {} 条待审核报名记录改为拒绝", 
+                                activity.getId(), updateCount);
+                    }
+                }
+            }
+
+            if (totalRejectedCount > 0) {
+                log.info("【定时任务】报名时间已过的待审核报名记录处理完成,共拒绝 {} 条", totalRejectedCount);
+            } else {
+                log.info("【定时任务】没有需要处理的报名时间已过的待审核报名记录");
+            }
+        } catch (Exception e) {
+            log.error("【定时任务】处理报名时间已过的待审核报名记录异常", e);
+        }
+    }
 }
 

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

@@ -310,7 +310,7 @@ public class StoreOperationalActivityController {
                 return R.fail("商户ID不能为空");
             }
             IPage<StoreOperationalActivityAchievementCaseVo> result = achievementService.listStoreCasePage(
-                    dto.getStoreId(), dto.getHasResult(), dto.getActivityName(), dto.getPageNum(), dto.getPageSize());
+                    dto.getStoreId(), dto.getActivityStatus(), dto.getActivityName(), dto.getPageNum(), dto.getPageSize());
             return R.data(result);
         } catch (IllegalArgumentException e) {
             return R.fail(e.getMessage());

+ 2 - 2
alien-store/src/main/java/shop/alien/store/dto/StoreOperationalActivityCaseQueryDto.java

@@ -17,8 +17,8 @@ public class StoreOperationalActivityCaseQueryDto {
     @ApiModelProperty(value = "商户ID", required = true)
     private Integer storeId;
 
-    @ApiModelProperty(value = "上传情况:0-未上传, 1-已上传")
-    private Integer hasResult;
+    @ApiModelProperty(value = "活动状态")
+    private Integer activityStatus;
 
     @ApiModelProperty(value = "所属活动(活动名称,支持模糊查询)")
     private String activityName;

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

@@ -75,15 +75,15 @@ public interface StoreOperationalActivityAchievementService {
     StoreOperationalActivityAchievementCaseDetailVo getCaseDetail(Integer activityId, Integer userId);
 
     /**
-     * 商家端案例列表(按商户ID、上传情况、活动名称筛选)
+     * 商家端案例列表(按商户ID、活动状态、活动名称筛选)
      *
      * @param storeId 商户ID
-     * @param hasResult 上传情况:0-未上传, 1-已上传
+     * @param activityStatus 活动状态
      * @param activityName 活动名称(模糊查询)
      * @param pageNum 当前页
      * @param pageSize 每页条数
      * @return 分页列表
      */
-    IPage<StoreOperationalActivityAchievementCaseVo> listStoreCasePage(Integer storeId, Integer hasResult,
+    IPage<StoreOperationalActivityAchievementCaseVo> listStoreCasePage(Integer storeId, Integer activityStatus,
                                                                         String activityName, Integer pageNum, Integer pageSize);
 }

+ 2 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreOperationalActivityAchievementServiceImpl.java

@@ -182,7 +182,7 @@ public class StoreOperationalActivityAchievementServiceImpl implements StoreOper
     }
 
     @Override
-    public IPage<StoreOperationalActivityAchievementCaseVo> listStoreCasePage(Integer storeId, Integer hasResult,
+    public IPage<StoreOperationalActivityAchievementCaseVo> listStoreCasePage(Integer storeId, Integer activityStatus,
                                                                                String activityName, Integer pageNum, Integer pageSize) {
         if (storeId == null || storeId <= 0) {
             throw new IllegalArgumentException("商户ID不能为空");
@@ -190,7 +190,7 @@ public class StoreOperationalActivityAchievementServiceImpl implements StoreOper
         int current = pageNum == null || pageNum <= 0 ? 1 : pageNum;
         int size = pageSize == null || pageSize <= 0 ? 10 : pageSize;
         Page<StoreOperationalActivityAchievementCaseVo> page = new Page<>(current, size);
-        return achievementMapper.selectStoreCasePage(page, storeId, hasResult, activityName);
+        return achievementMapper.selectStoreCasePage(page, storeId, activityStatus, activityName);
     }
 
     private List<String> splitMediaUrls(String mediaUrls) {