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

Commit ce4fe5ed authored by wangyifan's avatar wangyifan

草莓护照-校验用户是否绑定护照API

parent 9b3624e6
...@@ -3,6 +3,8 @@ package com.liquidnet.client.admin.zhengzai.adam.service.impl; ...@@ -3,6 +3,8 @@ package com.liquidnet.client.admin.zhengzai.adam.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamCaomeiPassportAdminService; import com.liquidnet.client.admin.zhengzai.adam.service.IAdamCaomeiPassportAdminService;
import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.AdamCaomeiPassportListDto; import com.liquidnet.service.adam.dto.AdamCaomeiPassportListDto;
import com.liquidnet.service.adam.dto.AdamCaomeiPassportUserBadgeDto; import com.liquidnet.service.adam.dto.AdamCaomeiPassportUserBadgeDto;
import com.liquidnet.service.adam.dto.param.AdamCaomeiPassportSearchParam; import com.liquidnet.service.adam.dto.param.AdamCaomeiPassportSearchParam;
...@@ -44,6 +46,8 @@ public class AdamCaomeiPassportAdminServiceImpl implements IAdamCaomeiPassportAd ...@@ -44,6 +46,8 @@ public class AdamCaomeiPassportAdminServiceImpl implements IAdamCaomeiPassportAd
private AdamRealNameMapper adamRealNameMapper; private AdamRealNameMapper adamRealNameMapper;
@Autowired @Autowired
private AdamCaomeiBadgeMapper adamCaomeiBadgeMapper; private AdamCaomeiBadgeMapper adamCaomeiBadgeMapper;
@Autowired
private RedisDataSourceUtil redisDataSourceUtil;
@Override @Override
public PageInfo<AdamCaomeiPassportListVo> listPassports(AdamCaomeiPassportSearchParam param) { public PageInfo<AdamCaomeiPassportListVo> listPassports(AdamCaomeiPassportSearchParam param) {
...@@ -157,6 +161,8 @@ public class AdamCaomeiPassportAdminServiceImpl implements IAdamCaomeiPassportAd ...@@ -157,6 +161,8 @@ public class AdamCaomeiPassportAdminServiceImpl implements IAdamCaomeiPassportAd
if (StringUtils.isNotBlank(uid)) { if (StringUtils.isNotBlank(uid)) {
// 解绑后,清理该用户由“绑定护照”自动发放的护照纪念徽章 // 解绑后,清理该用户由“绑定护照”自动发放的护照纪念徽章
adamCaomeiBadgeMapper.deletePassportTypeBadgesByUid(uid); adamCaomeiBadgeMapper.deletePassportTypeBadgesByUid(uid);
// 清理用户草莓徽章缓存,避免前端短时间读到解绑前数据
redisDataSourceUtil.getRedisAdamUtil().del(AdamRedisConst.INFO_CAOMEI_BADGE_USER.concat(uid));
} }
return true; return true;
} }
......
...@@ -710,6 +710,22 @@ public class AdamRdmService { ...@@ -710,6 +710,22 @@ public class AdamRdmService {
return setUserCaomeiBadgesByUid(uid, vos); return setUserCaomeiBadgesByUid(uid, vos);
} }
/**
* 用户认领徽章时批量追加(一次 set 回 Redis,避免循环多次写 Redis)
*/
public boolean addUserCaomeiBadgeDtosByUid(String uid,
List<AdamCaomeiPassportUserBadgeDto> vos,
List<AdamCaomeiPassportUserBadgeDto> appendVos) {
if (vos == null) {
vos = new ArrayList<>();
}
if (CollectionUtils.isEmpty(appendVos)) {
return setUserCaomeiBadgesByUid(uid, vos);
}
vos.addAll(appendVos);
return setUserCaomeiBadgesByUid(uid, vos);
}
/** /**
* 根据身份证获取已支付演出ID列表(60秒短缓存,缓解无索引热点查询) * 根据身份证获取已支付演出ID列表(60秒短缓存,缓解无索引热点查询)
*/ */
......
...@@ -159,7 +159,7 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi ...@@ -159,7 +159,7 @@ public class AdamCaomeiBadgeUserServiceImpl implements IAdamCaomeiBadgeUserServi
long t = System.currentTimeMillis(); long t = System.currentTimeMillis();
queueUtils.sendMsgByRedis( queueUtils.sendMsgByRedis(
MQConst.AdamQueue.SQL_UCENTER.getKey(), MQConst.AdamQueue.SQL_UCENTER.getKey(),
SqlMapping.get("adam_caomei_user_badge.add", uid, badge.getBadgeId(), source) SqlMapping.get("adam_caomei_user_badge.add", uid, badge.getBadgeId(), source, now)
); );
log.debug("[claimBadge] MQ耗时:{}ms, uid: {}, badgeId: {}", System.currentTimeMillis() - t, uid, badge.getBadgeId()); log.debug("[claimBadge] MQ耗时:{}ms, uid: {}, badgeId: {}", System.currentTimeMillis() - t, uid, badge.getBadgeId());
} }
......
...@@ -2,6 +2,7 @@ package com.liquidnet.service.adam.service.impl; ...@@ -2,6 +2,7 @@ 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.CurrentUtil; import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.DateUtil;
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;
...@@ -12,20 +13,18 @@ import com.liquidnet.service.adam.mapper.AdamCaomeiBadgeMapper; ...@@ -12,20 +13,18 @@ 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;
import com.liquidnet.service.adam.service.IAdamCaomeiPassportUserService; import com.liquidnet.service.adam.service.IAdamCaomeiPassportUserService;
import com.liquidnet.service.adam.util.QueueUtils;
import com.liquidnet.service.base.ErrorMapping; import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; 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.ArrayList; import java.util.*;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
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;
...@@ -41,6 +40,8 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse ...@@ -41,6 +40,8 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
private AdamCaomeiBadgeApplyRecordMapper badgeApplyRecordMapper; private AdamCaomeiBadgeApplyRecordMapper badgeApplyRecordMapper;
@Autowired @Autowired
private AdamRdmService adamRdmService; private AdamRdmService adamRdmService;
@Autowired
private QueueUtils queueUtils;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -87,29 +88,68 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse ...@@ -87,29 +88,68 @@ public class AdamCaomeiPassportUserServiceImpl implements IAdamCaomeiPassportUse
if (publishedBadges == null) { if (publishedBadges == null) {
publishedBadges = new ArrayList<>(); publishedBadges = new ArrayList<>();
} }
// 所有护照类型徽章
List<AdamCaomeiBadge> passportTypeBadges = publishedBadges.stream() List<AdamCaomeiBadge> passportTypeBadges = publishedBadges.stream()
.filter(b -> b.getType() != null && b.getType() == 1) .filter(b -> b.getType() != null && b.getType() == 1)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (passportTypeBadges.isEmpty()) {
log.info("[bindPassport] 暂无上架徽章");
return ResponseDto.success();
}
List<String> badgeIds = passportTypeBadges.stream() List<String> badgeIds = passportTypeBadges.stream()
.map(AdamCaomeiBadge::getBadgeId) .map(AdamCaomeiBadge::getBadgeId)
.filter(StringUtils::isNotBlank) .filter(StringUtils::isNotBlank)
.collect(Collectors.toList()); .collect(Collectors.toList());
Date grantAt = new Date();
if (!badgeIds.isEmpty()) { Date grantAt = DateUtil.now();
adamCaomeiBadgeMapper.insertUserBadgesBatch(uid, badgeIds, 1, grantAt);
// 兼容 claimBadge 的写法:把本次发放的护照徽章同时写入用户徽章缓存列表
List<AdamCaomeiPassportUserBadgeDto> cacheBadgeVos = adamRdmService.getUserCaomeiBadgesByUid(uid);
if (cacheBadgeVos == null) {
cacheBadgeVos = new ArrayList<>();
} else {
cacheBadgeVos = new ArrayList<>(cacheBadgeVos);
}
Set<String> existedBadgeIds = cacheBadgeVos.stream()
.map(AdamCaomeiPassportUserBadgeDto::getBadgeId)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toSet());
List<AdamCaomeiPassportUserBadgeDto> appendVos = passportTypeBadges.stream()
.filter(b -> b != null && StringUtils.isNotBlank(b.getBadgeId()) && !existedBadgeIds.contains(b.getBadgeId()))
.map(b -> {
AdamCaomeiPassportUserBadgeDto dto = new AdamCaomeiPassportUserBadgeDto();
dto.setBadgeId(b.getBadgeId());
dto.setBadgeName(StringUtils.defaultString(b.getName()));
dto.setIcon(StringUtils.defaultString(b.getIcon()));
dto.setShareText(StringUtils.defaultString(b.getShareText()));
dto.setType(b.getType());
dto.setClaimedAt(grantAt);
dto.setSource(1);
return dto;
})
.collect(Collectors.toList());
adamRdmService.addUserCaomeiBadgeDtosByUid(uid, cacheBadgeVos, appendVos);
LinkedList<Object[]> paramsList = new LinkedList<>();
for (String badgeId : badgeIds) {
paramsList.add(new Object[]{uid, badgeId, 1, grantAt});
} }
// 清理用户徽章缓存,下次读取首页时回源并重建 queueUtils.sendMsgByRedis(
adamRdmService.delUserCaomeiBadgesByUid(uid); MQConst.AdamQueue.SQL_UCENTER.getKey(),
SqlMapping.get("adam_caomei_user_badge.add", paramsList)
);
// 5. 返回本次绑定场景下的护照类型徽章列表(用于前端弹窗) // 5. 返回本次绑定场景下的护照类型徽章列表(用于前端弹窗)
List<AdamCaomeiPassportUserClaimedBadgeVo> grantedBadges = passportTypeBadges.stream().map(b -> { List<AdamCaomeiPassportUserClaimedBadgeVo> grantedBadges = appendVos.stream().map(b -> {
AdamCaomeiPassportUserClaimedBadgeVo v = new AdamCaomeiPassportUserClaimedBadgeVo(); AdamCaomeiPassportUserClaimedBadgeVo v = new AdamCaomeiPassportUserClaimedBadgeVo();
v.setBadgeId(b.getBadgeId()); v.setBadgeId(b.getBadgeId());
v.setName(StringUtils.defaultString(b.getName())); v.setName(StringUtils.defaultString(b.getBadgeName()));
v.setIcon(StringUtils.defaultString(b.getIcon())); v.setIcon(StringUtils.defaultString(b.getIcon()));
v.setShareText(StringUtils.defaultString(b.getShareText())); v.setShareText(StringUtils.defaultString(b.getShareText()));
v.setType(b.getType()); v.setType(b.getType());
v.setClaimedAt(grantAt); v.setClaimedAt(b.getClaimedAt());
v.setSource(1); v.setSource(1);
return v; return v;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
......
...@@ -80,12 +80,12 @@ adam_user_mobile_locate.update_province=UPDATE adam_user_mobile_locate SET provi ...@@ -80,12 +80,12 @@ adam_user_mobile_locate.update_province=UPDATE adam_user_mobile_locate SET provi
adam_user_mobile_locate.close=UPDATE adam_user_mobile_locate SET `state`=2, updated_at=? WHERE uid=? AND `state`=1 adam_user_mobile_locate.close=UPDATE adam_user_mobile_locate SET `state`=2, updated_at=? WHERE uid=? AND `state`=1
# ---------------------------------------------------- # ----------------------------------------------------
# 草莓护照-用户徽章获得记录 (adam_caomei_user_badge) # \u8349\u8393\u62A4\u7167-\u7528\u6237\u5FBD\u7AE0\u83B7\u5F97\u8BB0\u5F55 (adam_caomei_user_badge)
# 用户端 claimBadge:与 AdamCaomeiBadgeUserServiceImpl 中「先写 Redis 用户徽章列表、再 MQ 异步落库」配套;参数顺序 user_id, badge_id, source;created_at 由库端 now() 写入 # \u7528\u6237\u7AEF claimBadge\uFF1A\u4E0E AdamCaomeiBadgeUserServiceImpl \u4E2D\u300C\u5148\u5199 Redis \u7528\u6237\u5FBD\u7AE0\u5217\u8868\u3001\u518D MQ \u5F02\u6B65\u843D\u5E93\u300D\u914D\u5957\uFF1B\u53C2\u6570\u987A\u5E8F user_id, badge_id, source\uFF1Bcreated_at \u7531\u5E93\u7AEF now() \u5199\u5165
adam_caomei_user_badge.add=INSERT INTO adam_caomei_user_badge (user_id, badge_id, source, created_at) VALUES (?,?,?,now()) adam_caomei_user_badge.add=INSERT INTO adam_caomei_user_badge (user_id, badge_id, source, created_at) VALUES (?,?,?,?)
# 草莓护照-徽章补签申请 (adam_caomei_badge_apply_record) # \u8349\u8393\u62A4\u7167-\u5FBD\u7AE0\u8865\u7B7E\u7533\u8BF7 (adam_caomei_badge_apply_record)
# 用户端 applyBadge:与「先写 Redis 补签列表、再 MQ 异步落库」配套;参数顺序 apply_record_id, user_id, badge_id, performance_id, proof_image_url;audit_status=0、reject_reason 空串、时间由 now() 写入 # \u7528\u6237\u7AEF applyBadge\uFF1A\u4E0E\u300C\u5148\u5199 Redis \u8865\u7B7E\u5217\u8868\u3001\u518D MQ \u5F02\u6B65\u843D\u5E93\u300D\u914D\u5957\uFF1B\u53C2\u6570\u987A\u5E8F apply_record_id, user_id, badge_id, performance_id, proof_image_url\uFF1Baudit_status=0\u3001reject_reason \u7A7A\u4E32\u3001\u65F6\u95F4\u7531 now() \u5199\u5165
adam_caomei_badge_apply_record.add=INSERT INTO adam_caomei_badge_apply_record (apply_record_id, user_id, badge_id, performance_id, proof_image_url, audit_status, reject_reason, created_at, updated_at) VALUES (?,?,?,?,?,0,'',now(),now()) adam_caomei_badge_apply_record.add=INSERT INTO adam_caomei_badge_apply_record (apply_record_id, user_id, badge_id, performance_id, proof_image_url, audit_status, reject_reason, created_at, updated_at) VALUES (?,?,?,?,?,0,'',now(),now())
# ---------------------------------------------------- # ----------------------------------------------------
......
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