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

Commit fe044358 authored by 张国柄's avatar 张国柄

+queue:藏品声明查询及消费逻辑实现;

parent 5e30ec20
...@@ -262,6 +262,7 @@ public class MQConst { ...@@ -262,6 +262,7 @@ public class MQConst {
GOBLIN_UN_PAY_8("goblin:stream:order:back:8", "group.order:back", "回滚关闭订单库存队列"), GOBLIN_UN_PAY_8("goblin:stream:order:back:8", "group.order:back", "回滚关闭订单库存队列"),
GOBLIN_UN_PAY_9("goblin:stream:order:back:9", "group.order:back", "回滚关闭订单库存队列"), GOBLIN_UN_PAY_9("goblin:stream:order:back:9", "group.order:back", "回滚关闭订单库存队列"),
BIZ_ARTWORK_UPC("goblin:stream:biz_art:upc", "group.biz.artwork", "藏品声明查询"),
BIZ_ARTWORK_GEN("goblin:stream:biz_art:gen", "group.biz.artwork", "藏品生成"), BIZ_ARTWORK_GEN("goblin:stream:biz_art:gen", "group.biz.artwork", "藏品生成"),
SQL_ARTWORK_GEN("goblin:stream:sql_art:gen", "group.biz.artwork", "藏品生成"), SQL_ARTWORK_GEN("goblin:stream:sql_art:gen", "group.biz.artwork", "藏品生成"),
; ;
......
...@@ -3,6 +3,7 @@ package com.liquidnet.service.consumer.kylin.config; ...@@ -3,6 +3,7 @@ package com.liquidnet.service.consumer.kylin.config;
import com.liquidnet.common.cache.redis.config.RedisStreamConfig; import com.liquidnet.common.cache.redis.config.RedisStreamConfig;
import com.liquidnet.service.base.constant.MQConst; import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.consumer.kylin.receiver.ConsumerGoblinBizArtworkGenRdsReceiver; import com.liquidnet.service.consumer.kylin.receiver.ConsumerGoblinBizArtworkGenRdsReceiver;
import com.liquidnet.service.consumer.kylin.receiver.ConsumerGoblinBizArtworkUpcRdsReceiver;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -23,8 +24,26 @@ public class ConsumerCommonBizRedisStreamConfig extends RedisStreamConfig { ...@@ -23,8 +24,26 @@ public class ConsumerCommonBizRedisStreamConfig extends RedisStreamConfig {
@Autowired @Autowired
StringRedisTemplate stringRedisTemplate; StringRedisTemplate stringRedisTemplate;
@Autowired @Autowired
ConsumerGoblinBizArtworkUpcRdsReceiver consumerGoblinBizArtworkUpcRdsReceiver;
@Autowired
ConsumerGoblinBizArtworkGenRdsReceiver consumerGoblinBizArtworkGenRdsReceiver; ConsumerGoblinBizArtworkGenRdsReceiver consumerGoblinBizArtworkGenRdsReceiver;
@Bean// 藏品声明查询
public List<Subscription> subscriptionBizArtworkUpc(RedisConnectionFactory factory) {
List<Subscription> subscriptionList = new ArrayList<>();
MQConst.GoblinQueue stream = MQConst.GoblinQueue.BIZ_ARTWORK_UPC;
this.initStream(stringRedisTemplate, stream.getKey(), stream.getGroup());
for (int i = 0; i < 10; i++) {
StreamMessageListenerContainer<String, MapRecord<String, String, String>> listenerContainer = this.buildStreamMessageListenerContainer(factory);
subscriptionList.add(listenerContainer.receiveAutoAck(
Consumer.from(stream.getGroup(), getConsumerName(stream.name() + i)),
StreamOffset.create(stream.getKey(), ReadOffset.lastConsumed()), consumerGoblinBizArtworkUpcRdsReceiver
));
listenerContainer.start();
}
return subscriptionList;
}
@Bean// 藏品生成 @Bean// 藏品生成
public List<Subscription> subscriptionBizArtworkGen(RedisConnectionFactory factory) { public List<Subscription> subscriptionBizArtworkGen(RedisConnectionFactory factory) {
List<Subscription> subscriptionList = new ArrayList<>(); List<Subscription> subscriptionList = new ArrayList<>();
......
...@@ -78,14 +78,18 @@ public class ConsumerGoblinBizArtworkGenRdsReceiver extends AbstractBizRedisRece ...@@ -78,14 +78,18 @@ public class ConsumerGoblinBizArtworkGenRdsReceiver extends AbstractBizRedisRece
Integer source = dto.getSource(); Integer source = dto.getSource();
GoblinGoodsSkuInfoVo goodsSkuInfoVo = this.getGoodsSkuInfoVoFromRdb(skuId); GoblinGoodsSkuInfoVo goodsSkuInfoVo = this.getGoodsSkuInfoVoFromRdb(skuId);
if (null != goodsSkuInfoVo) { if (null == goodsSkuInfoVo || !"0".equals(goodsSkuInfoVo.getDelFlg())) {
// 判断是否已生成 log.warn("#CONSUMER MSG NULL_SKU[{}]:[uid={},skuId={},orderId={},source={},fromArtworkId={}]", this.getRedisStreamKey(), uid, skuId, orderId, source, fromArtworkId);
String genMarkerKey = GoblinRedisConst.USER_DIGITAL_ARTWORK_GENMARK.concat(uid).concat(skuId).concat(orderId); return true;
if (this.hasUserDigitalArtworkVoFromRdb(genMarkerKey)) {// 已生成 }
log.warn("#CONSUMER MSG EXIST_ART[{}]:[uid={},skuId={},orderId={},source={},fromArtworkId={}]", this.getRedisStreamKey(),
uid, skuId, orderId, source, fromArtworkId); // 判断是否已生成
return true; String genMarkerKey = GoblinRedisConst.USER_DIGITAL_ARTWORK_GENMARK.concat(uid).concat(skuId).concat(orderId);
} if (this.hasUserDigitalArtworkVoFromRdb(genMarkerKey)) {// 已生成
log.warn("#CONSUMER MSG EXIST_ART[{}]:[uid={},skuId={},orderId={},source={},fromArtworkId={}]", this.getRedisStreamKey(),
uid, skuId, orderId, source, fromArtworkId);
return true;
}
// GoblinDigitalArtworkVo existDigitalArtworkVo = this.getDigitalArtworkVoFromMdb(uid, skuId, orderId); // GoblinDigitalArtworkVo existDigitalArtworkVo = this.getDigitalArtworkVoFromMdb(uid, skuId, orderId);
// if (null != existDigitalArtworkVo) {// 已生成 // if (null != existDigitalArtworkVo) {// 已生成
// log.warn("#CONSUMER MSG EXIST_ART[{}]:[uid={},skuId={},orderId={},source={}]", this.getRedisStreamKey(), // log.warn("#CONSUMER MSG EXIST_ART[{}]:[uid={},skuId={},orderId={},source={}]", this.getRedisStreamKey(),
...@@ -93,74 +97,69 @@ public class ConsumerGoblinBizArtworkGenRdsReceiver extends AbstractBizRedisRece ...@@ -93,74 +97,69 @@ public class ConsumerGoblinBizArtworkGenRdsReceiver extends AbstractBizRedisRece
// return true; // return true;
// } // }
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
GoblinUserDigitalArtworkVo digitalArtworkVo = GoblinUserDigitalArtworkVo.getNew(); GoblinUserDigitalArtworkVo digitalArtworkVo = GoblinUserDigitalArtworkVo.getNew();
String artworkId = IDGenerator.nextMilliId2(); String artworkId = IDGenerator.nextMilliId2();
digitalArtworkVo.setArtworkId(artworkId); digitalArtworkVo.setArtworkId(artworkId);
digitalArtworkVo.setSkuId(skuId); digitalArtworkVo.setSkuId(skuId);
digitalArtworkVo.setUid(uid); digitalArtworkVo.setUid(uid);
digitalArtworkVo.setOrderId(orderId); digitalArtworkVo.setOrderId(orderId);
digitalArtworkVo.setSource(source); digitalArtworkVo.setSource(source);
digitalArtworkVo.setState(0); digitalArtworkVo.setState(0);
digitalArtworkVo.setDelFlg("0"); digitalArtworkVo.setDelFlg("0");
digitalArtworkVo.setCreatedAt(now); digitalArtworkVo.setCreatedAt(now);
// Mongo记录VO // Mongo记录VO
mongoTemplate.insert(digitalArtworkVo, GoblinUserDigitalArtworkVo.class.getSimpleName()); mongoTemplate.insert(digitalArtworkVo, GoblinUserDigitalArtworkVo.class.getSimpleName());
boolean fromBoxArtworkFlg = StringUtils.isNotEmpty(fromArtworkId); boolean fromBoxArtworkFlg = StringUtils.isNotEmpty(fromArtworkId);
if (fromBoxArtworkFlg) {// 更新盲盒藏品数据 if (fromBoxArtworkFlg) {// 更新盲盒藏品数据
GoblinUserDigitalArtworkVo userDigitalArtworkVo = this.getUserDigitalArtworkVoFromRdb(fromArtworkId); GoblinUserDigitalArtworkVo userDigitalArtworkVo = this.getUserDigitalArtworkVoFromRdb(fromArtworkId);
if (null != userDigitalArtworkVo) { if (null != userDigitalArtworkVo) {
mongoTemplate.getCollection(GoblinUserDigitalArtworkVo.class.getSimpleName()).updateOne( mongoTemplate.getCollection(GoblinUserDigitalArtworkVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("artworkId").is(fromArtworkId).and("state").ne(1)).getQueryObject(), Query.query(Criteria.where("artworkId").is(fromArtworkId).and("state").ne(1)).getQueryObject(),
Update.update("state", userDigitalArtworkVo.getState()) Update.update("state", userDigitalArtworkVo.getState())
.set("delFlg", userDigitalArtworkVo.getDelFlg()) .set("delFlg", userDigitalArtworkVo.getDelFlg())
.set("openingAt", userDigitalArtworkVo.getOpeningAt()) .set("openingAt", userDigitalArtworkVo.getOpeningAt())
.set("updatedAt", userDigitalArtworkVo.getUpdatedAt()) .set("updatedAt", userDigitalArtworkVo.getUpdatedAt())
.set("deletedAt", userDigitalArtworkVo.getDeletedAt()) .set("deletedAt", userDigitalArtworkVo.getDeletedAt())
.getUpdateObject() .getUpdateObject()
); );
}
}
// Redis记录VO
redisUtil.set(GoblinRedisConst.USER_DIGITAL_ARTWORK.concat(digitalArtworkVo.getArtworkId()), digitalArtworkVo);
// Redis更新藏品ID列表
List<String> userDigitalArtworkIds = this.getUserDigitalArtworkIdsFromRdb(uid);
if (CollectionUtils.isEmpty(userDigitalArtworkIds)) {
userDigitalArtworkIds = CollectionUtil.arrayListString();
userDigitalArtworkIds.add(artworkId);
} else {
userDigitalArtworkIds.add(0, artworkId);
if (fromBoxArtworkFlg) {
userDigitalArtworkIds.remove(fromArtworkId);
}
int size = userDigitalArtworkIds.size();
if (size > 30) userDigitalArtworkIds.remove(size - 1);
} }
redisUtil.set(GoblinRedisConst.USER_DIGITAL_ARTWORK_IDS.concat(uid), userDigitalArtworkIds); }
StreamOperations<String, Object, Object> streamOperations = stringRedisTemplate.opsForStream(); // Redis记录VO
// Mysql持久化 redisUtil.set(GoblinRedisConst.USER_DIGITAL_ARTWORK.concat(digitalArtworkVo.getArtworkId()), digitalArtworkVo);
HashMap<String, String> sqlArtworkMap = CollectionUtil.mapStringString(); // Redis更新藏品ID列表
LinkedList<String> toMqSqls = CollectionUtil.linkedListString(); List<String> userDigitalArtworkIds = this.getUserDigitalArtworkIdsFromRdb(uid);
toMqSqls.add(SQL_INSERT_ARTWORK); if (CollectionUtils.isEmpty(userDigitalArtworkIds)) {
LinkedList<Object[]> initArtworkObjs = CollectionUtil.linkedListObjectArr(); userDigitalArtworkIds = CollectionUtil.arrayListString();
initArtworkObjs.add(new Object[]{digitalArtworkVo.getArtworkId(), skuId, uid, orderId, source, digitalArtworkVo.getState(), now}); userDigitalArtworkIds.add(artworkId);
sqlArtworkMap.put("message", SqlMapping.gets(toMqSqls, initArtworkObjs));
streamOperations.add(StreamRecords.mapBacked(sqlArtworkMap).withStreamKey(MQConst.GoblinQueue.SQL_ARTWORK_GEN.getKey()));
// NFT发行购买
HashMap<String, String> bizNftBuyMap = CollectionUtil.mapStringString();
bizNftBuyMap.put("message", QUEUE_MSG_TL.replace("1", orderId).replace("2", skuId).replace("3", uid).replace("4", DateUtil.Formatter.yyyyMMddHHmmss.format(now)));
streamOperations.add(StreamRecords.mapBacked(bizNftBuyMap).withStreamKey(QUEUE_KEY_NFT));// TODO: 2022/3/30 ==zhanggb.anjiabin
redisUtil.incr(GoblinRedisConst.USER_DIGITAL_ARTWORK_CT.concat(uid), 1);
// Redis生成标记(缓存三天),用于上面的生成检查
redisUtil.set(genMarkerKey, 1, 259200);
} else { } else {
log.warn("#CONSUMER MSG NULL_SKU[{}]:[uid={},skuId={},orderId={},source={},fromArtworkId={}]", this.getRedisStreamKey(), uid, skuId, orderId, source, fromArtworkId); userDigitalArtworkIds.add(0, artworkId);
log.warn("#CONSUMER MSG NULL_SKU[{}]:[uid={},skuId={},orderId={},source={},fromArtworkId={}]", this.getRedisStreamKey(), uid, skuId, orderId, source, fromArtworkId); if (fromBoxArtworkFlg) {
log.warn("#CONSUMER MSG NULL_SKU[{}]:[uid={},skuId={},orderId={},source={},fromArtworkId={}]", this.getRedisStreamKey(), uid, skuId, orderId, source, fromArtworkId); userDigitalArtworkIds.remove(fromArtworkId);
}
int size = userDigitalArtworkIds.size();
if (size > 30) userDigitalArtworkIds.remove(size - 1);
} }
redisUtil.set(GoblinRedisConst.USER_DIGITAL_ARTWORK_IDS.concat(uid), userDigitalArtworkIds);
StreamOperations<String, Object, Object> streamOperations = stringRedisTemplate.opsForStream();
// Mysql持久化
HashMap<String, String> sqlArtworkMap = CollectionUtil.mapStringString();
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
toMqSqls.add(SQL_INSERT_ARTWORK);
LinkedList<Object[]> initArtworkObjs = CollectionUtil.linkedListObjectArr();
initArtworkObjs.add(new Object[]{digitalArtworkVo.getArtworkId(), skuId, uid, orderId, source, digitalArtworkVo.getState(), now});
sqlArtworkMap.put("message", SqlMapping.gets(toMqSqls, initArtworkObjs));
streamOperations.add(StreamRecords.mapBacked(sqlArtworkMap).withStreamKey(MQConst.GoblinQueue.SQL_ARTWORK_GEN.getKey()));
// NFT发行购买
HashMap<String, String> bizNftBuyMap = CollectionUtil.mapStringString();
bizNftBuyMap.put("message", QUEUE_MSG_TL.replace("1", orderId).replace("2", skuId).replace("3", uid).replace("4", DateUtil.Formatter.yyyyMMddHHmmss.format(now)));
streamOperations.add(StreamRecords.mapBacked(bizNftBuyMap).withStreamKey(QUEUE_KEY_NFT));// TODO: 2022/3/30 ==zhanggb.anjiabin
redisUtil.incr(GoblinRedisConst.USER_DIGITAL_ARTWORK_CT.concat(uid), 1);
// Redis生成标记(缓存三天),用于上面的生成检查
redisUtil.set(genMarkerKey, 1, 259200);
return true; return true;
} }
......
package com.liquidnet.service.consumer.kylin.receiver;
import com.fasterxml.jackson.databind.JsonNode;
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.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
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.data.mongodb.core.query.Update;
import org.springframework.data.redis.connection.stream.StreamRecords;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
@Slf4j
@Component
public class ConsumerGoblinBizArtworkUpcRdsReceiver extends AbstractBizRedisReceiver {
@Autowired
private RedisUtil redisUtil;
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
Environment env;
// @Value("${liquidnet.service.galaxy.url}")// TODO: 2022/4/1 ==zhanggb
// private String sevGalaxyUrl;
private static final String SQL_UPDATE_GOODS_SKU_NFT = "UPDATE goblin_goods_sku_nft SET upchain=?,series_id=?,series_hash=?,nft_hash=?,declare_at=?,updated_at=? WHERE skuId=? AND upchain=9 ";
@Override
protected String getRedisStreamKey() {
return MQConst.GoblinQueue.BIZ_ARTWORK_UPC.getKey();
}
@Override
protected String getRedisStreamGroup() {
return MQConst.GoblinQueue.BIZ_ARTWORK_UPC.getGroup();
}
@Override
protected boolean consumerMessageHandler(String msg) {
boolean aBoolean = false;
try {
if (StringUtils.isEmpty(msg)) {
log.warn("CONSUMER MSG NULL_DTO ==> [{}]:{}", this.getRedisStreamKey(), msg);
aBoolean = true;
} else {
String[] msgArr = msg.split(",");
String skuId = msgArr[0], time = msgArr[1];
LocalDateTime now = LocalDateTime.now(), checkTime = now.minusSeconds(10);
LocalDateTime createAt = StringUtils.isEmpty(time) ? checkTime : LocalDateTime.parse(time);
long durationToMillis = Duration.between(createAt, checkTime).toMillis();
if (durationToMillis >= 0) {
aBoolean = this.bizArtworkUpcProcessing(skuId);
} else {
try {
Thread.sleep(Math.abs(durationToMillis));
} catch (InterruptedException ignored) {
}
aBoolean = this.bizArtworkUpcProcessing(skuId);
}
}
} catch (Exception e) {
log.error("CONSUMER MSG EX_HANDLE ==> [{}]:{}", this.getRedisStreamKey(), msg, e);
} finally {
if (!aBoolean) {
HashMap<String, String> map = CollectionUtil.mapStringString();
map.put("message", msg);
stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(this.getRedisStreamKey()));
}
}
return aBoolean;
}
private boolean bizArtworkUpcProcessing(String skuId) {
GoblinGoodsSkuInfoVo goodsSkuInfoVo = this.getGoodsSkuInfoVoFromMdb(skuId);
if (null == goodsSkuInfoVo) {
log.warn("#CONSUMER MSG NULL_SKU[{}]:[skuId={}]", this.getRedisStreamKey(), skuId);
return true;
}
int skuType = goodsSkuInfoVo.getSkuType(), upchain = goodsSkuInfoVo.getUpchain();
String unbox = goodsSkuInfoVo.getUnbox();
if (1 != skuType || !"0".equals(unbox) || 9 != upchain) {// 非数字藏品 || 盲盒 || 非上传中
log.warn("#CONSUMER MSG VOID_SKU[{}]:[skuId={},skuType={},unbox={},upchain={}]",
this.getRedisStreamKey(), skuId, skuType, unbox, upchain);
return true;
}
List<String> checkNftClaimResult = this.checkNftClaimFromGalaxy(skuId, goodsSkuInfoVo.getRouteType());
if (CollectionUtils.isEmpty(checkNftClaimResult)) return false;
String seriesId = checkNftClaimResult.get(0);
String txHash = checkNftClaimResult.get(1);
String nftHash = checkNftClaimResult.get(2);
String chainTimestamp = checkNftClaimResult.get(3);
LocalDateTime now = LocalDateTime.now();
mongoTemplate.getCollection(GoblinGoodsSkuInfoVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("skuId").is(skuId).and("delFlg").is("0")).getQueryObject(),
Update.update("upchain", 1).set("seriesId", seriesId).set("seriesHash", txHash).set("nftHash", nftHash).set("declareAt", chainTimestamp).getUpdateObject()
);
redisUtil.del(GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId));
// Mysql持久化
HashMap<String, String> sqlUpdateMap = CollectionUtil.mapStringString();
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
toMqSqls.add(SQL_UPDATE_GOODS_SKU_NFT);
LinkedList<Object[]> updateGoodsSkuNftObjs = CollectionUtil.linkedListObjectArr();
updateGoodsSkuNftObjs.add(new Object[]{1, seriesId, txHash, nftHash, chainTimestamp, now, skuId});
sqlUpdateMap.put("message", SqlMapping.gets(toMqSqls, updateGoodsSkuNftObjs));
stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(sqlUpdateMap).withStreamKey(MQConst.GoblinQueue.SQL_GOODS.getKey()));
return true;
}
/* ------------------------------------------------------------------------------------ */
private List<String> checkNftClaimFromGalaxy(String skuId, String routerType) {
LinkedMultiValueMap<String, String> paramsMap = CollectionUtil.linkedMultiValueMapStringString();
paramsMap.add("skuId", skuId);
paramsMap.add("routerType", routerType);
// String postUrl = sevGalaxyUrl + "/user/register", blockChainAddress;// TODO: 2022/4/1 ==zhanggb
String postUrl = "https://ENVgalaxy.zhengzai.tv/galaxy/artwork/seriesClaimResultQuery".replace("ENV", env.getProperty(CurrentUtil.CK_ENV_ACTIVE)), blockChainAddress;
try {
LinkedMultiValueMap<String, String> headerMap = CollectionUtil.linkedMultiValueMapStringString();
headerMap.add("Accept", MediaType.APPLICATION_JSON_VALUE);
String postRespStr = HttpUtil.post(postUrl, paramsMap, headerMap);
JsonNode postRespJNode = JsonUtils.fromJson(postRespStr, JsonNode.class), postRespDataJNode;
if (null == postRespJNode || null == postRespJNode.get("code") || !postRespJNode.get("code").asText().equals("0")) {
log.warn("#CONSUMER MSG FAIL_UPC[{}]查询失败[paramsMap={},postRespStr={}]", this.getRedisStreamKey(), paramsMap, postRespStr);
return null;
}
if (1 != (postRespDataJNode = postRespJNode.get("data")).get("taskStatus").asInt()) {
log.warn("#CONSUMER MSG FAIL_UPC[{}]声明失败[paramsMap={},postRespStr={}]", this.getRedisStreamKey(), paramsMap, postRespStr);
return null;
}
List<String> respDataList = CollectionUtil.arrayListString();
respDataList.add(postRespDataJNode.get("seriesId").asText());
respDataList.add(postRespDataJNode.get("txHash").asText());
respDataList.add(postRespDataJNode.get("nftHash").asText());
respDataList.add(postRespDataJNode.get("chainTimestamp").asText());
return respDataList;
} catch (Exception e) {
log.error("Ex.CONSUMER MSG ERROR_UPC[{}]请求异常[skuId={},url={},paramsMap={}],ex:{}",
this.getRedisStreamKey(), skuId, postUrl, paramsMap, e.getMessage());
return null;
}
}
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
public GoblinGoodsSkuInfoVo getGoodsSkuInfoVoFromMdb(String skuId) {
return mongoTemplate.findOne(Query.query(Criteria.where("skuId").is(skuId).and("delFlg").is("0")),
GoblinGoodsSkuInfoVo.class, GoblinGoodsSkuInfoVo.class.getSimpleName());
}
/* ------------------------------------------------------------------------------------ */
}
...@@ -1071,7 +1071,7 @@ public class GoblinStoreMgtGoodsController { ...@@ -1071,7 +1071,7 @@ public class GoblinStoreMgtGoodsController {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("商品管理:商品编辑:SKU添加:[GoblinStoreMgtGoodsEditSkuParam={}]", JsonUtils.toJson(mgtDigitalGoodsAddSkuParam)); log.debug("商品管理:商品编辑:SKU添加:[GoblinStoreMgtGoodsEditSkuParam={}]", JsonUtils.toJson(mgtDigitalGoodsAddSkuParam));
} }
GoblinGoodsSkuInfoVo goodsSkuInfoVo = mgtDigitalGoodsAddSkuParam.initAddGoodsSkuInfoVo(notUnboxFlg); GoblinGoodsSkuInfoVo initGoodsSkuInfoVo = mgtDigitalGoodsAddSkuParam.initAddGoodsSkuInfoVo(notUnboxFlg);
{// 标签处理 {// 标签处理
List<String> paramExtagList = mgtDigitalGoodsAddSkuParam.getExtagList(); List<String> paramExtagList = mgtDigitalGoodsAddSkuParam.getExtagList();
if (!CollectionUtils.isEmpty(paramExtagList)) { if (!CollectionUtils.isEmpty(paramExtagList)) {
...@@ -1083,11 +1083,11 @@ public class GoblinStoreMgtGoodsController { ...@@ -1083,11 +1083,11 @@ public class GoblinStoreMgtGoodsController {
goodsExtagVoList.add(GoblinGoodsExtagVo.getNew().copy(r).setSort(i)); goodsExtagVoList.add(GoblinGoodsExtagVo.getNew().copy(r).setSort(i));
break; break;
} }
goodsSkuInfoVo.setExtagVoList(goodsExtagVoList); initGoodsSkuInfoVo.setExtagVoList(goodsExtagVoList);
} }
} }
goblinstoreMgtGoodsService.digitalGoodsAddSku(currentUid, goodsSkuInfoVo, goodsInfoVo); goblinstoreMgtGoodsService.digitalGoodsAddSku(currentUid, initGoodsSkuInfoVo, goodsInfoVo);
return ResponseDto.success(goodsSkuInfoVo.getSkuId()); return ResponseDto.success(initGoodsSkuInfoVo.getSkuId());
} }
@ApiOperationSupport(order = 9) @ApiOperationSupport(order = 9)
......
package com.liquidnet.service.goblin.service.impl; package com.liquidnet.service.goblin.service.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.PagedResult; import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.SqlMapping; import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst; import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.dto.GoblinQueueBizArtworkGenDto; import com.liquidnet.service.goblin.dto.GoblinQueueBizArtworkGenDto;
import com.liquidnet.service.goblin.dto.vo.*; import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.service.IGoblinUserDigitalArtworkService; import com.liquidnet.service.goblin.service.IGoblinUserDigitalArtworkService;
import com.liquidnet.service.goblin.service.impl.inner.GoblinGalaxyService;
import com.liquidnet.service.goblin.util.GoblinMongoUtils; import com.liquidnet.service.goblin.util.GoblinMongoUtils;
import com.liquidnet.service.goblin.util.GoblinRedisUtils; import com.liquidnet.service.goblin.util.GoblinRedisUtils;
import com.liquidnet.service.goblin.util.ObjectUtil; import com.liquidnet.service.goblin.util.ObjectUtil;
import com.liquidnet.service.goblin.util.QueueUtils; import com.liquidnet.service.goblin.util.QueueUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
...@@ -35,12 +28,8 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr ...@@ -35,12 +28,8 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr
private GoblinRedisUtils goblinRedisUtils; private GoblinRedisUtils goblinRedisUtils;
@Autowired @Autowired
private GoblinMongoUtils goblinMongoUtils; private GoblinMongoUtils goblinMongoUtils;
@Autowired @Autowired
Environment env; private GoblinGalaxyService goblinGalaxyService;
// @Value("${liquidnet.service.galaxy.url}")// TODO: 2022/3/31 ==zhanggb
// private String sevGalaxyUrl;
@Override @Override
public GoblinUserDigitalArtworkPageVo page(String uid, Integer pageNum, Integer pageSize) { public GoblinUserDigitalArtworkPageVo page(String uid, Integer pageNum, Integer pageSize) {
...@@ -77,7 +66,7 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr ...@@ -77,7 +66,7 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr
listVo.setOpeningTime(goodsSkuInfoVo.getOpeningTime()); listVo.setOpeningTime(goodsSkuInfoVo.getOpeningTime());
if (listVo.getCreatedAt().isBefore(toCheckTime)) {// 15秒前创建的藏品,去主动核实发行交易状态 if (listVo.getCreatedAt().isBefore(toCheckTime)) {// 15秒前创建的藏品,去主动核实发行交易状态
List<String> checkRespDataList = this.checkNftTradeFromGalaxy(uid, userDigitalArtworkVo.getOrderId(), goodsSkuInfoVo.getRouteType()); List<String> checkRespDataList = goblinGalaxyService.checkNftTradeResult(uid, userDigitalArtworkVo.getOrderId(), goodsSkuInfoVo.getRouteType());
this.updateUserDigitalArtworkByChainTrade(userDigitalArtworkVo, listVo, checkRespDataList, now); this.updateUserDigitalArtworkByChainTrade(userDigitalArtworkVo, listVo, checkRespDataList, now);
} }
...@@ -199,36 +188,4 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr ...@@ -199,36 +188,4 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr
); );
} }
} }
private List<String> checkNftTradeFromGalaxy(String uid, String orderId, String routerType) {
LinkedMultiValueMap<String, String> paramsMap = CollectionUtil.linkedMultiValueMapStringString();
paramsMap.add("userId", uid);
paramsMap.add("nftOrderPayId", orderId);// TODO: 2022/3/31 ==zhanggb
paramsMap.add("routerType", routerType);
// String postUrl = sevGalaxyUrl + "/user/register", blockChainAddress;// TODO: 2022/3/31 ==zhanggb
String postUrl = "https://ENVgalaxy.zhengzai.tv/galaxy/nftTrade/nftPublishAndBuyResultQuery".replace("ENV", env.getProperty(CurrentUtil.CK_ENV_ACTIVE)), blockChainAddress;
try {
LinkedMultiValueMap<String, String> headerMap = CollectionUtil.linkedMultiValueMapStringString();
headerMap.add("Accept", MediaType.APPLICATION_JSON_VALUE);
String postRespStr = HttpUtil.post(postUrl, paramsMap, headerMap);
JsonNode postRespJNode = JsonUtils.fromJson(postRespStr, JsonNode.class);
if (null == postRespJNode || !postRespJNode.get("code").asText().equals("0")) {
log.warn("#NFT发行购买结果查询:查询失败[paramsMap={},postRespStr={}]", paramsMap, postRespStr);
return null;
}
JsonNode postRespDataJNode = postRespJNode.get("data");
List<String> respDataList = CollectionUtil.arrayListString();
respDataList.add(postRespDataJNode.get("nftId").asText());
respDataList.add(postRespDataJNode.get("nftPublishChainTimestamp").asText());
respDataList.add(postRespDataJNode.get("nftPublishTxHash").asText());
respDataList.add(postRespDataJNode.get("nftBuyChainTimestamp").asText());
respDataList.add(postRespDataJNode.get("nftBuyTxHash").asText());
return respDataList;
} catch (Exception e) {
log.error("Ex.NFT发行购买结果查询:请求异常[UID={},url={},paramsMap={}],ex:{}", uid, postUrl, paramsMap, e.getMessage());
return null;
}
}
} }
package com.liquidnet.service.goblin.service.impl.inner;
import com.fasterxml.jackson.databind.JsonNode;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import java.util.List;
/**
* Galaxy服务接口调用
*
* @author zhanggb
* Created by IntelliJ IDEA at 2022/4/1
*/
@Slf4j
@Service
public class GoblinGalaxyService {
@Autowired
Environment env;
// @Value("${liquidnet.service.galaxy.url}")// TODO: 2022/3/31 ==zhanggb
// private String sevGalaxyUrl;
public List<String> checkNftTradeResult(String uid, String orderId, String routerType) {
LinkedMultiValueMap<String, String> paramsMap = CollectionUtil.linkedMultiValueMapStringString();
paramsMap.add("userId", uid);
paramsMap.add("nftOrderPayId", orderId);// TODO: 2022/3/31 ==zhanggb
paramsMap.add("routerType", routerType);
// String postUrl = sevGalaxyUrl + "/user/register", blockChainAddress;// TODO: 2022/3/31 ==zhanggb
String postUrl = "https://ENVgalaxy.zhengzai.tv/galaxy/nftTrade/nftPublishAndBuyResultQuery".replace("ENV", env.getProperty(CurrentUtil.CK_ENV_ACTIVE)), blockChainAddress;
try {
LinkedMultiValueMap<String, String> headerMap = CollectionUtil.linkedMultiValueMapStringString();
headerMap.add("Accept", MediaType.APPLICATION_JSON_VALUE);
String postRespStr = HttpUtil.post(postUrl, paramsMap, headerMap);
JsonNode postRespJNode = JsonUtils.fromJson(postRespStr, JsonNode.class), postRespCode;
if (null == postRespJNode || null == (postRespCode = postRespJNode.get("code")) || !postRespCode.asText().equals("0")) {
log.warn("#NFT发行购买结果查询:查询失败[paramsMap={},postRespStr={}]", paramsMap, postRespStr);
return null;
}
JsonNode postRespDataJNode = postRespJNode.get("data");
List<String> respDataList = CollectionUtil.arrayListString();
respDataList.add(postRespDataJNode.get("nftId").asText());
respDataList.add(postRespDataJNode.get("nftPublishChainTimestamp").asText());
respDataList.add(postRespDataJNode.get("nftPublishTxHash").asText());
respDataList.add(postRespDataJNode.get("nftBuyChainTimestamp").asText());
respDataList.add(postRespDataJNode.get("nftBuyTxHash").asText());
return respDataList;
} catch (Exception e) {
log.error("Ex.NFT发行购买结果查询:请求异常[UID={},url={},paramsMap={}],ex:{}", uid, postUrl, paramsMap, e.getMessage());
return null;
}
}
}
...@@ -982,10 +982,19 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi ...@@ -982,10 +982,19 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
} }
mgtGoodsInfoVo.setUpdatedBy(uid); mgtGoodsInfoVo.setUpdatedBy(uid);
mgtGoodsInfoVo.setUpdatedAt(now); mgtGoodsInfoVo.setUpdatedAt(now);
goblinMongoUtils.updateGoodsInfoVo(mgtGoodsInfoVo);
goblinRedisUtils.delGoodsInfoVo(spuId);
if ("2".equals(initGoodsSkuInfoVo.getShelvesHandle())) {// 直接上架处理
initGoodsSkuInfoVo.setShelvesStatus("3");
initGoodsSkuInfoVo.setShelvesAt(now);
initGoodsSkuInfoVo.setShelvesTime(null);
if (!"3".equals(mgtGoodsInfoVo.getShelvesStatus())) {
mgtGoodsInfoVo.setShelvesStatus("3");
mgtGoodsInfoVo.setShelvesAt(now);
}
}
log.info("藏品管理:SKU添加[UID={},PARAMS={}]", uid, JsonUtils.toJson(initGoodsSkuInfoVo)); log.info("藏品管理:SKU添加[UID={},PARAMS={}]", uid, JsonUtils.toJson(initGoodsSkuInfoVo));
goblinMongoUtils.updateGoodsInfoVo(mgtGoodsInfoVo);
goblinRedisUtils.delGoodsInfoVo(spuId);
goblinMongoUtils.setGoodsSkuInfoVo(initGoodsSkuInfoVo); goblinMongoUtils.setGoodsSkuInfoVo(initGoodsSkuInfoVo);
goblinRedisUtils.setSkuStock(null, initGoodsSkuInfoVo.getSkuId(), initGoodsSkuInfoVo.getSkuStock()); goblinRedisUtils.setSkuStock(null, initGoodsSkuInfoVo.getSkuId(), initGoodsSkuInfoVo.getSkuStock());
......
...@@ -61,6 +61,7 @@ goblin_goods_sku.update_by_del=UPDATE goblin_goods_sku SET del_flg='1',updated_b ...@@ -61,6 +61,7 @@ goblin_goods_sku.update_by_del=UPDATE goblin_goods_sku SET del_flg='1',updated_b
#goblin_goods_sku_nft.insert_for_digital=INSERT INTO goblin_goods_sku_nft (sku_id,route_type,material_type,material_url,upchain,display_url,nft_url,series_id,series_hash,nft_hash,declare_at,created_at)VALUES(?,?,?,?,?,?,?,?,?,?,?,?) #goblin_goods_sku_nft.insert_for_digital=INSERT INTO goblin_goods_sku_nft (sku_id,route_type,material_type,material_url,upchain,display_url,nft_url,series_id,series_hash,nft_hash,declare_at,created_at)VALUES(?,?,?,?,?,?,?,?,?,?,?,?)
goblin_goods_sku_nft.insert_for_digital=INSERT INTO goblin_goods_sku_nft (sku_id,route_type,material_type,material_url,upchain,display_url,nft_url,created_at)VALUES(?,?,?,?,?,?,?,?) goblin_goods_sku_nft.insert_for_digital=INSERT INTO goblin_goods_sku_nft (sku_id,route_type,material_type,material_url,upchain,display_url,nft_url,created_at)VALUES(?,?,?,?,?,?,?,?)
#goblin_goods_sku_nft.update_for_digital=UPDATE goblin_goods_sku_nft SET upchain=?,series_id=?,series_hash=?,nft_hash=?,declare_at=?,updated_at=? WHERE skuId=? AND upchain=9
goblin_goods_image.insert_byreplace=REPLACE INTO goblin_goods_image (spu_id,url,del_flg)VALUES(?,?,'0') goblin_goods_image.insert_byreplace=REPLACE INTO goblin_goods_image (spu_id,url,del_flg)VALUES(?,?,'0')
goblin_goods_image.delete=UPDATE goblin_goods_image SET del_flg='1' WHERE spu_id=? AND del_flg='0' goblin_goods_image.delete=UPDATE goblin_goods_image SET del_flg='1' WHERE spu_id=? AND del_flg='0'
......
...@@ -41,12 +41,11 @@ public class PlatformGoblinGoodsSkuService extends ServiceImpl<GoblinGoodsSkuMap ...@@ -41,12 +41,11 @@ public class PlatformGoblinGoodsSkuService extends ServiceImpl<GoblinGoodsSkuMap
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
LambdaQueryWrapper<GoblinGoodsSku> queryWrapper = Wrappers.lambdaQuery(GoblinGoodsSku.class); LambdaQueryWrapper<GoblinGoodsSku> queryWrapper = Wrappers.lambdaQuery(GoblinGoodsSku.class);
queryWrapper.eq(GoblinGoodsSku::getSkuType, 1);// 1-数字藏品 queryWrapper.eq(GoblinGoodsSku::getSkuType, 1);// 1-数字藏品
// queryWrapper.eq(GoblinGoodsSku::getUpchain, 1);// TODO: 2022/3/28 ==zhanggb
queryWrapper.eq(GoblinGoodsSku::getDelFlg, "0"); queryWrapper.eq(GoblinGoodsSku::getDelFlg, "0");
queryWrapper.eq(GoblinGoodsSku::getStatus, "3"); queryWrapper.eq(GoblinGoodsSku::getStatus, "3");
queryWrapper.eq(GoblinGoodsSku::getShelvesHandle, "3"); queryWrapper.eq(GoblinGoodsSku::getShelvesHandle, "3");
queryWrapper.le(GoblinGoodsSku::getShelvesTime, now); queryWrapper.le(GoblinGoodsSku::getShelvesTime, now);
queryWrapper.in(GoblinGoodsSku::getShelvesStatus, "0", "1"); queryWrapper.in(GoblinGoodsSku::getShelvesStatus, "0");
queryWrapper.orderByAsc(GoblinGoodsSku::getShelvesTime); queryWrapper.orderByAsc(GoblinGoodsSku::getShelvesTime);
queryWrapper.select(GoblinGoodsSku::getSkuId, GoblinGoodsSku::getSpuId); queryWrapper.select(GoblinGoodsSku::getSkuId, GoblinGoodsSku::getSpuId);
...@@ -72,31 +71,30 @@ public class PlatformGoblinGoodsSkuService extends ServiceImpl<GoblinGoodsSkuMap ...@@ -72,31 +71,30 @@ public class PlatformGoblinGoodsSkuService extends ServiceImpl<GoblinGoodsSkuMap
LiquidnetServiceException liquidnetServiceException = new LiquidnetServiceException(); LiquidnetServiceException liquidnetServiceException = new LiquidnetServiceException();
if (goblinGoodsMapper.update(updateSpu, updateSpuWrapper) > 0) { if (goblinGoodsMapper.update(updateSpu, updateSpuWrapper) > 0) {
UpdateResult updateSkuResult = mongoTemplate.getCollection(GoblinGoodsSkuInfoVo.class.getSimpleName()).updateMany( UpdateResult updateSkuResult = mongoTemplate.getCollection(GoblinGoodsSkuInfoVo.class.getSimpleName()).updateMany(
Query.query(Criteria.where("skuId").in(skuIdList).and("delFlg").is("0").and("shelvesStatus").in("0", "1").and("shelvesHandle").is("3")).getQueryObject(), Query.query(Criteria.where("skuId").in(skuIdList).and("delFlg").is("0").and("shelvesStatus").in("0").and("shelvesHandle").is("3")).getQueryObject(),
Update.update("shelvesStatus", "3").set("shelvesAt", now).getUpdateObject() Update.update("shelvesStatus", "3").set("shelvesAt", now).set("updatedAt", now).getUpdateObject()
); );
if (updateSkuResult.getModifiedCount() > 0) { if (updateSkuResult.getModifiedCount() > 0) {
UpdateResult updateSpuResult = mongoTemplate.getCollection(GoblinGoodsInfoVo.class.getSimpleName()).updateMany( UpdateResult updateSpuResult = mongoTemplate.getCollection(GoblinGoodsInfoVo.class.getSimpleName()).updateMany(
Query.query(Criteria.where("spuId").in(spuIdList).and("delFlg").is("0")).getQueryObject(), Query.query(Criteria.where("spuId").in(spuIdList).and("delFlg").is("0")).getQueryObject(),
Update.update("shelvesStatus", "3").set("shelvesAt", now).getUpdateObject() Update.update("shelvesStatus", "3").set("shelvesAt", now).set("updatedAt", now).getUpdateObject()
); );
if (updateSpuResult.getModifiedCount() > 0) { if (updateSpuResult.getModifiedCount() > 0) {
AbstractRedisUtil redisGoblinUtil = redisDataSourceUtil.getRedisGoblinUtil(); AbstractRedisUtil redisGoblinUtil = redisDataSourceUtil.getRedisGoblinUtil();
skuIdList.forEach(skuId -> { skuIdList.forEach(skuId -> {
redisGoblinUtil.del(GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId)); redisGoblinUtil.del(GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId));
redisGoblinUtil.del(GoblinRedisConst.BASIC_GOODS_SKU_UNSHELVES.concat(skuId)); // redisGoblinUtil.del(GoblinRedisConst.BASIC_GOODS_SKU_UNSHELVES.concat(skuId));
}); });
spuIdList.forEach(spuId -> { spuIdList.forEach(spuId -> {
redisGoblinUtil.del(GoblinRedisConst.BASIC_GOODS.concat(spuId)); redisGoblinUtil.del(GoblinRedisConst.BASIC_GOODS.concat(spuId));
redisGoblinUtil.del(GoblinRedisConst.BASIC_GOODS_UNSHELVES.concat(spuId)); // redisGoblinUtil.del(GoblinRedisConst.BASIC_GOODS_UNSHELVES.concat(spuId));
}); });
return; return;
} else { } else {
LocalDateTime of = LocalDateTime.of(2022, 1, 1, 0, 0);
mongoTemplate.getCollection(GoblinGoodsSkuInfoVo.class.getSimpleName()).updateMany( mongoTemplate.getCollection(GoblinGoodsSkuInfoVo.class.getSimpleName()).updateMany(
Query.query(Criteria.where("skuId").in(skuIdList).and("shelvesAt").is(now)).getQueryObject(), Query.query(Criteria.where("skuId").in(skuIdList).and("shelvesAt").is(now)).getQueryObject(),
Update.update("shelvesStatus", "0").set("shelvesAt", of).getUpdateObject() Update.update("shelvesStatus", "0").getUpdateObject()
); );
liquidnetServiceException.setMessage("更新失败:Mongo.GoblinGoodsInfoVo"); liquidnetServiceException.setMessage("更新失败:Mongo.GoblinGoodsInfoVo");
} }
......
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