|
@@ -9,14 +9,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.google.common.collect.Lists;
|
|
|
-import com.google.gson.JsonObject;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
-import org.apache.ibatis.annotations.Param;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
import shop.alien.entity.second.SecondGoods;
|
|
|
import shop.alien.entity.second.SecondGoodsAudit;
|
|
|
+import shop.alien.entity.second.enums.SecondGoodsStatusEnum;
|
|
|
import shop.alien.entity.second.vo.SecondGoodsVo;
|
|
|
import shop.alien.entity.second.vo.SellGoodsVo;
|
|
|
import shop.alien.entity.store.*;
|
|
@@ -25,9 +24,8 @@ import shop.alien.mapper.*;
|
|
|
import shop.alien.mapper.second.SecondGoodsAuditMapper;
|
|
|
import shop.alien.mapper.second.SecondGoodsMapper;
|
|
|
import shop.alien.second.service.SecondGoodsService;
|
|
|
+import shop.alien.util.common.Constants;
|
|
|
import shop.alien.util.common.VideoUtils;
|
|
|
-import shop.alien.util.common.netease.ImageCheckUtil;
|
|
|
-import shop.alien.util.common.netease.TextCheckUtil;
|
|
|
import shop.alien.util.common.safe.*;
|
|
|
|
|
|
import java.util.Collections;
|
|
@@ -104,7 +102,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
SecondGoods secondGoods = new SecondGoods();
|
|
|
BeanUtils.copyProperties(goods, secondGoods);
|
|
|
// 设置商品状态为草稿
|
|
|
- goods.setGoodsStatus(0); // TODO: 使用常量或枚举代替硬编码
|
|
|
+ goods.setGoodsStatus(SecondGoodsStatusEnum.DRAFT.getCode());
|
|
|
// 保存商品基本信息
|
|
|
if (!save(goods)) {
|
|
|
return false; // 保存失败直接返回
|
|
@@ -178,10 +176,10 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
|
|
|
if ("high".equals(textCheckResult.getRiskLevel())) {
|
|
|
// 文本审核不通过或存在高风险
|
|
|
- goods.setGoodsStatus(2); // 审核失败
|
|
|
+ goods.setGoodsStatus(SecondGoodsStatusEnum.REVIEW_FAILED.getCode()); // 审核失败
|
|
|
goods.setFailedReason("文本审核不通过:" + (textCheckResult.getRiskWords() != null ? textCheckResult.getRiskWords() : "存在高风险内容"));
|
|
|
// 插入审核记录
|
|
|
- createGoodsAudit(goods, textCheckResult.getRiskWords(),2);
|
|
|
+ createGoodsAudit(goods, textCheckResult.getRiskWords(), Constants.AuditStatus.FAILED);
|
|
|
// 发送审核失败消息
|
|
|
sendFailedMsg(goods);
|
|
|
return false;
|
|
@@ -199,10 +197,10 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
ImageModerationResultVO response = imageModerationUtil.productPublishCheck(imageUrl,imgServicesList);
|
|
|
if ("high".equals(response.getRiskLevel())) {
|
|
|
// 文本审核不通过或存在高风险
|
|
|
- goods.setGoodsStatus(2); // 审核失败
|
|
|
+ goods.setGoodsStatus(SecondGoodsStatusEnum.REVIEW_FAILED.getCode()); // 审核失败
|
|
|
goods.setFailedReason("图片审核不通过:图片中包含" + (response.getDescriptions() != null ? response.getDescriptions() : "高风险内容"));
|
|
|
// 插入审核记录
|
|
|
- createGoodsAudit(goods, response.getDescriptions(),2);
|
|
|
+ createGoodsAudit(goods, response.getDescriptions(), Constants.AuditStatus.FAILED);
|
|
|
// 发送审核失败消息
|
|
|
sendFailedMsg(goods);
|
|
|
return false;
|
|
@@ -211,12 +209,12 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
}
|
|
|
|
|
|
// 如果所有审核都通过,设置为上架状态
|
|
|
- goods.setGoodsStatus(3); // 上架
|
|
|
+ goods.setGoodsStatus(SecondGoodsStatusEnum.LISTED.getCode()); // 上架
|
|
|
goods.setFailedReason("");
|
|
|
goods.setReleaseTime(new Date()); // 上架时间
|
|
|
updateById(goods);
|
|
|
// 插入审核记录
|
|
|
- createGoodsAudit(goods, "",1);
|
|
|
+ createGoodsAudit(goods, "", Constants.AuditStatus.PASSED);
|
|
|
// 发送审核成功消息
|
|
|
sendMessage(goods);
|
|
|
return true;
|
|
@@ -235,7 +233,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
SecondGoodsAudit auditRecord = new SecondGoodsAudit();
|
|
|
auditRecord.setGoodsId(goods.getId());
|
|
|
auditRecord.setGoodsStatus(goodsStatus); // 审核失败
|
|
|
- if (goodsStatus == 2) {
|
|
|
+ if (Constants.AuditStatus.FAILED.equals(goodsStatus)) {
|
|
|
auditRecord.setFailedReason("文本审核不通过:" + (riskWords != null ? riskWords : "存在高风险内容"));
|
|
|
}
|
|
|
auditRecord.setCreatedUserId(goods.getUserId());
|
|
@@ -271,10 +269,10 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
for(int i = 0; i < imgUrl.size(); i++){
|
|
|
StoreImg storeImg = new StoreImg();
|
|
|
storeImg.setStoreId(savedGoodsId);
|
|
|
- storeImg.setImgType(18);
|
|
|
+ storeImg.setImgType(Constants.ImageType.SECOND_HAND_GOODS);
|
|
|
storeImg.setImgSort(i);
|
|
|
storeImg.setImgDescription("发布二手商品图片");
|
|
|
- storeImg.setDeleteFlag(0);
|
|
|
+ storeImg.setDeleteFlag(Constants.DeleteFlag.NOT_DELETED);
|
|
|
storeImg.setCreatedTime(new Date());
|
|
|
storeImg.setUpdatedTime(new Date());
|
|
|
storeImg.setCreatedUserId(1);
|
|
@@ -304,8 +302,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
jsonObject.put("status", "true");
|
|
|
jsonObject.put("message", "恭喜您的商品已发成功");
|
|
|
lifeNotice.setContext(jsonObject.toJSONString());
|
|
|
-// lifeNotice.setContext("恭喜您的商品已发成功");
|
|
|
- lifeNotice.setNoticeType(1); // 系统通知
|
|
|
+ lifeNotice.setNoticeType(Constants.Notice.SYSTEM_NOTICE); // 系统通知
|
|
|
lifeNotice.setIsRead(0);
|
|
|
lifeNoticeMapper.insert(lifeNotice);
|
|
|
}
|
|
@@ -331,9 +328,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
jsonObject.put("status", "false");
|
|
|
jsonObject.put("message", "抱歉您的商品发布失败,图片或文字存在违规行为。请您修改后从新发布");
|
|
|
lifeNotice.setContext(jsonObject.toJSONString());
|
|
|
-// lifeNotice.setContext("商品审核失败,原因为:" + goods.getFailedReason());
|
|
|
-// lifeNotice.setContext("抱歉您的商品发布失败,图片或文字存在违规行为。请您修改后从新发布");
|
|
|
- lifeNotice.setNoticeType(1); // 系统通知
|
|
|
+ lifeNotice.setNoticeType(Constants.Notice.SYSTEM_NOTICE); // 系统通知
|
|
|
lifeNotice.setIsRead(0);
|
|
|
lifeNoticeMapper.insert(lifeNotice);
|
|
|
}
|
|
@@ -471,7 +466,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
LambdaUpdateWrapper<LifeLikeRecord> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
updateWrapper.eq(LifeLikeRecord::getHuifuId, goods.getId())
|
|
|
.eq(LifeLikeRecord::getDianzanId, "user_"+phone).
|
|
|
- eq(LifeLikeRecord::getType, 6); // 6-二手商品
|
|
|
+ eq(LifeLikeRecord::getType, Constants.LikeType.SECOND_HAND_GOODS); // 6-二手商品
|
|
|
if (lifeLikeRecordMapper.selectCount(updateWrapper) > 0) {
|
|
|
goods.setLikeStatus(1);
|
|
|
}
|
|
@@ -491,8 +486,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
if (userId != null) {
|
|
|
LambdaUpdateWrapper<LifeCollect> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
updateWrapper.eq(LifeCollect::getUserId, "user_"+phone)
|
|
|
- .eq(LifeCollect::getBusinessType, 1)
|
|
|
- .eq(LifeCollect::getDeleteFlag, 0)
|
|
|
+ .eq(LifeCollect::getBusinessType, Constants.CollectBusinessType.DEFAULT)
|
|
|
+ .eq(LifeCollect::getDeleteFlag, Constants.DeleteFlag.NOT_DELETED)
|
|
|
.eq(LifeCollect::getBusinessId, goods.getId());
|
|
|
if (lifeCollectMapper.selectCount(updateWrapper) > 0) {
|
|
|
goods.setCollectStatus(1);
|
|
@@ -520,13 +515,13 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
public SecondGoodsVo getSecondGoodsById(Integer id) {
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
queryWrapper.eq("sg.id", id)
|
|
|
- .eq("sg.delete_flag", 0);
|
|
|
+ .eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED);
|
|
|
SecondGoodsVo secondGoods = secondGoodsMapper.getGoodsDetails(queryWrapper);
|
|
|
// 设置图片信息
|
|
|
QueryWrapper<StoreImg> query = new QueryWrapper<>();
|
|
|
query.lambda()
|
|
|
- .eq(StoreImg::getImgType, 18) // 商品 图片
|
|
|
- .eq(StoreImg::getDeleteFlag, 0)
|
|
|
+ .eq(StoreImg::getImgType, Constants.ImageType.SECOND_HAND_GOODS) // 商品 图片
|
|
|
+ .eq(StoreImg::getDeleteFlag, Constants.DeleteFlag.NOT_DELETED)
|
|
|
.in(StoreImg::getStoreId, id);
|
|
|
List<StoreImg> storeImgs = storeImgMapper.selectList(query);
|
|
|
// 设置图片信息
|
|
@@ -539,8 +534,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
@Override
|
|
|
public IPage<SecondGoodsVo> getShieldedGoodsPage(IPage<SecondGoodsVo> page, Integer userId) {
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("sg.delete_flag", 0)
|
|
|
- .eq("ss.delete_flag", 0)
|
|
|
+ queryWrapper.eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
+ .eq("ss.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
.eq("ss.user_id", userId)
|
|
|
.eq("ss.shield_type", 1);
|
|
|
return secondGoodsMapper.getShieldedGoodsPage(page, queryWrapper);
|
|
@@ -557,8 +552,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
public IPage<SecondGoodsVo> getCollectGoodsPage(IPage<SecondGoodsVo> page, int userId) {
|
|
|
LifeUser lifeUser = lifeUserMapper.selectById(userId);
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("sg.delete_flag", 0)
|
|
|
- .eq("lc.delete_flag", 0)
|
|
|
+ queryWrapper.eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
+ .eq("lc.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
.eq("lc.user_id", "user_"+lifeUser.getUserPhone());
|
|
|
return secondGoodsMapper.getCollectGoodsPage(page, queryWrapper);
|
|
|
}
|
|
@@ -572,10 +567,10 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
@Override
|
|
|
public IPage<SecondGoodsVo> getBuyGoodsPage(IPage<SecondGoodsVo> page, int userId) {
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("sg.delete_flag", 0)
|
|
|
- .eq("str.delete_flag", 0)
|
|
|
+ queryWrapper.eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
+ .eq("str.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
.eq("str.buyer_id", userId) // 买家ID
|
|
|
- .eq("str.trade_status", 1); // 1-交易成功
|
|
|
+ .eq("str.trade_status", Constants.TradeStatus.SUCCESS); // 1-交易成功
|
|
|
return secondGoodsMapper.getBuyGoodsPage(page, queryWrapper);
|
|
|
}
|
|
|
|
|
@@ -588,7 +583,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
@Override
|
|
|
public IPage<SecondGoodsVo> getSellGoodsPage(IPage<SecondGoodsVo> page, SecondGoodsVo secondGoodsVo,int userId) {
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("sg.delete_flag", 0)
|
|
|
+ queryWrapper.eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
.eq("sg.user_id", userId)
|
|
|
.eq("sg.goods_status", secondGoodsVo.getGoodsStatus()); // 5-已售出 ,0-草稿
|
|
|
return secondGoodsMapper.getSellGoodsPage(page, queryWrapper);
|
|
@@ -603,9 +598,9 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
@Override
|
|
|
public IPage<SecondGoodsVo> getUserGoodsPage(IPage<SecondGoodsVo> page, Double currentLatitude , Double currentLongitude, Integer userId) {
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("sg.delete_flag", 0)
|
|
|
+ queryWrapper.eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
.eq("sg.user_id", userId) // 主页用户ID
|
|
|
- .in("sg.goods_status",3,5) // 3-上架 5-已售出
|
|
|
+ .in("sg.goods_status", SecondGoodsStatusEnum.LISTED.getCode(), SecondGoodsStatusEnum.SOLD.getCode()) // 3-上架 5-已售出
|
|
|
.orderByAsc("FIELD(sg.goods_status, 3, 5)")
|
|
|
.orderByDesc("sg.release_time");
|
|
|
return secondGoodsMapper.getUserGoodsPage(page, currentLatitude, currentLongitude, queryWrapper);
|
|
@@ -620,9 +615,12 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
@Override
|
|
|
public IPage<SecondGoodsVo> getMyGoodsPage(IPage<SecondGoodsVo> page, int userId) {
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("sg.delete_flag", 0)
|
|
|
+ queryWrapper.eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
.eq("sg.user_id", userId) // 用户ID
|
|
|
- .in("sg.goods_status", 2, 3, 4, 5) // 3-上架 5-已售出
|
|
|
+ .in("sg.goods_status", SecondGoodsStatusEnum.REVIEW_FAILED.getCode(),
|
|
|
+ SecondGoodsStatusEnum.DELISTED.getCode(),
|
|
|
+ SecondGoodsStatusEnum.SOLD.getCode(),
|
|
|
+ SecondGoodsStatusEnum.LISTED.getCode()) // 3-上架 5-已售出
|
|
|
.orderByAsc("FIELD(sg.goods_status, 2, 4, 5, 3)")
|
|
|
.orderByDesc("sg.release_time");
|
|
|
return secondGoodsMapper.getMyGoodsPage(page, queryWrapper);
|
|
@@ -637,9 +635,9 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
@Override
|
|
|
public IPage<SecondGoodsVo> getDraftList(IPage<SecondGoodsVo> page, int userId) {
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("sg.delete_flag", 0)
|
|
|
+ queryWrapper.eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
.eq("sg.user_id", userId) // 用户ID
|
|
|
- .eq("sg.goods_status", 0);
|
|
|
+ .eq("sg.goods_status", SecondGoodsStatusEnum.DRAFT.getCode());
|
|
|
return secondGoodsMapper.getDraftList(page, queryWrapper);
|
|
|
}
|
|
|
|
|
@@ -653,10 +651,10 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
@Override
|
|
|
public IPage<SecondGoodsVo> getLikeGoodsPage(IPage<SecondGoodsVo> page, int userId, String phone) {
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("sg.delete_flag", 0)
|
|
|
- .eq("lc.delete_flag",0)
|
|
|
+ queryWrapper.eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
+ .eq("lc.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
.eq("lc.dianzan_id", "user_"+phone)
|
|
|
- .eq("lc.type", 6) // 6-二手商品
|
|
|
+ .eq("lc.type", Constants.LikeType.SECOND_HAND_GOODS) // 6-二手商品
|
|
|
.eq("sg.user_id", userId); // 用户ID
|
|
|
return secondGoodsMapper.getLikeGoodsPage(page, queryWrapper);
|
|
|
}
|
|
@@ -665,14 +663,14 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
* 获取交易列表
|
|
|
* @param page 分页参数
|
|
|
* @param userId 用户ID
|
|
|
- * @return IPage<SecondGoodsVo> 交易列表
|
|
|
+ * @return IPage<SellGoodsVo> 交易列表
|
|
|
*/
|
|
|
@Override
|
|
|
public IPage<SellGoodsVo> getTransactionList(IPage<SellGoodsVo> page, Integer userId) {
|
|
|
IPage<SellGoodsVo> result = new Page<>();
|
|
|
QueryWrapper<SellGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.eq("sg.delete_flag", 0)
|
|
|
- .eq("str.delete_flag", 0)
|
|
|
+ queryWrapper.eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
+ .eq("str.delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
.and(wrapper -> wrapper.eq("str.buyer_id", userId)
|
|
|
.or()
|
|
|
.eq("str.seller_id", userId));
|
|
@@ -711,8 +709,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
|
|
|
queryWrapper.notIn(CollectionUtil.isNotEmpty(shieldedGoodsIds), "sg.id", shieldedGoodsIds)
|
|
|
.notIn(CollectionUtil.isNotEmpty(userIdList), "sg.user_id", userIdList)
|
|
|
- .eq("sg.goods_status", 3)// 3-上架
|
|
|
- .eq("sg.delete_flag", 0);
|
|
|
+ .eq("sg.goods_status", SecondGoodsStatusEnum.LISTED.getCode())// 3-上架
|
|
|
+ .eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED);
|
|
|
// 添加对 searchData 的模糊查询
|
|
|
if (!StringUtils.isEmpty(secondGoodsVo.getSearchData())) {
|
|
|
String searchData = "%" + secondGoodsVo.getSearchData() + "%";
|
|
@@ -799,8 +797,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
// 批量获取图片信息
|
|
|
QueryWrapper<StoreImg> queryWrapper = new QueryWrapper<>();
|
|
|
queryWrapper.lambda()
|
|
|
- .eq(StoreImg::getImgType, 18) // 商品 图片
|
|
|
- .eq(StoreImg::getDeleteFlag, 0)
|
|
|
+ .eq(StoreImg::getImgType, Constants.ImageType.SECOND_HAND_GOODS) // 商品 图片
|
|
|
+ .eq(StoreImg::getDeleteFlag, Constants.DeleteFlag.NOT_DELETED)
|
|
|
.in(StoreImg::getStoreId, goodsIds);
|
|
|
List<StoreImg> imagesList= storeImgMapper.getImgsByGoodsIds(queryWrapper);
|
|
|
// 集合根據商品id进行分组返回map
|
|
@@ -837,7 +835,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
|
|
|
|
|
|
QueryWrapper<LifeUserVo> queryWrapper = new QueryWrapper<>();
|
|
|
queryWrapper.in("id", userIds)
|
|
|
- .eq("delete_flag", 0);
|
|
|
+ .eq("delete_flag", Constants.DeleteFlag.NOT_DELETED);
|
|
|
|
|
|
List<LifeUserVo> userInfoList = lifeUserMapper.getUserByIds(queryWrapper);
|
|
|
Map<Integer, LifeUserVo> userInfoMap = userInfoList.stream()
|