Commit dc4b8106 authored by wlx@33.cn's avatar wlx@33.cn

Merge branch 'dev' of https://gitlab.33.cn/yimu/mall-server into dev

parents 34c0af97 b12482f9
......@@ -106,8 +106,9 @@ public class NftEvm {
// System.err.println(hash);
//发行NFT,本次发行的是ERC1155
// String hash = ra.evmPublishToken(abi, cAddr, EvmTokenEnum.ERC1155, 0L, "1KzrvBBeVUavMjqnTVzzCygUVmPNk9vkra", null, 1631716701489L, 10000L, "publish", false);
// System.err.println(hash);
String hash = ra.evmPublishToken(abi, cAddr, EvmTokenEnum.ERC1155, 0L, "1F5HWw8WB7iGat37RXqbfaQAcHUwpGedko","1F5HWw8WB7iGat37RXqbfaQAcHUwpGedko", null, 1631716701489L, 10000L, "publish", true);
System.err.println(hash);
System.err.println(ra.cycleConfirmTxWithHash(hash,true,1000).getStatus());
//NFT转账
// String hash = ra.evmTransfer(abi, cAddr, EvmTokenEnum.ERC1155, 0L, to, tokenId, 100L, "transfer", publisher, null, false);
......@@ -119,7 +120,9 @@ public class NftEvm {
System.err.println("TRUE");
}*/
String hash = ra.evmDeploy(code, abi, "MallNFT", RpcConfig.TX_EVM_DEPLOY_FEE, "MallNFT", null, tokenManager, tokenManagerKey, false);
// String hash = ra.evmDeploy(code, abi, "MallNFT", RpcConfig.TX_EVM_DEPLOY_FEE, "MallNFT", null, tokenManager, tokenManagerKey, false);
// System.err.println(ra.walletCreateAccount("rressfe"));
}
}
......@@ -129,6 +129,20 @@ public class ChainUtil {
return hash;
}
//发行NFT,本次发行的是ERC1155 发行确认分体
public String evmPublishTokenSplitBatch(String publisher, long[] tokenIds, long[] amounts) {
String hash = null;
switch (Objects.requireNonNull(ChainTypeEnum.getByType(type))) {
case MAIN:
hash = mainClient.evmPublishTokenBatch(abi, cAddr, 0L, publisher, publisher, null, tokenIds, amounts, "publish", false);
break;
case PARA:
hash = paraClient.evmPublishTokenBatch(abi, cAddr, 0L, publisher, publisher, null, tokenIds, amounts, "publish", true);
break;
}
return hash;
}
//NFT转账
public String evmTransfer(String to, String publisher, long tokenId, long amount) {
String hash = null;
......@@ -145,6 +159,22 @@ public class ChainUtil {
return hash;
}
//NFT转账批量
public String evmTransferBatch(String to, String publisher, long[] tokenIds, long[] amounts) {
String hash = null;
switch (Objects.requireNonNull(ChainTypeEnum.getByType(type))) {
case MAIN:
hash = mainClient.evmTransferBatch(abi, cAddr, EvmTokenEnum.ERC1155, 0L, to, tokenIds, amounts,
"transfer", publisher, null, false);
break;
case PARA:
hash = paraClient.evmTransferBatch(abi, cAddr, EvmTokenEnum.ERC1155, 0L, to, tokenIds, amounts,
"transfer", publisher, null, true);
break;
}
return hash;
}
//查询NFT余额
public long evmBalance(String publisher, long tokenId) {
long balance = 0L;
......
......@@ -138,6 +138,33 @@ public class SpuController {
return resFac.getSuccessResponseWithData(page);
}
@ApiOperation(value = "分页查询-审核列表")
@GetMapping("/goodsList/pagecheck")
public ResponseVO pageCheck(
@ApiParam(name = "goodsId", value = "商品编号")
@RequestParam(required = false) String goodsId,
@ApiParam(name = "goodsName", value = "商品名称")
@RequestParam(required = false) String goodsName,
@ApiParam(name = "status", value = "状态")
@RequestParam(required = false) Integer status,
@ApiParam(name = "addTimeHead", value = "开始时间")
@RequestParam(required = false) Long addTimeHead,
@ApiParam(name = "addTimeTail", value = "结束时间")
@RequestParam(required = false) Long addTimeTail,
@ApiParam(name = "goodsType", value = "商品类型")
@RequestParam(required = false) Integer goodsType,
@ApiParam(name = "pageNum", value = "当前页数")
@RequestParam Integer pageNum,
@ApiParam(name = "pageSize", value = "每页个数")
@RequestParam Integer pageSize,
@ApiParam(name = "adminId", value = "管理员id")
@RequestHeader String adminId) {
Admin admin = adminService.getByAdminId(adminId);
IPage<GoodsSpuVO> page = spuService.page(admin.getMerchantId(), admin.getType(), goodsId, goodsName, status,
addTimeHead, addTimeTail, goodsType, pageNum, pageSize);
return resFac.getSuccessResponseWithData(page);
}
//BUG
@ApiOperation(value = "详情")
@GetMapping("/goodsList/detail")
......
......@@ -54,4 +54,7 @@ public class GoodsSkuDTO {
@ApiModelProperty("是否重发")
private Boolean republish;
@ApiModelProperty("nft销售方式(1.原商品销售 2.拷贝销售)")
private Integer nftSalesType;
}
......@@ -67,7 +67,7 @@ public class GoodsSpuDTO {
// @NotBlank(message = MallResponseError.NULL_PARAM_ERROR)
// private String templateId;
@ApiModelProperty("商品通证(0.否 1.是,自动生成Token 2.是,使用外部既有Token)")
@ApiModelProperty("商品通证(0.否 1.是,自动生成Token 2.是,使用外部既有Token 3.外部token使用权)")
// @NotNull(message = MallResponseError.NULL_PARAM_ERROR)
private Integer commodityPass;
......
......@@ -24,5 +24,6 @@ public class GoodsSkuVO {
private BigDecimal balanceNum;
private List<SkuPropertyVO> propertyList;
private Integer status;
private Integer nftSalesType;
}
......@@ -85,4 +85,7 @@ public class ExternalToken implements Serializable {
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateTime;
@ApiModelProperty(value = "商户id")
private String hash;
}
......@@ -98,5 +98,7 @@ public class Sku implements Serializable {
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Long updateTime;
@ApiModelProperty(value = "nft销售方式(1.原商品销售 2.拷贝销售)")
@TableField("nft_sales_type")
private Integer nftSalesType;
}
......@@ -101,7 +101,6 @@ public class ExternalTokenServiceImpl extends ServiceImpl<ExternalTokenMapper, E
}
}
}
} else {
ExternalToken externalToken = new ExternalToken();
externalToken.setCommodityPassId(UUIDUtil.getUUID());
......@@ -114,6 +113,8 @@ public class ExternalTokenServiceImpl extends ServiceImpl<ExternalTokenMapper, E
externalToken.setName(name);
externalToken.setPublishTime(publishTime);
externalToken.setPublisher(publisher);
//TODO 唐拓接口
externalToken.setHash("xxx");
save(externalToken);
}
}
......
......@@ -58,6 +58,14 @@ public class GoodsNftServiceImpl extends ServiceImpl<GoodsNftMapper, GoodsNft> i
//发行NFT
hash = chainUtil.evmPublishTokenSplit(nftAddr, timestamp, nftdto.getNumber());
System.err.println("nftdto");
System.err.println(nftdto);
System.err.println(goodsId);
System.err.println(name);
System.err.println(nftAddr);
System.err.println(merchantId);
System.err.println(hash);
Map<String, Object> map = new HashMap<>();
map.put("goodsId", goodsId);
map.put("hash", hash);
......
package com.fzm.mall.server.admin.goods_center.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fzm.mall.server.admin.block_chain.util.ChainUtil;
import com.fzm.mall.server.admin.constant.MALLGlobalConfig;
import com.fzm.mall.server.admin.constant.MallResponseError;
import com.fzm.mall.server.admin.exception.MyException;
import com.fzm.mall.server.admin.goods_center.entity.dto.GoodsSkuDTO;
......@@ -56,6 +59,8 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
private DozerBeanMapper beanMapper;
@Autowired
private IExternalTokenService externalTokenService;
@Autowired
private ChainUtil chainUtil;
@Override
public void add(List<GoodsSkuDTO> kDTOs, String goodsId, String goodsName, String merchantId, Integer commodityPass, Integer pDTOType) {
......@@ -109,6 +114,42 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
uw.eq(ExternalToken::getCommodityPassId, sku.getCommodityPassId());
externalTokenService.update(uw);
}
if (commodityPass.equals(3)) {
LambdaUpdateWrapper<ExternalToken> uw = new LambdaUpdateWrapper<>();
uw.set(ExternalToken::getBindNumber, sku.getStock());
uw.set(ExternalToken::getGoodsId, goodsId);
uw.set(ExternalToken::getGoodsName, goodsName);
uw.set(ExternalToken::getStatus, 1);
uw.eq(ExternalToken::getCommodityPassId, sku.getCommodityPassId());
externalTokenService.update(uw);
if (kDTO.getNftSalesType().equals(2)) {
//发行NFT
ExternalToken externalToken = externalTokenService.queryByLabelNameAndMerchantId(kDTO.getCoinName(), merchantId);
String tokenId = externalToken.getTokenId().toString();
long[] tokenIds = new long[Math.toIntExact(kDTO.getStock())];
long[] amounts = new long[Math.toIntExact(kDTO.getStock())];
long[] nos = new long[Math.toIntExact(kDTO.getStock())];
nos[0] = 0;
for (int i = 0; i < kDTO.getStock(); i++) {
tokenIds[i] = Long.parseLong(tokenId + (i + 1));
amounts[i] = 1;
nos[i + 1] = i + 1;
}
String hash = chainUtil.evmPublishTokenSplitBatch(merchant.getNftAddr(), tokenIds, amounts);
System.err.println("tokenIds:" + tokenIds);
System.err.println("amounts:" + amounts);
System.err.println("nos:" + nos);
System.err.println("hash:" + hash);
Map<String, Object> map = new HashMap<>();
map.put("goodsId", goodsId);
map.put("hash", hash);
map.put("prefix", tokenId);
map.put("nos", JSONArray.toJSON(nos));
producer.sendTTL(map, QueueTTLTypeEnum.NFT_USU_TTL, 10 * 1000);
}
}
}
saveBatch(skus);
......@@ -241,6 +282,35 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
externalToken.setBindNumber(externalToken.getBindNumber().add(new BigDecimal(kDTO.getStock() - oldStock)));
externalTokenService.updateById(externalToken);
}
if (commodityPass.equals(3)) {
if (kDTO.getNftSalesType().equals(2)) {
//发行NFT
ExternalToken externalToken = externalTokenService.queryByLabelNameAndMerchantId(kDTO.getCoinName(), merchantId);
String tokenId = externalToken.getTokenId().toString();
long[] tokenIds = new long[Math.toIntExact(kDTO.getStock())];
long[] amounts = new long[Math.toIntExact(kDTO.getStock())];
long[] nos = new long[Math.toIntExact(kDTO.getStock())];
nos[0] = 0;
for (int i = 0; i < kDTO.getStock(); i++) {
tokenIds[i] = Long.parseLong(tokenId + (i + 1));
amounts[i] = 1;
nos[i + 1] = i + 1;
}
String hash = chainUtil.evmPublishTokenSplitBatch(merchant.getNftAddr(), tokenIds, amounts);
System.err.println("tokenIds:" + tokenIds);
System.err.println("amounts:" + amounts);
System.err.println("nos:" + nos);
System.err.println("hash:" + hash);
Map<String, Object> map = new HashMap<>();
map.put("goodsId", goodsId);
map.put("hash", hash);
map.put("prefix", tokenId);
map.put("nos", JSONArray.toJSON(nos));
producer.sendTTL(map, QueueTTLTypeEnum.NFT_USU_TTL, 10 * 1000);
}
}
updateById(one);
} else {
......
......@@ -116,7 +116,8 @@ public class SpuServiceImpl extends ServiceImpl<SpuMapper, Spu> implements ISpuS
Spu spu = beanMapper.map(pDTO, Spu.class);
spu.setGoodsId(goodsId);
spu.setMerchantId(merchantId);
if (pDTO.getCommodityPass() == null || pDTO.getCommodityPass().equals(0) || pDTO.getCommodityPass().equals(2)) {
if (pDTO.getCommodityPass() == null || pDTO.getCommodityPass().equals(0) || pDTO.getCommodityPass().equals(2) ||
(pDTO.getSkuList().get(0) != null && pDTO.getSkuList().get(0).getNftSalesType() == 1)) {
spu.setStatus(SpuStatusEnum.WAIT_CHECK.getStatus());
} else {
spu.setStatus(SpuStatusEnum.ISSUE.getStatus());
......@@ -226,7 +227,8 @@ public class SpuServiceImpl extends ServiceImpl<SpuMapper, Spu> implements ISpuS
}
Spu spu = beanMapper.map(eDTO, Spu.class);
if (eDTO.getCommodityPass() == null || eDTO.getCommodityPass().equals(0) || eDTO.getCommodityPass().equals(2) || type.equals(6)) {
if (eDTO.getCommodityPass() == null || eDTO.getCommodityPass().equals(0) || eDTO.getCommodityPass().equals(2) || type.equals(6) ||
(eDTO.getSkuList().get(0) != null && eDTO.getSkuList().get(0).getNftSalesType() == 1)) {
spu.setStatus(SpuStatusEnum.WAIT_CHECK.getStatus());
} else {
spu.setStatus(SpuStatusEnum.ISSUE.getStatus());
......@@ -367,8 +369,7 @@ public class SpuServiceImpl extends ServiceImpl<SpuMapper, Spu> implements ISpuS
qw2.eq(ExternalToken::getLabelName, sku.getCoinName());
qw2.eq(ExternalToken::getMerchantId, spu.getMerchantId());
ExternalToken externalToken = externalTokenService.getOne(qw2);
String hash = chainUtil.getGoodsHash(externalToken.getTokenId(), merchantService.getByMerchantId(spu.getMerchantId()).getNftAddr());
spu.setHash(hash);
spu.setHash(externalToken.getHash());
}
spu.setStatus(type);
updateById(spu);
......
package com.fzm.mall.server.admin.mq.config.goods_center;
import com.fzm.mall.server.admin.mq.enums.QueueTTLTypeEnum;
import com.fzm.mall.server.admin.mq.enums.QueueTypeEnum;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author wangp
* @description 批量发行使用权
* @date 2020/10/20 17:39
*/
@Configuration
public class UsuNftConfig {
@Bean
DirectExchange usuNftDirect() {
return (DirectExchange) ExchangeBuilder.directExchange(QueueTypeEnum.NFT_USU.getExchange())
.durable(true).build();
}
@Bean
DirectExchange usuNftTTLDirect() {
return (DirectExchange) ExchangeBuilder.directExchange(QueueTTLTypeEnum.NFT_USU_TTL.getExchange())
.durable(true).build();
}
@Bean
public Queue usuNftQueue() {
return new Queue(QueueTypeEnum.NFT_USU.getQueue());
}
@Bean
public Queue usuNftTTLQueue() {
return QueueBuilder.durable(QueueTTLTypeEnum.NFT_USU_TTL.getQueue())
// 配置到期后转发的交换
.withArgument("x-dead-letter-exchange", QueueTypeEnum.NFT_USU.getExchange())
// 配置到期后转发的路由键
.withArgument("x-dead-letter-routing-key", QueueTypeEnum.NFT_USU.getQueueKey()).build();
}
@Bean
Binding usuNftBinding(DirectExchange usuNftDirect, Queue usuNftQueue) {
return BindingBuilder.bind(usuNftQueue).to(usuNftDirect).with(QueueTypeEnum.NFT_USU.getQueueKey());
}
@Bean
public Binding usuNftTTLBinding(Queue usuNftTTLQueue, DirectExchange usuNftTTLDirect) {
return BindingBuilder.bind(usuNftTTLQueue).to(usuNftTTLDirect)
.with(QueueTTLTypeEnum.NFT_USU_TTL.getQueueKey());
}
}
......@@ -2,8 +2,11 @@ package com.fzm.mall.server.admin.mq.consumer.goods_center;
import cn.fzm.chain.simplesdk.constant.TxStatusEnum;
import cn.fzm.chain.simplesdk.model.TxResult;
import com.alibaba.fastjson.JSONArray;
import com.fzm.mall.server.admin.block_chain.util.ChainUtil;
import com.fzm.mall.server.admin.goods_center.enums.status.SpuStatusEnum;
import com.fzm.mall.server.admin.goods_center.model.GoodsSkuUsufruct;
import com.fzm.mall.server.admin.goods_center.service.IGoodsSkuUsufructService;
import com.fzm.mall.server.admin.goods_center.service.ISkuService;
import com.fzm.mall.server.admin.goods_center.service.ISpuService;
import lombok.RequiredArgsConstructor;
......@@ -27,6 +30,7 @@ public class NftConsumer {
private final ISpuService spuService;
private final ChainUtil chainUtil;
private final IGoodsSkuUsufructService goodsSkuUsufructService;
//发行
@RabbitListener(queues = "ly.issue.nft.queue")
......@@ -50,4 +54,33 @@ public class NftConsumer {
}
}
//发行
@RabbitListener(queues = "ly.usu.nft.queue")
public void usuCoinsPrice(Map<String, Object> obj) {
try {
String goodsId = obj.get("goodsId") + "";
String hash = obj.get("hash") + "";
String prefix = obj.get("prefix") + "";
String nos = obj.get("nos") + "";
System.err.println("obj:" + obj);
//发行token
TxResult tr = chainUtil.cycleConfirmTxWithHash(hash);
log.info("map=========================" + tr.getStatus());
if (tr.getStatus() != TxStatusEnum.SUCCESS) {
log.error("NFT发行失败,交易HASH:{},失败原因:{}", hash, tr.getErrMsg());
spuService.updateStatus(goodsId, SpuStatusEnum.FAIL.getStatus(), tr.getErrMsg().getValue());
// skuService.updateStatus(skuId, SkuStatusEnum.ISSUE_FAIL.getStatus(), tr.getErrMsg().getValue());
} else {
spuService.updateStatus(goodsId, SpuStatusEnum.WAIT_CHECK.getStatus(), "");
GoodsSkuUsufruct goodsSkuUsufruct = new GoodsSkuUsufruct();
goodsSkuUsufruct.setPrefix(prefix);
goodsSkuUsufruct.setSerialNo(nos.toString());
goodsSkuUsufructService.save(goodsSkuUsufruct);
}
} catch (Exception e) {
return;
}
}
}
......@@ -34,7 +34,9 @@ public enum QueueTTLTypeEnum {
// 用户资产充值、扣除
USER_ASSETS_RECHARGE_OR_DEDUCTION_TTL(MALLGlobalConfig.PROJECT_PREFIX + "-user-assets-recharge-or-deduction-ttl-exchange", MALLGlobalConfig.PROJECT_PREFIX + ".user.assets.recharge.or.deduction.ttl.queue", MALLGlobalConfig.PROJECT_PREFIX + ".user.assets.recharge.or.deduction.ttl.key"),
// 发行nft
NFT_ISSUE_TTL(MALLGlobalConfig.PROJECT_PREFIX + "-issue-nft-ttl-exchange", MALLGlobalConfig.PROJECT_PREFIX + ".issue.nft.ttl.queue", MALLGlobalConfig.PROJECT_PREFIX + ".issue.nft.ttl.key");
NFT_ISSUE_TTL(MALLGlobalConfig.PROJECT_PREFIX + "-issue-nft-ttl-exchange", MALLGlobalConfig.PROJECT_PREFIX + ".issue.nft.ttl.queue", MALLGlobalConfig.PROJECT_PREFIX + ".issue.nft.ttl.key"),
// 批量发行使用权
NFT_USU_TTL(MALLGlobalConfig.PROJECT_PREFIX + "-usu-nft-ttl-exchange", MALLGlobalConfig.PROJECT_PREFIX + ".usu.nft.ttl.queue", MALLGlobalConfig.PROJECT_PREFIX + ".usu.nft.ttl.key");
private String exchange;
......
......@@ -38,7 +38,9 @@ public enum QueueTypeEnum {
//用户支付有效订单后得7-8天内,发送升级积分
USER_MEMBER_UP(MALLGlobalConfig.PROJECT_PREFIX + "-memberup-exchange", MALLGlobalConfig.PROJECT_PREFIX + ".memberup.queue", MALLGlobalConfig.PROJECT_PREFIX + ".memberup.key"),
//发行nft
NFT_ISSUE(MALLGlobalConfig.PROJECT_PREFIX + "-issue-nft-exchange", MALLGlobalConfig.PROJECT_PREFIX + ".issue.nft.queue", MALLGlobalConfig.PROJECT_PREFIX + ".issue.nft.key");
NFT_ISSUE(MALLGlobalConfig.PROJECT_PREFIX + "-issue-nft-exchange", MALLGlobalConfig.PROJECT_PREFIX + ".issue.nft.queue", MALLGlobalConfig.PROJECT_PREFIX + ".issue.nft.key"),
//批量发行使用权
NFT_USU(MALLGlobalConfig.PROJECT_PREFIX + "-usu-nft-exchange", MALLGlobalConfig.PROJECT_PREFIX + ".usu.nft.queue", MALLGlobalConfig.PROJECT_PREFIX + ".usu.nft.key");
private String exchange;
......
......@@ -21,6 +21,7 @@
<result column="type" property="type" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
<result column="hash" property="hash" />
</resultMap>
<select id="page" resultType="com.fzm.mall.server.admin.goods_center.entity.dto.ExternalTokenDTO">
......
......@@ -21,6 +21,7 @@
<result column="err_msg" property="errMsg"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="nft_sales_type" property="nftSalesType"/>
</resultMap>
</mapper>
......@@ -2481,4 +2481,10 @@ ALTER TABLE `goods_spu`
ADD COLUMN `hash` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '通邦nfthash', AFTER `nft_file`;
ALTER TABLE `opration_function`
ADD COLUMN `param` varchar(500) NOT NULL DEFAULT '' COMMENT '功能区跳转参数';
\ No newline at end of file
ADD COLUMN `param` varchar(500) NOT NULL DEFAULT '' COMMENT '功能区跳转参数';
ALTER TABLE `goods_sku`
ADD COLUMN `nft_sales_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'nft销售方式(1.原商品销售 2.拷贝销售)';
ALTER TABLE `external_token`
ADD COLUMN `hash` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '外部hash表';
\ No newline at end of file
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