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

Commit 4a2ab388 authored by wangyifan's avatar wangyifan

草莓护照- 补签相关接口;

parent 565a2963
package com.liquidnet.service.adam.dto.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel("草莓徽章-补签申请参数")
public class AdamCaomeiBadgeApplyParam {
@NotBlank(message = "徽章ID不能为空")
@ApiModelProperty(value = "徽章ID", required = true)
private String badgeId;
@NotBlank(message = "凭证图片不能为空")
@ApiModelProperty(value = "订单截图/凭证图片URL", required = true)
private String proofImageUrl;
}
package com.liquidnet.service.adam.dto.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.liquidnet.commons.lang.util.DateUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel("草莓徽章-补签记录(用户端)")
public class AdamCaomeiBadgeApplyRecordUserVo {
@ApiModelProperty("补签申请ID")
private String applyRecordId;
@ApiModelProperty("申请徽章名称")
private String badgeName;
@ApiModelProperty("申请时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private Date applyTime;
@ApiModelProperty("审核状态:0-待审核 1-已通过 2-已驳回")
private Integer auditStatus;
@ApiModelProperty("驳回理由")
private String rejectReason;
@ApiModelProperty("是否可重新上传(仅驳回状态为 true)")
private Boolean canReupload;
}
...@@ -36,4 +36,7 @@ public class AdamCaomeiPassportBadgeShelfItemVo { ...@@ -36,4 +36,7 @@ public class AdamCaomeiPassportBadgeShelfItemVo {
@ApiModelProperty("是否可认领(护照徽章未发放完全,或演出徽章有票未领)") @ApiModelProperty("是否可认领(护照徽章未发放完全,或演出徽章有票未领)")
private boolean claimable; private boolean claimable;
@ApiModelProperty("是否存在补签待审核(仅演出徽章生效)")
private boolean applyPending;
} }
package com.liquidnet.service.adam.dto.vo; package com.liquidnet.service.adam.dto.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.liquidnet.commons.lang.util.DateUtil;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.Date;
@Data @Data
@ApiModel("草莓护照-首页个人信息卡片") @ApiModel("草莓护照-首页个人信息卡片")
public class AdamCaomeiPassportUserCardVo { public class AdamCaomeiPassportUserCardVo {
...@@ -20,6 +24,10 @@ public class AdamCaomeiPassportUserCardVo { ...@@ -20,6 +24,10 @@ public class AdamCaomeiPassportUserCardVo {
@ApiModelProperty("护照编号(未绑定时为空)") @ApiModelProperty("护照编号(未绑定时为空)")
private String passportNo; private String passportNo;
@ApiModelProperty("护照获得时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private Date passportClaimedAt;
@ApiModelProperty("是否已绑定实体护照") @ApiModelProperty("是否已绑定实体护照")
private boolean passportBound; private boolean passportBound;
} }
package com.liquidnet.service.adam.service; package com.liquidnet.service.adam.service;
import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeApplyParam;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiBadgeApplyRecordUserVo;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import java.util.List;
/** /**
* 草莓徽章(用户端) * 草莓徽章(用户端)
*/ */
...@@ -11,4 +15,14 @@ public interface IAdamCaomeiBadgeUserService { ...@@ -11,4 +15,14 @@ public interface IAdamCaomeiBadgeUserService {
* 认领徽章 * 认领徽章
*/ */
ResponseDto<String> claimBadge(String badgeId, String uid); ResponseDto<String> claimBadge(String badgeId, String uid);
/**
* 补签申请记录列表(用户端)
*/
ResponseDto<List<AdamCaomeiBadgeApplyRecordUserVo>> getApplyRecords(String uid);
/**
* 发起补签申请(驳回后可再次提交)
*/
ResponseDto<String> applyBadge(AdamCaomeiBadgeApplyParam param, String uid);
} }
...@@ -82,7 +82,6 @@ public class AdamCaomeiBadgeApplyAuditAdminServiceImpl implements IAdamCaomeiBad ...@@ -82,7 +82,6 @@ public class AdamCaomeiBadgeApplyAuditAdminServiceImpl implements IAdamCaomeiBad
if (updated <= 0) { if (updated <= 0) {
return false; return false;
} }
badgeApplyRecordMapper.issueBadgeIfAbsent(record.getUserId(), record.getBadgeId());
return true; return true;
} }
......
package com.liquidnet.service.adam.dto;
import lombok.Data;
import java.util.Date;
@Data
public class AdamCaomeiBadgeApplyRecordUserDto {
private String applyRecordId;
private String badgeName;
private Date applyTime;
private Integer auditStatus;
private String rejectReason;
}
...@@ -3,6 +3,7 @@ package com.liquidnet.service.adam.mapper; ...@@ -3,6 +3,7 @@ package com.liquidnet.service.adam.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.adam.dto.AdamCaomeiBadgeApplyAuditDetailDto; import com.liquidnet.service.adam.dto.AdamCaomeiBadgeApplyAuditDetailDto;
import com.liquidnet.service.adam.dto.AdamCaomeiBadgeApplyAuditDto; import com.liquidnet.service.adam.dto.AdamCaomeiBadgeApplyAuditDto;
import com.liquidnet.service.adam.dto.AdamCaomeiBadgeApplyRecordUserDto;
import com.liquidnet.service.adam.entity.AdamCaomeiBadgeApplyRecord; import com.liquidnet.service.adam.entity.AdamCaomeiBadgeApplyRecord;
import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -101,4 +102,18 @@ public interface AdamCaomeiBadgeApplyRecordMapper extends BaseMapper<AdamCaomeiB ...@@ -101,4 +102,18 @@ public interface AdamCaomeiBadgeApplyRecordMapper extends BaseMapper<AdamCaomeiB
"values (#{userId}, #{badgeId}, 3, now())" "values (#{userId}, #{badgeId}, 3, now())"
}) })
int issueBadgeIfAbsent(@Param("userId") String userId, @Param("badgeId") String badgeId); int issueBadgeIfAbsent(@Param("userId") String userId, @Param("badgeId") String badgeId);
@Select({
"select ",
"ar.apply_record_id as applyRecordId,",
"ifnull(b.name, '') as badgeName,",
"ar.created_at as applyTime,",
"ar.audit_status as auditStatus,",
"ifnull(ar.reject_reason, '') as rejectReason ",
"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} ",
"order by ar.created_at desc"
})
List<AdamCaomeiBadgeApplyRecordUserDto> selectUserApplyRecordsByUid(@Param("uid") String uid);
} }
...@@ -3,7 +3,9 @@ package com.liquidnet.service.adam.controller; ...@@ -3,7 +3,9 @@ package com.liquidnet.service.adam.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.commons.lang.util.CurrentUtil; import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeApplyParam;
import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeClaimParam; import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeClaimParam;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiBadgeApplyRecordUserVo;
import com.liquidnet.service.adam.service.IAdamCaomeiBadgeUserService; import com.liquidnet.service.adam.service.IAdamCaomeiBadgeUserService;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -15,8 +17,10 @@ import org.springframework.web.bind.annotation.PostMapping; ...@@ -15,8 +17,10 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List;
@ApiSupport(order = 10046) @ApiSupport(order = 10046)
@Api(tags = "草莓徽章(用户端)") @Api(tags = "草莓徽章(用户端)")
...@@ -36,4 +40,20 @@ public class AdamCaomeiBadgeUserController { ...@@ -36,4 +40,20 @@ public class AdamCaomeiBadgeUserController {
String uid = CurrentUtil.getCurrentUid(); String uid = CurrentUtil.getCurrentUid();
return adamCaomeiBadgeUserService.claimBadge(param.getBadgeId(), uid); return adamCaomeiBadgeUserService.claimBadge(param.getBadgeId(), uid);
} }
@ApiOperationSupport(order = 2)
@ApiOperation("补签记录列表")
@GetMapping("apply/list")
public ResponseDto<List<AdamCaomeiBadgeApplyRecordUserVo>> applyList() {
String uid = CurrentUtil.getCurrentUid();
return adamCaomeiBadgeUserService.getApplyRecords(uid);
}
@ApiOperationSupport(order = 3)
@ApiOperation("发起补签申请(驳回后可重新上传)")
@PostMapping("apply")
public ResponseDto<String> apply(@Valid @RequestBody AdamCaomeiBadgeApplyParam param) {
String uid = CurrentUtil.getCurrentUid();
return adamCaomeiBadgeUserService.applyBadge(param, uid);
}
} }
...@@ -29,7 +29,7 @@ public class AdamCaomeiPassportUserController { ...@@ -29,7 +29,7 @@ public class AdamCaomeiPassportUserController {
private IAdamCaomeiPassportUserService adamCaomeiPassportUserService; private IAdamCaomeiPassportUserService adamCaomeiPassportUserService;
@ApiOperationSupport(order = 1) @ApiOperationSupport(order = 1)
@ApiOperation("绑定实体护照(内含编号有效性、是否可绑等校验)") @ApiOperation("绑定实体护照(内含·编号有效性、是否可绑等校验)")
@PostMapping("bind") @PostMapping("bind")
public ResponseDto<List<AdamCaomeiPassportUserClaimedBadgeVo>> bind(@Valid @RequestBody AdamCaomeiPassportNoParam param) { public ResponseDto<List<AdamCaomeiPassportUserClaimedBadgeVo>> bind(@Valid @RequestBody AdamCaomeiPassportNoParam param) {
return adamCaomeiPassportUserService.bindPassport(param.getPassportNo()); return adamCaomeiPassportUserService.bindPassport(param.getPassportNo());
......
package com.liquidnet.service.adam.service.impl; package com.liquidnet.service.adam.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeApplyParam;
import com.liquidnet.service.adam.dto.AdamCaomeiBadgeApplyRecordUserDto;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiBadgeApplyRecordUserVo;
import com.liquidnet.service.adam.dto.vo.AdamRealInfoVo; import com.liquidnet.service.adam.dto.vo.AdamRealInfoVo;
import com.liquidnet.service.adam.entity.AdamCaomeiBadgeApplyRecord;
import com.liquidnet.service.adam.entity.AdamCaomeiBadge; import com.liquidnet.service.adam.entity.AdamCaomeiBadge;
import com.liquidnet.service.adam.entity.AdamCaomeiPassport; import com.liquidnet.service.adam.entity.AdamCaomeiPassport;
import com.liquidnet.service.adam.mapper.AdamCaomeiBadgeApplyRecordMapper;
import com.liquidnet.service.adam.mapper.AdamCaomeiBadgeMapper; import com.liquidnet.service.adam.mapper.AdamCaomeiBadgeMapper;
import com.liquidnet.service.adam.mapper.AdamCaomeiPassportMapper; import com.liquidnet.service.adam.mapper.AdamCaomeiPassportMapper;
import com.liquidnet.service.adam.service.AdamRdmService; import com.liquidnet.service.adam.service.AdamRdmService;
...@@ -16,7 +22,10 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -16,7 +22,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Collections;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
...@@ -27,6 +36,8 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi ...@@ -27,6 +36,8 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi
@Autowired @Autowired
private AdamCaomeiPassportMapper adamCaomeiPassportMapper; private AdamCaomeiPassportMapper adamCaomeiPassportMapper;
@Autowired @Autowired
private AdamCaomeiBadgeApplyRecordMapper badgeApplyRecordMapper;
@Autowired
private AdamRdmService adamRdmService; private AdamRdmService adamRdmService;
@Override @Override
...@@ -77,7 +88,7 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi ...@@ -77,7 +88,7 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi
return ResponseDto.success(badgeId); return ResponseDto.success(badgeId);
} else if (type == 2) { } else if (type == 2) {
// 演出纪念徽章:需要实名认证 + 购票记录 // 演出纪念徽章:需要实名认证 +(购票记录 或 补签审核已通过)
AdamRealInfoVo real = adamRdmService.getRealInfoVoByUidPlain(uid); AdamRealInfoVo real = adamRdmService.getRealInfoVoByUidPlain(uid);
if (real == null || real.getState() == null || real.getState() != 1 || StringUtils.isBlank(real.getIdCard())) { if (real == null || real.getState() == null || real.getState() != 1 || StringUtils.isBlank(real.getIdCard())) {
log.error("[claimBadge] 认领演出徽章需先实名, uid: {}, badgeId: {}", uid, badgeId); log.error("[claimBadge] 认领演出徽章需先实名, uid: {}, badgeId: {}", uid, badgeId);
...@@ -86,8 +97,18 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi ...@@ -86,8 +97,18 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi
String idCard = real.getIdCard(); String idCard = real.getIdCard();
List<String> paidPerformanceIds = adamCaomeiBadgeMapper.selectPaidPerformanceIdsByIdCard(idCard); List<String> paidPerformanceIds = adamCaomeiBadgeMapper.selectPaidPerformanceIdsByIdCard(idCard);
if (paidPerformanceIds == null || !paidPerformanceIds.contains(badge.getPerformanceId())) { // 有支付记录
log.error("[claimBadge] 未查询到该演出的购票记录,无法认领, uid: {}, badgeId: {}", uid, badgeId); boolean hasPaidRecord = paidPerformanceIds != null && paidPerformanceIds.contains(badge.getPerformanceId());
Integer passedApplyCount = badgeApplyRecordMapper.selectCount(
Wrappers.lambdaQuery(AdamCaomeiBadgeApplyRecord.class)
.eq(AdamCaomeiBadgeApplyRecord::getUserId, uid)
.eq(AdamCaomeiBadgeApplyRecord::getBadgeId, badgeId)
.eq(AdamCaomeiBadgeApplyRecord::getAuditStatus, 1)
);
boolean hasPassedApply = passedApplyCount != null && passedApplyCount > 0;
if (!hasPaidRecord && !hasPassedApply) {
log.error("[claimBadge] 无购票记录且无通过的补签申请,无法认领, uid: {}, badgeId: {}", uid, badgeId);
return ResponseDto.failure(ErrorMapping.get("10611")); return ResponseDto.failure(ErrorMapping.get("10611"));
} }
...@@ -100,8 +121,9 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi ...@@ -100,8 +121,9 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi
// ); // );
// for (AdamCaomeiBadge perfBadge : performanceBadges) { // for (AdamCaomeiBadge perfBadge : performanceBadges) {
// 发放徽章 (source: 2-购票自动发放/演出徽章认领) // 发放徽章:2-购票自动发放/演出徽章认领,3-补签审核通过后认领
adamCaomeiBadgeMapper.insertUserBadge(uid, badgeId, 2); int source = hasPaidRecord ? 2 : 3;
adamCaomeiBadgeMapper.insertUserBadge(uid, badgeId, source);
adamRdmService.delUserCaomeiBadgesByUid(uid); adamRdmService.delUserCaomeiBadgesByUid(uid);
// } // }
...@@ -117,4 +139,83 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi ...@@ -117,4 +139,83 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi
log.error("[claimBadge] 未知的徽章类型, uid: {}, badgeId: {}, type: {}", uid, badgeId, type); log.error("[claimBadge] 未知的徽章类型, uid: {}, badgeId: {}, type: {}", uid, badgeId, type);
return ResponseDto.failure(ErrorMapping.get("10613")); return ResponseDto.failure(ErrorMapping.get("10613"));
} }
@Override
public ResponseDto<List<AdamCaomeiBadgeApplyRecordUserVo>> getApplyRecords(String uid) {
if (StringUtils.isBlank(uid)) {
return ResponseDto.failure(ErrorMapping.get("10001"));
}
List<AdamCaomeiBadgeApplyRecordUserDto> rows = badgeApplyRecordMapper.selectUserApplyRecordsByUid(uid);
if (rows == null) {
rows = Collections.emptyList();
}
List<AdamCaomeiBadgeApplyRecordUserVo> list = rows.stream().map(r -> {
AdamCaomeiBadgeApplyRecordUserVo v = new AdamCaomeiBadgeApplyRecordUserVo();
v.setApplyRecordId(r.getApplyRecordId());
v.setBadgeName(StringUtils.defaultString(r.getBadgeName()));
v.setApplyTime(r.getApplyTime());
v.setAuditStatus(r.getAuditStatus());
v.setRejectReason(StringUtils.defaultString(r.getRejectReason()));
v.setCanReupload(r.getAuditStatus() != null && r.getAuditStatus() == 2);
return v;
}).collect(Collectors.toList());
return ResponseDto.success(list);
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResponseDto<String> applyBadge(AdamCaomeiBadgeApplyParam param, String uid) {
if (StringUtils.isBlank(uid)) {
return ResponseDto.failure(ErrorMapping.get("10001"));
}
if (param == null || StringUtils.isBlank(param.getBadgeId()) || StringUtils.isBlank(param.getProofImageUrl())) {
return ResponseDto.failure("参数错误");
}
String badgeId = StringUtils.trimToEmpty(param.getBadgeId());
String proofImageUrl = StringUtils.trimToEmpty(param.getProofImageUrl());
AdamCaomeiBadge badge = adamCaomeiBadgeMapper.selectOne(
Wrappers.lambdaQuery(AdamCaomeiBadge.class)
.eq(AdamCaomeiBadge::getBadgeId, badgeId)
.last("limit 1")
);
if (badge == null) {
return ResponseDto.failure(ErrorMapping.get("10607"));
}
if (badge.getType() == null || badge.getType() != 2) {
return ResponseDto.failure("仅演出纪念徽章支持补签申请");
}
int claimedCount = adamCaomeiBadgeMapper.checkUserBadgeExists(uid, badgeId);
if (claimedCount > 0) {
return ResponseDto.failure(ErrorMapping.get("10608"));
}
Integer pendingCount = badgeApplyRecordMapper.selectCount(
Wrappers.lambdaQuery(AdamCaomeiBadgeApplyRecord.class)
.eq(AdamCaomeiBadgeApplyRecord::getUserId, uid)
.eq(AdamCaomeiBadgeApplyRecord::getBadgeId, badgeId)
.eq(AdamCaomeiBadgeApplyRecord::getAuditStatus, 0)
);
if (pendingCount != null && pendingCount > 0) {
return ResponseDto.failure("您已有待审核的补签申请,请勿重复提交");
}
Date now = new Date();
AdamCaomeiBadgeApplyRecord record = new AdamCaomeiBadgeApplyRecord();
record.setApplyRecordId(IDGenerator.nextSnowId());
record.setUserId(uid);
record.setBadgeId(badgeId);
record.setPerformanceId(StringUtils.defaultString(badge.getPerformanceId()));
record.setProofImageUrl(proofImageUrl);
record.setAuditStatus(0);
record.setRejectReason("");
record.setCreatedAt(now);
record.setUpdatedAt(now);
int inserted = badgeApplyRecordMapper.insert(record);
if (inserted <= 0) {
return ResponseDto.failure();
}
return ResponseDto.success(record.getApplyRecordId());
}
} }
...@@ -5,7 +5,9 @@ import com.liquidnet.commons.lang.util.CurrentUtil; ...@@ -5,7 +5,9 @@ import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.adam.dto.AdamCaomeiPassportUserBadgeDto; import com.liquidnet.service.adam.dto.AdamCaomeiPassportUserBadgeDto;
import com.liquidnet.service.adam.dto.vo.*; import com.liquidnet.service.adam.dto.vo.*;
import com.liquidnet.service.adam.entity.AdamCaomeiBadge; import com.liquidnet.service.adam.entity.AdamCaomeiBadge;
import com.liquidnet.service.adam.entity.AdamCaomeiBadgeApplyRecord;
import com.liquidnet.service.adam.entity.AdamCaomeiPassport; import com.liquidnet.service.adam.entity.AdamCaomeiPassport;
import com.liquidnet.service.adam.mapper.AdamCaomeiBadgeApplyRecordMapper;
import com.liquidnet.service.adam.mapper.AdamCaomeiBadgeMapper; import com.liquidnet.service.adam.mapper.AdamCaomeiBadgeMapper;
import com.liquidnet.service.adam.mapper.AdamCaomeiPassportMapper; import com.liquidnet.service.adam.mapper.AdamCaomeiPassportMapper;
import com.liquidnet.service.adam.service.AdamRdmService; import com.liquidnet.service.adam.service.AdamRdmService;
...@@ -22,6 +24,7 @@ import java.util.ArrayList; ...@@ -22,6 +24,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -34,6 +37,8 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse ...@@ -34,6 +37,8 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
@Autowired @Autowired
private AdamCaomeiBadgeMapper adamCaomeiBadgeMapper; private AdamCaomeiBadgeMapper adamCaomeiBadgeMapper;
@Autowired @Autowired
private AdamCaomeiBadgeApplyRecordMapper badgeApplyRecordMapper;
@Autowired
private AdamRdmService adamRdmService; private AdamRdmService adamRdmService;
@Override @Override
...@@ -132,6 +137,7 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse ...@@ -132,6 +137,7 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
AdamCaomeiPassportUserCardVo card = new AdamCaomeiPassportUserCardVo(); AdamCaomeiPassportUserCardVo card = new AdamCaomeiPassportUserCardVo();
card.setPassportBound(true); card.setPassportBound(true);
card.setPassportNo(bound.getPassportNo()); card.setPassportNo(bound.getPassportNo());
card.setPassportClaimedAt(bound.getBoundAt());
home.setUserCard(card); home.setUserCard(card);
// 2. 获取用户基本信息(头像、昵称) // 2. 获取用户基本信息(头像、昵称)
...@@ -162,6 +168,24 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse ...@@ -162,6 +168,24 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
: new ArrayList<>(); : new ArrayList<>();
log.info("[getPassportHome] 用户已支付的演出订单数量, uid: {}, 数量: {}", uid, paidPerformanceIds.size()); 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());
// 6. 查询用户已认领的所有徽章记录 (用于展示徽章墙) // 6. 查询用户已认领的所有徽章记录 (用于展示徽章墙)
List<AdamCaomeiPassportUserBadgeDto> rows = adamRdmService.getUserCaomeiBadgesByUid(uid); List<AdamCaomeiPassportUserBadgeDto> rows = adamRdmService.getUserCaomeiBadgesByUid(uid);
if (rows == null) { if (rows == null) {
...@@ -194,7 +218,7 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse ...@@ -194,7 +218,7 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
// 8. 组装全部上架徽章列表 (扁平结构,前端按 type 筛选展示) // 8. 组装全部上架徽章列表 (扁平结构,前端按 type 筛选展示)
List<AdamCaomeiPassportBadgeShelfItemVo> allBadges = published.stream() List<AdamCaomeiPassportBadgeShelfItemVo> allBadges = published.stream()
.map(b -> toShelfItem(b, claimedMap, paidPerformanceIds)) .map(b -> toShelfItem(b, claimedMap, paidPerformanceIds, passedApplyBadgeIds, pendingApplyBadgeIds))
.collect(Collectors.toList()); .collect(Collectors.toList());
home.setAllBadges(allBadges); home.setAllBadges(allBadges);
...@@ -206,17 +230,22 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse ...@@ -206,17 +230,22 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
* @param b 徽章信息 * @param b 徽章信息
* @param claimedMap 用户已领取的徽章 * @param claimedMap 用户已领取的徽章
* @param paidPerformanceIds 当前账号实名身份证号码购买的演出IDs * @param paidPerformanceIds 当前账号实名身份证号码购买的演出IDs
* @param passedApplyBadgeIds 补签审核已通过的徽章ID集合
* @param pendingApplyBadgeIds 补签待审核的徽章ID集合
* @return * @return
*/ */
private static AdamCaomeiPassportBadgeShelfItemVo toShelfItem(AdamCaomeiBadge b, private static AdamCaomeiPassportBadgeShelfItemVo toShelfItem(AdamCaomeiBadge b,
Map<String, AdamCaomeiPassportUserBadgeDto> claimedMap, Map<String, AdamCaomeiPassportUserBadgeDto> claimedMap,
List<String> paidPerformanceIds) { List<String> paidPerformanceIds,
Set<String> passedApplyBadgeIds,
Set<String> pendingApplyBadgeIds) {
AdamCaomeiPassportBadgeShelfItemVo v = new AdamCaomeiPassportBadgeShelfItemVo(); AdamCaomeiPassportBadgeShelfItemVo v = new AdamCaomeiPassportBadgeShelfItemVo();
v.setBadgeId(b.getBadgeId()); v.setBadgeId(b.getBadgeId());
v.setName(StringUtils.defaultString(b.getName())); v.setName(StringUtils.defaultString(b.getName()));
v.setIcon(StringUtils.defaultString(b.getIcon())); v.setIcon(StringUtils.defaultString(b.getIcon()));
v.setType(b.getType()); v.setType(b.getType());
v.setPerformanceId(StringUtils.defaultString(b.getPerformanceId())); v.setPerformanceId(StringUtils.defaultString(b.getPerformanceId()));
v.setApplyPending(false);
// 判断当前徽章是否已认领 // 判断当前徽章是否已认领
AdamCaomeiPassportUserBadgeDto got = claimedMap.get(b.getBadgeId()); AdamCaomeiPassportUserBadgeDto got = claimedMap.get(b.getBadgeId());
...@@ -232,8 +261,11 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse ...@@ -232,8 +261,11 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
// 护照纪念徽章:只要绑定了护照,就可认领(通常是绑定时漏发或后来新上架的) // 护照纪念徽章:只要绑定了护照,就可认领(通常是绑定时漏发或后来新上架的)
v.setClaimable(true); v.setClaimable(true);
} else if (type == 2) { } else if (type == 2) {
// 演出纪念徽章:只要有对应演出的已支付购票记录,就可认领 // 演出纪念徽章:有购票记录或补签审核通过即可认领
v.setClaimable(paidPerformanceIds != null && paidPerformanceIds.contains(b.getPerformanceId())); boolean canClaimByPaid = paidPerformanceIds != null && paidPerformanceIds.contains(b.getPerformanceId());
boolean canClaimByApply = passedApplyBadgeIds != null && passedApplyBadgeIds.contains(b.getBadgeId());
v.setClaimable(canClaimByPaid || canClaimByApply);
v.setApplyPending(pendingApplyBadgeIds != null && pendingApplyBadgeIds.contains(b.getBadgeId()));
} else if (type == 3) { } else if (type == 3) {
// 特殊徽章:不可自助领取,需要提示用户 // 特殊徽章:不可自助领取,需要提示用户
v.setClaimable(false); v.setClaimable(false);
......
...@@ -98,7 +98,7 @@ ...@@ -98,7 +98,7 @@
10608=\u60A8\u5DF2\u9886\u53D6\u8FC7\u8BE5\u5FBD\u7AE0 10608=\u60A8\u5DF2\u9886\u53D6\u8FC7\u8BE5\u5FBD\u7AE0
10609=\u8BA4\u9886\u62A4\u7167\u7EAA\u5FF5\u5FBD\u7AE0\u9700\u5148\u7ED1\u5B9A\u62A4\u7167 10609=\u8BA4\u9886\u62A4\u7167\u7EAA\u5FF5\u5FBD\u7AE0\u9700\u5148\u7ED1\u5B9A\u62A4\u7167
10610=\u8BA4\u9886\u6F14\u51FA\u5FBD\u7AE0\u9700\u5148\u5B9E\u540D 10610=\u8BA4\u9886\u6F14\u51FA\u5FBD\u7AE0\u9700\u5148\u5B9E\u540D
10611=\u672A\u67E5\u8BE2\u5230\u8BE5\u6F14\u51FA\u7684\u8D2D\u7968\u8BB0\u5F55\uFF0C\u65E0\u6CD5\u8BA4\u9886 10611=\u60A8\u6682\u65E0\u8D2D\u7968\u8BB0\u5F55\uFF0C\u8BF7\u4E0A\u4F20\u8BA2\u5355\u622A\u56FE
10612=\u7279\u6B8A\u5FBD\u7AE0\u4E0D\u53EF\u81EA\u52A9\u9886\u53D6 10612=\u7279\u6B8A\u5FBD\u7AE0\u4E0D\u53EF\u81EA\u52A9\u9886\u53D6
10613=\u672A\u77E5\u7684\u5FBD\u7AE0\u7C7B\u578B 10613=\u672A\u77E5\u7684\u5FBD\u7AE0\u7C7B\u578B
......
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