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

Commit f5b6e0c9 authored by wanglele's avatar wanglele

兑换码定时任务 空投

parent 162c7396
......@@ -31,7 +31,8 @@ public class GoblinNftExCodeParam implements Serializable {
private String userId;
@ApiModelProperty(position = 17,required = true,value = "手机号/ 发送空投时传入")
private String phone;
@ApiModelProperty(position = 18,required = true,value = "当操作用户id/发送空投时传入")
private String adminUid;
}
......@@ -27,7 +27,7 @@ public interface IGoblinNftExCodeService {
* @param goblinNftExCodeParam
* @return
*/
ResponseDto<Object> addAirdrop(GoblinNftExCodeParam goblinNftExCodeParam);
ResponseDto<Boolean> addAirdrop(GoblinNftExCodeParam goblinNftExCodeParam);
/**
* 兑换码导出
......
package com.liquidnet.service.goblin.service;
public interface IGoblinNftExCodeTaskService {
/**
* 定时生成兑换码
*/
void generateCode();
}
......@@ -158,8 +158,6 @@ public class IDGenerator {
* @return
*/
public static String createCode(int num,int sec,boolean bol) {
//
StringBuffer str = new StringBuffer();
for (int k=0;k<num;k++) {
for(int i=0;i < sec;i++){
......
package com.liquidnet.service.goblin.entity;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 兑换码定时任务生成副表
* </p>
*
* @author jiangxiulong
* @since 2022-04-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinNftExCodeTaskRelation implements Serializable {
private static final long serialVersionUID = 1L;
private String mid;
/**
* 定时id
*/
private String taskId;
/**
* sku_id
*/
private String skuId;
/**
* 库存
*/
private Integer stock;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
private final static GoblinNftExCodeTaskRelation obj = new GoblinNftExCodeTaskRelation();
public static GoblinNftExCodeTaskRelation getNew(){
try {
return (GoblinNftExCodeTaskRelation) obj.clone();
}catch (CloneNotSupportedException e){
return new GoblinNftExCodeTaskRelation();
}
}
}
......@@ -69,4 +69,11 @@ public interface GoblinNftExCodeMapper extends BaseMapper<GoblinNftExCode> {
* 获取数量
*/
int selectGoblinNftCodeCount(GoblinNftExCode goblinNftExCode);
/**
* 修改操作用户
* @param goblinNftExCode
* @return
*/
int updateCodeAdminUid(GoblinNftExCode goblinNftExCode);
}
package com.liquidnet.service.goblin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.goblin.entity.GoblinNftExCodeTaskRelation;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* <p>
* 兑换码定时任务生成副表 Mapper 接口
* </p>
*
* @author jiangxiulong
* @since 2022-04-28
*/
@Repository
public interface GoblinNftExCodeTaskRelationMapper extends BaseMapper<GoblinNftExCodeTaskRelation> {
/**
* 根据定时任务ids查询
* @param taskIds
* @return
*/
List<GoblinNftExCodeTaskRelation> selectByTaskIds(@Param("taskIds") String taskIds);
/**
* 批量添加定时任务附表
* @param goblinNftExCodeTaskRelations
* @return
*/
int inserts(@Param("goblinNftExCodeTaskRelations") List<GoblinNftExCodeTaskRelation> goblinNftExCodeTaskRelations);
}
......@@ -25,7 +25,7 @@
</select>
<select id="selectGoblinNftCodeByCode" resultMap="BeseResult">
select code_id, activity_id, code, box_sku_id from goblin_nft_ex_code where code = #{code}
select code_id, activity_id, code, box_sku_id,state from goblin_nft_ex_code where code = #{code}
</select>
<insert id="addGoblinNftExCodes">
......@@ -55,6 +55,15 @@
</foreach>
</update>
<update id="updateCodeAdminUid" parameterType="com.liquidnet.service.goblin.entity.GoblinNftExCode">
update goblin_nft_ex_code
<set>
admin_uid = #{adminUid}
</set>
where code_id = #{codeId}
</update>
<select id="selectGoblinNftCode" parameterType="com.liquidnet.service.goblin.entity.GoblinNftExCode"
resultMap="BeseResult">
select code_id,code,sku_id,box_sku_id,activity_id,state,redeem_uid,redeem_at,admin_uid,created_at from goblin_nft_ex_code
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.service.goblin.mapper.GoblinNftExCodeTaskRelationMapper">
<resultMap id="BaseResult" type="com.liquidnet.service.goblin.entity.GoblinNftExCodeTaskRelation">
<result column="task_id" property="taskId" jdbcType="VARCHAR"/>
<result column="sku_id" property="skuId" jdbcType="VARCHAR"/>
<result column="stock" property="stock" jdbcType="VARCHAR"/>
<result column="created_at" property="createdAt" jdbcType="TIMESTAMP"/>
<result column="updated_at" property="updatedAt" jdbcType="TIMESTAMP"/>
</resultMap>
<select id="selectByTaskIds" resultMap="BaseResult">
select task_id,sku_id,stock,created_at,updated_at from goblin_nft_ex_code_task_relation where task_id in
<foreach collection="taskIds.split(',')" item="taskId" open="(" separator="," close=")">
#{taskId}
</foreach>
</select>
<insert id="inserts">
insert into goblin_nft_ex_code_task_relation (task_id,sku_id,stock,created_at)
values
<foreach collection="goblinNftExCodeTaskRelations" item="goblinNftExCodeTaskRelation" separator=",">
(
#{goblinNftExCodeTaskRelation.taskId},
#{goblinNftExCodeTaskRelation.skuId},
#{goblinNftExCodeTaskRelation.stock},
#{goblinNftExCodeTaskRelation.createdAt}
)
</foreach>
</insert>
</mapper>
......@@ -25,4 +25,9 @@ public interface FeignPlatformGoblinTaskClient {
@PostMapping("spu/goblin/setCount")
ResponseDto<String> setCount();
@PostMapping("codeTask/generateCode")
ResponseDto<String> codeCount();
}
......@@ -43,4 +43,14 @@ public class PlatformGoblinTaskHandler {
}
}
@XxlJob(value = "sev-platform:codeCount")
public void codeCount() {// 设置商城 商品数量
try {
XxlJobHelper.handleSuccess("结果:" + feignPlatformGoblinTaskClient.codeCount().toJson());
} catch (Exception e) {
XxlJobHelper.log(e);
XxlJobHelper.handleFail();
}
}
}
......@@ -82,3 +82,16 @@ CREATE TABLE `goblin_nft_ex_code_task`
PRIMARY KEY (`mid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '兑换码定时任务表' ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `goblin_nft_ex_code_task_relation`;
CREATE TABLE `goblin_nft_ex_code_task_relation`
(
`mid` bigint(0) NOT NULL AUTO_INCREMENT,
`task_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '定时id',
`sku_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'sku_id',
`stock` int(0) NOT NULL COMMENT '库存',
`created_at` datetime(0) NOT NULL COMMENT '创建时间',
`updated_at` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`mid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '兑换码定时任务生成副表' ROW_FORMAT = Dynamic;
......@@ -49,8 +49,8 @@ public class GoblinNftExCodeController {
@ApiOperationSupport(order = 3)
@ApiOperation(value = "空投发送")
@PostMapping("addAirdrop")
public ResponseDto<Object> addAirdrop(@RequestBody GoblinNftExCodeParam goblinNftExCodeParam){
return ResponseDto.success(iGoblinNftExCodeService.addAirdrop(goblinNftExCodeParam));
public ResponseDto<Boolean> addAirdrop(@RequestBody GoblinNftExCodeParam goblinNftExCodeParam){
return iGoblinNftExCodeService.addAirdrop(goblinNftExCodeParam);
}
......
package com.liquidnet.service.platform.controller.goblin.code.task;
import com.liquidnet.service.goblin.service.IGoblinNftExCodeTaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "code定时任务")
@Slf4j
@Validated
@RestController
@RequestMapping("codeTask")
public class GoblinNftExCodeTaskController {
@Autowired
IGoblinNftExCodeTaskService iGoblinNftExCodeTaskService;
@PostMapping("generateCode")
@ApiOperation(value = "定时自动生成兑换码")
public void generateCode(){
iGoblinNftExCodeTaskService.generateCode();
}
}
......@@ -101,19 +101,19 @@ public class GoblinNftExActivityServiceImpl implements IGoblinNftExActivityServi
activityIds.deleteCharAt(activityIds.length() - 1);
// 根据活动ids查询正在生成的兑换码
// List<GoblinNftExCodeTask> goblinNftExCodeTasks = goblinNftExCodeTaskMapper.selectByActivityIds(activityIds.toString());
List<GoblinNftExCodeTask> goblinNftExCodeTasks = goblinNftExCodeTaskMapper.selectByActivityIds(activityIds.toString());
long k = System.currentTimeMillis();
List<GoblinNftExCode> goblinNftExCodes = goblinNftExCodeMapper.selectByActivityIds(activityIds.toString());
log.debug("#MYS耗时:{}ms", System.currentTimeMillis() - k);
for (GoblinNftExActivity goblinNftExActivity : goblinNftExActivities) {
/* for (GoblinNftExCodeTask goblinNftExCodeTask: goblinNftExCodeTasks) {
if (goblinNftExActivity.getActivityId().equals(goblinNftExCodeTask.getActivityId())){
for (GoblinNftExCodeTask goblinNftExCodeTask : goblinNftExCodeTasks) {
if (goblinNftExActivity.getActivityId().equals(goblinNftExCodeTask.getActivityId())) {
goblinNftExActivity.setIsDisplay(1);
break;
}
}*/
}
Integer countNumber = 0;
Integer useNumber = 0;
......@@ -139,7 +139,7 @@ public class GoblinNftExActivityServiceImpl implements IGoblinNftExActivityServi
}
}
PageInfoVo pageInfo = new PageInfoVo(goblinNftExActivityArrayList,count,0);
PageInfoVo pageInfo = new PageInfoVo(goblinNftExActivityArrayList, count, 0);
return pageInfo;
}
......
......@@ -5,6 +5,7 @@ import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.type.TypeReference;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.liquidnet.commons.lang.util.*;
......@@ -32,6 +33,7 @@ import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
......@@ -67,8 +69,6 @@ public class GoblinNftExCodeServiceImpl implements IGoblinNftExCodeService {
private AdamUserMapper adamUserMapper;
@Value("${liquidnet.service.order.url}")
private String orderUrl;
/* @Autowired
private */
@Override
public PageInfoVo selectCodePageList(GoblinNftExCodeParam goblinNftExCodeParam) {
......@@ -172,7 +172,7 @@ public class GoblinNftExCodeServiceImpl implements IGoblinNftExCodeService {
}
PageInfoVo pageInfo = new PageInfoVo(goblinNftExCodeArrayList,count);
PageInfoVo pageInfo = new PageInfoVo(goblinNftExCodeArrayList, count);
return pageInfo;
}
......@@ -208,33 +208,50 @@ public class GoblinNftExCodeServiceImpl implements IGoblinNftExCodeService {
skuMap.put(skuId, number + 1);
}
goblinRedisUtils.removeCode(goblinNftExCode.getCode());
}
if (skuMap.size() > 0) {
for (String key : skuMap.keySet()) {
goblinRedisUtils.incrSkuStock(null, key, skuMap.get(key));
// goblinRedisUtils.incrSkuStock(null, key, skuMap.get(key));
}
}
// 批量修改
goblinNftExCodeMapper.updateCodes(goblinNftExCodes);
return true;
}
@Override
public ResponseDto<Object> addAirdrop(GoblinNftExCodeParam goblinNftExCodeParam) {
@Transactional
public ResponseDto<Boolean> addAirdrop(GoblinNftExCodeParam goblinNftExCodeParam) {
String code = goblinNftExCodeParam.getCode();
String phone = goblinNftExCodeParam.getPhone();
AdamUserInfoDto adamUserInfoDto = adamUserMapper.selectByPhone(phone);
if (adamUserInfoDto == null) {
return ResponseDto.failure("兑换码不正确或已失效");
return ResponseDto.failure("用户不存在!");
}
// 根据兑换code查询兑换码信息
GoblinNftExCode goblinNftExCode = goblinNftExCodeMapper.selectGoblinNftCodeByCode(code);
if (goblinNftExCode == null) {
return ResponseDto.failure("兑换码不存在!");
}
if (goblinNftExCode.getState().equals(2)) {
return ResponseDto.failure("兑换码已领取!");
}
GoblinNftExCodeVo goblinNftExCodeVo = goblinRedisUtils.getGoblinNftExCodeVo(goblinNftExCode.getCode());
if (goblinNftExCodeVo == null) {
return ResponseDto.failure("兑换码已失效!");
}
if (goblinNftExCodeVo.getState().equals(2)) {
return ResponseDto.failure("兑换码已领取!");
}
// 验证吗时间校验
try {
MultiValueMap<String, String> params = new LinkedMultiValueMap();
params.add("code", code);
......@@ -243,10 +260,18 @@ public class GoblinNftExCodeServiceImpl implements IGoblinNftExCodeService {
headers.add("Accept", "application/json;charset=UTF-8");
headers.add("Authorization", "Bearer " + CurrentUtil.getToken());
String post = HttpUtil.post(orderUrl + "/order/goblin/nft/airdrop", params, headers);
return ResponseDto.success();
ResponseDto<Boolean> rsp = JsonUtils.fromJson(post, new TypeReference<ResponseDto<Boolean>>() {
});
if (rsp.getData() != null && rsp.getData()) {
goblinNftExCode.setAdminUid(goblinNftExCodeParam.getAdminUid());
goblinNftExCodeMapper.updateCodeAdminUid(goblinNftExCode);
}else {
return ResponseDto.failure(rsp.getMessage());
}
return rsp;
} catch (Exception e) {
e.printStackTrace();
return ResponseDto.failure();
return ResponseDto.failure("发送公投失败!");
}
}
......
......@@ -7,18 +7,13 @@ import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftExCodeVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftExSkuVo;
import com.liquidnet.service.goblin.entity.GoblinGoodsSku;
import com.liquidnet.service.goblin.entity.GoblinNftExCode;
import com.liquidnet.service.goblin.entity.GoblinNftExCodeTask;
import com.liquidnet.service.goblin.entity.GoblinNftExSku;
import com.liquidnet.service.goblin.mapper.GoblinGoodsSkuMapper;
import com.liquidnet.service.goblin.mapper.GoblinNftExCodeMapper;
import com.liquidnet.service.goblin.mapper.GoblinNftExCodeTaskMapper;
import com.liquidnet.service.goblin.mapper.GoblinNftExSkuMapper;
import com.liquidnet.service.goblin.entity.*;
import com.liquidnet.service.goblin.mapper.*;
import com.liquidnet.service.goblin.param.GoblinNftExSkuParam;
import com.liquidnet.service.goblin.service.IGoblinNftExSkuService;
import com.liquidnet.service.platform.utils.GoblinRedisUtils;
import com.liquidnet.service.platform.utils.ObjectUtil;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -51,6 +46,8 @@ public class GoblinNftExSkuServiceImpl implements IGoblinNftExSkuService {
private GoblinGoodsSkuMapper goblinGoodsSkuMapper;
@Autowired
GoblinNftExCodeTaskMapper goblinNftExCodeTaskMapper;
@Autowired
private GoblinNftExCodeTaskRelationMapper goblinNftExCodeTaskRelationMapper;
@Transactional
......@@ -96,23 +93,17 @@ public class GoblinNftExSkuServiceImpl implements IGoblinNftExSkuService {
}
List<GoblinNftExSku> goblinNftExSkus = new ArrayList<>();
// List<GoblinNftExCodeTask> goblinNftExCodeTasks = new ArrayList<>();
List<GoblinNftExCode> goblinNftExCodes = new ArrayList<>();
List<GoblinNftExCodeTask> goblinNftExCodeTasks = new ArrayList<>();
// List<GoblinNftExCode> goblinNftExCodes = new ArrayList<>();
// sku ---> 兑换码关联
Map<String, GoblinNftExSkuParam> goblinNftExSkuParamMap = new HashMap<>();
// Map<String, GoblinNftExSkuParam> goblinNftExSkuParamMap = new HashMap<>();
// 构建对象
for (GoblinNftExSkuParam goblinNftExSkuParam : goblinNftExSkuParams) {
GoblinNftExSku goblinNftExSku = new GoblinNftExSku();
BeanUtils.copyProperties(goblinNftExSkuParam, goblinNftExSku);
goblinNftExSku.setCreatedAt(now);
goblinNftExSkus.add(goblinNftExSku);
// 定时任务对象构建
/* GoblinNftExCodeTask goblinNftExCodeTask = GoblinNftExCodeTask.getNew();
GoblinNftExCodeTask goblinNftExCodeTask = GoblinNftExCodeTask.getNew();
goblinNftExCodeTask.setTaskId(IDGenerator.nextSnowId());
goblinNftExCodeTask.setActivityId(goblinNftExSkuParam.getActivityId());
goblinNftExCodeTask.setStoreId(goblinNftExSkuParam.getStoreId());
......@@ -125,14 +116,50 @@ public class GoblinNftExSkuServiceImpl implements IGoblinNftExSkuService {
goblinNftExCodeTask.setExStopTime(goblinNftExSkuParam.getExStopTime());
goblinNftExCodeTask.setTyp(1);
goblinNftExCodeTask.setCreatedAt(now);
goblinNftExCodeTasks.add(goblinNftExCodeTask);*/
if (goblinNftExSkuParam.getUnbox().equals("1")) {
List<GoblinNftExCodeTaskRelation> goblinNftExCodeTaskRelations = new ArrayList<>();
// sku ---> 库存
Map<String, Integer> skuMap = getSkuHitRatio(goblinNftExSkuParam.getExStock(), map);
Integer sNumber = 0;
for (String key : skuMap.keySet()) {
Integer stockNum = skuMap.get(key);
// 根据sku减库存
int stock = goblinRedisUtils.decrSkuStock(null, key, stockNum);
if (stock < 0) {
goblinRedisUtils.incrSkuStock(null, key, stockNum);
} else {
GoblinNftExCodeTaskRelation goblinNftExCodeTaskRelation = new GoblinNftExCodeTaskRelation();
goblinNftExCodeTaskRelation.setTaskId(goblinNftExCodeTask.getTaskId());
goblinNftExCodeTaskRelation.setSkuId(key);
goblinNftExCodeTaskRelation.setStock(stockNum);
goblinNftExCodeTaskRelation.setCreatedAt(now);
goblinNftExCodeTaskRelations.add(goblinNftExCodeTaskRelation);
}
sNumber += stockNum;
}
goblinNftExCodeTaskRelationMapper.inserts(goblinNftExCodeTaskRelations);
goblinNftExCodeTask.setExStock(sNumber);
} else {
int stock = goblinRedisUtils.decrSkuStock(null, goblinNftExSkuParam.getSkuId(), goblinNftExSkuParam.getExStock());
if (stock < 0) {
goblinRedisUtils.incrSkuStock(null, goblinNftExSkuParam.getSkuId(), goblinNftExSkuParam.getExStock());
}
}
goblinNftExCodeTasks.add(goblinNftExCodeTask);
// 盲盒 概率
switch (goblinNftExSkuParam.getUnbox()) {
/*switch (goblinNftExSkuParam.getUnbox()) {
case "1":
// sku ---> 库存
Map<String, Integer> skuMap = getSkuHitRatio(goblinNftExSkuParam.getExStock(), map);
for (String key : skuMap.keySet()) {
Integer stockNum = skuMap.get(key);
......@@ -176,7 +203,7 @@ public class GoblinNftExSkuServiceImpl implements IGoblinNftExSkuService {
goblinNftExCode.setSkuId(goblinNftExSkuParam.getSkuId());
}
goblinNftExSkuParamMap.put(key, goblinNftExSkuParam);
// goblinNftExSkuParamMap.put(key, goblinNftExSkuParam);
}
}
......@@ -232,12 +259,13 @@ public class GoblinNftExSkuServiceImpl implements IGoblinNftExSkuService {
// goblinNftExSkuArrayList.add(GoblinNftExSkuVo.getNew().copy(goblinNftExSku));
}
}*/
}
/*
for (String key : goblinNftExSkuParamMap.keySet()) {
GoblinNftExSkuVo goblinNftExSkuVo = goblinRedisUtils.getSkuTime(key);
......@@ -270,13 +298,13 @@ public class GoblinNftExSkuServiceImpl implements IGoblinNftExSkuService {
goblinRedisUtils.addSkuTime(key, goblinNftExSku);
}
*/
// 数据库操作
long startm = System.currentTimeMillis();
goblinNftExSkuMapper.addGoblinNftExSkus(goblinNftExSkus);
// goblinNftExCodeTaskMapper.addGoblinNftExCodeTasks(goblinNftExCodeTasks);
goblinNftExCodeMapper.addGoblinNftExCodes(goblinNftExCodes);
goblinNftExCodeTaskMapper.addGoblinNftExCodeTasks(goblinNftExCodeTasks);
// goblinNftExCodeMapper.addGoblinNftExCodes(goblinNftExCodes);
log.debug("MSQ耗时:ms", System.currentTimeMillis() - startm);
return true;
......
......@@ -208,6 +208,19 @@ public class GoblinRedisUtils {
return getRedis().set(key,goblinNftExCodeVo,millisNum);
}
/**
* 兑换码
*/
public GoblinNftExCodeVo getGoblinNftExCodeVo(String code) {
String redisKey = GoblinRedisConst.ACTIVITY_SKU_CODE.concat(code);
Object obj = getRedis().get(redisKey);
if (obj == null) {
return null;
} else {
return (GoblinNftExCodeVo) obj;
}
}
// 获取盲盒下藏品的库存 各种状态下不能算库存的排除掉
public int getSkuAllStatusStock(GoblinGoodsSku info) {
if (
......
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