|
|
@@ -21,8 +21,6 @@ import shop.alien.store.config.BaseRedisService;
|
|
|
import shop.alien.store.dto.StoreOperationalActivitySignupDto;
|
|
|
import shop.alien.store.service.StoreOperationalActivityService;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
-import com.alibaba.fastjson.JSONObject;
|
|
|
-import shop.alien.util.common.JwtUtil;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
@@ -48,8 +46,8 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
|
|
|
private final BaseRedisService baseRedisService;
|
|
|
|
|
|
@Override
|
|
|
- public StoreOperationalActivityDetailVo getActivityDetail(Integer id) {
|
|
|
- log.info("StoreOperationalActivityServiceImpl.getActivityDetail: id={}", id);
|
|
|
+ public StoreOperationalActivityDetailVo getActivityDetail(Integer id, Integer userId) {
|
|
|
+ log.info("StoreOperationalActivityServiceImpl.getActivityDetail: id={}, userId={}", id, userId);
|
|
|
if (id == null) {
|
|
|
throw new IllegalArgumentException("活动ID不能为空");
|
|
|
}
|
|
|
@@ -61,8 +59,10 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
|
|
|
StoreOperationalActivityDetailVo vo = new StoreOperationalActivityDetailVo();
|
|
|
BeanUtils.copyProperties(activity, vo);
|
|
|
vo.setStatusName(resolveStatusName(activity.getStatus()));
|
|
|
- fillSignupFlags(vo, activity);
|
|
|
+ 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());
|
|
|
@@ -107,6 +107,12 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
|
|
|
|
|
|
@Override
|
|
|
public List<StoreOperationalActivityMySignupVo> listMySignups(Integer userId) {
|
|
|
+ /**
|
|
|
+ * 我的报名列表:
|
|
|
+ * - 聚合活动基础信息、报名审核状态、成果状态等字段;
|
|
|
+ * - 计算列表展示状态(status)与状态文案(statusLabel);
|
|
|
+ * - 只返回未删除的数据。
|
|
|
+ */
|
|
|
if (userId == null) {
|
|
|
throw new IllegalArgumentException("用户ID不能为空");
|
|
|
}
|
|
|
@@ -118,7 +124,10 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
|
|
|
if (item == null) {
|
|
|
continue;
|
|
|
}
|
|
|
+ // 基于报名时间窗口生成展示文案(报名未开始/报名中/报名已结束)
|
|
|
item.setStatusLabel(resolveSignupStatusLabel(item.getSignupStatus(), item.getActivityStatus()));
|
|
|
+ // 基于活动状态、报名审核状态与成果状态计算列表展示状态
|
|
|
+ item.setStatus(resolveMySignupStatus(item));
|
|
|
}
|
|
|
return list;
|
|
|
}
|
|
|
@@ -268,32 +277,82 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
|
|
|
vo.setCurrentApprovedCount(approvedCount != null ? approvedCount : 0);
|
|
|
}
|
|
|
|
|
|
- private void fillSignupFlags(StoreOperationalActivityDetailVo vo, StoreOperationalActivity activity) {
|
|
|
+ private void fillSignupFlags(StoreOperationalActivityDetailVo vo, StoreOperationalActivity activity, Integer userId) {
|
|
|
if (vo == null || activity == null) {
|
|
|
return;
|
|
|
}
|
|
|
- boolean expired = false;
|
|
|
- if (activity.getSignupEndTime() != null) {
|
|
|
- expired = new Date().after(activity.getSignupEndTime());
|
|
|
+ vo.setInSignupTime(resolveInSignupTime(activity));
|
|
|
+ if (userId == null) {
|
|
|
+ vo.setSignedUp(false);
|
|
|
+ return;
|
|
|
}
|
|
|
- vo.setSignupExpired(expired);
|
|
|
+ Integer signupCount = signupMapper.countSignedUpByActivityAndUser(activity.getId(), userId);
|
|
|
+ vo.setSignedUp(signupCount != null && signupCount > 0);
|
|
|
+ }
|
|
|
|
|
|
- Integer currentUserId = null;
|
|
|
- try {
|
|
|
- JSONObject userInfo = JwtUtil.getCurrentUserInfo();
|
|
|
- if (userInfo != null) {
|
|
|
- currentUserId = userInfo.getInteger("userId");
|
|
|
+ private boolean resolveInSignupTime(StoreOperationalActivity activity) {
|
|
|
+ if (activity == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ Date now = new Date();
|
|
|
+ Date start = activity.getSignupStartTime();
|
|
|
+ Date end = activity.getSignupEndTime();
|
|
|
+ if (start != null && now.before(start)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (end != null && now.after(end)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Integer resolveDetailStatus(StoreOperationalActivity activity, Integer signupStatus) {
|
|
|
+ if (activity == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ Date now = new Date();
|
|
|
+ if (activity.getStatus() != null && activity.getStatus() == 7) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (activity.getEndTime() != null && now.after(activity.getEndTime())) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ Integer status = activity.getStatus();
|
|
|
+ if (status != null && (status == 0 || status == 1 || status == 3 || status == 4 || status == 6)) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if (signupStatus != null && signupStatus == 2
|
|
|
+ && activity.getStartTime() != null && now.before(activity.getStartTime())) {
|
|
|
+ return 2;
|
|
|
+ }
|
|
|
+ if (activity.getSignupEndTime() != null && now.after(activity.getSignupEndTime())) {
|
|
|
+ if (status != null && status == 5 && signupStatus != null && signupStatus == 2) {
|
|
|
+ return 3;
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if (signupStatus != null) {
|
|
|
+ if (signupStatus == 2) {
|
|
|
+ return 3;
|
|
|
+ }
|
|
|
+ if (signupStatus == 0) {
|
|
|
+ return 4;
|
|
|
+ }
|
|
|
+ if (signupStatus == 1) {
|
|
|
+ if (activity.getSignupEndTime() != null && now.before(activity.getSignupEndTime())) {
|
|
|
+ return 5;
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
}
|
|
|
- } catch (Exception e) {
|
|
|
- log.debug("获取当前用户失败,无法判断是否已报名", e);
|
|
|
}
|
|
|
+ return 5;
|
|
|
+ }
|
|
|
|
|
|
- if (currentUserId == null) {
|
|
|
- vo.setSignedUp(false);
|
|
|
- return;
|
|
|
+ private Integer resolveCurrentUserSignupStatus(Integer activityId, Integer userId) {
|
|
|
+ if (userId == null || activityId == null) {
|
|
|
+ return null;
|
|
|
}
|
|
|
- Integer signupCount = signupMapper.countSignedUpByActivityAndUser(activity.getId(), currentUserId);
|
|
|
- vo.setSignedUp(signupCount != null && signupCount > 0);
|
|
|
+ return signupMapper.selectLatestSignupStatus(activityId, userId);
|
|
|
}
|
|
|
|
|
|
private String resolveSignupStatusLabel(Integer signupStatus, Integer activityStatus) {
|
|
|
@@ -301,21 +360,56 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
|
|
|
return null;
|
|
|
}
|
|
|
if (signupStatus == 0) {
|
|
|
- return "审核中";
|
|
|
+ return "报名未开始";
|
|
|
}
|
|
|
if (signupStatus == 1) {
|
|
|
- return "报名已拒绝";
|
|
|
+ return "报名中";
|
|
|
}
|
|
|
if (signupStatus == 2) {
|
|
|
- if (activityStatus != null) {
|
|
|
- if (activityStatus == 5) {
|
|
|
- return "活动已开始";
|
|
|
- }
|
|
|
- if (activityStatus == 7) {
|
|
|
- return "活动已结束";
|
|
|
- }
|
|
|
+ return "报名已结束";
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Integer resolveMySignupStatus(StoreOperationalActivityMySignupVo item) {
|
|
|
+ /**
|
|
|
+ * 列表状态计算规则:
|
|
|
+ * 1 -> 活动已结束且无成果
|
|
|
+ * 2 -> 活动已结束且有成果
|
|
|
+ * 3 -> 活动进行中且有成果
|
|
|
+ * 4 -> 活动进行中且已报名无成果
|
|
|
+ * 5 -> 活动未开始且报名已拒绝
|
|
|
+ * 6 -> 活动未开始且报名成功
|
|
|
+ * 7 -> 报名审核中
|
|
|
+ */
|
|
|
+ if (item == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ Date now = new Date();
|
|
|
+ Integer activityStatus = item.getActivityStatus();
|
|
|
+ boolean hasAchievement = item.getHasAchievement() != null && item.getHasAchievement() == 1;
|
|
|
+ Integer auditStatus = item.getSignupAuditStatus();
|
|
|
+ Date startTime = item.getStartTime();
|
|
|
+ Date endTime = item.getEndTime();
|
|
|
+ boolean ended = (activityStatus != null && activityStatus == 7)
|
|
|
+ || (endTime != null && now.after(endTime));
|
|
|
+ if (ended) {
|
|
|
+ return hasAchievement ? 2 : 1;
|
|
|
+ }
|
|
|
+ if (activityStatus != null && activityStatus == 5) {
|
|
|
+ return hasAchievement ? 3 : 4;
|
|
|
+ }
|
|
|
+ if (activityStatus != null && activityStatus == 2) {
|
|
|
+ if (auditStatus != null && auditStatus == 1) {
|
|
|
+ return 5;
|
|
|
}
|
|
|
- return "报名成功";
|
|
|
+ if (auditStatus != null && auditStatus == 2) {
|
|
|
+ return 6;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (auditStatus != null && auditStatus == 0
|
|
|
+ && startTime != null && now.before(startTime)) {
|
|
|
+ return 7;
|
|
|
}
|
|
|
return null;
|
|
|
}
|