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

Commit d44567c8 authored by jiangxiulong's avatar jiangxiulong

nft藏品列表

parent d5713c7d
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@ApiModel(value = "GoblinNftGoodsSkuListJobVo", description = "NFT商品SKU信息JOB使用")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoblinNftGoodsSkuListJobVo implements Serializable {
private static final long serialVersionUID = 6938159791378866727L;
@ApiModelProperty(position = 10, value = "商品单品ID")
private String skuId;
@ApiModelProperty(position = 11, value = "商品ID[64]")
private String spuId;
@ApiModelProperty(position = 16, value = "是否盲盒[0-否|1-是]")
private String unbox;
@ApiModelProperty(position = 27, value = "开售时间")
private LocalDateTime saleStartTime;
@ApiModelProperty(position = 56, value = "是否售罄[0-否|1-是] 服务端判断库存使用")
private String soldoutStatus;
}
...@@ -61,7 +61,7 @@ public class GoblinNftGoodsSkuListVo implements Serializable, Cloneable { ...@@ -61,7 +61,7 @@ public class GoblinNftGoodsSkuListVo implements Serializable, Cloneable {
} }
} }
public GoblinNftGoodsSkuListVo copy(GoblinGoodsSkuInfoVo source, AnticipateValueVo anticipateValueVo) { public GoblinNftGoodsSkuListVo copy(GoblinGoodsSkuInfoVo source) {
if (null == source) return this; if (null == source) return this;
this.setSkuId(source.getSkuId()); this.setSkuId(source.getSkuId());
this.setSpuId(source.getSpuId()); this.setSpuId(source.getSpuId());
...@@ -71,6 +71,10 @@ public class GoblinNftGoodsSkuListVo implements Serializable, Cloneable { ...@@ -71,6 +71,10 @@ public class GoblinNftGoodsSkuListVo implements Serializable, Cloneable {
this.setSaleStartTime(source.getSaleStartTime()); this.setSaleStartTime(source.getSaleStartTime());
this.setSoldoutStatus(source.getSoldoutStatus()); this.setSoldoutStatus(source.getSoldoutStatus());
this.setUnbox(source.getUnbox()); this.setUnbox(source.getUnbox());
return this;
}
public GoblinNftGoodsSkuListVo setAnticipateValueVo(AnticipateValueVo anticipateValueVo) {
if (anticipateValueVo != null) { if (anticipateValueVo != null) {
if (anticipateValueVo.getAboutEndDate() != null) { if (anticipateValueVo.getAboutEndDate() != null) {
this.setAboutEndDate(DateUtil.Formatter.yyyyMMddHHmmss.format(anticipateValueVo.getAboutEndDate())); this.setAboutEndDate(DateUtil.Formatter.yyyyMMddHHmmss.format(anticipateValueVo.getAboutEndDate()));
......
package com.liquidnet.service.goblin.controller.Inner;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.service.impl.inner.GoblinNftJobServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Api(tags = "@API:RSC")
@RestController
@Validated
@RequestMapping("/nft/job")
public class GoblinNftJobController {
@Autowired
GoblinNftJobServiceImpl goblinNftJobService;
@GetMapping("goodsList")
@ApiOperation("NFT商品列表JOB")
public ResponseDto<Boolean> getGoodsList() {
return goblinNftJobService.goodsList();
}
}
package com.liquidnet.service.goblin.service.impl; package com.liquidnet.service.goblin.service.impl;
import com.liquidnet.common.cache.redis.util.RedisUtil; import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.CurrentUtil; import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.PagedResult; import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
...@@ -14,19 +13,15 @@ import com.liquidnet.service.goblin.util.*; ...@@ -14,19 +13,15 @@ import com.liquidnet.service.goblin.util.*;
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.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Comparator; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
@Service @Service
@Slf4j @Slf4j
...@@ -49,66 +44,45 @@ public class GoblinNftGoodsAppServiceImpl implements IGoblinNftGoodsAppService { ...@@ -49,66 +44,45 @@ public class GoblinNftGoodsAppServiceImpl implements IGoblinNftGoodsAppService {
@Autowired @Autowired
IGoblinGoodsAnticipateMgService goblinGoodsAnticipateMgService; IGoblinGoodsAnticipateMgService goblinGoodsAnticipateMgService;
final static int size = 40; final static int size = 20;
@Override @Override
public ResponseDto<PagedResult<GoblinNftGoodsSkuListVo>> goodsList(int page) { public ResponseDto<PagedResult<GoblinNftGoodsSkuListVo>> goodsList(int page) {
List<String> skuIdList = goblinRedisUtils.getGoblinNftGoodsInfoListVo(); List<String> startSkuIdList = goblinRedisUtils.getGoblinNftGoodsInfoListVo("1");
List<String> notStartSkuIdList = goblinRedisUtils.getGoblinNftGoodsInfoListVo("2");
List<String> soldOutSkuIdList = goblinRedisUtils.getGoblinNftGoodsInfoListVo("3");
List<String> allIdList = Stream.of(startSkuIdList, notStartSkuIdList, soldOutSkuIdList).flatMap(Collection::stream).collect(Collectors.toList());
int finalCount = allIdList.size() - page * size;
int initCount = allIdList.size() - (page - 1) * size - 1;
if (finalCount <= 0) {
finalCount = 0;
}
List<GoblinNftGoodsSkuListVo> skuList = ObjectUtil.getGoblinNftGoodsSkuListVoArrayList(); List<GoblinNftGoodsSkuListVo> skuList = ObjectUtil.getGoblinNftGoodsSkuListVoArrayList();
if (CollectionUtil.isEmpty(skuIdList) || page > 1) {// 查mongo for (int i = initCount; i >= finalCount; i--) {
//条件 String skuId = allIdList.get(i);
Query query = Query.query( // sku信息
Criteria.where("skuType").is(1).and("delFlg").is("0") GoblinGoodsSkuInfoVo skuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
.and("status").is("3").and("shelvesStatus").is("3") GoblinNftGoodsSkuListVo goblinNftGoodsSkuListVo = GoblinNftGoodsSkuListVo.getNew().copy(skuInfoVo);
.and("skuAppear").is("0") // spu信息
); GoblinGoodsInfoVo goodsInfoVo = goblinRedisUtils.getGoodsInfoVo(skuInfoVo.getSpuId());
// 分页 排序:按照开售时间 GoblinNftGoodsSpuInfoVo nftGoodsSpuInfoVo = GoblinNftGoodsSpuInfoVo.getNew().copy(goodsInfoVo);
Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.ASC, "saleStartTime")); goblinNftGoodsSkuListVo.setGoblinNftGoodsSpuInfoVo(nftGoodsSpuInfoVo);
query.with(pageable); // 库存、预约
// 查询 if (soldOutSkuIdList.contains(skuId)) {// 是售罄的
List<GoblinGoodsSkuInfoVo> skuInfoVos = mongoTemplate.find(query, GoblinGoodsSkuInfoVo.class, GoblinGoodsSkuInfoVo.class.getSimpleName()); goblinNftGoodsSkuListVo.setIsStock(0);
for (GoblinGoodsSkuInfoVo skuInfoVo : skuInfoVos) { } else {
// 获取预约相关 goblinNftGoodsSkuListVo.setIsStock(1);
AnticipateValueVo anticipateValueVo = goblinGoodsAnticipateMgService.getAnticipateValueBySkuId(skuInfoVo.getSkuId(), 0); // 获取预约相关 未售罄的才查询预约
// sku信息
GoblinNftGoodsSkuListVo nftGoodsSkuInfoVo = GoblinNftGoodsSkuListVo.getNew().copy(skuInfoVo, anticipateValueVo);
// spu信息
GoblinGoodsInfoVo goodsInfoVo = goblinRedisUtils.getGoodsInfoVo(skuInfoVo.getSpuId());
GoblinNftGoodsSpuInfoVo nftGoodsSpuInfoVo = GoblinNftGoodsSpuInfoVo.getNew().copy(goodsInfoVo);
nftGoodsSkuInfoVo.setGoblinNftGoodsSpuInfoVo(nftGoodsSpuInfoVo);
// 库存
HashMap<String, Integer> stockHashMap = goblinOrderUtils.getIsStock(skuInfoVo.getSkuId(), skuInfoVo.getUnbox(), skuInfoVo.getSoldoutStatus(), goodsInfoVo.getSkuIdList());
nftGoodsSkuInfoVo.setIsStock(stockHashMap.get("isStock"));
// 写入列表
skuList.add(nftGoodsSkuInfoVo);
skuIdList.add(nftGoodsSkuInfoVo.getSkuId());
}
if (page <= 1) {
goblinRedisUtils.setGoblinNftGoodsInfoListVo(skuIdList);
}
} else {
for (String skuId : skuIdList) {
// 获取预约相关
AnticipateValueVo anticipateValueVo = goblinGoodsAnticipateMgService.getAnticipateValueBySkuId(skuId, 0); AnticipateValueVo anticipateValueVo = goblinGoodsAnticipateMgService.getAnticipateValueBySkuId(skuId, 0);
// sku信息 goblinNftGoodsSkuListVo.setAnticipateValueVo(anticipateValueVo);
GoblinGoodsSkuInfoVo skuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
GoblinNftGoodsSkuListVo goblinNftGoodsSkuListVo = GoblinNftGoodsSkuListVo.getNew().copy(skuInfoVo, anticipateValueVo);
// spu信息
GoblinGoodsInfoVo goodsInfoVo = goblinRedisUtils.getGoodsInfoVo(skuInfoVo.getSpuId());
GoblinNftGoodsSpuInfoVo nftGoodsSpuInfoVo = GoblinNftGoodsSpuInfoVo.getNew().copy(goodsInfoVo);
goblinNftGoodsSkuListVo.setGoblinNftGoodsSpuInfoVo(nftGoodsSpuInfoVo);
// 库存
HashMap<String, Integer> stockHashMap = goblinOrderUtils.getIsStock(skuId, skuInfoVo.getUnbox(), skuInfoVo.getSoldoutStatus(), goodsInfoVo.getSkuIdList());
goblinNftGoodsSkuListVo.setIsStock(stockHashMap.get("isStock"));
// 写入列表
skuList.add(goblinNftGoodsSkuListVo);
} }
// 写入列表
skuList.add(goblinNftGoodsSkuListVo);
} }
// 库存售罄排序
List<GoblinNftGoodsSkuListVo> listSort = skuList.stream().sorted(Comparator.comparing(GoblinNftGoodsSkuListVo::getIsStock).reversed()).collect(Collectors.toList());
PagedResult<GoblinNftGoodsSkuListVo> listVoPagedResult = ObjectUtil.getGoblinNftGoodsSkuListVoPagedResult(); PagedResult<GoblinNftGoodsSkuListVo> listVoPagedResult = ObjectUtil.getGoblinNftGoodsSkuListVoPagedResult();
listVoPagedResult.setList(listSort).setPageSize(size).setCurrentPage(page); listVoPagedResult.setList(skuList).setPageSize(size).setCurrentPage(page);
return ResponseDto.success(listVoPagedResult); return ResponseDto.success(listVoPagedResult);
} }
......
package com.liquidnet.service.goblin.service.impl.inner;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftGoodsSkuListJobVo;
import com.liquidnet.service.goblin.service.GoblinCouponService;
import com.liquidnet.service.goblin.service.manage.IGoblinGoodsAnticipateMgService;
import com.liquidnet.service.goblin.util.GoblinMongoUtils;
import com.liquidnet.service.goblin.util.GoblinOrderUtils;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
import com.liquidnet.service.goblin.util.QueueUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@Service
@Slf4j
public class GoblinNftJobServiceImpl {
@Autowired
private GoblinRedisUtils goblinRedisUtils;
@Autowired
MongoTemplate mongoTemplate;
@Autowired
QueueUtils queueUtils;
@Autowired
GoblinMongoUtils mongoUtils;
@Autowired
RedisUtil redisUtil;
@Autowired
private GoblinOrderUtils goblinOrderUtils;
@Autowired
GoblinCouponService goblinCouponService;
@Autowired
IGoblinGoodsAnticipateMgService goblinGoodsAnticipateMgService;
public ResponseDto<Boolean> goodsList() {
// mongo初始条件
Query query = Query.query(
Criteria.where("skuType").is(1).and("delFlg").is("0")
.and("status").is("3").and("shelvesStatus").is("3")
.and("skuAppear").is("0")
);
// 分页 排序:按照开售时间
Pageable pageable = PageRequest.of(0, 100, Sort.by(Sort.Direction.ASC, "saleStartTime"));
query.with(pageable);
// 查询
List<GoblinNftGoodsSkuListJobVo> skuInfoVos = mongoTemplate.find(query, GoblinNftGoodsSkuListJobVo.class, GoblinGoodsSkuInfoVo.class.getSimpleName());
List<String> startSkuIdList = CollectionUtil.arrayListString();
List<String> notStartSkuIdList = CollectionUtil.arrayListString();
List<String> soldOutSkuIdList = CollectionUtil.arrayListString();
LocalDateTime nowTime = LocalDateTime.now();
for (GoblinNftGoodsSkuListJobVo info : skuInfoVos) {
if (nowTime.compareTo(info.getSaleStartTime()) > 0) {// 已开卖
List<String> skuIdList = CollectionUtil.arrayListString();
if (info.getUnbox().equals("0")) {// 不是盲盒 为了少查一次spu
skuIdList = goblinRedisUtils.getGoodsInfoVo(info.getSpuId()).getSkuIdList();
}
HashMap<String, Integer> stockHashMap = goblinOrderUtils.getIsStock(info.getSkuId(), info.getUnbox(), info.getSoldoutStatus(), skuIdList);
if (stockHashMap.get("isStock") == 1) {// 已开卖-未售罄
startSkuIdList.add(info.getSkuId());
} else {// 已开卖-已售罄 时间正序
soldOutSkuIdList.add(info.getSkuId());
}
} else {// 未开卖 时间正序
notStartSkuIdList.add(info.getSkuId());
}
}
// 已开卖 时间倒序
Collections.reverse(startSkuIdList);
// 写入缓存
goblinRedisUtils.setGoblinNftGoodsInfoListVo(startSkuIdList, "1");
goblinRedisUtils.setGoblinNftGoodsInfoListVo(notStartSkuIdList, "2");
goblinRedisUtils.setGoblinNftGoodsInfoListVo(soldOutSkuIdList, "3");
return ResponseDto.success();
}
}
...@@ -1506,21 +1506,6 @@ public class GoblinRedisUtils { ...@@ -1506,21 +1506,6 @@ public class GoblinRedisUtils {
} }
} }
public List<String> getGoblinNftGoodsInfoListVo() {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_GOODS_LIST;
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
} else {
return (List<String>) obj;
}
}
public void setGoblinNftGoodsInfoListVo(List<String> spuList) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_GOODS_LIST;
redisUtil.set(redisKey, spuList);
}
public void delGoblinNftGoodsInfoListVo() { public void delGoblinNftGoodsInfoListVo() {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_GOODS_LIST; String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_GOODS_LIST;
redisUtil.del(redisKey); redisUtil.del(redisKey);
...@@ -1614,6 +1599,21 @@ public class GoblinRedisUtils { ...@@ -1614,6 +1599,21 @@ public class GoblinRedisUtils {
/* ----------------------------------- ---------- ----------------------------------- */ /* ----------------------------------- ---------- ----------------------------------- */
public List<String> getGoblinNftGoodsInfoListVo(String num) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_GOODS_LIST.concat(num);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
} else {
return (List<String>) obj;
}
}
public void setGoblinNftGoodsInfoListVo(List<String> spuList, String num) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_GOODS_LIST.concat(num);
redisUtil.set(redisKey, spuList);
}
// 记录用户开通数字账户 // 记录用户开通数字账户
public void setNftNumAccount(String userId) { public void setNftNumAccount(String userId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_NUM_ACCOUNT.concat(userId); String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_NUM_ACCOUNT.concat(userId);
......
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