记得上下班打卡 | git大法好,push需谨慎

Commit f5cb95d4 authored by wangyifan's avatar wangyifan

草莓护照- 优化接口

parent 4a2ab388
......@@ -30,4 +30,7 @@ public class AdamCaomeiBadgeApplyRecordUserVo {
@ApiModelProperty("是否可重新上传(仅驳回状态为 true)")
private Boolean canReupload;
@ApiModelProperty("凭证图片")
private String proofImageUrl;
}
......@@ -11,4 +11,5 @@ public class AdamCaomeiBadgeApplyRecordUserDto {
private Date applyTime;
private Integer auditStatus;
private String rejectReason;
private String proofImageUrl;
}
......@@ -109,7 +109,8 @@ public interface AdamCaomeiBadgeApplyRecordMapper extends BaseMapper<AdamCaomeiB
"ifnull(b.name, '') as badgeName,",
"ar.created_at as applyTime,",
"ar.audit_status as auditStatus,",
"ifnull(ar.reject_reason, '') as rejectReason ",
"ifnull(ar.reject_reason, '') as rejectReason,",
"proof_image_url as proofImageUrl",
"from adam_caomei_badge_apply_record ar ",
"left join adam_caomei_badge b on ar.badge_id = b.badge_id ",
"where ar.user_id = #{uid} ",
......
......@@ -157,6 +157,7 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi
v.setAuditStatus(r.getAuditStatus());
v.setRejectReason(StringUtils.defaultString(r.getRejectReason()));
v.setCanReupload(r.getAuditStatus() != null && r.getAuditStatus() == 2);
v.setProofImageUrl(r.getProofImageUrl());
return v;
}).collect(Collectors.toList());
return ResponseDto.success(list);
......
......@@ -22,6 +22,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
......@@ -134,22 +135,9 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
// 1. 初始化返回对象
AdamCaomeiPassportHomeVo home = new AdamCaomeiPassportHomeVo();
AdamCaomeiPassportUserCardVo card = new AdamCaomeiPassportUserCardVo();
card.setPassportBound(true);
card.setPassportNo(bound.getPassportNo());
card.setPassportClaimedAt(bound.getBoundAt());
AdamCaomeiPassportUserCardVo card = buildUserCard(uid, bound);
home.setUserCard(card);
// 2. 获取用户基本信息(头像、昵称)
AdamUserInfoVo userInfo = adamRdmService.getUserInfoVoByUid(uid);
if (userInfo != null) {
card.setAvatar(StringUtils.defaultString(userInfo.getAvatar()));
card.setNickname(StringUtils.defaultString(userInfo.getNickname()));
} else {
card.setAvatar("");
card.setNickname("");
}
// 3. 获取用户实名认证信息
AdamRealInfoVo real = adamRdmService.getRealInfoVoByUidPlain(uid);
String idCard = null;
......@@ -168,46 +156,19 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
: new ArrayList<>();
log.info("[getPassportHome] 用户已支付的演出订单数量, uid: {}, 数量: {}", uid, paidPerformanceIds.size());
// 5.1 查询用户补签审核已通过的徽章(用于判断演出徽章是否可认领)
Set<String> passedApplyBadgeIds = badgeApplyRecordMapper.selectList(
Wrappers.lambdaQuery(AdamCaomeiBadgeApplyRecord.class)
.eq(AdamCaomeiBadgeApplyRecord::getUserId, uid)
.eq(AdamCaomeiBadgeApplyRecord::getAuditStatus, 1)
).stream().map(AdamCaomeiBadgeApplyRecord::getBadgeId)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toSet());
// 5.2 查询用户补签待审核的徽章(用于前端展示“审核中”状态)
Set<String> pendingApplyBadgeIds = badgeApplyRecordMapper.selectList(
Wrappers.lambdaQuery(AdamCaomeiBadgeApplyRecord.class)
.eq(AdamCaomeiBadgeApplyRecord::getUserId, uid)
.eq(AdamCaomeiBadgeApplyRecord::getAuditStatus, 0)
).stream().map(AdamCaomeiBadgeApplyRecord::getBadgeId)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toSet());
ApplyBadgeStatus applyBadgeStatus = loadApplyBadgeStatus(uid);
// 6. 查询用户已认领的所有徽章记录 (用于展示徽章墙)
List<AdamCaomeiPassportUserBadgeDto> rows = adamRdmService.getUserCaomeiBadgesByUid(uid);
if (rows == null) {
rows = new ArrayList<>();
}
List<AdamCaomeiPassportUserClaimedBadgeVo> claimed = rows.stream().map(r -> {
AdamCaomeiPassportUserClaimedBadgeVo v = new AdamCaomeiPassportUserClaimedBadgeVo();
v.setBadgeId(r.getBadgeId());
v.setName(StringUtils.defaultString(r.getBadgeName()));
v.setIcon(StringUtils.defaultString(r.getIcon()));
v.setType(r.getType());
v.setClaimedAt(r.getClaimedAt());
v.setSource(r.getSource());
return v;
}).collect(Collectors.toList());
List<AdamCaomeiPassportUserClaimedBadgeVo> claimed = toClaimedBadgeVos(rows);
home.setClaimedBadges(claimed);
log.info("[getPassportHome] 用户已认领的徽章数量, uid: {}, 数量: {}", uid, claimed.size());
// 转换为 Map 方便后续匹配货架上的徽章是否已认领
Map<String, AdamCaomeiPassportUserBadgeDto> claimedMap = rows.stream()
.filter(r -> StringUtils.isNotBlank(r.getBadgeId()))
.collect(Collectors.toMap(AdamCaomeiPassportUserBadgeDto::getBadgeId, Function.identity(), (a, b) -> a));
Map<String, AdamCaomeiPassportUserBadgeDto> claimedMap = toClaimedBadgeMap(rows);
// 7. 查询所有已上架的徽章配置,并按类型升序、排序值降序、ID降序排序
List<AdamCaomeiBadge> published = adamRdmService.getPublishedCaomeiBadges();
......@@ -217,15 +178,86 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
log.info("[getPassportHome] 系统已上架的徽章数量, uid: {}, 数量: {}", uid, published.size());
// 8. 组装全部上架徽章列表 (扁平结构,前端按 type 筛选展示)
List<AdamCaomeiPassportBadgeShelfItemVo> allBadges = published.stream()
.map(b -> toShelfItem(b, claimedMap, paidPerformanceIds, passedApplyBadgeIds, pendingApplyBadgeIds))
.collect(Collectors.toList());
List<AdamCaomeiPassportBadgeShelfItemVo> allBadges = toShelfItems(
published,
claimedMap,
paidPerformanceIds,
applyBadgeStatus.passedApplyBadgeIds,
applyBadgeStatus.pendingApplyBadgeIds
);
home.setAllBadges(allBadges);
log.info("[getPassportHome] 获取护照首页数据成功, uid: {}", uid);
return ResponseDto.success(home);
}
private AdamCaomeiPassportUserCardVo buildUserCard(String uid, AdamCaomeiPassport bound) {
AdamCaomeiPassportUserCardVo card = new AdamCaomeiPassportUserCardVo();
card.setPassportBound(true);
card.setPassportNo(bound.getPassportNo());
card.setPassportClaimedAt(bound.getBoundAt());
AdamUserInfoVo userInfo = adamRdmService.getUserInfoVoByUid(uid);
if (userInfo != null) {
card.setAvatar(StringUtils.defaultString(userInfo.getAvatar()));
card.setNickname(StringUtils.defaultString(userInfo.getNickname()));
} else {
card.setAvatar("");
card.setNickname("");
}
return card;
}
private ApplyBadgeStatus loadApplyBadgeStatus(String uid) {
List<AdamCaomeiBadgeApplyRecord> applyRecords = badgeApplyRecordMapper.selectList(
Wrappers.lambdaQuery(AdamCaomeiBadgeApplyRecord.class)
.eq(AdamCaomeiBadgeApplyRecord::getUserId, uid)
.in(AdamCaomeiBadgeApplyRecord::getAuditStatus, 0, 1)
);
Set<String> passedApplyBadgeIds = new HashSet<>();
Set<String> pendingApplyBadgeIds = new HashSet<>();
for (AdamCaomeiBadgeApplyRecord r : applyRecords) {
if (r == null || StringUtils.isBlank(r.getBadgeId()) || r.getAuditStatus() == null) {
continue;
}
if (r.getAuditStatus() == 1) {
passedApplyBadgeIds.add(r.getBadgeId());
} else if (r.getAuditStatus() == 0) {
pendingApplyBadgeIds.add(r.getBadgeId());
}
}
return new ApplyBadgeStatus(passedApplyBadgeIds, pendingApplyBadgeIds);
}
private static List<AdamCaomeiPassportUserClaimedBadgeVo> toClaimedBadgeVos(List<AdamCaomeiPassportUserBadgeDto> rows) {
return rows.stream().map(r -> {
AdamCaomeiPassportUserClaimedBadgeVo v = new AdamCaomeiPassportUserClaimedBadgeVo();
v.setBadgeId(r.getBadgeId());
v.setName(StringUtils.defaultString(r.getBadgeName()));
v.setIcon(StringUtils.defaultString(r.getIcon()));
v.setType(r.getType());
v.setClaimedAt(r.getClaimedAt());
v.setSource(r.getSource());
return v;
}).collect(Collectors.toList());
}
private static Map<String, AdamCaomeiPassportUserBadgeDto> toClaimedBadgeMap(List<AdamCaomeiPassportUserBadgeDto> rows) {
return rows.stream()
.filter(r -> StringUtils.isNotBlank(r.getBadgeId()))
.collect(Collectors.toMap(AdamCaomeiPassportUserBadgeDto::getBadgeId, Function.identity(), (a, b) -> a));
}
private static List<AdamCaomeiPassportBadgeShelfItemVo> toShelfItems(List<AdamCaomeiBadge> published,
Map<String, AdamCaomeiPassportUserBadgeDto> claimedMap,
List<String> paidPerformanceIds,
Set<String> passedApplyBadgeIds,
Set<String> pendingApplyBadgeIds) {
return published.stream()
.map(b -> toShelfItem(b, claimedMap, paidPerformanceIds, passedApplyBadgeIds, pendingApplyBadgeIds))
.collect(Collectors.toList());
}
/**
* @param b 徽章信息
* @param claimedMap 用户已领取的徽章
......@@ -288,4 +320,14 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
.last("limit 1")
);
}
private static final class ApplyBadgeStatus {
private final Set<String> passedApplyBadgeIds;
private final Set<String> pendingApplyBadgeIds;
private ApplyBadgeStatus(Set<String> passedApplyBadgeIds, Set<String> pendingApplyBadgeIds) {
this.passedApplyBadgeIds = passedApplyBadgeIds;
this.pendingApplyBadgeIds = pendingApplyBadgeIds;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment