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

Commit 11fed098 authored by 张国柄's avatar 张国柄

+api:藏品转赠结果查询队列及处理;

parent 25b14257
......@@ -20,6 +20,7 @@ public class GoblinUserDigitalArtworkVo implements Serializable, Cloneable {
private String releaseAt;
private String tradingTxhash;
private String tradingAt;
private String receiverUid;
private String transferOrderId;
private String transferState;
private Integer source;
......
......@@ -36,6 +36,8 @@ public class ConsumerCommonBizRedisStreamConfig extends RedisStreamConfig {
ConsumerGoblinBizArtworkUplReceiver consumerGoblinBizArtworkUplReceiver;
@Autowired
ConsumerGoblinBizArtworkClqReceiver consumerGoblinBizArtworkClqReceiver;
@Autowired
ConsumerGoblinBizArtworkTransQueryReceiver consumerGoblinBizArtworkTransQueryReceiver;
/*------galaxy------*/
@Autowired
ConsumerGalaxyJsonNftPublishAndBuyReceiver jsonNftPublishAndBuyReceiver;
......@@ -136,6 +138,22 @@ public class ConsumerCommonBizRedisStreamConfig extends RedisStreamConfig {
return subscriptionList;
}
@Bean
public List<Subscription> subscriptionGoblinBizArtworkTransQuery(RedisConnectionFactory factory) {
List<Subscription> subscriptionList = new ArrayList<>();
MQConst.GoblinQueue stream = MQConst.GoblinQueue.BIZ_ARTWORK_TRANS_QUERY;
this.initStream(stringRedisTemplate, stream.getKey(), stream.getGroup());
for (int i = 0; i < 1; 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()), consumerGoblinBizArtworkTransQueryReceiver
));
listenerContainer.start();
}
return subscriptionList;
}
/**
* galaxy发行和购买
* @param factory
......
......@@ -77,12 +77,12 @@ public class ConsumerGoblinBizArtworkClqReceiver extends AbstractBizRedisReceive
// 失败重新入队逻辑改至`被调用API`实现
// JsonNode postRespJNode = JsonUtils.fromJson(postRespStr, JsonNode.class), postRespCode;
// if (null == postRespJNode || null == (postRespCode = postRespJNode.get("code")) || !postRespCode.asText().equals("0")) {
// log.warn("#NFT声明查询:处理失败[paramsStr={},postRespStr={}]", postDataMap, postRespStr);
// log.warn("#藏品声明查询:处理失败[paramsStr={},postRespStr={}]", postDataMap, postRespStr);
// return false;
// }
return true;
} catch (Exception e) {
log.error("Ex.NFT声明查询:处理异常[url={},paramsStr={}],ex:{}", postUrl, postDataMap, e.getMessage());
log.error("Ex.藏品声明查询:处理异常[url={},paramsStr={}],ex:{}", postUrl, postDataMap, e.getMessage());
return false;
}
}
......
package com.liquidnet.service.consumer.base.receiver;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.service.base.constant.MQConst;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.connection.stream.StreamRecords;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.HashMap;
@Slf4j
@Component
public class ConsumerGoblinBizArtworkTransQueryReceiver extends AbstractBizRedisReceiver {
@Value("${liquidnet.service.goblin.url}")
private String serviceGoblinUrl;
@Override
protected boolean consumerMessageHandler(String msg) {
boolean aBoolean = false;
try {
if (StringUtils.isEmpty(msg)) {
log.warn("CONSUMER MSG NULL_MSG ==> [{}]:{}", this.getRedisStreamKey(), msg);
aBoolean = true;
} else {
String[] msgArr = msg.split(",");
String bizId = msgArr[0], time = msgArr.length == 2 ? msgArr[1] : null;
LocalDateTime now = LocalDateTime.now(), checkTime = now.minusSeconds(15);
LocalDateTime createAt = StringUtils.isEmpty(time) ? checkTime : LocalDateTime.parse(time);
long durationToMillis = Duration.between(createAt, checkTime).toMillis();
if (durationToMillis >= 0) {
aBoolean = this.bizArtworkTransQueryProcessing(bizId);
} else {
try {
Thread.sleep(Math.abs(durationToMillis));
} catch (InterruptedException ignored) {
}
aBoolean = this.bizArtworkTransQueryProcessing(bizId);
}
}
} catch (Exception e) {
log.error("CONSUMER MSG EX_HANDLE ==> [{}]:{}", this.getRedisStreamKey(), msg, e);
} finally {
if (!aBoolean) {
HashMap<String, String> map = CollectionUtil.mapStringString();
map.put(MQConst.QUEUE_MESSAGE_KEY, msg);
stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(this.getRedisStreamKey()));
}
}
return aBoolean;
}
@Override
protected String getRedisStreamKey() {
return MQConst.GoblinQueue.BIZ_ARTWORK_CLQ.getKey();
}
@Override
protected String getRedisStreamGroup() {
return MQConst.GoblinQueue.BIZ_ARTWORK_CLQ.getGroup();
}
private boolean bizArtworkTransQueryProcessing(String transferOrderId) {
String postUrl = serviceGoblinUrl + "/goblin/que/artwork/transQuery";
LinkedMultiValueMap<String, String> postDataMap = CollectionUtil.linkedMultiValueMapStringString();
try {
postDataMap.add("transferOrderId", transferOrderId);
String postRespStr = HttpUtil.post(postUrl, postDataMap);
// 失败重新入队逻辑改至`被调用API`实现
// JsonNode postRespJNode = JsonUtils.fromJson(postRespStr, JsonNode.class), postRespCode;
// if (null == postRespJNode || null == (postRespCode = postRespJNode.get("code")) || !postRespCode.asText().equals("0")) {
// log.warn("#藏品转赠结果查询:处理失败[paramsStr={},postRespStr={}]", postDataMap, postRespStr);
// return false;
// }
return true;
} catch (Exception e) {
log.error("Ex.藏品转赠结果查询:处理异常[url={},paramsStr={}],ex:{}", postUrl, postDataMap, e.getMessage());
return false;
}
}
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
}
......@@ -61,12 +61,12 @@ public class ConsumerGoblinBizArtworkUplReceiver extends AbstractBizRedisReceive
// 失败重新入队逻辑改至`被调用API`实现
// JsonNode postRespJNode = JsonUtils.fromJson(postRespStr, JsonNode.class), postRespCode;
// if (null == postRespJNode || null == (postRespCode = postRespJNode.get("code")) || !postRespCode.asText().equals("0")) {
// log.warn("#NFT素材上传:处理失败[paramsStr={},postRespStr={}]", postDataMap, postRespStr);
// log.warn("#藏品素材上传:处理失败[paramsStr={},postRespStr={}]", postDataMap, postRespStr);
// return false;
// }
return true;
} catch (Exception e) {
log.error("Ex.NFT素材上传:处理异常[url={},paramsStr={}],ex:{}", postUrl, postDataMap, e.getMessage());
log.error("Ex.藏品素材上传:处理异常[url={},paramsStr={}],ex:{}", postUrl, postDataMap, e.getMessage());
return false;
}
}
......
......@@ -1153,7 +1153,9 @@ create table goblin_user_digital_artwork
) engine = InnoDB comment '用户数字藏品信息';
# -- >>------------------------------------------------------------------------------------ |20220817数字藏品转赠安全密码
alter table goblin_user_digital_artwork
add transfer_order_id varchar(20) null comment '转赠订单号' after trading_at;
add receiver_uid varchar(20) null comment '受赠人UID' after trading_at;
alter table goblin_user_digital_artwork
add transfer_order_id varchar(20) null comment '转赠订单号' after receiver_uid;
alter table goblin_user_digital_artwork
add transfer_state varchar(20) null comment '转赠状态[PENDING|SUCCESS]' after transfer_order_id;
alter table goblin_user_digital_artwork
......
......@@ -172,7 +172,7 @@ public class GoblinUserDigitalArtworkController {
if (1 != userDigitalArtworkVo.getState()) return ResponseDto.failure(ErrorMapping.get("140107"));// 未上链
String transferState = userDigitalArtworkVo.getTransferState();
if (StringUtils.isNotEmpty(transferState)) return ResponseDto.success(transferState);// 转赠状态不为空,标记已转赠或转赠中
String[] receiverArr = null;
String[] receiverArr;
try {
receiverArr = DESUtils.DES().decrypt(receiver).split(",");
} catch (Exception e) {
......
......@@ -2,6 +2,7 @@ package com.liquidnet.service.goblin.controller.Inner;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.service.impl.inner.GoblinQueBizArtworkClqService;
import com.liquidnet.service.goblin.service.impl.inner.GoblinQueBizArtworkTransQueryService;
import com.liquidnet.service.goblin.service.impl.inner.GoblinQueBizArtworkUplService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
......@@ -27,22 +28,33 @@ public class GoblinQueBizArtworkController {
private GoblinQueBizArtworkUplService goblinQueBizArtworkUplService;
@Autowired
private GoblinQueBizArtworkClqService goblinQueBizArtworkClqService;
@Autowired
private GoblinQueBizArtworkTransQueryService goblinQueBizArtworkTransQueryService;
@PostMapping("upl")
@ApiOperation("藏品上传声明")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "skuId", value = "藏品ID", example = "1"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "skuId", value = "藏品SKUID", example = "1"),
})
public ResponseDto<String> bizArtworkUpl(@NotBlank(message = "藏品ID不能为空") @RequestParam String skuId) {
public ResponseDto<String> bizArtworkUpl(@NotBlank(message = "藏品SKUID不能为空") @RequestParam String skuId) {
return goblinQueBizArtworkUplService.bizArtworkUplProcessing(skuId);
}
@PostMapping("clq")
@ApiOperation("藏品声明查询")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "skuId", value = "藏品ID", example = "1"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "skuId", value = "藏品SKUID", example = "1"),
})
public ResponseDto<String> bizArtworkClq(@NotBlank(message = "藏品ID不能为空") @RequestParam String skuId) {
public ResponseDto<String> bizArtworkClq(@NotBlank(message = "藏品SKUID不能为空") @RequestParam String skuId) {
return goblinQueBizArtworkClqService.bizArtworkClqProcessing(skuId);
}
@PostMapping("transQuery")
@ApiOperation("藏品转赠结果查询")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "artworkId", value = "藏品ID", example = "1"),
})
public ResponseDto<String> bizArtworkTransQuery(@NotBlank(message = "藏品转赠订单号不能为空") @RequestParam String artworkId) {
return goblinQueBizArtworkTransQueryService.bizArtworkTransQueryProcessing(artworkId);
}
}
......@@ -174,47 +174,6 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr
return null;
}
// @Override
// public GoblinUserDigitalArtworkListVo unboxingForBuyOrExchange(String uid, GoblinUserDigitalArtworkVo userDigitalArtworkVo) {
// String orderId = userDigitalArtworkVo.getOrderId();
// GoblinNftOrderVo goblinNftOrder = goblinRedisUtils.getGoblinNftOrder(orderId);
// GoblinGoodsSkuInfoVo unboxSkuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(goblinNftOrder.getBoxSkuId());
//
// GoblinUserDigitalArtworkListVo unboxDigitalArtworkListVo = GoblinUserDigitalArtworkListVo.getNew();
//// unboxDigitalArtworkListVo.setArtworkId();
// unboxDigitalArtworkListVo.setName(unboxSkuInfoVo.getName());
// unboxDigitalArtworkListVo.setSubtitle(unboxSkuInfoVo.getSubtitle());
// unboxDigitalArtworkListVo.setCoverPic(unboxSkuInfoVo.getSkuPic());
//// unboxDigitalArtworkListVo.setSource(userDigitalArtworkVo.getSource());
//// unboxDigitalArtworkListVo.setState(0);
//// unboxDigitalArtworkListVo.setCreatedAt();
//// unboxDigitalArtworkListVo.setUnbox("0");
//// unboxDigitalArtworkListVo.setOpeningTime(now);
//
// LocalDateTime now = LocalDateTime.now();
// userDigitalArtworkVo.setState(1);
// userDigitalArtworkVo.setDelFlg("1");// 盲盒开启后直接删除
// userDigitalArtworkVo.setOpeningAt(now);
// userDigitalArtworkVo.setUpdatedAt(now);
// userDigitalArtworkVo.setDeletedAt(now);
//
//// if (goblinMongoUtils.updateUserDigitalArtworkVoByUnboxing(userDigitalArtworkVo)) {
// goblinRedisUtils.setexUserDigitalArtworkVo(userDigitalArtworkVo);
//
// String artworkId = userDigitalArtworkVo.getArtworkId();
// GoblinQueueBizArtworkGenDto queueBizArtworkGenDto = GoblinQueueBizArtworkGenDto.getNew();
// queueBizArtworkGenDto.setUid(uid);
// queueBizArtworkGenDto.setSkuId(unboxSkuInfoVo.getSkuId());
// queueBizArtworkGenDto.setOrderId(orderId);
// queueBizArtworkGenDto.setSource(userDigitalArtworkVo.getSource());
// queueBizArtworkGenDto.setFromArtId(artworkId);
// queueUtils.sendMsgByRedis(MQConst.GoblinQueue.BIZ_ARTWORK_GEN.getKey(), queueBizArtworkGenDto.toJson());
// queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_ARTWORK_GEN.getKey(),
// SqlMapping.get("goblin_user_digital_artwork.update_for_unboxing", now, now, now, artworkId));
//// }
// return unboxDigitalArtworkListVo;
// }
@Override
public GoblinUserDigitalArtworkListVo unboxingForBuyOrExchange(String uid, GoblinUserDigitalArtworkVo userDigitalArtworkBoxVo) {
LocalDateTime now = LocalDateTime.now();
......@@ -354,27 +313,13 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr
@Override
public boolean transfer(GoblinUserDigitalArtworkVo userDigitalArtworkVo, String routerType, String[] receiverArr) {
userDigitalArtworkVo.setTransferState(GoblinStatusConst.TransferState.PENDING.name());
userDigitalArtworkVo.setReceiverUid(receiverArr[0]);
userDigitalArtworkVo.setTransferOrderId(IDGenerator.nextSnowId());
userDigitalArtworkVo.setTransferState(GoblinStatusConst.TransferState.PENDING.name());
userDigitalArtworkVo.setTransferUser(SensitizeUtil.custom(receiverArr[1], 0, 1) + String.format("(%s)", SensitizeUtil.custom(receiverArr[2], 3, 4)));
if (goblinRedisUtils.setUserDigitalArtworkVo(userDigitalArtworkVo)) {
LocalDateTime nowTime = LocalDateTime.now();
// GoblinUserDigitalArtworkVo receiverDigitalArtworkVo = GoblinUserDigitalArtworkVo.getNew();
// receiverDigitalArtworkVo.setArtworkId(IDGenerator.nextSnowId());
// receiverDigitalArtworkVo.setSkuId(userDigitalArtworkVo.getSkuId());
// receiverDigitalArtworkVo.setUid(receiverArr[0]);
// receiverDigitalArtworkVo.setOrderId(userDigitalArtworkVo.getTransferOrderId());
// receiverDigitalArtworkVo.setSource(6);
// receiverDigitalArtworkVo.setState(1);
// receiverDigitalArtworkVo.setDelFlg("0");
// receiverDigitalArtworkVo.setCreatedAt(nowTime);
// receiverDigitalArtworkVo.setAuthor(userDigitalArtworkVo.getAuthor());
// receiverDigitalArtworkVo.setPublisher(userDigitalArtworkVo.getPublisher());
//
// goblinRedisUtils.setUserDigitalArtworkVo(receiverDigitalArtworkVo);
GalaxyNftTransferReqDto galaxyNftTransferReqDto = GalaxyNftTransferReqDto.getNew();
galaxyNftTransferReqDto.setRouterType(routerType);
galaxyNftTransferReqDto.setNftId(userDigitalArtworkVo.getNftId());
......@@ -383,7 +328,7 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr
galaxyNftTransferReqDto.setTransOrderId(userDigitalArtworkVo.getTransferOrderId());
galaxyNftTransferReqDto.setReqTimestamp(DateUtil.Formatter.yyyyMMddHHmmss.format(nowTime));
queueUtils.sendMsgByRedis(MQConst.GalaxyQueue.JSON_NFT_TRANSFER.getKey(), JsonUtils.toJson(galaxyNftTransferReqDto));
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.BIZ_ARTWORK_TRANS_QUERY.getKey(), userDigitalArtworkVo.getTransferOrderId().concat(",").concat(String.valueOf(LocalDateTime.now())));
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.BIZ_ARTWORK_TRANS_QUERY.getKey(), userDigitalArtworkVo.getArtworkId().concat(",").concat(String.valueOf(LocalDateTime.now())));
// Mongo同步更新
GoblinQueueBizMongoDto goblinQueueBizMongoDto = GoblinQueueBizMongoDto.getNew();
......@@ -396,14 +341,11 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr
// Mysql持久化
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
// toMqSqls.add(SqlMapping.get("goblin_user_digital_artwork.insert"));
// LinkedList<Object[]> initUserDigitalArtworkObjs = CollectionUtil.linkedListObjectArr();
// initUserDigitalArtworkObjs.add(new Object[]{receiverDigitalArtworkVo.getArtworkId(),
// receiverDigitalArtworkVo.getSkuId(), receiverDigitalArtworkVo.getUid(), receiverDigitalArtworkVo.getOrderId(),
// receiverDigitalArtworkVo.getSource(), receiverDigitalArtworkVo.getState(), receiverDigitalArtworkVo.getCreatedAt()});
toMqSqls.add(SqlMapping.get("goblin_user_digital_artwork.update_for_transfer"));
LinkedList<Object[]> updateUserDigitalArtworkObjs = CollectionUtil.linkedListObjectArr();
updateUserDigitalArtworkObjs.add(new Object[]{userDigitalArtworkVo.getTransferState(), nowTime, userDigitalArtworkVo.getArtworkId()});
updateUserDigitalArtworkObjs.add(new Object[]{userDigitalArtworkVo.getReceiverUid(),
userDigitalArtworkVo.getTransferOrderId(), userDigitalArtworkVo.getTransferState(), nowTime, userDigitalArtworkVo.getArtworkId()
});
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_ARTWORK_GEN.getKey(), SqlMapping.gets(toMqSqls, updateUserDigitalArtworkObjs));
}
return false;
......
......@@ -53,14 +53,14 @@ public class GoblinQueBizArtworkClqService {
try {
GoblinGoodsSkuInfoVo mgtGoodsSkuInfoVo = goblinMongoUtils.getGoodsSkuInfoVo(skuId);
if (null == mgtGoodsSkuInfoVo) {
log.warn("#NFT声明查询:藏品SKU不存在[skuId={}]", skuId);
log.warn("#藏品声明查询:藏品SKU不存在[skuId={}]", skuId);
return ResponseDto.success(String.format("藏品SKU不存在[skuId:%s]", skuId));
}
int skuType = mgtGoodsSkuInfoVo.getSkuType(), upchain = mgtGoodsSkuInfoVo.getUpchain();
String unbox = mgtGoodsSkuInfoVo.getUnbox();
// 非数字藏品 || 盲盒 || 非声明中 || 已有声明系列ID
if (1 != skuType || !"0".equals(unbox) || 9 != upchain || StringUtils.isNotEmpty(mgtGoodsSkuInfoVo.getSeriesId())) {
log.warn("#NFT声明查询:藏品SKU无效或已声明[skuId={},skuType={},unbox={},upchain={},seriesId={}]",
log.warn("#藏品声明查询:藏品SKU无效或已声明[skuId={},skuType={},unbox={},upchain={},seriesId={}]",
skuId, skuType, unbox, upchain, mgtGoodsSkuInfoVo.getSeriesId());
return ResponseDto.success(String.format("藏品SKU无效或已声明[skuId:%s]", skuId));
}
......@@ -93,7 +93,7 @@ public class GoblinQueBizArtworkClqService {
sqlUpdateMap.put(MQConst.QUEUE_MESSAGE_KEY, SqlMapping.gets(toMqSqls, updateGoodsSkuNftObjs));
redisDataSourceUtil.getRedisQueueUtil().getStringRedisTemplate().opsForStream().add(StreamRecords.mapBacked(sqlUpdateMap).withStreamKey(MQConst.GoblinQueue.SQL_GOODS.getKey()));
} catch (Exception e) {
log.error("Ex.NFT声明查询:处理异常[skuId={}]", skuId, e);
log.error("Ex.藏品声明查询:处理异常[skuId={}]", skuId, e);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.BIZ_ARTWORK_CLQ.getKey(), skuId);
return ResponseDto.failure(String.format("藏品声明查询异常[skuId:%s]", skuId));// 声明查询失败,重新入队处理
}
......@@ -114,12 +114,12 @@ public class GoblinQueBizArtworkClqService {
requestDto.setRouterType(routerType);
responseDto = galaxyArtworkService.seriesClaimResultQuery(requestDto);
if (!responseDto.isSuccess()) {
log.warn("#NFT声明查询:处理失败[paramsStr={},postRespStr={}]", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto));
log.warn("#藏品声明查询:处理失败[paramsStr={},postRespStr={}]", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto));
return null;
}
return responseDto.getData();
} catch (Exception e) {
log.error("Ex.NFT声明查询:处理异常[paramsStr={},postRespStr={}],ex:{}", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto), e.getMessage());
log.error("Ex.藏品声明查询:处理异常[paramsStr={},postRespStr={}],ex:{}", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto), e.getMessage());
return null;
}
}
......
package com.liquidnet.service.goblin.service.impl.inner;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftTransferQueryReqDto;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftTransferQueryRespDto;
import com.liquidnet.service.galaxy.service.IGalaxyTradeService;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinUserDigitalArtworkVo;
import com.liquidnet.service.goblin.util.GoblinMongoUtils;
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.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.LinkedList;
@Slf4j
@Service
public class GoblinQueBizArtworkTransQueryService {
@Autowired
QueueUtils queueUtils;
@Autowired
GoblinRedisUtils goblinRedisUtils;
@Autowired
GoblinMongoUtils goblinMongoUtils;
@Resource(name = "galaxyTradeServiceImpl")
private IGalaxyTradeService galaxyTradeService;
public ResponseDto<String> bizArtworkTransQueryProcessing(String artworkId) {
try {
GoblinUserDigitalArtworkVo userDigitalArtworkVo = goblinRedisUtils.getUserDigitalArtworkVo(artworkId);
if (null == userDigitalArtworkVo) {
log.warn("#藏品转赠结果查询:藏品不存在[artworkId={}]", artworkId);
return ResponseDto.success(String.format("藏品不存在[artworkId:%s]", artworkId));
}
if (!GoblinStatusConst.TransferState.PENDING.name().equals(userDigitalArtworkVo.getTransferState())) {
log.warn("#藏品转赠结果查询:藏品非转赠中不处理[artworkId={},transferState={},transferOrderId={}]", artworkId, userDigitalArtworkVo.getTransferState(), userDigitalArtworkVo.getTransferOrderId());
return ResponseDto.success(String.format("藏品非转赠中不处理[artworkId:%s]", artworkId));
}
GoblinGoodsSkuInfoVo goodsSkuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(userDigitalArtworkVo.getSkuId());
GalaxyNftTransferQueryRespDto queryRespDto = this.queryNftTransferQueryRespDto(userDigitalArtworkVo.getTransferOrderId(), goodsSkuInfoVo.getRouteType());
if (null == queryRespDto || !"1".equals(queryRespDto.getTransferStatus())) {// 查询失败,重新入队处理
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.BIZ_ARTWORK_TRANS_QUERY.getKey(), userDigitalArtworkVo.getArtworkId());
return ResponseDto.failure(String.format("藏品转赠结果查询失败[artworkId:%s]", artworkId));
}
if (!userDigitalArtworkVo.getReceiverUid().equals(queryRespDto.getOwnerUserId())) {// 拥有者与受赠人不一致(特殊情况,重新入队处理)
log.warn("#藏品转赠结果查询:拥有者与受赠人不一致[artworkId={},receiverUid={},ownerUserId={}]", userDigitalArtworkVo.getArtworkId(), userDigitalArtworkVo.getReceiverUid(), queryRespDto.getOwnerUserId());
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.BIZ_ARTWORK_TRANS_QUERY.getKey(), artworkId);
return ResponseDto.failure(String.format("藏品转赠结果查询数据不一致[artworkId:%s]", artworkId));
}
LocalDateTime nowDateTime = LocalDateTime.now();
{// 转赠人藏品处理
userDigitalArtworkVo.setTransferState(GoblinStatusConst.TransferState.SUCCESS.name());
userDigitalArtworkVo.setDelFlg("1");
userDigitalArtworkVo.setDeletedAt(nowDateTime);
if (goblinMongoUtils.updateUserDigitalArtworkVoByTransQuery(userDigitalArtworkVo)) {// 转赠人藏品状态更新Mongo
goblinRedisUtils.setUserDigitalArtworkVo(userDigitalArtworkVo);// 转赠人藏品状态更新Redis
goblinRedisUtils.addSubUserDigitalArtworkCount(userDigitalArtworkVo.getUid(), -1);// 转赠人藏品数量处理Redis
goblinRedisUtils.resetUserDigitalArtworkIdsByMongo(userDigitalArtworkVo.getUid());// 转赠人藏品ID集合缓存重置Redis
} else {
log.warn("#藏品转赠结果查询:更新转赠人藏品Mongo数据失败[artworkId={}]", userDigitalArtworkVo.getArtworkId());
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.BIZ_ARTWORK_TRANS_QUERY.getKey(), artworkId);
return ResponseDto.failure(String.format("藏品转赠结果查询数据不一致[artworkId:%s]", artworkId));
}
}
GoblinUserDigitalArtworkVo receiverDigitalArtworkVo = GoblinUserDigitalArtworkVo.getNew();
{// 受赠人藏品处理
String transferTime = queryRespDto.getTransferTime(), transferHash = queryRespDto.getTransferHash();
receiverDigitalArtworkVo.setArtworkId(IDGenerator.nextSnowId());
receiverDigitalArtworkVo.setUid(userDigitalArtworkVo.getReceiverUid());
receiverDigitalArtworkVo.setSkuId(userDigitalArtworkVo.getSkuId());
receiverDigitalArtworkVo.setOrderId(userDigitalArtworkVo.getTransferOrderId());
receiverDigitalArtworkVo.setEditionSn(userDigitalArtworkVo.getEditionSn());
receiverDigitalArtworkVo.setNftId(userDigitalArtworkVo.getNftId());
//receiverDigitalArtworkVo.setReleaseTxhash();
//receiverDigitalArtworkVo.setReleaseAt();
receiverDigitalArtworkVo.setTradingTxhash(transferHash);
receiverDigitalArtworkVo.setTradingAt(transferTime);
//receiverDigitalArtworkVo.setReceiverUid();
//receiverDigitalArtworkVo.setTransferOrderId();
//receiverDigitalArtworkVo.setTransferState();
receiverDigitalArtworkVo.setSource(6);
receiverDigitalArtworkVo.setState(1);
receiverDigitalArtworkVo.setDelFlg("0");
//receiverDigitalArtworkVo.setOpeningAt();
receiverDigitalArtworkVo.setCreatedAt(nowDateTime);
//receiverDigitalArtworkVo.setUpdatedAt();
receiverDigitalArtworkVo.setAuthor(userDigitalArtworkVo.getAuthor());
receiverDigitalArtworkVo.setPublisher(userDigitalArtworkVo.getPublisher());
goblinMongoUtils.insertUserDigitalArtworkVo(receiverDigitalArtworkVo);// 受赠人藏品记录Mongo
goblinRedisUtils.setUserDigitalArtworkVo(receiverDigitalArtworkVo);// 受赠人藏品记录Redis
goblinRedisUtils.addUserDigitalArtworkIds(receiverDigitalArtworkVo.getUid(), receiverDigitalArtworkVo.getArtworkId());// 受赠人藏品ID列表记录Redis
goblinRedisUtils.addSubUserDigitalArtworkCount(receiverDigitalArtworkVo.getUid(), 1);// 受赠人藏品数量记录Redis
}
{// Mysql持久化
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
toMqSqls.add(SqlMapping.get("goblin_user_digital_artwork.update_for_trans_query"));
LinkedList<Object[]> updateUserDigitalArtworkObjs = CollectionUtil.linkedListObjectArr();
updateUserDigitalArtworkObjs.add(new Object[]{userDigitalArtworkVo.getTransferState(), userDigitalArtworkVo.getDeletedAt(), userDigitalArtworkVo.getArtworkId()});
toMqSqls.add(SqlMapping.get("goblin_user_digital_artwork.insert_for_transfer"));
LinkedList<Object[]> initUserDigitalArtworkObjs = CollectionUtil.linkedListObjectArr();
initUserDigitalArtworkObjs.add(new Object[]{receiverDigitalArtworkVo.getArtworkId(),
receiverDigitalArtworkVo.getUid(), receiverDigitalArtworkVo.getSkuId(), receiverDigitalArtworkVo.getOrderId(),
receiverDigitalArtworkVo.getEditionSn(), receiverDigitalArtworkVo.getNftId(), receiverDigitalArtworkVo.getTradingTxhash(),
receiverDigitalArtworkVo.getTradingAt(), receiverDigitalArtworkVo.getSource(), receiverDigitalArtworkVo.getState(),
receiverDigitalArtworkVo.getCreatedAt()});
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_ARTWORK_GEN.getKey(), SqlMapping.gets(toMqSqls, updateUserDigitalArtworkObjs, initUserDigitalArtworkObjs));
}
} catch (Exception e) {
log.error("Ex.藏品转赠结果查询:处理异常[artworkId={}]", artworkId, e);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.BIZ_ARTWORK_UPL.getKey(), artworkId);
return ResponseDto.failure(String.format("藏品转赠结果查询异常[artworkId:%s]", artworkId));
}
return ResponseDto.success();
}
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
private GalaxyNftTransferQueryRespDto queryNftTransferQueryRespDto(String transferOrderId, String routerType) {
GalaxyNftTransferQueryReqDto requestDto = GalaxyNftTransferQueryReqDto.getNew();
ResponseDto<GalaxyNftTransferQueryRespDto> responseDto = null;
try {
requestDto.setTransOrderId(transferOrderId);
requestDto.setRouterType(routerType);
responseDto = galaxyTradeService.nftTransferQuery(requestDto);
if (!responseDto.isSuccess()) {
log.warn("#藏品转赠结果查询:处理失败[paramsStr={},postRespStr={}]", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto));
return null;
}
return responseDto.getData();
} catch (Exception e) {
log.error("Ex.藏品转赠结果查询:处理异常[paramsStr={},postRespStr={}],ex:{}", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto), e.getMessage());
return null;
}
}
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------ */
}
\ No newline at end of file
......@@ -57,14 +57,14 @@ public class GoblinQueBizArtworkUplService {
try {
GoblinGoodsSkuInfoVo mgtGoodsSkuInfoVo = goblinMongoUtils.getGoodsSkuInfoVo(skuId);
if (null == mgtGoodsSkuInfoVo) {
log.warn("#NFT素材上传:藏品SKU不存在[skuId={}]", skuId);
log.warn("#藏品素材上传:藏品SKU不存在[skuId={}]", skuId);
return ResponseDto.success(String.format("藏品SKU不存在[skuId:%s]", skuId));
}
int skuType = mgtGoodsSkuInfoVo.getSkuType(), upchain = mgtGoodsSkuInfoVo.getUpchain();
String unbox = mgtGoodsSkuInfoVo.getUnbox();
// 非数字藏品 || 盲盒 || 非声明中 || 已有声明系列ID
if (1 != skuType || !"0".equals(unbox) || 0 != upchain || StringUtils.isNotEmpty(mgtGoodsSkuInfoVo.getSeriesId())) {
log.warn("#NFT素材上传:藏品SKU无效或已声明[skuId={},skuType={},unbox={},upchain={},seriesId={}]",
log.warn("#藏品素材上传:藏品SKU无效或已声明[skuId={},skuType={},unbox={},upchain={},seriesId={}]",
skuId, skuType, unbox, upchain, mgtGoodsSkuInfoVo.getSeriesId());
return ResponseDto.success(String.format("藏品SKU无效或已声明[skuId:%s]", skuId));
}
......@@ -126,7 +126,7 @@ public class GoblinQueBizArtworkUplService {
toQueueBeClaimQueryMsg.put(MQConst.QUEUE_MESSAGE_KEY, skuId.concat(",").concat(String.valueOf(LocalDateTime.now())));
streamOperations.add(StreamRecords.mapBacked(toQueueBeClaimQueryMsg).withStreamKey(MQConst.GoblinQueue.BIZ_ARTWORK_CLQ.getKey()));
} catch (Exception e) {
log.error("Ex.NFT素材上传:处理异常[skuId={}]", skuId, e);
log.error("Ex.藏品素材上传:处理异常[skuId={}]", skuId, e);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.BIZ_ARTWORK_UPL.getKey(), skuId);
return ResponseDto.failure(String.format("藏品上传异常[skuId:%s]", skuId));
}
......@@ -140,7 +140,7 @@ public class GoblinQueBizArtworkUplService {
/* ------------------------------------------------------------------------------------ */
/**
* NFT素材上传
* 藏品素材上传
*
* @param nftUploadReqDto GalaxyNftUploadReqDto
* @return GalaxyNftUploadRespDto
......@@ -150,12 +150,12 @@ public class GoblinQueBizArtworkUplService {
try {
responseDto = galaxyArtworkService.nftUpload(nftUploadReqDto);
if (!responseDto.isSuccess()) {
log.warn("#NFT素材上传:处理失败[paramsStr={},postRespStr={}]", JsonUtils.toJson(nftUploadReqDto), JsonUtils.toJson(responseDto));
log.warn("#藏品素材上传:处理失败[paramsStr={},postRespStr={}]", JsonUtils.toJson(nftUploadReqDto), JsonUtils.toJson(responseDto));
return null;
}
return responseDto.getData();
} catch (Exception e) {
log.error("Ex.NFT素材上传:处理异常[paramsStr={},postRespStr={}],ex:{}", JsonUtils.toJson(nftUploadReqDto), JsonUtils.toJson(responseDto), e.getMessage());
log.error("Ex.藏品素材上传:处理异常[paramsStr={},postRespStr={}],ex:{}", JsonUtils.toJson(nftUploadReqDto), JsonUtils.toJson(responseDto), e.getMessage());
return null;
}
}
......@@ -171,12 +171,12 @@ public class GoblinQueBizArtworkUplService {
try {
responseDto = galaxyArtworkService.seriesClaim(requestDto);
if (!responseDto.isSuccess()) {
log.warn("#NFT系列声明:处理失败[paramsStr={},postRespStr={}]", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto));
log.warn("#藏品系列声明:处理失败[paramsStr={},postRespStr={}]", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto));
return null;
}
return responseDto.getData();
} catch (Exception e) {
log.error("Ex.NFT系列声明:处理异常[paramsStr={},postRespStr={}],ex:{}", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto), e.getMessage());
log.error("Ex.藏品系列声明:处理异常[paramsStr={},postRespStr={}],ex:{}", JsonUtils.toJson(requestDto), JsonUtils.toJson(responseDto), e.getMessage());
return null;
}
}
......
......@@ -1625,6 +1625,20 @@ public class GoblinMongoUtils {
return updateResult.getModifiedCount() > 0;
}
/**
* 转赠成功后,更新藏品信息
*/
public boolean updateUserDigitalArtworkVoByTransQuery(GoblinUserDigitalArtworkVo vo) {
UpdateResult updateResult = mongoTemplate.getCollection(GoblinUserDigitalArtworkVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("artworkId").is(vo.getArtworkId())).getQueryObject(),
Update.update("transferState", vo.getTransferState())
.set("delFlg", vo.getDelFlg())
.set("deletedAt", mongoConverter.convertToMongoType(vo.getDeletedAt()))
.getUpdateObject()
);
return updateResult.getModifiedCount() > 0;
}
public List<String> getPageUserDigitalArtworkIds(String uid, Integer pageNum, Integer pageSize) {
Criteria criteria = Criteria.where("uid").is(uid).and("delFlg").is("0");
Query query = Query.query(criteria);
......
......@@ -1985,9 +1985,24 @@ public class GoblinRedisUtils {
return redisUtil.incr(GoblinRedisConst.USER_DIGITAL_ARTWORK_UNBOX.concat(artworkId), 1);
}
/**
* 缓存用户累计藏品数
*
* @param uid 藏品拥有者
* @param num 增减藏品数量
* @return 用户剩余藏品数
*/
public long addSubUserDigitalArtworkCount(String uid, long num) {
if (num > 0) {
return redisUtil.incr(GoblinRedisConst.USER_DIGITAL_ARTWORK_CT.concat(uid), num);
} else {
return redisUtil.decr(GoblinRedisConst.USER_DIGITAL_ARTWORK_CT.concat(uid), Math.abs(num));
}
}
public long countUserDigitalArtwork(String uid) {
Object o = redisUtil.get(GoblinRedisConst.USER_DIGITAL_ARTWORK_CT.concat(uid));
return Objects.isNull(o) ? 0 : (int) o;
return Objects.isNull(o) ? 0 : Math.max(((int) o), 0);
}
public GoblinUserDigitalArtworkVo getUserDigitalArtworkVo(String artworkId) {
......@@ -2009,7 +2024,7 @@ public class GoblinRedisUtils {
return redisUtil.set(GoblinRedisConst.USER_DIGITAL_ARTWORK.concat(vo.getArtworkId()), vo, 259200);
}
/* ----------------------------------- 我的藏品生成 ----------------------------------- */
/* ----------------------------------- 我的藏品管理 ----------------------------------- */
/**
* 标记订单藏品生成
......@@ -2025,21 +2040,29 @@ public class GoblinRedisUtils {
return redisUtil.hasKey(GoblinRedisConst.USER_DIGITAL_ARTWORK_GENMARK.concat(uid).concat(skuId).concat(orderId));
}
// /**
// * 缓存并更新用户藏品ID集合
// */
// public boolean addUserDigitalArtworkIds(String uid, String artworkId) {
// List<String> ids = this.getUserDigitalArtworkIds(uid);
// if (CollectionUtils.isEmpty(ids)) {
// ids = CollectionUtil.arrayListString();
// ids.add(artworkId);
// } else {
// ids.add(0, artworkId);
// int size = ids.size();
// if (size > 30) ids.remove(size - 1);
// }
// return redisUtil.set(GoblinRedisConst.USER_DIGITAL_ARTWORK_IDS.concat(uid), ids);
// }
/**
* 重置Redis中用户藏品ID集合的缓存(降级Mongo查取藏品ID集合)
*/
public boolean resetUserDigitalArtworkIdsByMongo(String uid) {
List<String> ids = goblinMongoUtils.getPageUserDigitalArtworkIds(uid, 1, 30);
return !CollectionUtils.isEmpty(ids) && redisUtil.set(GoblinRedisConst.USER_DIGITAL_ARTWORK_IDS.concat(uid), ids);
}
/**
* 缓存并更新用户藏品ID集合
*/
public boolean addUserDigitalArtworkIds(String uid, String artworkId) {
List<String> ids = this.getUserDigitalArtworkIds(uid);
if (CollectionUtils.isEmpty(ids)) {
ids = CollectionUtil.arrayListString();
ids.add(artworkId);
} else {
ids.add(0, artworkId);
int size = ids.size();
if (size > 30) ids.remove(size - 1);
}
return redisUtil.set(GoblinRedisConst.USER_DIGITAL_ARTWORK_IDS.concat(uid), ids);
}
/**
* 开启盲盒:缓存并更新用户藏品ID集合
......
......@@ -127,11 +127,13 @@ goblin_store_coupon_rule.update_del=UPDATE goblin_store_coupon_rule SET del_flg=
goblin_user_coupon.insert=INSERT INTO goblin_user_coupon (ucoupon_id, store_coupon_id, uid, state, bind_at, dued_at, operator, created_at)VALUES(?,?,?,?,?,?,?,?)
goblin_user_coupon.updateState=UPDATE goblin_user_coupon SET state = ? , used_for = ? ,updated_at = ? where ucoupon_id = ?
#---- \u6211\u7684\u85CF\u54C1
goblin_user_digital_artwork.insert=INSERT INTO goblin_user_digital_artwork (artwork_id, sku_id, uid, order_id, source, state, created_at)VALUES(?,?,?,?,?,?,?)
goblin_user_digital_artwork.insert=INSERT INTO goblin_user_digital_artwork (artwork_id,sku_id,uid,order_id,source,state,created_at)VALUES(?,?,?,?,?,?,?)
goblin_user_digital_artwork.insert_for_transfer=INSERT INTO goblin_user_digital_artwork (artwork_id,uid,sku_id,order_id,edition_sn,nft_id,trading_txhash,trading_at,`source`,state,created_at)VALUES(?,?,?,?,?,?,?,?,?,?,?)
goblin_user_digital_artwork.update_for_chain=UPDATE goblin_user_digital_artwork SET edition_sn=?,nft_id=?,release_txhash=?,release_at=?,trading_txhash=?,trading_at=?,state=?,updated_at=? WHERE artwork_id=? AND state<>1
goblin_user_digital_artwork.update_for_unboxing=UPDATE goblin_user_digital_artwork SET state=1,del_flg='1',opening_at=?,updated_at=?,deleted_at=? WHERE artwork_id=? AND state<>1
goblin_user_digital_artwork.update_for_accept=UPDATE goblin_user_digital_artwork SET state=0,opening_at=?,updated_at=? WHERE artwork_id=? AND state=5
goblin_user_digital_artwork.update_for_transfer=UPDATE goblin_user_digital_artwork SET transfer_order_id=?,transfer_state=?,updated_at=? WHERE artwork_id=?
goblin_user_digital_artwork.update_for_transfer=UPDATE goblin_user_digital_artwork SET receiver_uid=?,transfer_order_id=?,transfer_state=?,updated_at=? WHERE artwork_id=?
goblin_user_digital_artwork.update_for_trans_query=UPDATE goblin_user_digital_artwork SET transfer_state=?,del_flg='1',deleted_at=? WHERE artwork_id=?
#----
#---- \u9884\u7EA6
goblin_goods_anticipate=INSERT INTO goblin_goods_anticipate(ant_id,people,`type`,`rule`,created_date,del_tag) VALUES(?,?,?,?,?,?)
......
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