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

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

+api:藏品转赠;

parent c87cda2e
......@@ -36,7 +36,7 @@ public class GoblinUserDigitalArtworkInfoVo implements Serializable, Cloneable {
@ApiModelProperty(position = 18, value = "藏品生成时间[yyyy-MM-dd HH:mm:ss]")
private String generateTime;
@ApiModelProperty(position = 19, value = "获得方式[1-购买|2-兑换|3-赠送|5-赠|31-空投赠送]")
@ApiModelProperty(position = 19, value = "获得方式[1-购买|2-兑换|3-赠送|5-大美|6-转赠|31-空投赠送]")
private Integer source;
@ApiModelProperty(position = 20, value = "藏品状态,根据`unbox`区分盲盒来判断[0-生成中/未开启|1-已生成/已开启|2-生成失败/开启失败|5-待收取]")
private Integer state;
......
......@@ -28,7 +28,7 @@ public class GoblinUserDigitalArtworkListVo implements Serializable, Cloneable {
private Integer editionSn;
@ApiModelProperty(position = 16, value = "藏品发行量")
private Integer edition;
@ApiModelProperty(position = 17, value = "获得方式[1-购买|2-兑换|3-赠送|5-赠|31-空投赠送]")
@ApiModelProperty(position = 17, value = "获得方式[1-购买|2-兑换|3-赠送|5-大美|6-转赠|31-空投赠送]")
private Integer source;
@ApiModelProperty(position = 18, value = "藏品状态,根据`unbox`区分盲盒来判断[0-生成中/未开启|1-已生成/已开启|2-生成失败/开启失败|5-待收取]")
......
......@@ -20,6 +20,7 @@ public class GoblinUserDigitalArtworkVo implements Serializable, Cloneable {
private String releaseAt;
private String tradingTxhash;
private String tradingAt;
private String transferOrderId;
private String transferState;
private Integer source;
private Integer state;
......
package com.liquidnet.service.goblin.service;
import com.liquidnet.service.goblin.dto.vo.GoblinUserDigitalArtworkInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinUserDigitalArtworkListVo;
import com.liquidnet.service.goblin.dto.vo.GoblinUserDigitalArtworkPageVo;
import com.liquidnet.service.goblin.dto.vo.GoblinUserDigitalArtworkVo;
import com.liquidnet.service.goblin.dto.vo.*;
public interface IGoblinUserDigitalArtworkService {
......@@ -14,4 +11,6 @@ public interface IGoblinUserDigitalArtworkService {
GoblinUserDigitalArtworkListVo unboxingForBuyOrExchange(String uid, GoblinUserDigitalArtworkVo userDigitalArtworkVo);
boolean accept(String uid, GoblinUserDigitalArtworkVo userDigitalArtworkVo);
boolean transfer(GoblinUserDigitalArtworkVo userDigitalArtworkVo, String routerType, String[] receiverArr);
}
......@@ -44,6 +44,17 @@ public abstract class AbstractRedisUtil {
// =============================common============================
/**
* 指定缓存失效时间
*
* @param key 键
* @param time 时间(秒)
* @return
*/
public boolean expireSet(String key, long time) {
return expire(this.fillingKey(key), time);
}
/**
* 指定缓存失效时间
*
......@@ -54,10 +65,10 @@ public abstract class AbstractRedisUtil {
private boolean expire(String key, long time) {
if (time > 0) {
this.getRedisConfig().getRedisTemplateByDb(this.getIndex(key)).expire(key, time, TimeUnit.SECONDS);
return this.getRedisConfig().getRedisTemplateByDb(this.getIndex(key)).expire(key, time, TimeUnit.SECONDS);
}
return true;
return false;
}
......@@ -171,15 +182,6 @@ public abstract class AbstractRedisUtil {
// ============================String=============================
public Long ttl(String key) {
if (null == key) {
return 0L;
}
key = this.fillingKey(key);
return this.getRedisConfig().getRedisTemplateByDb(this.getIndex(key)).opsForValue().getOperations().getExpire(key);
}
/**
* 普通缓存获取
*
......
......@@ -290,7 +290,7 @@ public class MQConst {
BIZ_ARTWORK_UPL("goblin:stream:biz_art:upl", "group.biz.artwork", "藏品上传声明"),
BIZ_ARTWORK_CLQ("goblin:stream:biz_art:clq", "group.biz.artwork", "藏品声明查询"),
BIZ_ARTWORK_GEN("goblin:stream:biz_art:gen", "group.biz.artwork", "藏品生成"),
BIZ_ARTWORK_TRANS_QUERY("goblin:stream:biz_art:trans_query", "group.biz.artwork", "藏品转赠查询"),
SQL_ARTWORK_GEN("goblin:stream:sql_art:gen", "group.biz.artwork", "藏品生成"),
GOBLIN_NFT_ORDER("goblin:stream:nftOrder:create", "group.nftOrder:create", "NFT订单处理"),
......
......@@ -85,7 +85,7 @@ public class GoblinUserDigitalArtwork implements Serializable {
private String transferState;
/**
* 获得方式[1-购买|2-兑换|3-赠送|5-赠|31-空投赠送]
* 获得方式[1-购买|2-兑换|3-赠送|5-大美|6-转赠|31-空投赠送]
*/
private Integer source;
......
......@@ -479,9 +479,12 @@ public class AdamUserController {
AdamUserInfoVo userInfoVo;
if (uid == null || null == (userInfoVo = adamRdmService.getUserInfoVoByUid(uid))) {
log.warn("###用户不存在[MOBILE:{},UID:{},TOKEN:{}]", mobile, uid, CurrentUtil.getToken());
return ResponseDto.failure("账号不存在,请确认");
return ResponseDto.failure("该用户不存在");
}
AdamRealInfoVo realInfoVoByUidPlain = adamRdmService.getRealInfoVoByUidPlain(uid);
if (null == realInfoVoByUidPlain || 3 != realInfoVoByUidPlain.getNode()) {
return ResponseDto.failure("该用户未实名");
}
AdamUserIdentityInfoVo userIdentityInfoVo = AdamUserIdentityInfoVo.getNew();
userIdentityInfoVo.setUid(uid);
userIdentityInfoVo.setName(realInfoVoByUidPlain.getName());
......
......@@ -1153,7 +1153,11 @@ create table goblin_user_digital_artwork
) engine = InnoDB comment '用户数字藏品信息';
# -- >>------------------------------------------------------------------------------------ |20220817数字藏品转赠安全密码
alter table goblin_user_digital_artwork
add transfer_state varchar(20) null comment '转赠状态[PENDING|SUCCESS]' after trading_at;
add transfer_order_id varchar(20) null comment '转赠订单号' after trading_at;
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
modify source tinyint null comment '获得方式[1-购买|2-兑换|3-赠送|5-大美|6-转赠|31-空投赠送]';
drop table if exists goblin_user_safe_config;
create table goblin_user_safe_config
......
......@@ -16,6 +16,7 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -102,6 +103,6 @@ public class GoblinNFTUserController {
@ApiOperation(value = "业务账号开通信息-指定UID")
@GetMapping(value = "open/account/info2")
public ResponseDto<GoblinUserNftAccInfoVo> openAccountInfoByUid(@RequestParam String uid) {
return ResponseDto.success(goblinRedisUtils.getOpenAccountInfo(uid));
return ResponseDto.success(StringUtils.isBlank(uid) ? null : goblinRedisUtils.getOpenAccountInfo(uid));
}
}
......@@ -3,9 +3,12 @@ package com.liquidnet.service.goblin.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.DESUtils;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.GoblinUserNftAccInfoVo;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.service.IGoblinUserDigitalArtworkService;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
......@@ -14,6 +17,7 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -93,6 +97,7 @@ public class GoblinUserDigitalArtworkController {
} else if (goblinRedisUtils.markUnboxUserDigitalArtwork(artworkId) > 1) {
return ResponseDto.failure(ErrorMapping.get("140000"));
}
goblinRedisUtils.expire(GoblinRedisConst.USER_DIGITAL_ARTWORK_UNBOX.concat(artworkId), 30);
GoblinUserDigitalArtworkListVo unboxingRstVo = null;
try {
switch (userDigitalArtworkVo.getSource()) {
......@@ -106,7 +111,7 @@ public class GoblinUserDigitalArtworkController {
log.warn("Invalid operation[UID={},artworkId={}]", currentUid, artworkId);
}
} catch (Exception e) {
log.error("开启盲盒异常[artworkId={},uid={}]", artworkId, currentUid);
log.error("Ex.开启盲盒异常[artworkId={},uid={}]", artworkId, currentUid);
}
goblinRedisUtils.del(GoblinRedisConst.USER_DIGITAL_ARTWORK_UNBOX.concat(artworkId));
return null == unboxingRstVo ? ResponseDto.failure(ErrorMapping.get("140102")) : ResponseDto.success(unboxingRstVo);
......@@ -132,8 +137,47 @@ public class GoblinUserDigitalArtworkController {
} else if (goblinRedisUtils.markUnboxUserDigitalArtwork(artworkId) > 1) {
return ResponseDto.failure(ErrorMapping.get("140000"));
}
goblinRedisUtils.expire(GoblinRedisConst.USER_DIGITAL_ARTWORK_UNBOX.concat(artworkId), 30);
boolean acceptRstFlg = goblinUserDigitalArtworkService.accept(currentUid, userDigitalArtworkVo);
goblinRedisUtils.del(GoblinRedisConst.USER_DIGITAL_ARTWORK_UNBOX.concat(artworkId));
return acceptRstFlg ? ResponseDto.success(0) : ResponseDto.failure(ErrorMapping.get("140106"));
return acceptRstFlg ? ResponseDto.success(0) : ResponseDto.failure(ErrorMapping.get("140002"));
}
@ApiOperationSupport(order = 5)
@ApiOperation(value = "藏品转赠", notes = "<br />响应【data】值描述:转赠状态[PENDING|SUCCESS]")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "artworkId", value = "藏品ID"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "receiver", value = "受赠人"),
})
@PostMapping("transfer")
public ResponseDto<String> transfer(@NotBlank(message = "藏品ID不能为空") @RequestParam String artworkId,
@NotBlank(message = "受赠人不能为空") @RequestParam String receiver) {
String currentUid = CurrentUtil.getCurrentUid();
GoblinUserDigitalArtworkVo userDigitalArtworkVo = goblinRedisUtils.getUserDigitalArtworkVo(artworkId);
if (null == userDigitalArtworkVo || !currentUid.equals(userDigitalArtworkVo.getUid()) || userDigitalArtworkVo.getDelFlg().equals("1")) {
return ResponseDto.failure(ErrorMapping.get("140105"));
}
GoblinGoodsSkuInfoVo goodsSkuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(userDigitalArtworkVo.getSkuId());
if ("1".equals(goodsSkuInfoVo.getUnbox())) return ResponseDto.failure(ErrorMapping.get("140106"));// 盲盒
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;
try {
receiverArr = DESUtils.DES().decrypt(receiver).split(",");
} catch (Exception e) {
log.error("Ex.藏品转赠受赠人解析异常[artworkId={},receiver={}]", artworkId, receiver);
return ResponseDto.failure(ErrorMapping.get("140108"));// 受赠人信息有误
}
if (CurrentUtil.getCurrentUid().equals(receiverArr[0])) return ResponseDto.failure(ErrorMapping.get("140109"));// 受赠人不能是本人
GoblinUserNftAccInfoVo receiverAcctInfo = goblinRedisUtils.getOpenAccountInfo(receiverArr[0]);
if (null == receiverAcctInfo || !"2000".equals(receiverAcctInfo.getCode())) return ResponseDto.failure(ErrorMapping.get("140110"));// 未开通数字账户
String lockKey = GoblinRedisConst.USER_DIGITAL_ARTWORK.concat("lk").concat(artworkId);
if (goblinRedisUtils.incr(lockKey, 1) > 1) return ResponseDto.failure(ErrorMapping.get("140000"));
goblinRedisUtils.expire(lockKey, 30);
boolean transferRstFlg = goblinUserDigitalArtworkService.transfer(userDigitalArtworkVo, goodsSkuInfoVo.getRouteType(), receiverArr);
goblinRedisUtils.del(lockKey);
return transferRstFlg ? ResponseDto.success(GoblinStatusConst.TransferState.SUCCESS.name()) : ResponseDto.failure(ErrorMapping.get("140002"));
}
}
......@@ -67,10 +67,9 @@ public class GoblinUserSafeController {
if (null != userSafeConfigDto) {
return ResponseDto.failure(ErrorMapping.get("140020"));
}
String lockKey = GoblinRedisConst.USER_SAFE_CONFIG.concat("l").concat(currentUid);
if (goblinRedisUtils.incr(lockKey, 1) > 1) {
return ResponseDto.failure(ErrorMapping.get("140000"));
}
String lockKey = GoblinRedisConst.USER_SAFE_CONFIG.concat("lk").concat(currentUid);
if (goblinRedisUtils.incr(lockKey, 1) > 1) return ResponseDto.failure(ErrorMapping.get("140000"));
goblinRedisUtils.expire(lockKey, 30);
boolean resultFlg = goblinUserAssetConfigService.initSafePasswd(passwd, currentUid);
goblinRedisUtils.del(lockKey);
return resultFlg ? ResponseDto.success() : ResponseDto.failure(ErrorMapping.get("140002"));
......
package com.liquidnet.service.goblin.service.impl;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.base.PagedResult;
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.GalaxyNftPublishAndBuyResultQueryReqDto;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftPublishAndBuyResultQueryRespDto;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftTransferReqDto;
import com.liquidnet.service.galaxy.service.IGalaxyTradeService;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.GoblinQueueBizMongoDto;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.service.IGoblinUserDigitalArtworkService;
......@@ -353,6 +352,54 @@ public class GoblinUserDigitalArtworkServiceImpl implements IGoblinUserDigitalAr
// return false;
}
@Override
public boolean transfer(GoblinUserDigitalArtworkVo userDigitalArtworkVo, String routerType, String[] receiverArr) {
userDigitalArtworkVo.setTransferState(GoblinStatusConst.TransferState.PENDING.name());
userDigitalArtworkVo.setTransferOrderId(IDGenerator.nextSnowId());
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());
galaxyNftTransferReqDto.setUserId(userDigitalArtworkVo.getUid());
galaxyNftTransferReqDto.setReceiveUserId(receiverArr[0]);
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())));
// 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()});
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_ARTWORK_GEN.getKey(), SqlMapping.gets(toMqSqls, updateUserDigitalArtworkObjs));
}
return false;
}
/* -------------------------------------------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------------------------------------------- */
......
......@@ -53,6 +53,10 @@ public class GoblinRedisUtils {
return redisUtil.get(key);
}
public boolean expire(String key, long seconds) {
return redisUtil.expireSet(key, seconds);
}
public long incr(String key, long delta) {
return redisUtil.incr(key, delta);
}
......@@ -64,7 +68,7 @@ public class GoblinRedisUtils {
}
public Long ttlSmsCodeByMobile(String mobile) {
return redisUtil.ttl(GoblinRedisConst.VALID_SMS_CODE_MOBILE + mobile);
return redisUtil.getExpire(GoblinRedisConst.VALID_SMS_CODE_MOBILE + mobile);
}
public String getSmsCodeByMobile(String mobile) {
......
......@@ -46,7 +46,11 @@
140101=\u8BF7\u6838\u5B9E\u76F2\u76D2\u5F00\u542F\u65F6\u95F4
140102=\u5F00\u542F\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5
140105=\u85CF\u54C1\u4E0D\u5B58\u5728
140106=\u6536\u53D6\u5931\u8D25
140106=\u76F2\u76D2\u4E0D\u652F\u6301\u8F6C\u8D60
140107=\u85CF\u54C1\u672A\u4E0A\u94FE
140108=\u53D7\u8D60\u4EBA\u4FE1\u606F\u6709\u8BEF
140109=\u8F6C\u8D60\u4EBA\u4E0E\u53D7\u8D60\u4EBA\u4E0D\u53EF\u672A\u540C\u4E00\u4EBA
140110=\u53D7\u8D60\u4EBA\u672A\u5F00\u901A\u6570\u5B57\u8D26\u53F7
......
......@@ -131,6 +131,7 @@ goblin_user_digital_artwork.insert=INSERT INTO goblin_user_digital_artwork (artw
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=?
#----
#---- \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