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

Commit 3ef00d84 authored by 张国柄's avatar 张国柄

Merge remote-tracking branch 'origin/dev_nft' into dev_nft

# Conflicts:
#	liquidnet-bus-service/liquidnet-service-goblin/liquidnet-service-goblin-impl/src/main/resources/sqlmap.properties
parents 6bae9c50 19aa6c66
......@@ -118,6 +118,13 @@ public class GoblinRedisConst {
public static final String REDIS_GOBLIN_TEMP_COUPON_MARKET = PREFIX.concat("temp:coupon:marketId:");//id 列表 $key:$marketId
public static final String REDIS_GOBLIN_TEMP_COUPON = PREFIX.concat("temp:coupon:");//详情 $key:$ucouponId
/* --------------------------------NFT--------------------------------- */
public static final String REDIS_GOBLIN_NFT_ORDER_INFO = PREFIX.concat("nftOrder:");// nft订单详情
public static final String REDIS_GOBLIN_NFT_ORDER_USER_ID_LIST = PREFIX.concat("nftOrder:idList:user:");// nft用户订单id列表
public static final String REDIS_GOBLIN_NFT_ORDER_REFUND_INFO = PREFIX.concat("nftOrder:refund:");// nft退款订单详情
public static final String REDIS_GOBLIN_NFT_GOODS_LIST = PREFIX.concat("nftGoodsList");// nft商品列表
/* ----------------------------------------------------------------- */
/**
* SKU剩余库存
......
......@@ -184,7 +184,36 @@ public class GoblinStatusConst {
}
/* ----------------------------------------------------------------- */
/* -----------------------------NFT订单状态------------------------------------ */
public enum NftStatus {
ORDER_STATUS_1(1, "待付款(用户刚下单)"),
ORDER_STATUS_2(2, "已付款(用户付完款 等待商城发货)"),
ORDER_STATUS_3(3, "已取消(未付款取消订单"),
ORDER_STATUS_4(4, "退款中(超时支付)"),
ORDER_STATUS_5(5, "已退款(超时支付)"),
ORDER_REFUND_STATUS_1(1, "申请"),
ORDER_REFUND_STATUS_2(2, "退款成功"),
ORDER_REFUND_STATUS_3(3, "退款失败"),
;
private final int value;
private final String desc;
NftStatus(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return value;
}
public String getDesc() {
return desc;
}
}
......
package com.liquidnet.service.goblin.dto.manage;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsInfoVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@ApiModel(value = "GoblinStoreMgtDigitalGoodsAddParam", description = "商品管理:商品编辑:数字商品基本信息添加/编辑入参")
@Data
public class GoblinStoreMgtDigitalGoodsAddParam implements Serializable {
private static final long serialVersionUID = -107018124207214457L;
@ApiModelProperty(position = 10, required = true, value = "店铺ID")
@NotNull(message = "店铺ID不能为空")
private String storeId;
@ApiModelProperty(position = 11, required = false, value = "商品ID[编辑时必传]")
private String spuId;
/**
* ---------------------------- 基本信息 ----------------------------
**/
@ApiModelProperty(position = 12, required = true, value = "商品名称[36]")
@NotBlank(message = "商品名称不能为空")
@Size(max = 36, message = "商品名称长度超限")
private String name;
@ApiModelProperty(position = 14, required = true, value = "商品一级分类ID[30]")
@NotBlank(message = "商品分类ID不能为空")
private String cateFid;
@ApiModelProperty(position = 15, required = true, value = "商品二级分类ID[30]")
private String cateSid;
@ApiModelProperty(position = 16, required = true, value = "商品三级分类ID[30]")
private String cateTid;
@ApiModelProperty(position = 17, required = false, value = "商品简介[256]", example = "商品简介...")
@Size(max = 256, message = "商品简介内容过长")
private String intro;
@ApiModelProperty(position = 18, required = false, value = "商品标签列表")
private List<String> tagList;
@ApiModelProperty(position = 19, required = false, value = "注意事项[256]", example = "注意事项...")
@Size(max = 256, message = "商品简介内容过长")
private String attention;
@ApiModelProperty(position = 20, required = false, value = "创作者[25]", example = "创作者...")
@Size(max = 25, message = "创作者内容过长")
private String author;
@ApiModelProperty(position = 21, required = false, value = "发行方[25]", example = "发行方...")
@Size(max = 25, message = "发行方内容过长")
private String publisher;
/**
* 生成SPU
*
* @return GoblinGoodsInfoVo
*/
public GoblinGoodsInfoVo initGoodsInfoVo() {
GoblinGoodsInfoVo vo = GoblinGoodsInfoVo.getNew();
vo.setStoreId(this.getStoreId());
if (StringUtils.isBlank(this.getSpuId())) {
vo.setSpuId(IDGenerator.nextMilliId2());
} else {
vo.setSpuId(this.getSpuId());
}
vo.setSpuNo(vo.getSpuId());
vo.setSpuType(1);
vo.setName(this.getName());
vo.setSpecMode("1");
vo.setCateFid(this.getCateFid());
vo.setCateSid(this.getCateSid());
vo.setCateTid(this.getCateTid());
vo.setPriceGe(BigDecimal.ZERO);
vo.setPriceLe(BigDecimal.ZERO);
vo.setIntro(this.getIntro());
vo.setAttention(this.getAttention());
vo.setAuthor(this.getAuthor());
vo.setPublisher(this.getPublisher());
vo.setShelvesHandle("1");
vo.setVirtualFlg("1");
vo.setStatus("3");
vo.setShelvesStatus("0");
vo.setSpuAppear("1");
vo.setDelFlg("0");
return vo;
}
/**
* 编辑SPU参数整理
*
* @return GoblinGoodsInfoVo
*/
public GoblinGoodsInfoVo initEditGoodsInfoVo() {
GoblinGoodsInfoVo vo = GoblinGoodsInfoVo.getNew();
vo.setSpuId(this.getSpuId());
vo.setName(this.getName());
vo.setIntro(this.getIntro());
vo.setCateFid(this.getCateFid());
vo.setCateSid(this.getCateSid());
vo.setCateTid(this.getCateTid());
return vo;
}
}
package com.liquidnet.service.goblin.dto.manage;
import com.liquidnet.commons.lang.constant.LnsRegex;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import javax.validation.constraints.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@ApiModel(value = "GoblinStoreMgtDigitalGoodsSkuAddParam", description = "商品管理:商品编辑:数字商品SKU添加/编辑SKU入参")
@Data
public class GoblinStoreMgtDigitalGoodsAddSkuParam implements Serializable {
private static final long serialVersionUID = 8312325974060397741L;
@ApiModelProperty(position = 10, required = true, value = "店铺ID")
@NotBlank(message = "店铺ID不能为空")
private String storeId;
@ApiModelProperty(position = 11, required = true, value = "商品ID")
@NotNull(message = "商品ID不能为空")
private String spuId;
@ApiModelProperty(position = 12, required = false, value = "单品ID,编辑时必传")
private String skuId;
@ApiModelProperty(position = 13, required = true, value = "藏品名称[36]")
@NotNull(message = "藏品名称不能为空")
@Size(max = 36, message = "藏品名称内容过长")
private String name;
@ApiModelProperty(position = 14, required = false, value = "款式名称[36],`unbox=0`时必传")
@Size(max = 36, message = "款式名称内容过长")
private String subtitle;
@ApiModelProperty(position = 15, required = true, value = "藏品封面图片URL[256]")
@NotNull(message = "藏品封面图片不能为空")
@Size(max = 256, message = "藏品封面图片URL过长")
private String skuPic;
@ApiModelProperty(position = 16, required = true, value = "展示文件URL[256]")
@NotNull(message = "展示文件不能为空")
@Size(max = 256, message = "展示文件URL过长")
private String skuWatch;
@ApiModelProperty(position = 17, required = true, value = "展示文件类型[1-图片|2-视频|3-模型]")
@NotNull(message = "展示文件类型不能为空")
@Pattern(regexp = "\\b(1|2|3)\\b", message = "展示文件类型参数无效")
private String watchType;
@ApiModelProperty(position = 18, required = false, value = "我的藏品展示文件类型[1-图片|2-视频|3-模型],`unbox=0`时必传")
@Pattern(regexp = "\\b(1|2|3)\\b", message = "我的藏品展示文件类型参数无效")
private String materialType;
@ApiModelProperty(position = 19, required = false, value = "我的藏品展示文件URL[256],`unbox=0`时必传")
@Size(max = 256, message = "我的藏品展示文件URL过长")
private String materialUrl;
@ApiModelProperty(position = 20, required = true, value = "线上库存")
@NotNull(message = "线上库存不能为空")
@Min(value = 0, message = "线上库存必须大于0")
private Integer stock;
@ApiModelProperty(position = 21, required = true, value = "兑换库存")
@NotNull(message = "兑换库存不能为空")
@Min(value = 0, message = "兑换库存必须大于0")
private Integer giftStock;
@ApiModelProperty(position = 22, required = false, value = "概率[0.01~100%],`unbox=1`时有效")
@DecimalMin(value = "0.01", message = "概率超出可填范围0.01~100")
private BigDecimal hitRatio;
@ApiModelProperty(position = 23, required = true, value = "藏品价格[20,2]")
@NotNull(message = "藏品价格不能为空")
@DecimalMin(value = "0.01", message = "藏品价格必须大于0")
private BigDecimal price;
@ApiModelProperty(position = 24, required = false, value = "藏品会员价格[20,2]")
@DecimalMin(value = "0.01", message = "藏品会员价格必须大于0")
private BigDecimal priceMember;
@ApiModelProperty(position = 25, required = false, value = "限购[0-无限制|X:限购数量],`unbox=0`时必传")
@Min(value = 1, message = "限购数量必须大于0")
private Integer buyLimit;
@ApiModelProperty(position = 26, required = false, value = "购买限制[0-全部用户|1-仅会员|2-指定用户],`unbox=0`时必传")
@Pattern(regexp = "\\b(0|1|2)\\b", message = "购买条件参数无效")
private String buyFactor;
@ApiModelProperty(position = 27, required = false, value = "购买限制人员名单URL,购买限制为2-指定用户时必填")
@Size(max = 256, message = "购买限制人员名单URL过长")
private String buyRoster;
@ApiModelProperty(position = 28, required = false, value = "购买限制人员名单操作类型[1-添加|2-删除],购买限制为2-指定用户时有效")
@Pattern(regexp = "\\b(1|2)\\b", message = "购买限制人员名单操作类型参数无效")
private String buyRosterType;
@ApiModelProperty(position = 29, required = false, value = "简介[256]")
@Size(max = 256, message = "藏品简介内容过长")
private String intro;
@ApiModelProperty(position = 30, required = true, value = "详情[256]")
@NotNull(message = "藏品详情不能为空")
private String details;
@ApiModelProperty(position = 31, required = true, value = "上架处理方式[1-等待手动上架|2-直接上架售卖|3-预约定时上架]", example = "1")
@NotNull(message = "上架处理方式不能为空")
@Pattern(regexp = "\\b(1|2|3)\\b", message = "上架处理方式参数无效")
private String shelvesHandle;
@ApiModelProperty(position = 32, required = false, value = "预约上架时间[yyyy-MM-dd HH:mm:ss][上架处理方式为3-预约定时上架时需要指定]")
@Pattern(regexp = LnsRegex.Valid.DATETIME_FULL, message = "预约上架时间格式有误")
private String shelvesTime;
@ApiModelProperty(position = 33, required = true, value = "开售时间[yyyy-MM-dd HH:mm:ss]")
@NotNull(message = "开售时间不能为空")
@Pattern(regexp = LnsRegex.Valid.DATETIME_FULL, message = "开售时间格式有误")
private String saleStartTime;
@ApiModelProperty(position = 34, required = false, value = "是否盲盒[0-否|1-是]")
@Pattern(regexp = "\\b(0|1)\\b", message = "是否盲盒参数无效")
private String unbox;
@ApiModelProperty(position = 35, required = false, value = "盲盒开启时间[yyyy-MM-dd HH:mm:ss],`unbox=1`时必传")
@Pattern(regexp = LnsRegex.Valid.DATETIME_FULL, message = "盲盒开启时间格式有误")
private String openingTime;
@ApiModelProperty(position = 36, required = false, value = "盲盒开启时限[单位秒]")
@Min(value = 0, message = "盲盒开启时限参数无效")
private String openingLimit;
/**
* ---------------------------- 专属标签 ----------------------------
**/
@ApiModelProperty(position = 37, required = false, value = "藏品关联音乐人、艺术家、品牌方、厂牌列表")
private List<String> extagList;
public GoblinGoodsSkuInfoVo initAddGoodsSkuInfoVo(boolean notUnboxFlg) {
GoblinGoodsSkuInfoVo initVo = GoblinGoodsSkuInfoVo.getNew();
initVo.setSkuId(this.getSpuId().concat(StringUtils.right(String.valueOf(System.nanoTime()), 5)));
initVo.setSpuId(this.getSpuId());
initVo.setSkuNo(this.getSpuId());
initVo.setSkuType(1);
initVo.setName(this.getName());
initVo.setSkuPic(this.getSkuPic());
initVo.setSkuWatch(this.getSkuWatch());
initVo.setWatchType(this.getWatchType());
initVo.setPrice(this.getPrice());
initVo.setPriceMember(this.getPrice());
initVo.setIntro(this.getIntro());
initVo.setDetails(this.getDetails());
initVo.setStoreId(this.getStoreId());
initVo.setShelvesHandle(this.getShelvesHandle());
initVo.setShelvesTime(this.getShelvesTime());
initVo.setSaleStartTime(DateUtil.Formatter.yyyyMMddHHmmss.parse(this.getSaleStartTime()));
initVo.setVirtualFlg("1");
initVo.setStatus("3");
initVo.setShelvesStatus("0");
initVo.setSkuAppear("0");
initVo.setDelFlg("0");
initVo.setUnbox(notUnboxFlg ? "0" : "1");
if (notUnboxFlg) {
initVo.setSubtitle(this.getSubtitle());//0
initVo.setMaterialType(this.getMaterialType());//0
initVo.setMaterialUrl(this.getMaterialUrl());//0
initVo.setStock(this.getStock());//0
initVo.setSkuStock(this.getStock());//0
initVo.setGiftStock(this.getGiftStock());//0
initVo.setHitRatio(this.getHitRatio());//0
initVo.setBuyFactor(this.getBuyFactor());//0
initVo.setBuyRoster(this.getBuyRoster());//0
initVo.setBuyLimit(this.getBuyLimit());//0
} else {
initVo.setOpeningTime(DateUtil.Formatter.yyyyMMddHHmmss.parse(this.getOpeningTime()));//1
}
return initVo;
}
public GoblinGoodsSkuInfoVo initEditGoodsSkuInfoVo() {
GoblinGoodsSkuInfoVo updateVo = GoblinGoodsSkuInfoVo.getNew();
updateVo.setSkuId(this.getSkuId());
updateVo.setDetails(this.getDetails());
updateVo.setShelvesHandle(this.getShelvesHandle());
updateVo.setShelvesTime(this.getShelvesTime());
updateVo.setSaleStartTime(DateUtil.Formatter.yyyyMMddHHmmss.parse(this.getSaleStartTime()));
switch (this.getUnbox()) {
case "0":
updateVo.setHitRatio(this.getHitRatio());//0
updateVo.setBuyLimit(this.getBuyLimit());//0
updateVo.setBuyFactor(this.getBuyFactor());//0
updateVo.setBuyRoster(this.getBuyRoster());//0
break;
case "1":
updateVo.setName(this.getName());//1
updateVo.setSkuPic(this.getSkuPic());//1
updateVo.setSkuWatch(this.getSkuWatch());//1
updateVo.setWatchType(this.getWatchType());//1
updateVo.setPrice(this.getPrice());//1
updateVo.setPriceMember(this.getPrice());//
updateVo.setIntro(this.getIntro());//1
updateVo.setOpeningTime(DateUtil.Formatter.yyyyMMddHHmmss.parse(this.getOpeningTime()));//1
break;
}
return updateVo;
}
}
......@@ -110,6 +110,7 @@ public class GoblinStoreMgtGoodsAddParam implements Serializable {
**/
@ApiModelProperty(position = 28, required = true, value = "上架处理方式[1-等待手动上架|2-直接上架售卖|3-预约定时上架]", example = "1")
@NotNull(message = "上架处理方式不能为空")
@Pattern(regexp = "\\b(1|2|3)\\b", message = "规格展现方式参数无效")
private String shelvesHandle;
@ApiModelProperty(position = 29, required = false, value = "预约上架时间[yyyy-MM-dd HH:mm:ss][上架处理方式为3-预约定时上架时需要指定]")
......
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@ApiModel(value = "GoblinDigitalArtworkCertVo", description = "藏品证书信息")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoblinDigitalArtworkCertVo implements Serializable, Cloneable {
private static final long serialVersionUID = -5348463844779743371L;
@ApiModelProperty(position = 11, value = "藏品名称")
private String name;
@ApiModelProperty(position = 12, value = "创作者")
private String author;
@ApiModelProperty(position = 13, value = "发行方")
private String publisher;
@ApiModelProperty(position = 14, value = "收藏者")
private String collector;
@ApiModelProperty(position = 15, value = "藏品简介")
private String intro;
// 流转记录
private static final GoblinDigitalArtworkCertVo obj = new GoblinDigitalArtworkCertVo();
public static GoblinDigitalArtworkCertVo getNew() {
try {
return (GoblinDigitalArtworkCertVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinDigitalArtworkCertVo();
}
}
}
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@ApiModel(value = "GoblinDigitalArtworkInfoVo", description = "藏品详情信息")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoblinDigitalArtworkInfoVo implements Serializable, Cloneable {
private static final long serialVersionUID = 8903534983251413696L;
@ApiModelProperty(position = 11, value = "是否盲盒[0-否|1-是]")
private Integer unbox;
@ApiModelProperty(position = 12, value = "藏品名称")
private String name;
@ApiModelProperty(position = 13, value = "藏品素材类型[1-图片|2-视频|3-模型]")
private Integer materialType;
@ApiModelProperty(position = 14, value = "藏品素材URL")
private String materialUrl;
@ApiModelProperty(position = 15, value = "序列号")
private Integer editionSn;
@ApiModelProperty(position = 16, value = "藏品发行量")
private Integer edition;
@ApiModelProperty(position = 17, value = "NFT藏品HASH")
private String nftHash;
@ApiModelProperty(position = 18, value = "NFT系列声明时间")
private String declareAt;
@ApiModelProperty(position = 19, value = "获得方式[0-购买|1-兑换]")
private Integer getway;
@ApiModelProperty(position = 20, value = "藏品状态,根据`unbox`区分盲盒来判断[0-生成中/未开启|1-已生成/已开启|2-生成失败/开启失败]")
private Integer state;
@ApiModelProperty(position = 21, value = "创作者")
private String author;
@ApiModelProperty(position = 22, value = "收藏者")
private String collector;
@ApiModelProperty(position = 23, value = "发行方")
private String publisher;
private static final GoblinDigitalArtworkInfoVo obj = new GoblinDigitalArtworkInfoVo();
public static GoblinDigitalArtworkInfoVo getNew() {
try {
return (GoblinDigitalArtworkInfoVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinDigitalArtworkInfoVo();
}
}
}
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.commons.lang.util.DateUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@ApiModel(value = "GoblinDigitalArtworkListVo", description = "藏品列表信息")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoblinDigitalArtworkListVo implements Serializable, Cloneable {
private static final long serialVersionUID = -1510553574954846520L;
@ApiModelProperty(position = 10, value = "是否盲盒[0-否|1-是]")
private Integer unbox;
@ApiModelProperty(position = 11, value = "藏品Id")
private String artworkId;
@ApiModelProperty(position = 12, value = "藏品名称")
private String name;
@ApiModelProperty(position = 13, value = "藏品封面")
private String coverPic;
@ApiModelProperty(position = 14, value = "序列号")
private Integer editionSn;
@ApiModelProperty(position = 15, value = "藏品发行量")
private Integer edition;
@ApiModelProperty(position = 16, value = "获得方式[0-购买|1-兑换]")
private Integer getway;
@ApiModelProperty(position = 17, value = "藏品状态,根据`unbox`区分盲盒来判断[0-生成中/未开启|1-已生成/已开启|2-生成失败/开启失败]")
private Integer state;
@ApiModelProperty(position = 18, value = "盲盒开启时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime openingTime;
private static final GoblinDigitalArtworkListVo obj = new GoblinDigitalArtworkListVo();
public static GoblinDigitalArtworkListVo getNew() {
try {
return (GoblinDigitalArtworkListVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinDigitalArtworkListVo();
}
}
}
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoblinDigitalArtworkVo implements Serializable, Cloneable {
private static final long serialVersionUID = -5920952408993245963L;
private String artworkId;
private String orderId;
private String uid;
private String skuId;
private Integer editionSn;
private String nftId;
private String releaseTxhash;
private String releaseAt;
private String tradingTxhash;
private String tradingAt;
private Integer getway;
private Integer state;
private String delFlg;
private LocalDateTime openingAt;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private LocalDateTime deletedAt;
/* ---------------------- 冗余SPU信息 ---------------------- */
private String author;
private String publisher;
private static final GoblinDigitalArtworkVo obj = new GoblinDigitalArtworkVo();
public static GoblinDigitalArtworkVo getNew() {
try {
return (GoblinDigitalArtworkVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinDigitalArtworkVo();
}
}
}
......@@ -27,6 +27,8 @@ public class GoblinGoodsInfoVo implements Serializable, Cloneable {
private String spuId;
@ApiModelProperty(position = 12, value = "商品编码[默认为系统编码,也可手动输入商家自己的编码]")
private String spuNo;
@ApiModelProperty(position = 12, value = "商品类型[0-常规|1-数字藏品]")
private Integer spuType;
@ApiModelProperty(position = 13, value = "商品名称[100]")
private String name;
@ApiModelProperty(position = 14, value = "商品副标题[128]")
......@@ -41,6 +43,8 @@ public class GoblinGoodsInfoVo implements Serializable, Cloneable {
private String intro;
@ApiModelProperty(position = 19, value = "商品详情", example = "商品详情...")
private String details;
@ApiModelProperty(position = 19, value = "注意事项", example = "注意事项...")
private String attention;
@ApiModelProperty(position = 20, value = "封面图片地址[256]")
private String coverPic;
@ApiModelProperty(position = 21, value = "商品视频地址")
......@@ -66,6 +70,12 @@ public class GoblinGoodsInfoVo implements Serializable, Cloneable {
private String shelvesHandle;
@ApiModelProperty(position = 31, value = "预约上架时间[上架处理方式为3-预约定时上架时需要指定]")
private String shelvesTime;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
@ApiModelProperty(position = 31, value = "开售时间")
private LocalDateTime saleStartTime;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
@ApiModelProperty(position = 31, value = "停售时间")
private LocalDateTime saleStopTime;
@ApiModelProperty(position = 32, value = "商品有效期[YYYY-MM-DD]")
private String spuValidity;
@ApiModelProperty(position = 33, value = "是否虚拟商品[0-否|1-是]")
......@@ -78,6 +88,10 @@ public class GoblinGoodsInfoVo implements Serializable, Cloneable {
private String shelvesStatus;
@ApiModelProperty(position = 37, value = "自定义展示[0-默认展示|1-隐藏不可购买]")
private String spuAppear;
@ApiModelProperty(position = 37, value = "创作者")
private String author;
@ApiModelProperty(position = 37, value = "发行方")
private String publisher;
@ApiModelProperty(position = 38, value = "删除标记[0-未删除|1-删除]")
private String delFlg;
@ApiModelProperty(position = 39, value = "上架时间")
......
......@@ -25,18 +25,32 @@ public class GoblinGoodsSkuInfoVo implements Serializable, Cloneable {
private String spuId;
@ApiModelProperty(position = 12, value = "单品的编号[45]")
private String skuNo;
@ApiModelProperty(position = 12, value = "商品类型[0-常规|1-数字藏品]")
private int skuType;
@ApiModelProperty(position = 13, value = "单品的名称[100]")
private String name;
@ApiModelProperty(position = 14, value = "单品的副标题[128]")
private String subtitle;
@ApiModelProperty(position = 15, value = "单品默认图片的URL[256]")
private String skuPic;
@ApiModelProperty(position = 15, value = "单品详情展示文件URL[256]")
private String skuWatch;
@ApiModelProperty(position = 15, value = "展示文件类型[1-图片|2-视频|3-模型]")
private String watchType;
@ApiModelProperty(position = 15, value = "素材原始文件类型[1-图片|2-视频|3-模型]")
private String materialType;
@ApiModelProperty(position = 15, value = "素材原始文件URL")
private String materialUrl;
@ApiModelProperty(position = 16, value = "ISBN,针对CD/图书等[50]")
private String skuIsbn;
@ApiModelProperty(position = 17, value = "总库存")
private Integer stock;
@ApiModelProperty(position = 18, value = "单品库存")
private Integer skuStock;
@ApiModelProperty(position = 18, value = "兑换库存")
private Integer giftStock;
@ApiModelProperty(position = 18, value = "盲盒命中率[0.01~100%]")
private BigDecimal hitRatio;
@ApiModelProperty(position = 19, value = "预警库存")
private Integer warningStock;
@ApiModelProperty(position = 20, value = "单品销售价-原价[20,2]")
......@@ -47,6 +61,10 @@ public class GoblinGoodsSkuInfoVo implements Serializable, Cloneable {
private BigDecimal priceMember;
@ApiModelProperty(position = 23, value = "单品的重量[20,2]")
private BigDecimal weight;
@ApiModelProperty(position = 23, value = "单品简介[256]", example = "单品简介...")
private String intro;
@ApiModelProperty(position = 23, value = "单品详情", example = "单品详情...")
private String details;
@ApiModelProperty(position = 24, value = "购买限制[0-全部用户|1-仅会员|2-指定用户]")
private String buyFactor;
@ApiModelProperty(position = 25, value = "购买限制人员名单[购买限制为2-指定用户时必填]")
......@@ -55,6 +73,16 @@ public class GoblinGoodsSkuInfoVo implements Serializable, Cloneable {
private Integer buyLimit;
@ApiModelProperty(position = 27, value = "商品的店铺ID,如果是平台的则为0")
private String storeId;
@ApiModelProperty(position = 27, value = "上架处理方式[1-等待手动上架|2-直接上架售卖|3-预约定时上架]")
private String shelvesHandle;
@ApiModelProperty(position = 27, value = "预约上架时间[上架处理方式为3-预约定时上架时需要指定]")
private String shelvesTime;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
@ApiModelProperty(position = 27, value = "开售时间")
private LocalDateTime saleStartTime;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
@ApiModelProperty(position = 27, value = "停售时间")
private LocalDateTime saleStopTime;
@ApiModelProperty(position = 28, value = "单品有效期")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime skuValidity;
......@@ -68,6 +96,28 @@ public class GoblinGoodsSkuInfoVo implements Serializable, Cloneable {
private String shelvesStatus;
@ApiModelProperty(position = 33, value = "自定义展示[0-默认展示|1-隐藏不可购买]")
private String skuAppear;
@ApiModelProperty(position = 33, value = "是否盲盒[0-否|1-是]")
private String unbox;
@ApiModelProperty(position = 33, value = "盲盒开启时间")
private LocalDateTime openingTime;
@ApiModelProperty(position = 33, value = "盲盒开启时限[单位秒]")
private Integer openingLimit;
@ApiModelProperty(position = 33, value = "NFT路由")
private String routeType;
@ApiModelProperty(position = 33, value = "NFT上传声明状态[0-待上传|1-已上传|2-上传失败|9-上传中]")
private Integer upchain;
@ApiModelProperty(position = 33, value = "NFT预览图访问URL")
private String displayUrl;
@ApiModelProperty(position = 33, value = "NFT素材访问URL")
private String nftUrl;
@ApiModelProperty(position = 33, value = "NFT系列ID")
private String seriesId;
@ApiModelProperty(position = 33, value = "NFT系列HASH")
private String seriesHash;
@ApiModelProperty(position = 33, value = "NFT藏品HASH")
private String nftHash;
@ApiModelProperty(position = 33, value = "NFT系列声明时间")
private String declareAt;
@ApiModelProperty(position = 34, value = "删除标记[0-未删除|1-删除]")
private String delFlg;
@ApiModelProperty(position = 35, value = "上架时间")
......@@ -90,6 +140,8 @@ public class GoblinGoodsSkuInfoVo implements Serializable, Cloneable {
@ApiModelProperty(position = 40, value = "单品规格信息")
private List<GoblinGoodsSpecDto> skuSpecList;
@ApiModelProperty(position = 54, value = "单品音乐人标签[藏品类型时使用]")
private List<GoblinGoodsExtagVo> extagVoList;
/* -------------------------------- 只展示,不存储 -------------------------------- */
......
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.commons.lang.util.DateUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@ApiModel(value = "GoblinNftGoodsInfoListVo", description = "NFT商品SPU详情[不包含具体SKU,SKU详情参见'GoblinNftGoodsSkuInfoVo']")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoblinNftGoodsInfoListVo implements Serializable, Cloneable {
private static final long serialVersionUID = -3869909399504844722L;
@ApiModelProperty(position = 10, value = "店铺ID")
private String storeId;
@ApiModelProperty(position = 11, value = "商品ID[64]")
private String spuId;
@ApiModelProperty(position = 12, value = "商品编码[默认为系统编码,也可手动输入商家自己的编码]")
private String spuNo;
@ApiModelProperty(position = 13, value = "商品名称[100]")
private String name;
@ApiModelProperty(position = 14, value = "商品副标题[128]")
private String subtitle;
@ApiModelProperty(position = 20, value = "封面图片地址[256]")
private String coverPic;
@ApiModelProperty(position = 21, value = "商品视频地址")
private String video;
@ApiModelProperty(position = 15, value = "销售价-原价[20,2]")
private BigDecimal sellPrice;
@ApiModelProperty(position = 16, value = "价格区间MIN[20,2]")
private BigDecimal priceGe;
@ApiModelProperty(position = 17, value = "价格区间MAX[20,2]")
private BigDecimal priceLe;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
@ApiModelProperty(position = 31, value = "开售时间")
private LocalDateTime saleStartTime;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
@ApiModelProperty(position = 31, value = "停售时间")
private LocalDateTime saleStopTime;
@ApiModelProperty(position = 32, value = "商品有效期[YYYY-MM-DD]")
private String spuValidity;
@ApiModelProperty(position = 34, value = "审核状态[0-编辑中|1-审核中|2-审核不通过|3-审核通过]")
private String status;
@ApiModelProperty(position = 36, value = "商品上架状态[0-待上架|1-下架|2-违规|3-上架]")
private String shelvesStatus;
@ApiModelProperty(position = 37, value = "自定义展示[0-默认展示|1-隐藏不可购买]")
private String spuAppear;
@ApiModelProperty(position = 37, value = "创作者")
private String author;
@ApiModelProperty(position = 37, value = "发行方")
private String publisher;
@ApiModelProperty(position = 39, value = "上架时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime shelvesAt;
@ApiModelProperty(position = 40, value = "商品图片列表")
private List<String> imageList;
@ApiModelProperty(position = 52, value = "商品标签列表")
private List<GoblinGoodsTagVo> tagVoList;
@ApiModelProperty(position = 54, value = "音乐人、艺术家、IP列表")
private List<GoblinGoodsExtagVo> extagVoList;
@ApiModelProperty(position = 55, value = "AR标签")
private List<GoblinGoodsExtagVo> artagVoList;
@ApiModelProperty(position = 56, value = "SPU包含的SKU_ID列表")
private List<String> skuIdList;
@ApiModelProperty(position = 61, value = "销量")
private Integer count;
@ApiModelProperty(position = 62, value = "商铺名称")
private String storeName;
@ApiModelProperty(position = 63, value = "skuList")
private List<GoblinNftGoodsSkuInfoVo> nftGoodsSkuInfoVoList;
private static final GoblinNftGoodsInfoListVo obj = new GoblinNftGoodsInfoListVo();
public static GoblinNftGoodsInfoListVo getNew() {
try {
return (GoblinNftGoodsInfoListVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinNftGoodsInfoListVo();
}
}
}
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.goblin.dto.GoblinGoodsSpecDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@ApiModel(value = "GoblinNftGoodsSkuInfoVo", description = "NFT商品SKU信息")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoblinNftGoodsSkuInfoVo implements Serializable, Cloneable {
private static final long serialVersionUID = -519573757075729441L;
@ApiModelProperty(position = 10, value = "商品单品ID")
private String skuId;
@ApiModelProperty(position = 11, value = "商品ID[64]")
private String spuId;
@ApiModelProperty(position = 12, value = "单品的编号[45]")
private String skuNo;
@ApiModelProperty(position = 12, value = "商品类型[0-常规|1-数字藏品]")
private int skuType;
@ApiModelProperty(position = 13, value = "单品的名称[100]")
private String name;
@ApiModelProperty(position = 14, value = "单品的副标题[128]")
private String subtitle;
@ApiModelProperty(position = 15, value = "单品默认图片的URL[256]")
private String skuPic;
@ApiModelProperty(position = 15, value = "单品详情展示文件URL[256]")
private String skuWatch;
@ApiModelProperty(position = 15, value = "展示文件类型[1-图片|2-视频|3-模型]")
private String watchType;
@ApiModelProperty(position = 15, value = "素材原始文件类型[1-图片|2-视频|3-模型]")
private String materialType;
@ApiModelProperty(position = 15, value = "素材原始文件URL")
private String materialUrl;
@ApiModelProperty(position = 16, value = "ISBN,针对CD/图书等[50]")
private String skuIsbn;
@ApiModelProperty(position = 17, value = "总库存")
private Integer stock;
@ApiModelProperty(position = 18, value = "单品库存")
private Integer skuStock;
@ApiModelProperty(position = 18, value = "兑换库存")
private Integer giftStock;
@ApiModelProperty(position = 18, value = "盲盒命中率[0.01~100%]")
private BigDecimal hitRatio;
@ApiModelProperty(position = 19, value = "预警库存")
private Integer warningStock;
@ApiModelProperty(position = 20, value = "单品销售价-原价[20,2]")
private BigDecimal sellPrice;
@ApiModelProperty(position = 21, value = "单品现价[20,2]")
private BigDecimal price;
@ApiModelProperty(position = 22, value = "单品会员价格[20,2]")
private BigDecimal priceMember;
@ApiModelProperty(position = 23, value = "单品的重量[20,2]")
private BigDecimal weight;
@ApiModelProperty(position = 23, value = "单品简介[256]", example = "单品简介...")
private String intro;
@ApiModelProperty(position = 23, value = "单品详情", example = "单品详情...")
private String details;
@ApiModelProperty(position = 24, value = "购买限制[0-全部用户|1-仅会员|2-指定用户]")
private String buyFactor;
@ApiModelProperty(position = 25, value = "购买限制人员名单[购买限制为2-指定用户时必填]")
private String buyRoster;
@ApiModelProperty(position = 26, value = "限量[0-无限制|X:限购数量]")
private Integer buyLimit;
@ApiModelProperty(position = 27, value = "商品的店铺ID,如果是平台的则为0")
private String storeId;
@ApiModelProperty(position = 27, value = "上架处理方式[1-等待手动上架|2-直接上架售卖|3-预约定时上架]")
private String shelvesHandle;
@ApiModelProperty(position = 27, value = "预约上架时间[上架处理方式为3-预约定时上架时需要指定]")
private String shelvesTime;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
@ApiModelProperty(position = 27, value = "开售时间")
private LocalDateTime saleStartTime;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
@ApiModelProperty(position = 27, value = "停售时间")
private LocalDateTime saleStopTime;
@ApiModelProperty(position = 28, value = "单品有效期")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime skuValidity;
@ApiModelProperty(position = 29, value = "是否是虚拟商品[0-否|1-是]")
private String virtualFlg;
@ApiModelProperty(position = 30, value = "审核状态[0-初始编辑|1-审核中|2-审核不通过|3-审核通过]")
private String status;
@ApiModelProperty(position = 31, value = "审核拒绝原因[256]")
private String reason;
@ApiModelProperty(position = 32, value = "单品上架状态[0-待上架|1-下架|2-违规|3-上架]")
private String shelvesStatus;
@ApiModelProperty(position = 33, value = "自定义展示[0-默认展示|1-隐藏不可购买]")
private String skuAppear;
@ApiModelProperty(position = 33, value = "是否盲盒[0-否|1-是]")
private String unbox;
@ApiModelProperty(position = 33, value = "盲盒开启时间")
private LocalDateTime openingTime;
@ApiModelProperty(position = 33, value = "盲盒开启时限[单位秒]")
private Integer openingLimit;
@ApiModelProperty(position = 33, value = "NFT路由")
private String routeType;
@ApiModelProperty(position = 33, value = "NFT上传声明状态[0-待上传|1-已上传|2-上传失败|9-上传中]")
private Integer upchain;
@ApiModelProperty(position = 33, value = "NFT预览图访问URL")
private String displayUrl;
@ApiModelProperty(position = 33, value = "NFT素材访问URL")
private String nftUrl;
@ApiModelProperty(position = 33, value = "NFT系列ID")
private String seriesId;
@ApiModelProperty(position = 33, value = "NFT系列HASH")
private String seriesHash;
@ApiModelProperty(position = 33, value = "NFT藏品HASH")
private String nftHash;
@ApiModelProperty(position = 33, value = "NFT系列声明时间")
private String declareAt;
@ApiModelProperty(position = 34, value = "删除标记[0-未删除|1-删除]")
private String delFlg;
@ApiModelProperty(position = 35, value = "上架时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime shelvesAt;
@ApiModelProperty(position = 36, value = "活动Id")
private String marketId;
@ApiModelProperty(position = 37, value = "物流模版ID")
private String logisticsTemplate;
private String createdBy;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime createdAt;
private String updatedBy;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime updatedAt;
private String deletedBy;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime deletedAt;
@ApiModelProperty(position = 40, value = "单品规格信息")
private List<GoblinGoodsSpecDto> skuSpecList;
@ApiModelProperty(position = 54, value = "单品音乐人标签[藏品类型时使用]")
private List<GoblinGoodsExtagVo> extagVoList;
private static final GoblinNftGoodsSkuInfoVo obj = new GoblinNftGoodsSkuInfoVo();
public static GoblinNftGoodsSkuInfoVo getNew() {
try {
return (GoblinNftGoodsSkuInfoVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinNftGoodsSkuInfoVo();
}
}
}
package com.liquidnet.service.goblin.dto.vo;
import com.liquidnet.service.goblin.entity.GoblinNftOrderRefund;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
* NFT订单退单退款表
* </p>
*
* @author jiangxiulong
* @since 2022-03-24
*/
@ApiModel(value = "GoblinNftOrderCallBackVo", description = "退款订单vo")
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinNftOrderCallBackVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "订单退单表id")
private String orderRefundId;
@ApiModelProperty(value = "退款单号")
private String refundCode;
@ApiModelProperty(value = "订单id")
private String orderId;
@ApiModelProperty(value = "订单编号")
private String orderCode;
@ApiModelProperty(value = "商铺id")
private String storeId;
@ApiModelProperty(value = "用户id")
private String userId;
@ApiModelProperty(value = "skuIdNums")
private String skuIdNums;
@ApiModelProperty(value = "退货时候实际退款金额")
private BigDecimal realBackPrice;
@ApiModelProperty(value = "退款状态 1申请|2退款成功|3退款失败")
private Integer status;
@ApiModelProperty(value = "退款时间")
private LocalDateTime refundAt;
@ApiModelProperty(value = "退款失败原因")
private String errorReason;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createdAt;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updatedAt;
public GoblinNftOrderCallBackVo copy(GoblinNftOrderRefund source) {
this.setOrderRefundId(source.getOrderRefundId());
this.setRefundCode(source.getRefundCode());
this.setOrderId(source.getOrderId());
this.setOrderCode(source.getOrderCode());
this.setStoreId(source.getStoreId());
this.setUserId(source.getUserId());
this.setSkuIdNums(source.getSkuIdNums());
this.setRealBackPrice(source.getRealBackPrice());
this.setStatus(source.getStatus());
this.setRefundAt(source.getRefundAt());
this.setErrorReason(source.getErrorReason());
this.setCreatedAt(source.getCreatedAt());
this.setUpdatedAt(source.getUpdatedAt());
return this;
}
private static final GoblinNftOrderCallBackVo obj = new GoblinNftOrderCallBackVo();
public static GoblinNftOrderCallBackVo getNew() {
try {
return (GoblinNftOrderCallBackVo) obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new GoblinNftOrderCallBackVo();
}
}
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
* NFT订单表
* </p>
*
* @author jiangxiulong
* @since 2022-03-25
*/
@ApiModel(value = "GoblinNftOrderDetailsVo", description = "NFT订单列表信息")
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinNftOrderDetailsVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "订单id")
private String orderId;
@ApiModelProperty(value = "商品id")
private String spuId;
@ApiModelProperty(value = "款式id")
private String skuId;
@ApiModelProperty(value = "数量")
private Integer num;
@ApiModelProperty(value = "店铺id")
private String storeId;
@ApiModelProperty(value = "商铺名称")
private String storeName;
@ApiModelProperty(value = "订单号")
private String orderCode;
@ApiModelProperty(value = "用户id")
private String userId;
@ApiModelProperty(value = "用户昵称")
private String userName;
@ApiModelProperty(value = "用户手机号")
private String userMobile;
@ApiModelProperty(value = "是否会员")
private Integer isMember;
@ApiModelProperty(value = "应付金额")
private BigDecimal priceTotal;
@ApiModelProperty(value = "券优惠金额")
private BigDecimal priceCoupon;
@ApiModelProperty(value = "商铺券优惠金额")
private BigDecimal storePriceCoupon;
@ApiModelProperty(value = "红包优惠金额")
private BigDecimal priceRedEnvelope;
@ApiModelProperty(value = "总优惠价格")
private BigDecimal priceVoucher;
@ApiModelProperty(value = "实付金额")
private BigDecimal priceActual;
@ApiModelProperty(value = "券id")
private String ucouponId;
@ApiModelProperty(value = "商铺券id")
private String storeCouponId;
@ApiModelProperty(value = "红包code")
private String redEnvelopeCode;
@ApiModelProperty(value = "订单状态 0-待付款(用户刚下单)|1-已付款|2-已取消(未付款取消订单)|3-已退款(超时支付)")
private Integer status;
@ApiModelProperty(value = "订单来源 app|h5|applet")
private String source;
@ApiModelProperty(value = "订单类型 0-购买订单|1-兑换订单|2-演出赠送订单")
private Integer orderType;
@ApiModelProperty(value = "支付时间")
private LocalDateTime payTime;
@ApiModelProperty(value = "支付单号")
private String payCode;
@ApiModelProperty(value = "支付类型 wepay-微信支付|alipay-阿里支付|douyinpay-抖音支付|unionpay-银联支付")
private String payType;
@ApiModelProperty(value = "支付类型来源[wap|js]")
private String deviceFrom;
@ApiModelProperty(value = "支付中心返回实际支付类型")
private String paymentType;
@ApiModelProperty(value = "支付中心返回支付id")
private String paymentId;
@ApiModelProperty(value = "钱到了哪个支付平台 平台的订单id为")
private String payStoreId;
@ApiModelProperty(value = "订单过期时间(分钟)")
private Integer payCountdownMinute;
@ApiModelProperty(value = "取消原因")
private String cancelReason;
@ApiModelProperty(value = "取消时间")
private LocalDateTime cancelTime;
@ApiModelProperty(value = "版本号")
private String version;
@ApiModelProperty(value = "ip地址")
private String ipAddress;
@ApiModelProperty(value = "ip地域全名称")
private String area;
@ApiModelProperty(value = "ip地域省")
private String areaProvince;
@ApiModelProperty(value = "ip地域市")
private String areaCity;
@ApiModelProperty(value = "ip地域县")
private String areaCounty;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createdAt;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updatedAt;
@ApiModelProperty(value = "商品信息")
GoblinOrderSkuVo orderSkuVo;
private static final GoblinNftOrderDetailsVo obj = new GoblinNftOrderDetailsVo();
public static GoblinNftOrderDetailsVo getNew() {
try {
return (GoblinNftOrderDetailsVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinNftOrderDetailsVo();
}
}
}
package com.liquidnet.service.goblin.dto.vo;
import com.liquidnet.service.goblin.entity.GoblinNftOrder;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
* NFT订单表
* </p>
*
* @author jiangxiulong
* @since 2022-03-24
*/
@ApiModel(value = "GoblinNftOrderVo", description = "订单详情信息")
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinNftOrderVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "订单id")
private String orderId;
@ApiModelProperty(value = "商品id")
private String spuId;
@ApiModelProperty(value = "款式id")
private String skuId;
@ApiModelProperty(value = "数量")
private Integer num;
@ApiModelProperty(value = "店铺id")
private String storeId;
@ApiModelProperty(value = "商铺名称")
private String storeName;
@ApiModelProperty(value = "订单号")
private String orderCode;
@ApiModelProperty(value = "用户id")
private String userId;
@ApiModelProperty(value = "用户昵称")
private String userName;
@ApiModelProperty(value = "用户手机号")
private String userMobile;
@ApiModelProperty(value = "是否会员")
private Integer isMember;
@ApiModelProperty(value = "应付金额")
private BigDecimal priceTotal;
@ApiModelProperty(value = "券优惠金额")
private BigDecimal priceCoupon;
@ApiModelProperty(value = "商铺券优惠金额")
private BigDecimal storePriceCoupon;
@ApiModelProperty(value = "红包优惠金额")
private BigDecimal priceRedEnvelope;
@ApiModelProperty(value = "总优惠价格")
private BigDecimal priceVoucher;
@ApiModelProperty(value = "实付金额")
private BigDecimal priceActual;
@ApiModelProperty(value = "券id")
private String ucouponId;
@ApiModelProperty(value = "商铺券id")
private String storeCouponId;
@ApiModelProperty(value = "红包code")
private String redEnvelopeCode;
@ApiModelProperty(value = "订单状态 0-待付款(用户刚下单)|1-已付款|2-已取消(未付款取消订单)|3-已退款(超时支付)")
private Integer status;
@ApiModelProperty(value = "订单来源 app|h5|applet")
private String source;
@ApiModelProperty(value = "订单类型 0-购买订单|1-兑换订单|2-演出赠送订单")
private Integer orderType;
@ApiModelProperty(value = "支付时间")
private LocalDateTime payTime;
@ApiModelProperty(value = "支付单号")
private String payCode;
@ApiModelProperty(value = "支付类型 wepay-微信支付|alipay-阿里支付|douyinpay-抖音支付|unionpay-银联支付")
private String payType;
@ApiModelProperty(value = "支付类型来源[wap|js]")
private String deviceFrom;
@ApiModelProperty(value = "支付中心返回实际支付类型")
private String paymentType;
@ApiModelProperty(value = "支付中心返回支付id")
private String paymentId;
@ApiModelProperty(value = "钱到了哪个支付平台 平台的订单id为")
private String payStoreId;
@ApiModelProperty(value = "订单过期时间(分钟)")
private Integer payCountdownMinute;
@ApiModelProperty(value = "取消原因")
private String cancelReason;
@ApiModelProperty(value = "取消时间")
private LocalDateTime cancelTime;
@ApiModelProperty(value = "版本号")
private String version;
@ApiModelProperty(value = "ip地址")
private String ipAddress;
@ApiModelProperty(value = "ip地域全名称")
private String area;
@ApiModelProperty(value = "ip地域省")
private String areaProvince;
@ApiModelProperty(value = "ip地域市")
private String areaCity;
@ApiModelProperty(value = "ip地域县")
private String areaCounty;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createdAt;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updatedAt;
public GoblinNftOrderVo copy(GoblinNftOrder source) {
if (null == source) return this;
this.setOrderId(source.getOrderId());
this.setStoreId(source.getStoreId());
this.setStoreName(source.getStoreName());
this.setOrderCode(source.getOrderCode());
this.setPayCode(source.getPayCode());
this.setUserId(source.getUserId());
this.setUserName(source.getUserName());
this.setUserMobile(source.getUserMobile());
this.setPriceTotal(source.getPriceTotal());
this.setPriceActual(source.getPriceActual());
this.setPriceCoupon(source.getPriceCoupon());
this.setStorePriceCoupon(source.getStorePriceCoupon());
this.setPriceVoucher(source.getPriceVoucher());
this.setStatus(source.getStatus());
this.setUcouponId(source.getUcouponId());
this.setStoreCouponId(source.getStoreCouponId());
this.setPayType(source.getPayType());
this.setDeviceFrom(source.getDeviceFrom());
this.setCancelReason(source.getCancelReason());
this.setSource(source.getSource());
this.setVersion(source.getVersion());
this.setIsMember(source.getIsMember());
this.setOrderType(source.getOrderType());
this.setPayCountdownMinute(source.getPayCountdownMinute());
this.setIpAddress(source.getIpAddress());
this.setPaymentId(source.getPaymentId());
this.setPaymentType(source.getPaymentType());
this.setCreatedAt(source.getCreatedAt());
return this;
}
private static final GoblinNftOrderVo obj = new GoblinNftOrderVo();
public static GoblinNftOrderVo getNew() {
try {
return (GoblinNftOrderVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinNftOrderVo();
}
}
}
......@@ -7,9 +7,9 @@ import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@ApiModel(value = "GoblinNtfPayResultVo", description = "下单唤起支付参数信息")
@ApiModel(value = "GoblinNftPayResultVo", description = "下单唤起支付参数信息")
@Data
public class GoblinNtfPayResultVo implements Serializable, Cloneable {
public class GoblinNftPayResultVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
......@@ -25,9 +25,6 @@ public class GoblinNtfPayResultVo implements Serializable, Cloneable {
@ApiModelProperty(position = 12, value = "orderCode")
private String orderCode;
@ApiModelProperty(position = 13, value = "orderMasterCode")
private String orderMasterCode;
@ApiModelProperty(position = 19, value = "金额")
private BigDecimal price;
......@@ -43,13 +40,13 @@ public class GoblinNtfPayResultVo implements Serializable, Cloneable {
@ApiModelProperty(position = 20, value = "payData")
private Object payData;
private static final GoblinNtfPayResultVo obj = new GoblinNtfPayResultVo();
private static final GoblinNftPayResultVo obj = new GoblinNftPayResultVo();
public static GoblinNtfPayResultVo getNew() {
public static GoblinNftPayResultVo getNew() {
try {
return (GoblinNtfPayResultVo) obj.clone();
return (GoblinNftPayResultVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinNtfPayResultVo();
return new GoblinNftPayResultVo();
}
}
......
......@@ -6,9 +6,9 @@ import lombok.Data;
import javax.validation.constraints.NotNull;
@ApiModel(value = "GoblinNtfOrderPayAgainParam", description = "再次支付所需参数")
@ApiModel(value = "GoblinNftOrderPayAgainParam", description = "再次支付所需参数")
@Data
public class GoblinNtfOrderPayAgainParam {
public class GoblinNftOrderPayAgainParam {
@ApiModelProperty(value = "openId")
private String openId;
......
......@@ -6,9 +6,9 @@ import lombok.Data;
import java.math.BigDecimal;
@ApiModel(value = "GoblinNtfOrderPayCallbackParam", description = "支付成功回调所需参数")
@ApiModel(value = "GoblinNftOrderPayCallbackParam", description = "支付成功回调所需参数")
@Data
public class GoblinNtfOrderPayCallbackParam implements Cloneable {
public class GoblinNftOrderPayCallbackParam implements Cloneable {
@ApiModelProperty(value = "支付状态[1-成功|0-失败]")
private Integer status;
......@@ -16,37 +16,34 @@ public class GoblinNtfOrderPayCallbackParam implements Cloneable {
@ApiModelProperty(value = "订单ID")
private String orderId;
@ApiModelProperty(value = "masterOrderCode")
@ApiModelProperty(value = "订单编号")
private String orderCode;
@ApiModelProperty(value = "不用管")
private String orderCodeId;
@ApiModelProperty(value = "[写死]HUIFU_PAY_CODE")
@ApiModelProperty(value = "支付code")
private String code;
@ApiModelProperty(value = "不用管")
@ApiModelProperty(value = "price")
private BigDecimal price;
@ApiModelProperty(value = "不用管")
@ApiModelProperty(value = "type")
private String type;
@ApiModelProperty(value = "汇付相关id")
private String paymentId;
@ApiModelProperty(value = "[写死]huifu")
@ApiModelProperty(value = "paymentType")
private String paymentType;
@ApiModelProperty(value = "支付时间")
private String paymentAt;
private static final GoblinNtfOrderPayCallbackParam obj = new GoblinNtfOrderPayCallbackParam();
private static final GoblinNftOrderPayCallbackParam obj = new GoblinNftOrderPayCallbackParam();
public static GoblinNtfOrderPayCallbackParam getNew() {
public static GoblinNftOrderPayCallbackParam getNew() {
try {
return (GoblinNtfOrderPayCallbackParam) obj.clone();
return (GoblinNftOrderPayCallbackParam) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinNtfOrderPayCallbackParam();
return new GoblinNftOrderPayCallbackParam();
}
}
}
package com.liquidnet.service.goblin.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* <p>
* NFT下单所需商品相关参数
* </p>
*
* @author jiangxiulong
* @since 2022-03-24
*/
@ApiModel(value = "GoblinNftOrderPayGoodsParam", description = "下单所需商品相关参数")
@Data
public class GoblinNftOrderPayGoodsParam {
@ApiModelProperty(position = 10, required = true, value = "商铺id")
@NotBlank(message = "storeId不能为空")
private String storeId;
@ApiModelProperty(position = 11, required = true, value = "spuId")
@NotBlank(message = "spuId不能为空")
private String spuId;
@ApiModelProperty(position = 12, required = true, value = "skuId")
@NotBlank(message = "skuId不能为空")
private String skuId;
@ApiModelProperty(position = 13, value = "平台券码")
private String platVoucherCode;
@ApiModelProperty(position = 14, value = "商品券码")
private String storeVoucherCode;
}
package com.liquidnet.service.goblin.param;
import com.liquidnet.commons.lang.constant.LnsRegex;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
@ApiModel(value = "GoblinNftOrderPayParam", description = "下单所需参数")
@Data
public class GoblinNftOrderPayParam {
@ApiModelProperty(position = 10, value = "openId微信内网页及小程序支付必传")
private String openId;
@ApiModelProperty(position = 11, required = true, value = "支付方式", allowableValues = "alipay,wepay,douyinpay,unionpay")
@Pattern(regexp = LnsRegex.Valid.TRIPLE_PF_FOR_PAY, message = "支付方式无效")
@NotBlank(message = "支付方式不能为空")
private String payType;
@ApiModelProperty(position = 12, required = true, value = "支付终端", allowableValues = "app,wap,js,applet")
@Pattern(regexp = LnsRegex.Valid.TRIPLE_PF_FOR_PAY_TERMINAL, message = "支付终端类型无效")
@NotBlank(message = "支付终端不能为空")
private String deviceFrom;
@ApiModelProperty(position = 13, value = "showUrl 之前h5需要 app不需要再说")
private String showUrl;
@ApiModelProperty(position = 14, value = "returnUrl 之前h5需要 app不需要再说")
private String returnUrl;
@ApiModelProperty(position = 15, required = true, value = "下单所需商品相关参数")
@Valid
private GoblinNftOrderPayGoodsParam goblinNtfOrderPayGoodsParam;
}
......@@ -16,9 +16,9 @@ import java.math.BigDecimal;
* @since 2021-05-31 11:19 上午
*/
@ApiModel(value = "GoblinNtfOrderRefundCallbackParam", description = "退款回调所需参数")
@ApiModel(value = "GoblinNftOrderRefundCallbackParam", description = "退款回调所需参数")
@Data
public class GoblinNtfOrderRefundCallbackParam implements Serializable {
public class GoblinNftOrderRefundCallbackParam implements Serializable {
@ApiModelProperty(value = "状态 1成功 0失败")
private Integer status;
......
package com.liquidnet.service.goblin.param;
import com.liquidnet.service.goblin.dto.manage.AddressVo;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderStoreParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
@ApiModel(value = "GoblinNtfOrderPayParam", description = "下单所需参数")
@Data
public class GoblinNtfOrderPayParam {
@ApiModelProperty(value = "openId")
private String openId;
@ApiModelProperty(value = "用户id")
private String uid;
@ApiModelProperty(value = "扫码枪code")
private String authCode;
@ApiModelProperty(value = "支付类型")
@NotNull(message = "支付类型不能为空")
private String payType;
@ApiModelProperty(value = "支付来源 [新增micropay-微信扫码支付]")
@NotNull(message = "支付来源不能为空")
private String deviceFrom;
@ApiModelProperty(value = "代理id")
private String agentId;
@ApiModelProperty(value = "收货地址id[虚拟物品不需要]")
private ArrayList<String> addressIds;
@ApiModelProperty(value = "入场人地址vo")
private AddressVo addressesVo;
@ApiModelProperty(value = "showUrl")
private String showUrl;
@ApiModelProperty(value = "returnUrl")
private String returnUrl;
@ApiModelProperty(value = "商品相关参数集合")
private List<GoblinOrderStoreParam> goblinOrderStoreParamList;
}
package com.liquidnet.service.goblin.service;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinNftGoodsInfoListVo;
public interface IGoblinNftGoodsAppService {
ResponseDto<PageInfo<GoblinNftGoodsInfoListVo>> goodsList(int pag);
GoblinNftGoodsInfoListVo goodsDetail(String spuId, String skuId);
Boolean exchange(String code);
}
package com.liquidnet.service.goblin.service;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderDetailsVo;
public interface IGoblinNftOrderAppService {
ResponseDto<PageInfo<GoblinNftOrderDetailsVo>> orderList(int page);
ResponseDto<GoblinNftOrderDetailsVo> orderDetails(String orderId);
}
package com.liquidnet.service.goblin.service;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinNtfPayResultVo;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayAgainParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayCallbackParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderRefundCallbackParam;
import com.liquidnet.service.goblin.dto.vo.GoblinNftPayResultVo;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayAgainParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayCallbackParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderRefundCallbackParam;
/**
* <p>
......@@ -16,13 +16,13 @@ import com.liquidnet.service.goblin.param.GoblinNtfOrderRefundCallbackParam;
* @since 2022-03-23
*/
public interface IGoblinNftOrderService {
ResponseDto<GoblinNtfPayResultVo> checkOrder(GoblinNtfOrderPayParam param, String uid);
ResponseDto<GoblinNftPayResultVo> checkOrder(GoblinNftOrderPayParam payParam);
ResponseDto<GoblinNtfPayResultVo> payAgain(GoblinNtfOrderPayAgainParam param);
ResponseDto<GoblinNftPayResultVo> payAgain(GoblinNftOrderPayAgainParam payParam);
ResponseDto<Integer> checkOrderResult(String orderId);
String syncOrder(GoblinNtfOrderPayCallbackParam syncOrderParam);
String syncOrder(GoblinNftOrderPayCallbackParam syncOrderParam);
String refundSyncOrder(GoblinNtfOrderRefundCallbackParam refundCallbackParam);
String refundSyncOrder(GoblinNftOrderRefundCallbackParam refundCallbackParam);
}
......@@ -27,6 +27,13 @@ public interface IGoblinstoreMgtGoodsService {
*/
void goodsAdd(GoblinGoodsInfoVo goodsInfoVo, List<GoblinGoodsSkuInfoVo> goodsSkuInfoVoList);
/**
* 商品管理:SPU添加-数字藏品
*
* @param goodsInfoVo GoblinGoodsInfoVo
*/
void digitalGoodsAdd(GoblinGoodsInfoVo goodsInfoVo);
/**
* 商品管理:SPU详情
*
......@@ -46,6 +53,16 @@ public interface IGoblinstoreMgtGoodsService {
*/
boolean goodsEditSpu(String uid, GoblinStoreMgtGoodsAddParam mgtGoodsAddParam, GoblinGoodsInfoVo goodsInfoVo);
/**
* 商品管理:商品编辑:SPU编辑
*
* @param uid UID
* @param mgtDigitalGoodsAddParam GoblinStoreMgtDigitalGoodsAddParam
* @param goodsInfoVo GoblinGoodsInfoVo
* @return boolean
*/
boolean digitalGoodsEditSpu(String uid, GoblinStoreMgtDigitalGoodsAddParam mgtDigitalGoodsAddParam, GoblinGoodsInfoVo goodsInfoVo);
/**
* 商品管理:商品编辑:SKU编辑
*
......@@ -60,6 +77,16 @@ public interface IGoblinstoreMgtGoodsService {
boolean goodsEditSku(String uid, GoblinStoreMgtGoodsEditSkuParam mgtGoodsEditSkuParam, GoblinGoodsSkuInfoVo mgtGoodsSkuInfoVo,
GoblinGoodsInfoVo goodsInfoVo, Map<String, String> delSpuSpecMap, Map<String, String> addSpuSpecMap);
/**
* 商品管理:商品编辑:SKU编辑-数字藏品
*
* @param uid UID
* @param mgtDigitalGoodsAddSkuParam GoblinStoreMgtDigitalGoodsAddSkuParam
* @param mgtGoodsInfoVo GoblinGoodsInfoVo
* @return boolean
*/
boolean digitalGoodsEditSku(String uid, GoblinStoreMgtDigitalGoodsAddSkuParam mgtDigitalGoodsAddSkuParam, GoblinGoodsInfoVo mgtGoodsInfoVo);
/**
* 商品管理:商品编辑:SKU添加
*
......@@ -69,6 +96,15 @@ public interface IGoblinstoreMgtGoodsService {
*/
void goodsEditSkuAdd(String uid, GoblinStoreMgtGoodsEditSkuParam mgtGoodsEditSkuParam, GoblinGoodsInfoVo goodsInfoVo);
/**
* 商品管理:商品编辑:SKU添加-数字藏品
*
* @param uid UID
* @param initGoodsSkuInfoVo GoblinGoodsSkuInfoVo
* @param mgtGoodsInfoVo GoblinGoodsInfoVo
*/
void digitalGoodsAddSku(String uid, GoblinGoodsSkuInfoVo initGoodsSkuInfoVo, GoblinGoodsInfoVo mgtGoodsInfoVo);
/**
* 商品管理:商品编辑:SKU删除
*
......
......@@ -24,6 +24,11 @@ public class GoblinDigitalArtwork implements Serializable {
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 藏品ID
*/
private String artworkId;
/**
* 藏品订单号
*/
......@@ -40,40 +45,60 @@ public class GoblinDigitalArtwork implements Serializable {
private String skuId;
/**
* 盲盒开启时间
* 序列号
*/
private LocalDateTime openingAt;
private Integer editionSn;
/**
* 藏品状态[0-生成中/未开启|1-已生成/已开启|2-生成失败/开启失败]
* 藏品ID
*/
private String state;
private String nftId;
/**
* 序列号
* 藏品HASH
*/
private Integer editionSn;
private String nftHash;
/**
* 发行标识
* 发行HASH
*/
private String nftId;
private String releaseTxhash;
/**
* 发行时间
*/
private LocalDateTime releaseAt;
private String releaseAt;
/**
* 交易HASH
*/
private String tradingTxhash;
/**
* 交易时间
*/
private LocalDateTime tradingAt;
private String tradingAt;
/**
* 获得方式[0-购买|1-兑换]
*/
private Integer getway;
/**
* 藏品状态[0-生成中/未开启|1-已生成/已开启|2-生成失败/开启失败]
*/
private Integer state;
/**
* 删除标记[0-未删除|1-删除]
*/
private String delFlg;
/**
* 盲盒开启时间
*/
private LocalDateTime openingAt;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
......
......@@ -148,12 +148,12 @@ public class GoblinGoods implements Serializable {
/**
* 开售时间
*/
private LocalDateTime saleStartAt;
private LocalDateTime saleStartTime;
/**
* 停售时间
*/
private LocalDateTime saleStopAt;
private LocalDateTime saleStopTime;
/**
* 商品有效期[YYYY-MM-DD]
......
......@@ -47,16 +47,6 @@ public class GoblinGoodsSku implements Serializable {
*/
private String subtitle;
/**
* 简介
*/
private String intro;
/**
* 详情
*/
private String details;
/**
* 单品销售价-原价
*/
......@@ -68,19 +58,19 @@ public class GoblinGoodsSku implements Serializable {
private String skuPic;
/**
* ISBN,针对CD/图书等
* 展示文件URL
*/
private String skuIsbn;
private String skuWatch;
/**
* 展示文件URL
* 展示文件类型[1-图片|2-视频|3-模型]
*/
private String skuWatch;
private String watchType;
/**
* 素材原始文件URL
* ISBN,针对CD/图书等
*/
private String materialOriginalUrl;
private String skuIsbn;
/**
* 总库存
......@@ -117,6 +107,16 @@ public class GoblinGoodsSku implements Serializable {
*/
private BigDecimal weight;
/**
* 简介
*/
private String intro;
/**
* 详情
*/
private String details;
/**
* 购买限制[0-全部用户|1-仅会员|2-指定用户]
*/
......@@ -150,12 +150,12 @@ public class GoblinGoodsSku implements Serializable {
/**
* 开售时间
*/
private LocalDateTime saleStartAt;
private LocalDateTime saleStartTime;
/**
* 停售时间
*/
private LocalDateTime saleStopAt;
private LocalDateTime saleStopTime;
/**
* 单品有效期
......@@ -187,15 +187,25 @@ public class GoblinGoodsSku implements Serializable {
*/
private String skuAppear;
/**
* 素材原始文件类型[1-图片|2-视频|3-模型]
*/
private String materialType;
/**
* 素材原始文件URL
*/
private String materialUrl;
/**
* 是否盲盒[0-否|1-是]
*/
private Integer unbox;
private String unbox;
/**
* 盲盒命中率
* 盲盒命中率[0.01~100%]
*/
private String hitRatio;
private BigDecimal hitRatio;
/**
* 盲盒开启时间
......@@ -232,6 +242,21 @@ public class GoblinGoodsSku implements Serializable {
*/
private String seriesId;
/**
* NFT系列HASH
*/
private String seriesHash;
/**
* NFT藏品HASH
*/
private String nftHash;
/**
* NFT系列声明时间
*/
private String declareAt;
/**
* 删除标记[0-未删除|1删除]
*/
......
......@@ -4,33 +4,39 @@ alter table adam_real_name add node tinyint default 2 not null comment '认证
alter table goblin_goods add spu_type tinyint default 0 not null comment '商品类型[0-常规|1-数字藏品]' after spu_no;
alter table goblin_goods add attention varchar(256) null comment '注意事项' after details;
alter table goblin_goods add sale_start_at datetime null comment '开售时间' after shelves_time;
alter table goblin_goods add sale_stop_at datetime null comment '停售时间' after sale_start_at;
alter table goblin_goods add sale_start_time datetime null comment '开售时间' after shelves_time;
alter table goblin_goods add sale_stop_time datetime null comment '停售时间' after sale_start_time;
alter table goblin_goods add author varchar(100) null comment '创作者' after spu_appear;
alter table goblin_goods add publisher varchar(100) null comment '发行方' after author;
# alter table goblin_goods add has_box tinyint default 0 null comment '存在盲盒[0-否|1-是]' after spu_appear;
alter table goblin_goods_sku add sku_type tinyint default 0 not null comment '商品类型[0-常规|1-数字藏品]' after sku_no;
alter table goblin_goods_sku add intro varchar(256) null comment '简介' after subtitle;
alter table goblin_goods_sku add sku_watch varchar(256) null comment '展示文件URL' after sku_pic;
alter table goblin_goods_sku add watch_type char null comment '展示文件类型[1-图片|2-视频|3-模型]' after sku_watch;
alter table goblin_goods_sku add material_type char null comment '素材原始文件类型[1-图片|2-视频|3-模型]' after watch_type;
alter table goblin_goods_sku add material_url varchar(256) null comment '素材原始文件URL' after material_type;
alter table goblin_goods_sku add intro varchar(256) null comment '简介' after weight;
alter table goblin_goods_sku add details text null comment '详情' after intro;
alter table goblin_goods_sku add sku_watch varchar(256) null comment '展示文件URL' after sku_isbn;
alter table goblin_goods_sku add material_original_url varchar(256) null comment '素材原始文件URL' after sku_watch;
alter table goblin_goods_sku add gift_stock int null comment '兑换库存' after sku_stock;
alter table goblin_goods_sku add shelves_handle char default '1' comment '上架处理方式[1-等待手动上架|2-直接上架售卖|3-预约定时上架]' after store_id;
alter table goblin_goods_sku add shelves_time datetime null comment '预约上架时间[上架处理方式为3-预约定时上架时需要指定]' after shelves_handle;
alter table goblin_goods_sku add sale_start_at datetime null comment '开售时间' after shelves_time;
alter table goblin_goods_sku add sale_stop_at datetime null comment '停售时间' after sale_start_at;
alter table goblin_goods_sku add sale_start_time datetime null comment '开售时间' after shelves_time;
alter table goblin_goods_sku add sale_stop_time datetime null comment '停售时间' after sale_start_time;
alter table goblin_goods_sku add unbox tinyint default 0 null comment '是否盲盒[0-否|1-是]' after sku_appear;
alter table goblin_goods_sku add hit_ratio varchar(10) null comment '盲盒命中率' after unbox;
alter table goblin_goods_sku add unbox char default '0' null comment '是否盲盒[0-否|1-是]' after material_url;
alter table goblin_goods_sku add hit_ratio decimal(3, 2) null comment '盲盒命中率[0.01~100%]' after unbox;
alter table goblin_goods_sku add opening_time datetime null comment '盲盒开启时间' after hit_ratio;
alter table goblin_goods_sku add opening_limit int default 0 comment '盲盒开启时限[单位秒]' after opening_time;
alter table goblin_goods_sku add route_type varchar(20) null comment 'NFT路由' after opening_limit;
alter table goblin_goods_sku add upchain tinyint default 0 null comment 'NFT上传声明状态[0-待上传|1-已上传|2-上传失败|9-上传中]' after route_type;
alter table goblin_goods_sku add display_url varchar(256) null comment 'NFT预览图URL' after upchain;
alter table goblin_goods_sku add material_access_url varchar(256) null comment 'NFT素材访问URL' after display_url;
alter table goblin_goods_sku add series_id varchar(256) null comment 'NFT系列ID' after material_access_url;
alter table goblin_goods_sku add display_url varchar(500) null comment 'NFT预览图URL' after upchain;
alter table goblin_goods_sku add nft_url varchar(500) null comment 'NFT素材访问URL' after display_url;
alter table goblin_goods_sku add series_id varchar(256) null comment 'NFT系列ID' after nft_url;
alter table goblin_goods_sku add series_hash varchar(256) null comment 'NFT系列HASH' after series_id;
alter table goblin_goods_sku add nft_hash varchar(25) null comment 'NFT藏品HASH' after series_hash;
alter table goblin_goods_sku add declare_at varchar(25) null comment 'NFT系列声明时间' after nft_hash;
# -- >>------------------------------------------------------------------------------------
drop table if exists goblin_goods_sku_tag;
create table goblin_goods_sku_tag
......@@ -50,19 +56,22 @@ drop table if exists goblin_digital_artwork;
create table goblin_digital_artwork
(
mid bigint auto_increment primary key,
artwork_id varchar(64) not null comment '藏品ID',
order_id varchar(64) not null comment '藏品订单号',
uid varchar(64) not null comment '用户UID',
sku_id varchar(64) not null comment '单品ID',
opening_at datetime null comment '盲盒开启时间',
state char default '0' comment '藏品状态[0-生成中/未开启|1-已生成/已开启|2-生成失败/开启失败]',
edition_sn int null comment '序列号',
nft_id varchar(256) null comment '发行标识',
release_at datetime null comment '发行时间',
trading_at datetime null comment '交易时间',
nft_id varchar(256) null comment '藏品ID',
release_txhash varchar(256) null comment '发行HASH',
release_at varchar(25) null comment '发行时间',
trading_txhash varchar(256) null comment '发放HASH',
trading_at varchar(25) null comment '交易时间',
getway tinyint null comment '获得方式[0-购买|1-兑换]',
state tinyint default 0 comment '藏品状态[0-生成中/未开启|1-已生成/已开启|2-生成失败/开启失败]',
del_flg char default '0' comment '删除标记[0-未删除|1-删除]',
opening_at datetime null comment '盲盒开启时间',
created_at datetime not null,
updated_at datetime null,
deleted_at datetime null,
......@@ -120,13 +129,13 @@ CREATE TABLE goblin_nft_order
ucoupon_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '券id',
store_coupon_id VARCHAR(255) NOT NULL DEFAULT '' COMMENT '商铺券id',
red_envelope_code VARCHAR(64) NOT NULL DEFAULT '' COMMENT '红包code',
status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单状态 0-待付款(用户刚下单)|1-已付款|2-已取消(未付款取消订单)|3-已退款(超时支付)',
source VARCHAR(32) NOT NULL DEFAULT '' COMMENT '订单来源 app|h5|applet',
order_type TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单类型 0-购买订单|1-兑换订单|2-演出赠送订单',
status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单状态 1待付款 2已付款 3未付款取消订单 4退款中 5已退款',
source VARCHAR(32) NOT NULL DEFAULT '' COMMENT '订单来源 app h5 applet',
order_type TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单类型 1购买订单 2兑换订单 3演出赠送订单',
pay_time DATETIME NULL DEFAULT NULL COMMENT '支付时间',
pay_code VARCHAR(64) NOT NULL DEFAULT '' COMMENT '支付单号',
pay_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付类型 wepay-微信支付|alipay-阿里支付|douyinpay-抖音支付|unionpay-银联支付',
device_from VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付类型来源[wap|js]',
pay_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付类型 wepay微信 alipay阿里 douyinpay抖音 unionpay银联',
device_from VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付终端 app wap js applet',
payment_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付中心返回实际支付类型',
payment_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '支付中心返回支付id',
pay_store_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '钱到了哪个支付平台 平台的订单id为''',
......@@ -161,9 +170,9 @@ CREATE TABLE goblin_nft_order_refund
order_code VARCHAR(64) NOT NULL DEFAULT '' COMMENT '订单编号',
store_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '商铺id',
user_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '用户id',
sku_id_nums VARCHAR(255) NOT NULL DEFAULT '' COMMENT '退货的单品ID多个用,分开 退款的时候不需要,因为退款只能整单退1001-1,1002-3 表示单品id为1001 的单品退货1件 单品id为1002的单品退货3件',
sku_id_nums VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'skuId',
real_back_price DECIMAL(8, 2) NOT NULL DEFAULT 0 COMMENT '退货时候实际退款金额',
status INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '退款状态 1申请|2退款成功|3退款失败',
status INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '退款状态 1申请 2退款成功 3退款失败',
refund_at DATETIME NULL DEFAULT NULL COMMENT '退款时间',
error_reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '退款失败原因',
created_at DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
......
package com.liquidnet.service.goblin.controller;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinNftGoodsInfoListVo;
import com.liquidnet.service.goblin.service.IGoblinNftGoodsAppService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Slf4j
@Api(tags = "NFT商品-App")
@RestController
@RequestMapping("/nftGoods")
public class GoblinNftGoodsAppController {
@Autowired
IGoblinNftGoodsAppService goblinNftGoodsAppService;
@GetMapping("list")
@ApiOperation("获得NFT商品列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "page", value = "页码", example = "1"),
})
public ResponseDto<PageInfo<GoblinNftGoodsInfoListVo>> getGoodsList(
@RequestParam(name = "page", defaultValue = "1") Integer page
) {
return goblinNftGoodsAppService.goodsList(page);
}
@GetMapping("detail")
@ApiOperation("获得商品详情")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", required = true, dataType = "String", name = "spuId", value = "spuId", example = "1"),
@ApiImplicitParam(type = "query", required = true, dataType = "String", name = "skuId", value = "skuId", example = "1"),
})
public ResponseDto<GoblinNftGoodsInfoListVo> getGoodsDetail(
@RequestParam("spuId") String spuId,
@RequestParam("skuId") String skuId
) {
GoblinNftGoodsInfoListVo vo = goblinNftGoodsAppService.goodsDetail(spuId, skuId);
if (vo == null) {
return ResponseDto.failure("商品不存在");
}
return ResponseDto.success(vo);
}
@PostMapping("exchange")
@ApiOperation("兑换码兑换")
@ApiImplicitParams({
@ApiImplicitParam(type = "from", required = true, dataType = "String", name = "code", value = "兑换码", example = "1"),
})
public ResponseDto exchange(
@RequestParam("code") String code
) {
Boolean res = goblinNftGoodsAppService.exchange(code);
if (res) {
return ResponseDto.success();
} else {
return ResponseDto.failure();
}
}
}
package com.liquidnet.service.goblin.controller;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderDetailsVo;
import com.liquidnet.service.goblin.service.IGoblinNftOrderAppService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@Slf4j
@Api(tags = "用户NFT订单相关-App")
@RestController
@RequestMapping("/nftOrder")
public class GoblinNftOrderAppController {
@Autowired
IGoblinNftOrderAppService goblinNftOrderAppService;
@PostMapping("list")
@ApiOperation("用户订单列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "Integer", name = "page", value = "页数", example = "1"),
})
public ResponseDto<PageInfo<GoblinNftOrderDetailsVo>> orderList(@RequestParam("page") @Valid int page) {
return goblinNftOrderAppService.orderList(page);
}
@PostMapping("details")
@ApiOperation("订单详情")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "orderId", value = "订单id", example = "1"),
})
public ResponseDto<GoblinNftOrderDetailsVo> orderDetails(@RequestParam("orderId") @Valid String orderId) {
return goblinNftOrderAppService.orderDetails(orderId);
}
}
......@@ -151,6 +151,10 @@ public class GoblinStoreMgtGoodsController {
log.warn("商品管理:SPU管理:上架警告:请先将商品下架后操作[UID={},spuId={}]", currentUid, spuId);
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "无效操作,商品已上架");
}
if (goodsInfoVo.getSpuType().equals(1)) {
log.warn("商品管理:SPU管理:上架警告:数字藏品不支持此操作[UID={},spuId={}]", currentUid, spuId);
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "无效操作,该商品为数字藏品");
}
spuNoList.add(goodsInfoVo.getSpuNo());
}
resultFlg = goblinstoreMgtGoodsService.goodsShelvesProcessing(mgtGoodsActionParam, currentUid, true, spuNoList);
......@@ -189,6 +193,10 @@ public class GoblinStoreMgtGoodsController {
log.warn("商品管理:SPU管理:删除警告:请先将商品下架后操作[UID={},spuId={}]", currentUid, spuId);
return ResponseDto.failure(ErrorMapping.get("149016"));
}
if (goodsInfoVo.getSpuType().equals(1)) {
log.warn("商品管理:SPU管理:上架警告:数字藏品不支持此操作[UID={},spuId={}]", currentUid, spuId);
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "无效操作,该商品为数字藏品");
}
spuNoList.add(goodsInfoVo.getSpuNo());
}
resultFlg = goblinstoreMgtGoodsService.goodsRemove(mgtGoodsActionParam, currentUid, spuNoList);
......@@ -327,6 +335,50 @@ public class GoblinStoreMgtGoodsController {
return ResponseDto.success(goodsInfoVo.getSpuId());
}
@ApiOperationSupport(order = 41)
@ApiOperation(value = "SPU添加-数字藏品")
@PostMapping("digital/add")
public ResponseDto<Object> digitalAdd(@Valid @RequestBody GoblinStoreMgtDigitalGoodsAddParam mgtDigitalGoodsAddParam) {
String currentUid = CurrentUtil.getCurrentUid(), storeId = mgtDigitalGoodsAddParam.getStoreId();
if (!goblinRedisUtils.hasStoreId(currentUid, storeId)) return ResponseDto.failure(ErrorMapping.get("149002"));
String cateSid = mgtDigitalGoodsAddParam.getCateSid(), cateTid = mgtDigitalGoodsAddParam.getCateTid();
List<GoblinSelfGoodsCategoryVo> selfGoodsCategoryVos = goblinStoreMgtExtraService.listCategoryVo();
if (selfGoodsCategoryVos.stream().noneMatch(r -> r.getCateId().equals(mgtDigitalGoodsAddParam.getCateFid()) && r.getGrade().equals("1"))) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "商品一级分类无效");
}
if (StringUtils.isNotBlank(cateSid) && selfGoodsCategoryVos.stream().noneMatch(r -> r.getCateId().equals(cateSid) && r.getGrade().equals("2"))) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "商品二级分类无效");
}
if (StringUtils.isNotBlank(cateTid) && selfGoodsCategoryVos.stream().noneMatch(r -> r.getCateId().equals(cateTid) && r.getGrade().equals("3"))) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "商品三级分类无效");
}
if (goblinMongoUtils.countMgtGoodsInfoVo(mgtDigitalGoodsAddParam.getName()) > 0) return ResponseDto.failure(ErrorMapping.get("149007"));
GoblinGoodsInfoVo initGoodsInfoVo = mgtDigitalGoodsAddParam.initGoodsInfoVo();
{// 标签处理
List<String> goodsTagIdList = mgtDigitalGoodsAddParam.getTagList();
if (!CollectionUtils.isEmpty(goodsTagIdList)) {
List<GoblinSelfTagVo> selfGoodsTagVos = goblinRedisUtils.getSelfTagVos();
List<GoblinGoodsTagVo> goodsTagVoList = ObjectUtil.getGoblinGoodsTagVoArrayList();
for (int i = 0; i < goodsTagIdList.size(); i++)
for (GoblinSelfTagVo r : selfGoodsTagVos)
if (r.getTagId().equals(goodsTagIdList.get(i)) && r.getTagBelong().equals("0")) {
goodsTagVoList.add(GoblinGoodsTagVo.getNew().copy(r).setSort(i));
break;
}
initGoodsInfoVo.setTagVoList(goodsTagVoList);
}
}
if (log.isDebugEnabled()) {
log.debug("商品管理:SPU添加:[GoblinStoreMgtGoodsAddParam={}]", JsonUtils.toJson(mgtDigitalGoodsAddParam));
}
initGoodsInfoVo.setCreatedBy(currentUid);
initGoodsInfoVo.setCreatedAt(LocalDateTime.now());
goblinstoreMgtGoodsService.digitalGoodsAdd(initGoodsInfoVo);
return ResponseDto.success(initGoodsInfoVo.getSpuId());
}
@ApiOperationSupport(order = 5)
@ApiOperation(value = "SPU详情")
@ApiImplicitParams({
......@@ -424,6 +476,43 @@ public class GoblinStoreMgtGoodsController {
return resultFlg ? ResponseDto.success() : ResponseDto.failure();
}
@ApiOperationSupport(order = 61)
@ApiOperation(value = "SPU编辑-数字藏品", notes = "只修改商品信息,不包含价格库存相关信息")
@PutMapping("digital/edit_spu")
public ResponseDto<Object> digitalEditSpu(@Valid @RequestBody GoblinStoreMgtDigitalGoodsAddParam mgtDigitalGoodsEditParam) {
String currentUid = CurrentUtil.getCurrentUid(), storeId = mgtDigitalGoodsEditParam.getStoreId();
if (!goblinRedisUtils.hasStoreId(currentUid, storeId)) return ResponseDto.failure(ErrorMapping.get("149002"));
GoblinGoodsInfoVo mgtGoodsInfoVo;
if (StringUtils.isBlank(mgtDigitalGoodsEditParam.getSpuId())
|| null == (mgtGoodsInfoVo = goblinRedisUtils.getGoodsInfoVo(mgtDigitalGoodsEditParam.getSpuId()))
|| !mgtGoodsInfoVo.getStoreId().equals(storeId)
|| !mgtGoodsInfoVo.getDelFlg().equals("0")) {
return ResponseDto.failure(ErrorMapping.get("149010"));
}
if (!mgtGoodsInfoVo.getName().equals(mgtDigitalGoodsEditParam.getName())
&& goblinMongoUtils.countMgtGoodsInfoVo(mgtDigitalGoodsEditParam.getName()) > 0) {
return ResponseDto.failure(ErrorMapping.get("149007"));
}
String cateSid = mgtDigitalGoodsEditParam.getCateSid(), cateTid = mgtDigitalGoodsEditParam.getCateTid();
List<GoblinSelfGoodsCategoryVo> selfGoodsCategoryVos = goblinStoreMgtExtraService.listCategoryVo();
if (selfGoodsCategoryVos.stream().noneMatch(r -> r.getCateId().equals(mgtDigitalGoodsEditParam.getCateFid()) && r.getGrade().equals("1"))) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "商品一级分类无效");
}
if (StringUtils.isNotBlank(cateSid) && selfGoodsCategoryVos.stream().noneMatch(r -> r.getCateId().equals(cateSid) && r.getGrade().equals("2"))) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "商品二级分类无效");
}
if (StringUtils.isNotBlank(cateTid) && selfGoodsCategoryVos.stream().noneMatch(r -> r.getCateId().equals(cateTid) && r.getGrade().equals("3"))) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "商品三级分类无效");
}
if (log.isDebugEnabled()) {
log.debug("商品管理:商品编辑:SPU编辑:[GoblinStoreMgtGoodsAddParam={}]", JsonUtils.toJson(mgtDigitalGoodsEditParam));
}
boolean resultFlg = goblinstoreMgtGoodsService.digitalGoodsEditSpu(currentUid, mgtDigitalGoodsEditParam, mgtGoodsInfoVo);
return resultFlg ? ResponseDto.success() : ResponseDto.failure();
}
@ApiOperationSupport(order = 7)
@ApiOperation(value = "商品编辑:SKU编辑", notes = "只修改单品信息,不包含商品信息")
@PostMapping("edit_sku")
......@@ -618,6 +707,64 @@ public class GoblinStoreMgtGoodsController {
}
}
@ApiOperationSupport(order = 71)
@ApiOperation(value = "商品编辑:SKU编辑-数字藏品", notes = "只修改单品信息,不包含商品信息")
@PutMapping("digital/edit_sku")
public ResponseDto<Object> digitalEditSku(@Valid @RequestBody GoblinStoreMgtDigitalGoodsAddSkuParam mgtDigitalGoodsEditSkuParam) {
String currentUid = CurrentUtil.getCurrentUid(), storeId = mgtDigitalGoodsEditSkuParam.getStoreId();
if (!goblinRedisUtils.hasStoreId(currentUid, storeId)) return ResponseDto.failure(ErrorMapping.get("149002"));
String paramSkuId = mgtDigitalGoodsEditSkuParam.getSkuId();
GoblinGoodsSkuInfoVo mgtGoodsSkuInfoVo;
if (StringUtils.isBlank(paramSkuId) || null == (mgtGoodsSkuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(paramSkuId))
|| !mgtGoodsSkuInfoVo.getStoreId().equals(storeId) || !mgtGoodsSkuInfoVo.getDelFlg().equals("0")) {
return ResponseDto.failure(ErrorMapping.get("149011"));
}
GoblinGoodsInfoVo mgtGoodsInfoVo = goblinRedisUtils.getGoodsInfoVo(mgtGoodsSkuInfoVo.getSpuId());
if (null == mgtGoodsInfoVo || !mgtGoodsInfoVo.getDelFlg().equals("0")) {
return ResponseDto.failure(ErrorMapping.get("149010"));
}
if ("3".equals(mgtDigitalGoodsEditSkuParam.getShelvesHandle()) && StringUtils.isEmpty(mgtDigitalGoodsEditSkuParam.getShelvesTime())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "请指定预约上架时间");
}
mgtDigitalGoodsEditSkuParam.setUnbox(mgtGoodsSkuInfoVo.getUnbox());
switch (mgtGoodsSkuInfoVo.getUnbox()) {
case "0":// 非盲盒
if (null == mgtDigitalGoodsEditSkuParam.getBuyLimit()) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "限购数量不能为空");
}
String buyFactor = mgtDigitalGoodsEditSkuParam.getBuyFactor();
if (StringUtils.isEmpty(buyFactor)) return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "请指定藏品购买条件");
if (buyFactor.equals("2")) {// 购买条件:指定用户时
if (StringUtils.isEmpty(mgtDigitalGoodsEditSkuParam.getBuyRosterType())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "请指定购买限制人员名单操作类型");
}
String buyRoster = mgtDigitalGoodsEditSkuParam.getBuyRoster();
if (StringUtils.isBlank(buyRoster) || StringUtils.equals(mgtGoodsSkuInfoVo.getBuyRoster(), buyRoster) || !buyRoster.startsWith("http")) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "购买限制人员名单URL无效");
}
} else {
mgtDigitalGoodsEditSkuParam.setBuyRoster(null);
mgtDigitalGoodsEditSkuParam.setBuyRosterType(null);
}
break;
case "1":// 盲盒
if (StringUtils.isEmpty(mgtDigitalGoodsEditSkuParam.getOpeningTime())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "盲盒开启时间不能为空");
}
break;
}
if (log.isDebugEnabled()) {
log.debug("商品管理:商品编辑:SKU编辑-数字藏品:[GoblinStoreMgtGoodsEditSkuParam={}]", JsonUtils.toJson(mgtDigitalGoodsEditSkuParam));
}
if (goblinstoreMgtGoodsService.digitalGoodsEditSku(currentUid, mgtDigitalGoodsEditSkuParam, mgtGoodsInfoVo)) {
mgtGoodsSkuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(paramSkuId);
mgtGoodsSkuInfoVo.setSurplusStock(goblinRedisUtils.getSkuStock(null, paramSkuId));
return ResponseDto.success(mgtGoodsSkuInfoVo);
}
return ResponseDto.failure(ErrorMapping.get("149013"));
}
@ApiOperationSupport(order = 8)
@ApiOperation(value = "商品编辑:SKU添加")
@PutMapping("edit_sku/add")
......@@ -726,6 +873,71 @@ public class GoblinStoreMgtGoodsController {
return ResponseDto.success();
}
@ApiOperationSupport(order = 81)
@ApiOperation(value = "商品编辑:SKU添加-数字藏品")
@PostMapping("digital/add_sku")
public ResponseDto<Object> digitalSkuAdd(@Valid @RequestBody GoblinStoreMgtDigitalGoodsAddSkuParam mgtDigitalGoodsAddSkuParam) {
String currentUid = CurrentUtil.getCurrentUid(), storeId = mgtDigitalGoodsAddSkuParam.getStoreId();
if (!goblinRedisUtils.hasStoreId(currentUid, storeId)) return ResponseDto.failure(ErrorMapping.get("149002"));
GoblinGoodsInfoVo goodsInfoVo = goblinRedisUtils.getGoodsInfoVo(mgtDigitalGoodsAddSkuParam.getSpuId());
if (null == goodsInfoVo || !goodsInfoVo.getDelFlg().equals("0") || !goodsInfoVo.getStoreId().equals(storeId)) {
return ResponseDto.failure(ErrorMapping.get("149010"));
}
String unbox = mgtDigitalGoodsAddSkuParam.getUnbox();
boolean notUnboxFlg = StringUtils.isEmpty(unbox) || unbox.equals("0");
if (notUnboxFlg) {// 非盲盒校验
if (StringUtils.isBlank(mgtDigitalGoodsAddSkuParam.getSubtitle())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "款式名称不能为空");
}
if (StringUtils.isEmpty(mgtDigitalGoodsAddSkuParam.getMaterialType()) || StringUtils.isBlank(mgtDigitalGoodsAddSkuParam.getMaterialUrl())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "我的藏品展示类型或文件不能为空");
}
if (null == mgtDigitalGoodsAddSkuParam.getBuyLimit()) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "限购数量不能为空");
}
String buyFactor = mgtDigitalGoodsAddSkuParam.getBuyFactor();
if (StringUtils.isEmpty(buyFactor)) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "请指定藏品购买条件");
}
if (buyFactor.equals("2")) {// 购买条件:指定用户时
if (StringUtils.isEmpty(mgtDigitalGoodsAddSkuParam.getBuyRosterType())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "请指定购买限制人员名单操作类型");
}
if (StringUtils.isBlank(mgtDigitalGoodsAddSkuParam.getBuyRoster()) || !mgtDigitalGoodsAddSkuParam.getBuyRoster().startsWith("http")) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "购买限制人员名单URL无效");
}
}
} else {// 盲盒校验
if (StringUtils.isEmpty(mgtDigitalGoodsAddSkuParam.getOpeningTime())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "盲盒开启时间不能为空");
}
}
if ("3".equals(mgtDigitalGoodsAddSkuParam.getShelvesHandle()) && StringUtils.isEmpty(mgtDigitalGoodsAddSkuParam.getShelvesTime())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "请指定预约上架时间");
}
if (log.isDebugEnabled()) {
log.debug("商品管理:商品编辑:SKU添加:[GoblinStoreMgtGoodsEditSkuParam={}]", JsonUtils.toJson(mgtDigitalGoodsAddSkuParam));
}
GoblinGoodsSkuInfoVo goodsSkuInfoVo = mgtDigitalGoodsAddSkuParam.initAddGoodsSkuInfoVo(notUnboxFlg);
{// 标签处理
List<String> paramExtagList = mgtDigitalGoodsAddSkuParam.getExtagList();
if (!CollectionUtils.isEmpty(paramExtagList)) {
List<GoblinSelfTagVo> selfExtagVos = goblinRedisUtils.getSelfExtagVos();
List<GoblinGoodsExtagVo> goodsExtagVoList = ObjectUtil.getGoblinGoodsExtagVoArrayList();
for (int i = 0; i < paramExtagList.size(); i++)
for (GoblinSelfTagVo r : selfExtagVos)
if (r.getTagId().equals(paramExtagList.get(i)) && r.getTagBelong().equals("1") && !r.getTagType().equals("5")) {
goodsExtagVoList.add(GoblinGoodsExtagVo.getNew().copy(r).setSort(i));
break;
}
goodsSkuInfoVo.setExtagVoList(goodsExtagVoList);
}
}
goblinstoreMgtGoodsService.digitalGoodsAddSku(currentUid, goodsSkuInfoVo, goodsInfoVo);
return ResponseDto.success();
}
@ApiOperationSupport(order = 9)
@ApiOperation(value = "商品编辑:SKU删除")
@ApiImplicitParams({
......@@ -754,24 +966,4 @@ public class GoblinStoreMgtGoodsController {
boolean delResultFlg = goblinstoreMgtGoodsService.goodsEditSkuDel(currentUid, mgtGoodsSkuInfoVo, mgtGoodsInfoVo);
return delResultFlg ? ResponseDto.success() : ResponseDto.failure(ErrorMapping.get("149003"));
}
// @ApiOperationSupport(order = 10)
// @ApiOperation(value = "商品编辑:SKU批改")
// @ApiImplicitParams({
// @ApiImplicitParam(type = "form", required = true, dataType = "String", name = "storeId", value = "店铺ID"),
// @ApiImplicitParam(type = "form", required = true, dataType = "String", name = "spuId", value = "商品ID"),
// @ApiImplicitParam(type = "form", required = true, dataType = "String", name = "batField", value = "批量修改属性"),
// @ApiImplicitParam(type = "form", required = true, dataType = "String", name = "batFieldVal", value = "批量修改属性值"),
// })
// @PostMapping("edit_sku/bat")
// public ResponseDto<Object> editSkuBat(@NotBlank(message = "店铺ID不能为空") String storeId,
// @NotBlank(message = "商品ID不能为空") String spuId,
// @NotBlank(message = "批量修改属性不能为空") String batField,
// @NotBlank(message = "批量修改属性值不能为空") String batFieldVal) {
// if (!goblinRedisUtils.hasStoreId(CurrentUtil.getCurrentUid(), storeId)) {
// return ResponseDto.failure(ErrorMapping.get("149002"));
// }
// goblinstoreMgtGoodsService.goodsEditSkuBat(spuId, batField, batFieldVal)
// return ResponseDto.success();
// }
}
package com.liquidnet.service.goblin.service.impl;
import com.github.pagehelper.PageInfo;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftGoodsInfoListVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftGoodsSkuInfoVo;
import com.liquidnet.service.goblin.service.GoblinCouponService;
import com.liquidnet.service.goblin.service.IGoblinNftGoodsAppService;
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.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class GoblinNftGoodsAppServiceImpl implements IGoblinNftGoodsAppService {
@Autowired
private GoblinRedisUtils goblinRedisUtils;
@Autowired
MongoTemplate mongoTemplate;
@Autowired
QueueUtils queueUtils;
@Autowired
GoblinMongoUtils mongoUtils;
@Autowired
GoblinCouponService goblinCouponService;
@Override
public ResponseDto<PageInfo<GoblinNftGoodsInfoListVo>> goodsList(int page) {
int size = 20;
//条件
Query query = Query.query(
Criteria.where("spuType").is(1).and("delFlg").is(0).and("status").is(3).and("shelvesStatus").is(3).and("")
);
long count = mongoTemplate.count(query, GoblinGoodsInfoVo.class, GoblinGoodsInfoVo.class.getSimpleName());
List<GoblinNftGoodsInfoListVo> spuList = goblinRedisUtils.getGoblinNftGoodsInfoListVo();
if (null == spuList || page > 1) {
spuList = new ArrayList<>();
// 排序 分页
Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "createdAt"));
query.with(pageable);
List <GoblinGoodsInfoVo> goodsInfoVoList = mongoTemplate.find(query, GoblinGoodsInfoVo.class, GoblinGoodsInfoVo.class.getSimpleName());
for (GoblinGoodsInfoVo info : goodsInfoVoList) {
List<String> skuIdList = info.getSkuIdList();
List<GoblinNftGoodsSkuInfoVo> spuSkuVoList = new ArrayList<>();
for (String skuId : skuIdList) {
GoblinGoodsSkuInfoVo skuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
GoblinNftGoodsSkuInfoVo nftGoodsSkuInfoVo = GoblinNftGoodsSkuInfoVo.getNew();
BeanUtils.copyProperties(skuInfoVo, nftGoodsSkuInfoVo);
spuSkuVoList.add(nftGoodsSkuInfoVo);
}
GoblinNftGoodsInfoListVo nftGoodsInfoListVo = GoblinNftGoodsInfoListVo.getNew();
BeanUtils.copyProperties(info, nftGoodsInfoListVo);
nftGoodsInfoListVo.setNftGoodsSkuInfoVoList(spuSkuVoList);
spuList.add(nftGoodsInfoListVo);
}
if (page <= 1) {
goblinRedisUtils.setGoblinNftGoodsInfoListVo(spuList);
}
}
PageInfo<GoblinNftGoodsInfoListVo> pageInfo = new PageInfo(spuList);
pageInfo.setTotal(count);
return ResponseDto.success(pageInfo);
}
@Override
public GoblinNftGoodsInfoListVo goodsDetail(String spuId, String skuId) {
GoblinGoodsInfoVo goodsInfoVo = goblinRedisUtils.getGoodsInfoVo(spuId);
if (null != goodsInfoVo) {
Integer buyCount = 0;
String userId = CurrentUtil.getCurrentUid();
if (StringUtils.isNotBlank(userId)) {
buyCount = goblinRedisUtils.getSkuCountByUid(userId, skuId);
}
GoblinGoodsSkuInfoVo goodsSkuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
if (null != goodsSkuInfoVo && goodsSkuInfoVo.getDelFlg().equals("0") && goodsSkuInfoVo.getShelvesStatus().equals("3")) {
//获取 sku 库存数量
int stock = goblinRedisUtils.getSkuStock(null, skuId);
log.info("skuId:{}, 库存数量:{}", skuId, stock);
if (0 != goodsSkuInfoVo.getBuyLimit()) {
buyCount = 0;
// TODO: jxl 2022/3/25 新vo处理
// goodsSkuInfoVo.setCanBuy(goodsSkuInfoVo.getBuyLimit() - buyCount);
} else {
// goodsSkuInfoVo.setCanBuy(-9999);
}
if (stock <= 0) {
// goodsSkuInfoVo.setStockLess(true);
} else {
// goodsSkuInfoVo.setStockLess(false);
}
List<GoblinGoodsSkuInfoVo> spuSkuVoList = new ArrayList<>();
spuSkuVoList.add(goodsSkuInfoVo);
goodsInfoVo.setGoblinOrderSkuVos(spuSkuVoList);
} else {
return null;
}
} else {
return null;
}
// return goodsInfoVo;
return GoblinNftGoodsInfoListVo.getNew();
}
@Override
public Boolean exchange(String code) {
// 验证
// 使用
// 下单
return true;
}
}
package com.liquidnet.service.goblin.service.impl;
import com.github.pagehelper.PageInfo;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderDetailsVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinOrderSkuVo;
import com.liquidnet.service.goblin.service.IGoblinNftOrderAppService;
import com.liquidnet.service.goblin.util.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Slf4j
public class GoblinNftOrderAppServiceImpl implements IGoblinNftOrderAppService {
@Autowired
GoblinRedisUtils redisUtils;
@Autowired
GoblinMongoUtils mongoUtils;
@Autowired
QueueUtils queueUtils;
@Autowired
GoblinOrderUtils orderUtils;
@Override
public ResponseDto<PageInfo<GoblinNftOrderDetailsVo>> orderList(int page) {
String uid = CurrentUtil.getCurrentUid();
List<GoblinNftOrderDetailsVo> orderVoList = ObjectUtil.goblinNftOrderDetailsVoArrayList();
List<String> orderIds;
orderIds = redisUtils.getNftOrderList(uid);
int size = 40;
int finalCount = orderIds.size() - page * size;
int initCount = orderIds.size() - (page - 1) * size - 1;
if (finalCount <= 0) {
finalCount = 0;
}
for (int i = initCount; i >= finalCount; i--) {
String orderId = orderIds.get(i);
GoblinNftOrderVo orderVo = redisUtils.getGoblinNftOrder(orderId);
GoblinNftOrderDetailsVo vo = GoblinNftOrderDetailsVo.getNew();
BeanUtils.copyProperties(orderVo, vo);
GoblinOrderSkuVo orderSkuVo = redisUtils.getGoblinOrderSkuVo(orderVo.getSkuId());
vo.setOrderSkuVo(orderSkuVo);
orderVoList.add(vo);
}
PageInfo<GoblinNftOrderDetailsVo> pageInfo = new PageInfo(orderVoList);
pageInfo.setTotal(orderIds.size());
return ResponseDto.success(pageInfo);
}
@Override
public ResponseDto<GoblinNftOrderDetailsVo> orderDetails(String orderId) {
GoblinNftOrderVo orderVo = redisUtils.getGoblinNftOrder(orderId);
String uid = CurrentUtil.getCurrentUid();
if (orderVo == null || !orderVo.getUserId().equals(uid)) {
return ResponseDto.failure(ErrorMapping.get("20003"));
}
GoblinNftOrderDetailsVo vo = GoblinNftOrderDetailsVo.getNew();
BeanUtils.copyProperties(orderVo, vo);
GoblinOrderSkuVo orderSkuVo = redisUtils.getGoblinOrderSkuVo(orderVo.getSkuId());
vo.setOrderSkuVo(orderSkuVo);
return ResponseDto.success(vo);
}
}
......@@ -7,10 +7,7 @@ import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.GoblinGoodsSpecDto;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsActionParam;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsAddParam;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsEditSkuParam;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsFilterParam;
import com.liquidnet.service.goblin.dto.manage.*;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinMgtCategorySpecVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtGoodsInfoVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtGoodsListVo;
......@@ -222,6 +219,29 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
);
}
@Override
public void digitalGoodsAdd(GoblinGoodsInfoVo goodsInfoVo) {
goblinMongoUtils.setGoodsInfoVo(goodsInfoVo);
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
toMqSqls.add(SqlMapping.get("goblin_goods.insert_for_digital"));
LinkedList<Object[]> initGoodsObjs = CollectionUtil.linkedListObjectArr();
String spuId = goodsInfoVo.getSpuId();
initGoodsObjs.add(new Object[]{
spuId, goodsInfoVo.getSpuNo(), goodsInfoVo.getSpuType(), goodsInfoVo.getName(), goodsInfoVo.getIntro(),
goodsInfoVo.getAttention(), goodsInfoVo.getStoreId(), goodsInfoVo.getCateFid(), goodsInfoVo.getCateSid(), goodsInfoVo.getCateTid(),
goodsInfoVo.getVirtualFlg(), goodsInfoVo.getStatus(), goodsInfoVo.getShelvesStatus(), goodsInfoVo.getSpuAppear(), goodsInfoVo.getCreatedBy(),
goodsInfoVo.getCreatedAt()
});
toMqSqls.add(SqlMapping.get("goblin_goods_tag.insert_byreplace"));
LinkedList<Object[]> initGoodsTagObjs = CollectionUtil.linkedListObjectArr();
if (!CollectionUtils.isEmpty(goodsInfoVo.getTagVoList())) {
goodsInfoVo.getTagVoList().forEach(tagVo -> initGoodsTagObjs.add(new Object[]{spuId, tagVo.getTagId(), tagVo.getSort(), "0"}));
}
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(), SqlMapping.gets(toMqSqls, initGoodsObjs));
}
@Override
public GoblinStoreMgtGoodsInfoVo goodsInfo(String storeId, String spuId) {
GoblinStoreMgtGoodsInfoVo vo = GoblinStoreMgtGoodsInfoVo.getNew();
......@@ -530,6 +550,79 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
return false;
}
@Override
public boolean digitalGoodsEditSpu(String uid, GoblinStoreMgtDigitalGoodsAddParam mgtDigitalGoodsAddParam, GoblinGoodsInfoVo mgtGoodsInfoVo) {
String spuId = mgtDigitalGoodsAddParam.getSpuId();
GoblinGoodsInfoVo updateSpuInfoVo = mgtDigitalGoodsAddParam.initEditGoodsInfoVo();
List<GoblinGoodsTagVo> befTagVoList = mgtGoodsInfoVo.getTagVoList();
boolean updateTagFlg = false, befTagIsEmptyFlg = CollectionUtils.isEmpty(befTagVoList), paramTagIsEmptyFlg;
{// 标签处理
List<GoblinGoodsTagVo> paramTagVoList = ObjectUtil.getGoblinGoodsTagVoArrayList();
List<String> goodsTagIdList = mgtDigitalGoodsAddParam.getTagList();
if (!CollectionUtils.isEmpty(goodsTagIdList)) {
List<GoblinSelfTagVo> selfGoodsTagVos = goblinRedisUtils.getSelfTagVos();
for (int i = 0; i < goodsTagIdList.size(); i++)
for (GoblinSelfTagVo r : selfGoodsTagVos)
if (r.getTagId().equals(goodsTagIdList.get(i)) && r.getTagBelong().equals("0")) {
paramTagVoList.add(GoblinGoodsTagVo.getNew().copy(r).setSort(i));
break;
}
}
paramTagIsEmptyFlg = CollectionUtils.isEmpty(paramTagVoList);
if (!befTagIsEmptyFlg || !paramTagIsEmptyFlg) {
if (!befTagIsEmptyFlg && !paramTagIsEmptyFlg) {
if (paramTagVoList.size() != befTagVoList.size()) {
updateTagFlg = true;
} else {
List<String> befTagIdList = befTagVoList.stream().map(GoblinGoodsTagVo::getTagId).collect(Collectors.toList());
for (GoblinGoodsTagVo vo : paramTagVoList)
if (!befTagIdList.contains(vo.getTagId())) {
updateTagFlg = true;
break;
}
}
} else {
updateTagFlg = true;
}
}
if (updateTagFlg) {
updateSpuInfoVo.setTagVoList(paramTagIsEmptyFlg ? ObjectUtil.getGoblinGoodsTagVoArrayList() : paramTagVoList);
}
}
updateSpuInfoVo.setUpdatedBy(uid);
updateSpuInfoVo.setUpdatedAt(LocalDateTime.now());
if (goblinMongoUtils.updateGoodsInfoVo(updateSpuInfoVo)) {
log.info("商品管理:SPU编辑-数字藏品[UID={},PARAMS={}]", uid, JsonUtils.toJson(mgtDigitalGoodsAddParam));
goblinRedisUtils.delGoodsInfoVo(spuId);
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
toMqSqls.add(SqlMapping.get("goblin_goods.update_by_edit_for_digital"));
LinkedList<Object[]> updateGoodsInfoObjs = CollectionUtil.linkedListObjectArr();
updateGoodsInfoObjs.add(new Object[]{
updateSpuInfoVo.getName(), updateSpuInfoVo.getIntro(), updateSpuInfoVo.getCateFid(), updateSpuInfoVo.getCateSid(),
updateSpuInfoVo.getCateTid(), updateSpuInfoVo.getUpdatedBy(), updateSpuInfoVo.getUpdatedAt(), updateSpuInfoVo.getSpuId()
});
toMqSqls.add(SqlMapping.get("goblin_goods_tag.delete"));
LinkedList<Object[]> deleteGoodsTagObjs = CollectionUtil.linkedListObjectArr();
toMqSqls.add(SqlMapping.get("goblin_goods_tag.insert_byreplace"));
LinkedList<Object[]> initGoodsTagObjs = CollectionUtil.linkedListObjectArr();
if (updateTagFlg) {
if (!befTagIsEmptyFlg) {
deleteGoodsTagObjs.add(new Object[]{spuId, '0'});
}
if (!paramTagIsEmptyFlg) {
updateSpuInfoVo.getTagVoList().forEach(vo -> initGoodsTagObjs.add(new Object[]{spuId, vo.getTagId(), vo.getSort(), "0"}));
}
}
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.gets(toMqSqls, updateGoodsInfoObjs, deleteGoodsTagObjs, initGoodsTagObjs));
return true;
}
return false;
}
@Override
public boolean goodsEditSku(String uid, GoblinStoreMgtGoodsEditSkuParam mgtGoodsEditSkuParam, GoblinGoodsSkuInfoVo mgtGoodsSkuInfoVo,
GoblinGoodsInfoVo goodsInfoVo, Map<String, String> delSpuSpecMap, Map<String, String> addSpuSpecMap) {
......@@ -653,6 +746,120 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
return false;
}
@Override
public boolean digitalGoodsEditSku(String uid, GoblinStoreMgtDigitalGoodsAddSkuParam mgtDigitalGoodsAddSkuParam, GoblinGoodsInfoVo mgtGoodsInfoVo) {
GoblinGoodsSkuInfoVo updateSkuInfoVo = mgtDigitalGoodsAddSkuParam.initEditGoodsSkuInfoVo();
String skuId = updateSkuInfoVo.getSkuId();
LocalDateTime now = LocalDateTime.now();
updateSkuInfoVo.setUpdatedBy(uid);
updateSkuInfoVo.setUpdatedAt(now);
LinkedList<Object[]> deleteGoodsSkuTagObjs = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> initGoodsSkuTagObjs = CollectionUtil.linkedListObjectArr();
{// 标签处理
List<GoblinGoodsExtagVo> befExtagVoList = mgtGoodsInfoVo.getExtagVoList();
List<GoblinGoodsExtagVo> paramExtagVoList = ObjectUtil.getGoblinGoodsExtagVoArrayList();
List<String> paramExtagIdList = mgtDigitalGoodsAddSkuParam.getExtagList();
if (!CollectionUtils.isEmpty(paramExtagIdList)) {
List<GoblinSelfTagVo> selfExtagVos = goblinRedisUtils.getSelfExtagVos();
for (int i = 0; i < paramExtagIdList.size(); i++)
for (GoblinSelfTagVo r : selfExtagVos)
if (r.getTagId().equals(paramExtagIdList.get(i)) && r.getTagBelong().equals("1") && !r.getTagType().equals("5")) {
paramExtagVoList.add(GoblinGoodsExtagVo.getNew().copy(r).setSort(i));
break;
}
}
boolean paramExtagIsEmptyFlg = CollectionUtils.isEmpty(paramExtagVoList), befExtagIsEmptyFlg = CollectionUtils.isEmpty(befExtagVoList);
if (!befExtagIsEmptyFlg || !paramExtagIsEmptyFlg) {
boolean updateExtagFlg = false;
if (!befExtagIsEmptyFlg && !paramExtagIsEmptyFlg) {
if (paramExtagVoList.size() != befExtagVoList.size()) {
updateExtagFlg = true;
} else {
List<String> befExtagIdList = befExtagVoList.stream().map(GoblinGoodsExtagVo::getTagId).collect(Collectors.toList());
for (GoblinGoodsExtagVo vo : paramExtagVoList)
if (!befExtagIdList.contains(vo.getTagId())) {
updateExtagFlg = true;
break;
}
}
} else {
updateExtagFlg = true;
}
if (updateExtagFlg) {
updateSkuInfoVo.setExtagVoList(paramExtagIsEmptyFlg ? ObjectUtil.getGoblinGoodsExtagVoArrayList() : paramExtagVoList);
if (!befExtagIsEmptyFlg) {
deleteGoodsSkuTagObjs.add(new Object[]{skuId, '1'});
}
if (!paramExtagIsEmptyFlg) {
updateSkuInfoVo.getExtagVoList().forEach(vo -> initGoodsSkuTagObjs.add(new Object[]{skuId, vo.getTagId(), vo.getSort(), "1"}));
}
}
}
}
if (goblinMongoUtils.updateGoodsSkuInfoVo(updateSkuInfoVo)) {
log.info("商品管理:SKU编辑[UID={},PARAMS={}]", uid, JsonUtils.toJson(mgtDigitalGoodsAddSkuParam));
goblinRedisUtils.delGoodsSkuInfoVo(skuId);
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> updateGoodsSkuObjs = CollectionUtil.linkedListObjectArr();
if ("1".equals(updateSkuInfoVo.getUnbox())) {
BigDecimal priceGe = BigDecimal.ZERO, priceLe = BigDecimal.ZERO;
for (String skuIdStr : mgtGoodsInfoVo.getSkuIdList()) {
GoblinGoodsSkuInfoVo skuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(skuIdStr);
if (null != skuInfoVo && skuInfoVo.getDelFlg().equals("0")) {
priceGe = priceGe.compareTo(BigDecimal.ZERO) == 0 ? skuInfoVo.getPrice() : (priceGe.compareTo(skuInfoVo.getPrice()) > 0 ? skuInfoVo.getPrice() : priceGe);
priceLe = priceLe.compareTo(skuInfoVo.getPrice()) < 0 ? skuInfoVo.getPrice() : priceLe;
}
}
if (priceGe.compareTo(mgtGoodsInfoVo.getPriceGe()) != 0 || priceLe.compareTo(mgtGoodsInfoVo.getPriceLe()) != 0) {
mgtGoodsInfoVo.setPriceGe(priceGe);
mgtGoodsInfoVo.setPriceLe(priceLe);
mgtGoodsInfoVo.setUpdatedBy(uid);
mgtGoodsInfoVo.setUpdatedAt(now);
goblinMongoUtils.updateGoodsInfoVo(mgtGoodsInfoVo);
goblinRedisUtils.delGoodsInfoVo(mgtGoodsInfoVo.getSpuId());
updateGoodsObjs.add(new Object[]{priceGe, priceLe, uid, now, mgtGoodsInfoVo.getSpuId()});
}
toMqSqls.add(SqlMapping.get("goblin_goods_sku.update_by_edit_box_digital"));
updateGoodsSkuObjs.add(new Object[]{
updateSkuInfoVo.getName(), updateSkuInfoVo.getSubtitle(), updateSkuInfoVo.getSkuPic(), updateSkuInfoVo.getSkuWatch(), updateSkuInfoVo.getWatchType(),
updateSkuInfoVo.getPrice(), updateSkuInfoVo.getPriceMember(), updateSkuInfoVo.getIntro(), updateSkuInfoVo.getDetails(), updateSkuInfoVo.getShelvesHandle(),
updateSkuInfoVo.getShelvesTime(), updateSkuInfoVo.getSaleStartTime(), updateSkuInfoVo.getOpeningTime(), updateSkuInfoVo.getUpdatedBy(), updateSkuInfoVo.getUpdatedAt(),
skuId
});
} else {
String buyRoster = mgtDigitalGoodsAddSkuParam.getBuyRoster();
if (StringUtils.isNotEmpty(buyRoster)) {
queueUtils.sendMsgByRedisXls(buyRoster, mgtDigitalGoodsAddSkuParam.getBuyRosterType(), skuId);
}
toMqSqls.add(SqlMapping.get("goblin_goods_sku.update_by_edit_for_digital"));
updateGoodsSkuObjs.add(new Object[]{
updateSkuInfoVo.getHitRatio(), updateSkuInfoVo.getBuyFactor(), updateSkuInfoVo.getBuyRoster(), updateSkuInfoVo.getBuyLimit(), updateSkuInfoVo.getShelvesHandle(),
updateSkuInfoVo.getShelvesTime(), updateSkuInfoVo.getSaleStartTime(), updateSkuInfoVo.getUpdatedBy(), updateSkuInfoVo.getUpdatedAt(), skuId
});
}
toMqSqls.add(SqlMapping.get("goblin_goods.update_by_edit_sku"));
// LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr();
toMqSqls.add(SqlMapping.get("goblin_goods_sku_tag.delete"));
// LinkedList<Object[]> deleteGoodsSkuTagObjs = CollectionUtil.linkedListObjectArr();
toMqSqls.add(SqlMapping.get("goblin_goods_sku_tag.insert_byreplace"));
// LinkedList<Object[]> initGoodsSkuTagObjs = CollectionUtil.linkedListObjectArr();
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.gets(toMqSqls, updateGoodsSkuObjs, updateGoodsObjs, deleteGoodsSkuTagObjs, initGoodsSkuTagObjs));
return true;
}
return false;
}
@Override
public void goodsEditSkuAdd(String uid, GoblinStoreMgtGoodsEditSkuParam mgtGoodsEditSkuParam, GoblinGoodsInfoVo goodsInfoVo) {
LocalDateTime now = LocalDateTime.now();
......@@ -697,7 +904,6 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
}
goblinMongoUtils.updateGoodsInfoVo(goodsInfoVo);
goblinRedisUtils.delGoodsSkuInfoVo(spuId);
goblinRedisUtils.delGoodsInfoVo(spuId);
goblinRedisUtils.setSkuStock(null, addSkuInfoVo.getSkuId(), addSkuInfoVo.getSkuStock());
......@@ -743,6 +949,62 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
);
}
@Override
public void digitalGoodsAddSku(String uid, GoblinGoodsSkuInfoVo initGoodsSkuInfoVo, GoblinGoodsInfoVo mgtGoodsInfoVo) {
LocalDateTime now = LocalDateTime.now();
initGoodsSkuInfoVo.setRouteType("zxinchain");// TODO: 2022/3/25 ==zhanggb
initGoodsSkuInfoVo.setUpchain(0);
initGoodsSkuInfoVo.setCreatedAt(now);
initGoodsSkuInfoVo.setCreatedBy(uid);
String spuId = initGoodsSkuInfoVo.getSpuId(), skuId = initGoodsSkuInfoVo.getSkuId();
List<String> skuIdList = mgtGoodsInfoVo.getSkuIdList();
if (CollectionUtils.isEmpty(skuIdList)) {
skuIdList = CollectionUtil.linkedListString();
}
skuIdList.add(initGoodsSkuInfoVo.getSkuId());
mgtGoodsInfoVo.setSkuIdList(skuIdList);
BigDecimal priceGe = BigDecimal.ZERO, priceLe = BigDecimal.ZERO;
for (String skuIdStr : skuIdList) {
GoblinGoodsSkuInfoVo skuInfoVo = skuIdStr.equals(skuId) ? initGoodsSkuInfoVo : goblinRedisUtils.getGoodsSkuInfoVo(skuIdStr);
if (null != skuInfoVo && skuInfoVo.getDelFlg().equals("0")) {
priceGe = priceGe.compareTo(BigDecimal.ZERO) == 0 ? skuInfoVo.getPrice() : (priceGe.compareTo(skuInfoVo.getPrice()) > 0 ? skuInfoVo.getPrice() : priceGe);
priceLe = priceLe.compareTo(skuInfoVo.getPrice()) < 0 ? skuInfoVo.getPrice() : priceLe;
}
}
LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr();
if (priceGe.compareTo(mgtGoodsInfoVo.getPriceGe()) != 0 || priceLe.compareTo(mgtGoodsInfoVo.getPriceLe()) != 0) {
mgtGoodsInfoVo.setPriceGe(priceGe);
mgtGoodsInfoVo.setPriceLe(priceLe);
mgtGoodsInfoVo.setUpdatedBy(uid);
mgtGoodsInfoVo.setUpdatedAt(now);
updateGoodsObjs.add(new Object[]{priceGe, priceLe, uid, now, spuId});
goblinMongoUtils.updateGoodsInfoVo(mgtGoodsInfoVo);
goblinRedisUtils.delGoodsInfoVo(spuId);
}
log.info("藏品管理:SKU添加[UID={},PARAMS={}]", uid, JsonUtils.toJson(initGoodsSkuInfoVo));
goblinMongoUtils.setGoodsSkuInfoVo(initGoodsSkuInfoVo);
goblinRedisUtils.setSkuStock(null, initGoodsSkuInfoVo.getSkuId(), initGoodsSkuInfoVo.getSkuStock());
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
toMqSqls.add(SqlMapping.get("goblin_goods_sku.insert_for_digital"));
LinkedList<Object[]> initGoodsSkuObjs = CollectionUtil.linkedListObjectArr();
initGoodsSkuObjs.add(new Object[]{
skuId, spuId, initGoodsSkuInfoVo.getSkuNo(), initGoodsSkuInfoVo.getSkuType(), initGoodsSkuInfoVo.getName(),
initGoodsSkuInfoVo.getSubtitle(), initGoodsSkuInfoVo.getSkuPic(), initGoodsSkuInfoVo.getSkuWatch(), initGoodsSkuInfoVo.getWatchType(), initGoodsSkuInfoVo.getMaterialType(),
initGoodsSkuInfoVo.getMaterialUrl(), initGoodsSkuInfoVo.getStock(), initGoodsSkuInfoVo.getSkuStock(), initGoodsSkuInfoVo.getGiftStock(), initGoodsSkuInfoVo.getHitRatio(),
initGoodsSkuInfoVo.getPrice(), initGoodsSkuInfoVo.getPriceMember(), initGoodsSkuInfoVo.getIntro(), initGoodsSkuInfoVo.getDetails(), initGoodsSkuInfoVo.getBuyFactor(),
initGoodsSkuInfoVo.getBuyRoster(), initGoodsSkuInfoVo.getBuyLimit(), initGoodsSkuInfoVo.getStoreId(), initGoodsSkuInfoVo.getShelvesHandle(), initGoodsSkuInfoVo.getShelvesTime(),
initGoodsSkuInfoVo.getSaleStartTime(), initGoodsSkuInfoVo.getVirtualFlg(), initGoodsSkuInfoVo.getStatus(), initGoodsSkuInfoVo.getShelvesStatus(), initGoodsSkuInfoVo.getSkuAppear(),
initGoodsSkuInfoVo.getUnbox(), initGoodsSkuInfoVo.getOpeningTime(), initGoodsSkuInfoVo.getRouteType(), initGoodsSkuInfoVo.getUpchain(), uid, now
});
toMqSqls.add(SqlMapping.get("goblin_goods.update_by_edit_sku"));// SPU价格区间
// LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr();
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(), SqlMapping.gets(toMqSqls, initGoodsSkuObjs, updateGoodsObjs));
}
@Override
public boolean goodsEditSkuDel(String uid, GoblinGoodsSkuInfoVo delGoodsSkuInfoVo, GoblinGoodsInfoVo mgtGoodsInfoVo) {
String spuId = delGoodsSkuInfoVo.getSpuId();
......
......@@ -893,6 +893,17 @@ public class GoblinRedisUtils {
}
}
// 获取 nft订单相关vo
public GoblinNftOrderVo getGoblinNftOrder(String orderId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_INFO.concat(orderId);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return null;
} else {
return (GoblinNftOrderVo) obj;
}
}
// 获取 订单相关Skuvo
public GoblinOrderSkuVo getGoblinOrderSkuVo(String orderSkuId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_SKU.concat(orderSkuId);
......@@ -957,6 +968,17 @@ public class GoblinRedisUtils {
}
}
// 获取 nft订单id列表
public List<String> getNftOrderList(String uid) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_USER_ID_LIST.concat(uid);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
} else {
return (List<String>) obj;
}
}
// 添加 订单id列表
public void addOrderList(String uid, String orderId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_LIST.concat(uid);
......@@ -1328,5 +1350,19 @@ public class GoblinRedisUtils {
}
}
public List<GoblinNftGoodsInfoListVo> getGoblinNftGoodsInfoListVo() {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_GOODS_LIST;
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return null;
} else {
return (List<GoblinNftGoodsInfoListVo>) obj;
}
}
public void setGoblinNftGoodsInfoListVo(List<GoblinNftGoodsInfoListVo> spuList) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_GOODS_LIST;
redisUtil.set(redisKey, spuList);
}
/* ---------------------------------------- ---------------------------------------- */
}
......@@ -64,6 +64,7 @@ public class ObjectUtil {
private static final ArrayList<GoblinShoppingCartVoDetail> goblinShoppingCartVoDetailArrayList = new ArrayList<>();
private static final ArrayList<GoblinStoreBackOrderListVo> goblinStoreBackOrderListVoArrayList = new ArrayList<>();
private static final ArrayList<GoblinAppOrderListVo> goblinAppOrderListVoArrayList = new ArrayList<>();
private static final ArrayList<GoblinNftOrderDetailsVo> goblinNftOrderDetailsVoArrayList = new ArrayList<>();
private static final ArrayList<GoblinBackOrderSkuVo> goblinBackOrderSkuVoArrayList = new ArrayList<>();
private static final ArrayList<GoblinBackOrderVo> goblinBackOrderVoArrayList = new ArrayList<>();
private static final ArrayList<GoblinFrontNavigationVo> goblinFrontNavigationVoArrayList = new ArrayList<>();
......@@ -138,6 +139,10 @@ public class ObjectUtil {
return (ArrayList<GoblinAppOrderListVo>) goblinAppOrderListVoArrayList.clone();
}
public static ArrayList<GoblinNftOrderDetailsVo> goblinNftOrderDetailsVoArrayList() {
return (ArrayList<GoblinNftOrderDetailsVo>) goblinNftOrderDetailsVoArrayList.clone();
}
public static ArrayList<GoblinStoreBackOrderListVo> goblinStoreBackOrderListVoArrayList() {
return (ArrayList<GoblinStoreBackOrderListVo>) goblinStoreBackOrderListVoArrayList.clone();
}
......
......@@ -35,7 +35,9 @@ goblin_goods_sku_spec_value.update_by_edit=UPDATE goblin_goods_sku_spec_value SE
goblin_goods_sku_spec_value.update_by_del_sku=UPDATE goblin_goods_sku_spec_value SET del_flg='1' WHERE sku_id=? AND del_flg='0'
#---- 商品信息
goblin_goods.insert=INSERT INTO goblin_goods (spu_id,spu_no,name,subtitle,sell_price, price_ge,price_le,intro,details,cover_pic, video,spec_mode,store_id,cate_fid,cate_sid, cate_tid,store_cate_fid,store_cate_sid,store_cate_tid,brand_id, shelves_handle,shelves_time,spu_validity,virtual_flg,status, shelves_status,spu_appear,shelves_at,created_by,created_at, logistics_template)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_goods.insert_for_digital=INSERT INTO goblin_goods (spu_id,spu_no,spu_type,name,intro,attention,store_id,cate_fid,cate_sid,cate_tid,virtual_flg,status,shelves_status,spu_appear,created_by,created_at)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_goods.update_by_edit=UPDATE goblin_goods SET spu_no=?,name=?,subtitle=?,sell_price=?,intro=?,details=?,cover_pic=?,video=?,spec_mode=?,cate_fid=?,cate_sid=?,cate_tid=?,shelves_handle=?,shelves_time=?,spu_validity=?,virtual_flg=?,logistics_template=?,updated_by=?,updated_at=? WHERE spu_id=? AND del_flg='0'
goblin_goods.update_by_edit_for_digital=UPDATE goblin_goods SET name=?,intro=?,cate_fid=?,cate_sid=?,cate_tid=?,updated_by=?,updated_at=? WHERE spu_id=? AND del_flg='0'
goblin_goods.update_by_shelves=UPDATE goblin_goods SET shelves_status=?,shelves_at=?,updated_by=?,updated_at=? WHERE spu_id=? AND store_id=? AND spu_appear='0'
goblin_goods.update_by_unshelves=UPDATE goblin_goods SET shelves_handle=?,shelves_status=?,shelves_at=?,updated_by=?,updated_at=? WHERE spu_id=? AND store_id=? AND spu_appear='0'
goblin_goods.update_by_status=UPDATE goblin_goods SET spu_appear=?,updated_by=?,updated_at=? WHERE store_id=? AND del_flg='0'
......@@ -44,8 +46,11 @@ goblin_goods.update_by_del_sku=UPDATE goblin_goods SET price_ge=?,price_le=?,upd
goblin_goods.update_by_del_store=UPDATE goblin_goods SET del_flg='1',updated_by=?,updated_at=?,deleted_by=?,deleted_at=? WHERE store_id=? AND del_flg='0'
goblin_goods.update_by_del=UPDATE goblin_goods SET del_flg='1',updated_by=?,updated_at=?,deleted_by=?,deleted_at=? WHERE spu_id=? AND del_flg='0'
goblin_goods_sku.insert=INSERT INTO goblin_goods_sku (sku_id,spu_id,sku_no,name,subtitle, sell_price,sku_pic,sku_isbn,stock,sku_stock, warning_stock,price,price_member,weight,buy_factor, buy_roster,buy_limit,store_id,sku_validity,virtual_flg, status,shelves_status,sku_appear,shelves_at,created_by, created_at,logistics_template)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_goods_sku.insert_for_digital=INSERT INTO goblin_goods_sku (sku_id,spu_id,sku_no,sku_type,name,subtitle,sku_pic,sku_watch,watch_type,material_type,material_url,stock,sku_stock,gift_stock,hit_ratio,price,price_member,intro,details,buy_factor,buy_roster,buy_limit,store_id,shelves_handle,shelves_time,sale_start_time,virtual_flg,status,shelves_status,sku_appear,unbox,opening_time,route_type,upchain,created_by,created_at)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_goods_sku.update_by_edit_for_market=UPDATE goblin_goods_sku SET name=?,sku_pic=?,sell_price=?,weight=?,stock=?,warning_stock=?,sku_appear=?,sku_isbn=?,sku_validity=?,updated_by=?,updated_at=? WHERE sku_id=? AND del_flg='0'
goblin_goods_sku.update_by_edit=UPDATE goblin_goods_sku SET name=?,sku_pic=?,sell_price=?,price=?,price_member=?,weight=?,stock=?,sku_stock=?,warning_stock=?,sku_appear=?,sku_isbn=?,buy_factor=?,buy_roster=?,buy_limit=?,sku_validity=?,updated_by=?,updated_at=? WHERE sku_id=? AND del_flg='0'
goblin_goods_sku.update_by_edit_for_digital=UPDATE goblin_goods_sku SET hit_ratio=?,buy_factor=?,buy_roster=?,buy_limit=?,shelves_handle=?,shelves_time=?,sale_start_time=?,updated_by=?,updated_at=? WHERE sku_id=? AND del_flg='0'
goblin_goods_sku.update_by_edit_box_digital=UPDATE goblin_goods_sku SET name=?,subtitle=?,sku_pic=?,sku_watch=?,watch_type=?,price=?,price_member=?,intro=?,details=?,shelves_handle=?,shelves_time=?,sale_start_time=?,opening_time=?,updated_by=?,updated_at=? WHERE sku_id=? AND del_flg='0'
goblin_goods_sku.update_by_edit_spu=UPDATE goblin_goods_sku SET sku_no=?,virtual_flg=?,logistics_template=?,updated_by=?,updated_at=? WHERE spu_id=? AND del_flg='0'
goblin_goods_sku.update_by_shelves=UPDATE goblin_goods_sku SET shelves_status=?,shelves_at=?,updated_by=?,updated_at=? WHERE spu_id=? AND store_id=? AND sku_appear='0'
goblin_goods_sku.update_by_del_store=UPDATE goblin_goods_sku SET del_flg='1',updated_by=?,updated_at=?,deleted_by=?,deleted_at=? WHERE store_id=? AND del_flg='0'
......@@ -55,6 +60,8 @@ goblin_goods_image.insert_byreplace=REPLACE INTO goblin_goods_image (spu_id,url,
goblin_goods_image.delete=UPDATE goblin_goods_image SET del_flg='1' WHERE spu_id=? AND del_flg='0'
goblin_goods_tag.insert_byreplace=REPLACE INTO goblin_goods_tag (spu_id,tag_id,sort,tag_belong,del_flg)VALUES(?,?,?,?,'0')
goblin_goods_tag.delete=UPDATE goblin_goods_tag SET del_flg='1' WHERE spu_id=? AND tag_belong=? AND del_flg='0'
goblin_goods_sku_tag.delete=UPDATE goblin_goods_sku_tag SET del_flg='1' WHERE sku_id=? AND tag_belong=? AND del_flg='0'
goblin_goods_sku_tag.insert_byreplace=REPLACE INTO goblin_goods_sku_tag (sku_id,tag_id,sort,tag_belong,del_flg)VALUES(?,?,?,?,'0')
goblin_goods_artag.insert_byreplace=REPLACE INTO goblin_goods_tag (spu_id,tag_id,sort,tag_belong,del_flg)VALUES(?,?,?,?,'0')
goblin_goods_artag.delete=UPDATE goblin_goods_tag SET del_flg='1' WHERE spu_id=? AND tag_belong=? AND del_flg='0'
goblin_goods_service_support.insert_byreplace=REPLACE INTO goblin_goods_service_support (spu_id,ssid,del_flg)VALUES(?,?,'0')
......
package com.liquidnet.service.order.controller;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.codec.vo.EncryptedReq;
import com.liquidnet.service.goblin.dto.vo.GoblinNtfPayResultVo;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayAgainParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayCallbackParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderRefundCallbackParam;
import com.liquidnet.service.goblin.dto.vo.GoblinNftPayResultVo;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayAgainParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayCallbackParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderRefundCallbackParam;
import com.liquidnet.service.goblin.service.IGoblinNftOrderService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -26,24 +25,21 @@ public class GoblinNftOrderController {
@PostMapping("pre")
@ApiOperation("下单(加密)")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<GoblinNtfPayResultVo> checkOrder(@RequestBody EncryptedReq<GoblinNtfOrderPayParam> param) {
GoblinNtfOrderPayParam payOrderParam = param.getData();
String uid = CurrentUtil.getCurrentUid();
return iGoblinNftOrderService.checkOrder(payOrderParam, uid);
public ResponseDto<GoblinNftPayResultVo> checkOrder(@RequestBody EncryptedReq<GoblinNftOrderPayParam> payParam) {
return iGoblinNftOrderService.checkOrder(payParam.getData());
}
@PostMapping("fc7bce6d6c2213b866f76493f92224b8")
@ApiOperation("下单(非加密)")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<GoblinNtfPayResultVo> checkOrder(@RequestBody GoblinNtfOrderPayParam param) {
String uid = CurrentUtil.getCurrentUid();
return iGoblinNftOrderService.checkOrder(param, uid);
public ResponseDto<GoblinNftPayResultVo> checkOrder(@RequestBody GoblinNftOrderPayParam payParam) {
return iGoblinNftOrderService.checkOrder(payParam);
}
@PostMapping("payAgain")
@ApiOperation("再次支付")
// @ApiOperation("再次支付")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<GoblinNtfPayResultVo> payAgain(@RequestBody @Valid GoblinNtfOrderPayAgainParam param) {
public ResponseDto<GoblinNftPayResultVo> payAgain(@RequestBody @Valid GoblinNftOrderPayAgainParam param) {
return iGoblinNftOrderService.payAgain(param);
}
......@@ -60,14 +56,14 @@ public class GoblinNftOrderController {
@PostMapping("syncOrder")
@ApiOperation("支付回调")
@ApiResponse(code = 200, message = "接口返回对象参数")
public String syncOrder(@ModelAttribute @Valid GoblinNtfOrderPayCallbackParam syncOrderParam) {
public String syncOrder(@ModelAttribute @Valid GoblinNftOrderPayCallbackParam syncOrderParam) {
return iGoblinNftOrderService.syncOrder(syncOrderParam);
}
@ApiOperation(value = "退款回调")
@PostMapping(value = "refundSyncOrder")
@ApiResponse(code = 200, message = "接口返回对象参数")
public String refundSyncOrder(GoblinNtfOrderRefundCallbackParam refundCallbackParam) {
public String refundSyncOrder(GoblinNftOrderRefundCallbackParam refundCallbackParam) {
return iGoblinNftOrderService.refundSyncOrder(refundCallbackParam);
}
......
package com.liquidnet.service.order.service.impl;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.UserPathDto;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.manage.AddressVo;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderSkuParam;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderStoreParam;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinOrderAttr;
import com.liquidnet.service.goblin.entity.GoblinOrderSku;
import com.liquidnet.service.goblin.entity.GoblinStoreOrder;
import com.liquidnet.service.goblin.entity.GoblinNftOrder;
import com.liquidnet.service.goblin.param.*;
import com.liquidnet.service.goblin.service.IGoblinNftOrderService;
import com.liquidnet.service.order.utils.*;
......@@ -25,33 +18,28 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.*;
import static com.liquidnet.commons.lang.util.DateUtil.DTF_YMD_HMS;
import static com.liquidnet.commons.lang.util.DateUtil.getNowTime;
@Service
@Slf4j
public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
@Autowired
GoblinRedisUtils redisUtils;
GoblinRedisUtils goblinRedisUtils;
@Autowired
GoblinMongoUtils mongoUtils;
GoblinMongoUtils goblinMongoUtils;
@Autowired
QueueUtils queueUtils;
@Autowired
GoblinOrderUtils orderUtils;
GoblinOrderUtils goblinOrderUtils;
@Autowired
GoblinNtfOrderUtils ntfOrderUtils;
GoblinNftOrderUtils nftOrderUtils;
@Value("${liquidnet.service.order.url-pay.pay}")
private String payUrl;
......@@ -61,584 +49,255 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
private String synUrl;
@Override
public ResponseDto<GoblinNtfPayResultVo> checkOrder(GoblinNtfOrderPayParam param, String uid) {
List<String> skuAndPreListAndNumber = CollectionUtil.arrayListString();
List<String> platformCodeList = CollectionUtil.arrayListString();
List<String> storeCodeList = CollectionUtil.arrayListString();
List<GoblinOrderSqlParam> orderSqlParams = ObjectUtil.getGoblinOrderSqlParamArrayListList();
String orderMasterCode = IDGenerator.storeMasterCode();//总订单id
GoblinOrderPreParam preParam = GoblinOrderPreParam.getNew();
preParam.setAuthCode(param.getAuthCode());
preParam.setPayType(param.getPayType());
preParam.setDeviceFrom(param.getDeviceFrom());
preParam.setOpenId(param.getOpenId());
preParam.setReturnUrl(param.getReturnUrl());
preParam.setShowUrl(param.getShowUrl());
preParam.setOrderMasterCode(orderMasterCode);
preParam.setExpireTime(5);
preParam.setPriceActual(BigDecimal.ZERO);
preParam.setStoreName("");
preParam.setSkuName("");
preParam.setOrderIdList("");
try {
List<GoblinOrderStoreParam> goblinOrderStoreParamList = param.getGoblinOrderStoreParamList();//分订单
boolean isMember;
AddressVo addressesVo = null;
if (orderUtils.noZhengzaiOrder(uid)) {
addressesVo = param.getAddressesVo();
if (orderUtils.getMember(uid) != null) {
isMember = true;
} else {
isMember = false;
}
} else {
isMember = false;
}
for (GoblinOrderStoreParam storeParam : goblinOrderStoreParamList) {//商铺维度循环
String orderId = IDGenerator.nextSnowId();
String orderCode = IDGenerator.storeCode(orderId);
for (GoblinOrderSkuParam skuParam : storeParam.getGoblinOrderSkuParamArrayList()) {//商品维度循环
String skuId = skuParam.getSkuId();
int number = skuParam.getNumber();
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuId);
int surplusGeneral = redisUtils.decrSkuStock(pre, skuId, number);
skuAndPreListAndNumber.add(skuId + "," + pre + "," + number);
//库存回滚
public ResponseDto<GoblinNftPayResultVo> checkOrder(GoblinNftOrderPayParam payParam) {
// 基础参数
GoblinNftOrderPayGoodsParam payGoodsParam = payParam.getGoblinNtfOrderPayGoodsParam();
// 判断库存
String skuId = payGoodsParam.getSkuId();
int number = 1;
int surplusGeneral = nftOrderUtils.decrSkuStock(skuId, number);
if (surplusGeneral < 0) {
return ntfOrderUtils.orderException(skuAndPreListAndNumber, platformCodeList, storeCodeList, uid, "库存不足");
// throw new Exception("库存不足");
}
}//GoblinOrderSkuParam
//下单
GoblinOrderPreParam pre = order(param, storeParam, uid, isMember, addressesVo, orderMasterCode, orderId, orderCode, platformCodeList, storeCodeList);
preParam.setPriceActual(preParam.getPriceActual().add(pre.getPriceActual()));
preParam.setStoreName(pre.getStoreName() + "," + preParam.getStoreName());
preParam.setSkuName(preParam.getSkuName() + "," + pre.getSkuName());
preParam.setOrderIdList(preParam.getOrderIdList() + "," + pre.getOrderIdList());
preParam.setPlatformSpuIds(pre.getPlatformSpuIds());
preParam.setStoreSpuIds(pre.getStoreSpuIds());
GoblinOrderSqlParam sqlParam = GoblinOrderSqlParam.getNew();
sqlParam.setStoreOrder(pre.getStoreOrder());
sqlParam.setOrderAttr(pre.getOrderAttr());
sqlParam.setOrderSkuList(pre.getOrderSkuList());
orderSqlParams.add(sqlParam);
}//GoblinOrderStoreParam
if (preParam.getOrderIdList().equals("")) {
return ntfOrderUtils.orderException(skuAndPreListAndNumber, platformCodeList, storeCodeList, uid, "参数异常");
// throw new Exception("参数异常");
}
return payOrder(preParam, orderSqlParams, uid);
} catch (Exception e) {
log.error("Kylin Order Pay Error = {}", e);
Long time3 = System.currentTimeMillis();
//回顾限购 回滚库存
for (String item : skuAndPreListAndNumber) {
String[] array = item.split(",");
String skuId = array[0];
String pre = array[1];
int number = Integer.parseInt(array[2]);
redisUtils.incrSkuStock(pre, skuId, number);
if (orderUtils.noZhengzaiOrder(uid)) {
redisUtils.decrSkuCountByUid(uid, skuId, number);
}
}
//回退平台券
for (String platformCode : platformCodeList) {
orderUtils.backCoupon(platformCode, uid);
}
//回退店铺券
List<BackCouponParam> params = ObjectUtil.getBackCouponParam();
for (String storeCode : storeCodeList) {
BackCouponParam backCouponParam = BackCouponParam.getNew();
backCouponParam.setuCouponIds(storeCode);
backCouponParam.setUid(uid);
params.add(backCouponParam);
nftOrderUtils.incrSkuStock(skuId, number);
return ResponseDto.failure("库存不足啦~");
}
if (params.size() > 0) {
orderUtils.backStoreCoupon(params);
}
if (e.getMessage() == null) {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
} else if (e.getMessage().equals("平台券不可用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("无权购买")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("平台券店铺券不可一起使用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("平台券店铺券不可一起使用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("跨店铺购物平台券不可用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("店铺券不可用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("不可购买")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("参数异常")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("库存不足")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("已超出限购数量")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("非法参数")) {
return ResponseDto.failure(e.getMessage());
} else {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
// 是店铺商品可购买
String storeId = payGoodsParam.getStoreId();
String spuId = payGoodsParam.getSpuId();
GoblinGoodsInfoVo spuVo = goblinRedisUtils.getGoodsInfoVo(spuId);
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
if (!storeId.equals(spuVo.getStoreId()) || !storeId.equals(skuVo.getStoreId())) {
log.info("NFT-storeId错误 相关参数:[storeId:{}, spuId:{}, skuId:{}]", storeId, spuId, skuId);
return ResponseDto.failure("非法参数~");
}
// 3审核通过 3已上架 0未删除 才可购买
if (!skuVo.getStatus().equals("3") || !skuVo.getShelvesStatus().equals("3") || skuVo.getDelFlg().equals("1")) {
return ResponseDto.failure("该商品当前不可购买~");
}
// TODO: jxl 2022/3/23 是否开售
// 数量限购
String uid = CurrentUtil.getCurrentUid();
int limitCount = skuVo.getBuyLimit() == 0 ? Integer.MAX_VALUE : skuVo.getBuyLimit();
String isOutLimt = goblinOrderUtils.judgeOrderLimit(uid, skuId, 1, limitCount);
if (!StringUtils.isEmpty(isOutLimt)) {
goblinRedisUtils.decrSkuCountByUid(uid, skuId, number);
return ResponseDto.failure("已超出限购数量~");
}
// 权限限购
String mobile = StringUtils.defaultString(((String) CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_MOBILE)), "");
boolean isVip = nftOrderUtils.isVipMember(uid);
Boolean isAuthBuy = goblinOrderUtils.judgeOrderRose(isVip, skuId, mobile, Integer.parseInt(skuVo.getBuyFactor()));
if (!isAuthBuy) {
return ResponseDto.failure("该商品仅限特定用户购买~");
}
private GoblinOrderPreParam order(GoblinNtfOrderPayParam param, GoblinOrderStoreParam storeParam, String uid, boolean isMember, AddressVo addressesVo, String orderMasterCode, String orderId, String orderCode, List<String> platformCodeList, List<String> storeCodeList) throws Exception {
String platVoucherCode = storeParam.getPlatVoucherCode();
String storeVoucherCode = storeParam.getStoreVoucherCode();
String storeId = storeParam.getStoreId();
Map token = CurrentUtil.getTokenClaims();
String headerCliSource = CurrentUtil.getHeaderCliSource(), headerCliVersion = CurrentUtil.getHeaderCliVersion();
String source = headerCliSource == null ? "" : headerCliSource;
String version = headerCliVersion == null ? "" : headerCliVersion;
LocalDateTime now = LocalDateTime.now();
String skuName = "";
BigDecimal price;//sku应付价格
BigDecimal priceBase;//sku原价
BigDecimal storeTotalPrice = BigDecimal.ZERO;//订单总金额
String writeOffCode = ""; //取货码
List<GoblinOrderSku> goblinOrderSkuList = ObjectUtil.getGoblinOrderSkuArrayList();
List<String> storeSpuIds = CollectionUtil.linkedListString();
List<String> platformSpuIds = CollectionUtil.linkedListString();
String marketId = "";
String marketType = "";
for (GoblinOrderSkuParam skuParam : storeParam.getGoblinOrderSkuParamArrayList()) {
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuParam.getSkuId());
GoblinGoodsSkuInfoVo skuVo = redisUtils.getGoodsSkuInfoVo(skuParam.getSkuId());
GoblinGoodsInfoVo spuVo = redisUtils.getGoodsInfoVo(skuParam.getSpuId());
if (!spuVo.getStoreId().equals(storeParam.getStoreId()) || !skuVo.getStoreId().equals(storeParam.getStoreId())) {
throw new Exception("非法参数");
}
if (!(skuVo.getStatus().equals("3") && skuVo.getShelvesStatus().equals("3")) || skuVo.getDelFlg().equals("1")) {
throw new Exception("不可购买");
// 判断优惠券
String platVoucherCode = payGoodsParam.getPlatVoucherCode();
String storeVoucherCode = payGoodsParam.getStoreVoucherCode();
if (!StringUtils.isEmpty(platVoucherCode) && !StringUtils.isEmpty(storeVoucherCode)) {
return ResponseDto.failure("平台券与店铺券不可一起使用哦~");
}
// 判断库存
int limitCount = skuVo.getBuyLimit() == 0 ? Integer.MAX_VALUE : skuVo.getBuyLimit();
//判断限购
if (orderUtils.noZhengzaiOrder(uid)) {
String res1 = orderUtils.judgeOrderLimit(uid, skuParam.getSkuId(), skuParam.getNumber(), limitCount);
if (!res1.equals("")) {
throw new Exception("已超出限购数量");
}
//权限限购
Boolean res2 = orderUtils.judgeOrderRose(isMember, skuParam.getSkuId(), StringUtils.defaultString(((String) CurrentUtil.getTokenClaims().get("mobile")), ""), Integer.parseInt(skuVo.getBuyFactor()));
if (!res2) {
throw new Exception("无权购买");
}
}
marketId = spuVo.getMarketId();
marketType = pre;
skuName = skuName.concat(skuVo.getName()).concat(",");
if (pre != null && pre.equals(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())) {
writeOffCode = "EMPTY";
}
//获得 活动原价
price = skuVo.getPrice();
if (isMember) {
price = skuVo.getPriceMember();
}
//活动价格
// if (pre != null) {
// GoblinGoodsSkuInfoVo skuMarketVo = redisUtils.getGoodsSkuInfoVo(skuParam.getSkuId().split(pre)[0]);
// priceBase = skuMarketVo.getPrice();
// if (isMember) {
// priceBase = skuMarketVo.getPriceMember();
// }
// } else {
priceBase = skuVo.getPrice();
if (isMember) {
priceBase = skuVo.getPriceMember();
}
// }
//todo
//获得活动优惠价格
// priceBase = priceBase.multiply(BigDecimal.valueOf(skuParam.getNumber()));
price = price.multiply(BigDecimal.valueOf(skuParam.getNumber()));
storeTotalPrice = storeTotalPrice.add(price);
//订单sku
GoblinOrderSku orderSku = GoblinOrderSku.getNew();
orderSku.setOrderSkuId(IDGenerator.nextTimeId2());
orderSku.setOrderId(orderId);
orderSku.setStatus(GoblinStatusConst.Status.ORDER_STATUS_0.getValue());
orderSku.setSpuId(skuParam.getSpuId());
orderSku.setSpuName(spuVo.getName());
orderSku.setSkuId(skuParam.getSkuId());
orderSku.setNum(skuParam.getNumber());
orderSku.setSkuPrice(priceBase);
orderSku.setSkuPriceActual(price);
orderSku.setSkuName(skuVo.getName());
orderSku.setSkuNo(skuVo.getSkuNo());
orderSku.setSkuImage(skuVo.getSkuPic());
orderSku.setSkuSpecs(JSON.toJSONString(skuVo.getSkuSpecList()));
orderSku.setPriceVoucher(BigDecimal.ZERO);
// orderSku.setPriceVoucher(priceBase.subtract(price));
orderSku.setCreatedAt(now);
orderSku.setSpuName(spuVo.getName());
orderSku.setSpuPic(spuVo.getCoverPic());
goblinOrderSkuList.add(orderSku);
}
if ((platVoucherCode != null && !platVoucherCode.equals("")) && (storeVoucherCode != null && !storeVoucherCode.equals(""))) {
throw new Exception("平台券店铺券不可一起使用");
}
if (param.getGoblinOrderStoreParamList().size() > 1 && (platVoucherCode != null && !platVoucherCode.equals(""))) {
throw new Exception("跨店铺购物平台券不可用");
}
//优惠券
BigDecimal voucherPrice = BigDecimal.ZERO;
if (platVoucherCode != null && !platVoucherCode.equals("")) {
String spuIds = "";
for (GoblinOrderSkuParam item : storeParam.getGoblinOrderSkuParamArrayList()) {
String pre = GoblinStatusConst.MarketPreStatus.getPre(item.getSpuId());
if (pre != null) {
spuIds = spuIds.concat(item.getSpuId().split(pre)[0] + ",");
} else {
spuIds = spuIds.concat(item.getSpuId() + ",");
}
String orderId = IDGenerator.nextSnowId();
String orderCode = IDGenerator.storeCode(orderId);
BigDecimal totalPrice = skuVo.getPrice();
if (isVip) {
totalPrice = skuVo.getPriceMember();
}
HashMap<String, Object> hashMap = orderUtils.useCoupon(platVoucherCode, "购买商品[" + orderCode + "]", storeTotalPrice, spuIds, uid, goblinOrderSkuList);
if (!StringUtils.isEmpty(platVoucherCode)) {// 平台券
HashMap<String, Object> hashMap = nftOrderUtils.useCoupon(platVoucherCode, "购买NFT商品[" + orderCode + "]", totalPrice, spuId, uid);
if (hashMap != null) {
voucherPrice = (BigDecimal) hashMap.get("voucher");
Integer typeVoucher = (Integer) hashMap.get("type");
if (typeVoucher.equals(-1)) {
throw new Exception("平台券不可用");
return ResponseDto.failure("当前平台券不允许使用~");
} else {
platformCodeList.add(platVoucherCode);
platformSpuIds = (List<String>) hashMap.get("spuIds");
// TODO: jxl 2022/3/24 错误回退
}
}
}
//商铺券
BigDecimal storeVoucherPrice = BigDecimal.ZERO;
if (storeVoucherCode != null && !storeVoucherCode.equals("")) {
GoblinUseResultVo storeCouponVo = orderUtils.useStoreCoupon(storeVoucherCode, "购买商品[" + orderCode + "]", storeTotalPrice, goblinOrderSkuList, uid);
if (!StringUtils.isEmpty(storeVoucherCode)) {// 店铺券
GoblinUseResultVo storeCouponVo = nftOrderUtils.useStoreCoupon(storeVoucherCode, "购买NFT商品[" + orderCode + "]", totalPrice, spuId, uid);
String typeVoucher;
if (storeCouponVo != null) {
storeVoucherPrice = storeCouponVo.getValue();
typeVoucher = storeCouponVo.getCouType();
if (typeVoucher.equals("-1")) {
throw new Exception("店铺券不可用");
return ResponseDto.failure("当前店铺券不允许使用~");
} else {
storeCodeList.add(storeVoucherCode);
storeSpuIds = storeCouponVo.getSpuIds();
// TODO: jxl 2022/3/24 错误回退
}
}
}
GoblinStoreInfoVo storeInfoVo = redisUtils.getStoreInfoVo(storeId);
// 下单数据
GoblinNftOrder nftOrder = order(payParam, payGoodsParam, uid, orderId, orderCode, totalPrice, voucherPrice, storeVoucherPrice, isVip);
// 下单唤起支付
GoblinNftPayResultVo nftPayResultVo = payOrder(nftOrder, uid, payParam);
return ResponseDto.success(nftPayResultVo);
}
private GoblinNftOrder order(
GoblinNftOrderPayParam payParam, GoblinNftOrderPayGoodsParam payGoodsParam, String uid,
String orderId, String orderCode,
BigDecimal totalPrice, BigDecimal voucherPrice, BigDecimal storeVoucherPrice,
boolean isVip
) {
String storeId = payGoodsParam.getStoreId();
LocalDateTime now = LocalDateTime.now();
Map token = CurrentUtil.getTokenClaims();
String headerCliSource = CurrentUtil.getHeaderCliSource(), headerCliVersion = CurrentUtil.getHeaderCliVersion();
String source = headerCliSource == null ? "" : headerCliSource;
String version = headerCliVersion == null ? "" : headerCliVersion;
GoblinStoreInfoVo storeInfoVo = goblinRedisUtils.getStoreInfoVo(storeId);
String storeName = storeInfoVo.getStoreName();
//生成订单
GoblinStoreOrder storeOrder = GoblinStoreOrder.getNew();
storeOrder.setMasterOrderCode(orderMasterCode);
storeOrder.setOrderId(orderId);
storeOrder.setStoreId(storeId);
storeOrder.setStoreName(storeInfoVo.getStoreName());
storeOrder.setOrderCode(orderCode);
storeOrder.setUserId(uid);
storeOrder.setUserName(StringUtils.defaultString(((String) token.get("nickname")), ""));
storeOrder.setUserMobile(StringUtils.defaultString(((String) token.get("mobile")), ""));
if (addressesVo == null) {
storeOrder.setPriceExpress(BigDecimal.ZERO);
} else {
storeOrder.setPriceExpress(BigDecimal.TEN);
}
storeOrder.setPriceTotal(storeTotalPrice.add(storeOrder.getPriceExpress()));
BigDecimal priceActual = storeOrder.getPriceTotal().subtract(voucherPrice).subtract(storeVoucherPrice);
if (priceActual.compareTo(storeOrder.getPriceExpress()) < 0) {
priceActual = storeOrder.getPriceExpress();
}
storeOrder.setPriceActual(priceActual.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : priceActual);
storeOrder.setPriceRefund(BigDecimal.ZERO);
storeOrder.setPriceCoupon(voucherPrice);
storeOrder.setStorePriceCoupon(storeVoucherPrice);
storeOrder.setPriceVoucher(voucherPrice.add(storeVoucherPrice));
storeOrder.setStatus(0);
storeOrder.setUcouponId(platVoucherCode);
storeOrder.setStoreCouponId(storeVoucherCode);
storeOrder.setPayType(param.getPayType());
storeOrder.setDeviceFrom(param.getDeviceFrom());
storeOrder.setSource(source);
storeOrder.setVersion(version);
storeOrder.setIsMember(isMember ? 1 : 0);
storeOrder.setOrderType(0);
storeOrder.setWriteOffCode(writeOffCode);
if (marketType != null && marketType.equals(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())) {
storeOrder.setPayCountdownMinute(1);
} else {
storeOrder.setPayCountdownMinute(5);
}
storeOrder.setIpAddress(CurrentUtil.getCliIpAddr());
storeOrder.setCreatedAt(now);
storeOrder.setMarketId(marketId);
storeOrder.setMarketType(marketType);
//订单attr
GoblinOrderAttr orderAttr = GoblinOrderAttr.getNew();
orderAttr.setOrderAttrId(IDGenerator.nextTimeId2());
orderAttr.setOrderId(orderId);
if (!writeOffCode.equals("EMPTY")) {
orderAttr.setExpressContacts(addressesVo.getName());
orderAttr.setExpressAddress(addressesVo.getProvince() + "," + addressesVo.getCounty() + "," + addressesVo.getCity());
orderAttr.setExpressAddressDetail(addressesVo.getAddress());
orderAttr.setExpressPhone(addressesVo.getPhone());
orderAttr.setExpressType(1);
orderAttr.setCreatedAt(now);
}
//返回值
GoblinOrderPreParam preParam = GoblinOrderPreParam.getNew();
preParam.setPriceActual(storeOrder.getPriceActual());
preParam.setStoreName(storeInfoVo.getStoreName());
preParam.setSkuName(skuName);
preParam.setOrderIdList(storeOrder.getOrderId());
preParam.setStoreOrder(storeOrder);
preParam.setOrderAttr(orderAttr);
preParam.setOrderSkuList(goblinOrderSkuList);
preParam.setStoreSpuIds(storeSpuIds);
preParam.setPlatformSpuIds(platformSpuIds);
return preParam;
}
private ResponseDto<GoblinNtfPayResultVo> payOrder(GoblinOrderPreParam preParam, List<GoblinOrderSqlParam> sqlParams, String uid) {
//是否免费
GoblinNftOrder nftOrder = GoblinNftOrder.getNew();
nftOrder.setOrderId(orderId);
nftOrder.setOrderCode(orderCode);
nftOrder.setStoreId(storeId);
nftOrder.setStoreName(storeName);
nftOrder.setUserId(uid);
nftOrder.setUserName(StringUtils.defaultString(((String) token.get(CurrentUtil.TOKEN_NICKNAME)), ""));
nftOrder.setUserMobile(StringUtils.defaultString(((String) token.get(CurrentUtil.TOKEN_MOBILE)), ""));
nftOrder.setPriceTotal(totalPrice);
BigDecimal priceActual = totalPrice.subtract(voucherPrice).subtract(storeVoucherPrice);
nftOrder.setPriceActual(priceActual.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : priceActual);
nftOrder.setPriceCoupon(voucherPrice);
nftOrder.setStorePriceCoupon(storeVoucherPrice);
nftOrder.setPriceVoucher(voucherPrice.add(storeVoucherPrice));
nftOrder.setStatus(GoblinStatusConst.NftStatus.ORDER_STATUS_1.getValue());
nftOrder.setUcouponId(payGoodsParam.getPlatVoucherCode());
nftOrder.setStoreCouponId(payGoodsParam.getStoreVoucherCode());
nftOrder.setPayType(payParam.getPayType());
nftOrder.setDeviceFrom(payParam.getDeviceFrom());
nftOrder.setSource(source);
nftOrder.setVersion(version);
nftOrder.setIsMember(isVip ? 1 : 0);
nftOrder.setOrderType(0);
nftOrder.setPayCountdownMinute(5);
nftOrder.setIpAddress(CurrentUtil.getCliIpAddr());
nftOrder.setCreatedAt(now);
return nftOrder;
}
private GoblinNftPayResultVo payOrder(GoblinNftOrder nftOrder, String uid, GoblinNftOrderPayParam payParam) {
// 是否免费
boolean isFree = false;
GoblinNtfPayResultVo ntfPayResultVo;
GoblinNftPayResultVo NftPayResultVo = GoblinNftPayResultVo.getNew();
String payCode;
if (preParam.getPriceActual().compareTo(BigDecimal.valueOf(0)) > 0 && !preParam.getPayType().equals("huifu")) {
// 调用支付
if (nftOrder.getPriceActual().compareTo(BigDecimal.valueOf(0)) > 0) {// 调用支付
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("type", "PRODUCT");
httpData.add("price", preParam.getPriceActual().toString());
httpData.add("price", nftOrder.getPriceActual().toString());
// 测试0.01
// httpData.add("price","0.01");
httpData.add("name", preParam.getStoreName());
httpData.add("detail", preParam.getSkuName());
httpData.add("orderCode", preParam.getOrderMasterCode());
httpData.add("orderId", preParam.getOrderIdList().substring(1));
httpData.add("name", nftOrder.getStoreName());
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(nftOrder.getSkuId());
httpData.add("detail", skuVo.getName());
httpData.add("orderCode", nftOrder.getOrderCode());
httpData.add("orderId", nftOrder.getOrderId());
httpData.add("clientIp", CurrentUtil.getCliIpAddr());
httpData.add("notifyUrl", synUrl);
httpData.add("createDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
httpData.add("expireTime", preParam.getExpireTime() + "");
httpData.add("payType", preParam.getPayType());
httpData.add("deviceFrom", preParam.getDeviceFrom());
if (preParam.getDeviceFrom().equals("micropay")) {
httpData.add("authCode", preParam.getAuthCode());
}
if (preParam.getDeviceFrom().equals("js") || preParam.getDeviceFrom().equals("applet")) {
httpData.add("openId", preParam.getOpenId());
}
// if (preParam.getPayType().equals("alipay") && preParam.getDeviceFrom().equals("wap")) {
// httpData.add("showUrl", preParam.getShowUrl() + preParam.getOrderMasterCode());
// httpData.add("returnUrl", preParam.getReturnUrl() + preParam.getOrderMasterCode());
// }
// if (preParam.getPayType().equals("douyinpay")) {
// httpData.add("showUrl", preParam.getShowUrl() + preParam.getOrderMasterCode());
// httpData.add("returnUrl", preParam.getReturnUrl() + preParam.getOrderMasterCode());
// }
// if (preParam.getPayType().equals("unionpay")) {
// httpData.add("returnUrl", preParam.getReturnUrl() + preParam.getOrderMasterCode());
// }
httpData.add("showUrl", preParam.getShowUrl() + preParam.getOrderMasterCode());
httpData.add("returnUrl", preParam.getReturnUrl() + preParam.getOrderMasterCode());
httpData.add("expireTime", "5");
httpData.add("payType", nftOrder.getPayType());
httpData.add("deviceFrom", nftOrder.getDeviceFrom());
if (nftOrder.getDeviceFrom().equals("js") || nftOrder.getDeviceFrom().equals("applet")) {
httpData.add("openId", payParam.getOpenId());
}
String showUrl = payParam.getShowUrl().concat(nftOrder.getOrderCode());
String returnUrl = payParam.getReturnUrl().concat(nftOrder.getOrderCode());
httpData.add("showUrl", showUrl);
httpData.add("returnUrl", returnUrl);
LinkedMultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
String returnData = HttpUtil.post(payUrl, httpData, header);
log.info("调用 DRAGON 结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
ntfPayResultVo = GoblinNtfPayResultVo.getNew();
ntfPayResultVo.setCode(dto.getData().getCode());
ntfPayResultVo.setOrderCode(dto.getData().getOrderCode());
ntfPayResultVo.setPayData(dto.getData().getPayData());
ntfPayResultVo.setPayType(preParam.getPayType());
ntfPayResultVo.setPrice(preParam.getPriceActual());
payCode = ntfPayResultVo.getCode();
ntfPayResultVo.setShowUrl(preParam.getShowUrl());
ntfPayResultVo.setReturnUrl(preParam.getReturnUrl());
} else if (preParam.getPayType() == null) {
isFree = true;
preParam.setPayType("FREE");
payCode = "FREE_PAY_CODE";
ntfPayResultVo = GoblinNtfPayResultVo.getNew();
ntfPayResultVo.setPrice(BigDecimal.valueOf(0));
ntfPayResultVo.setPayType(preParam.getPayType());
} else if (preParam.getPayType().equals("huifu")) {
isFree = true;
preParam.setPayType("huifu");
payCode = "HUIFU_PAY_CODE";
ntfPayResultVo = GoblinNtfPayResultVo.getNew();
ntfPayResultVo.setPrice(preParam.getPriceActual());
ntfPayResultVo.setPayType(preParam.getPayType());
GoblinPayInnerResultVo dtoData = dto.getData();
payCode = dtoData.getCode();
NftPayResultVo.setCode(payCode);
NftPayResultVo.setOrderCode(dtoData.getOrderCode());
NftPayResultVo.setPayData(dtoData.getPayData());
NftPayResultVo.setPayType(nftOrder.getPayType());
NftPayResultVo.setPrice(nftOrder.getPriceActual());
NftPayResultVo.setShowUrl(showUrl);
NftPayResultVo.setReturnUrl(returnUrl);
} else {
isFree = true;
preParam.setPayType("FREE");
nftOrder.setPayType("FREE");
payCode = "FREE_PAY_CODE";
ntfPayResultVo = GoblinNtfPayResultVo.getNew();
ntfPayResultVo.setPrice(BigDecimal.valueOf(0));
ntfPayResultVo.setPayType(preParam.getPayType());
NftPayResultVo.setPrice(BigDecimal.valueOf(0));
NftPayResultVo.setPayType(nftOrder.getPayType());
}
ntfPayResultVo.setOrderMasterCode(preParam.getOrderMasterCode());
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin.order.create.sku_insert"));
sqls.add(SqlMapping.get("goblin.order.create.order_insert"));
sqls.add(SqlMapping.get("goblin.order.create.attr_insert"));
LinkedList<Object[]> sqlDataSku = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("goblin_nft_order.insert"));
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataAttr = CollectionUtil.linkedListObjectArr();
List<GoblinStoreOrderVo> orderVoList = ObjectUtil.getGoblinStoreOrderVoArrayList();
List<GoblinOrderSkuVo> skuVoList = ObjectUtil.getGoblinOrderSkuVoArrayList();
for (GoblinOrderSqlParam item : sqlParams) {
List<String> goblinOrderSkuIdList = CollectionUtil.linkedListString();
BigDecimal restVoucherPrice = item.getStoreOrder().getPriceVoucher();
for (int i = 0; i < item.getOrderSkuList().size(); i++) {
GoblinOrderSku orderSku = item.getOrderSkuList().get(i);
if (item.getStoreOrder().getPriceVoucher().compareTo(BigDecimal.ZERO) > 0) {
if (preParam.getStoreSpuIds().size() > 0 || preParam.getPlatformSpuIds().size() > 0) {//指定范围商品券
String spuId = orderSku.getSpuId();
String pre = GoblinStatusConst.MarketPreStatus.getPre(spuId);
if (pre != null) {
spuId = spuId.split(pre)[0];
}
if (preParam.getStoreSpuIds().contains(spuId) || preParam.getPlatformSpuIds().contains(spuId)) {
if (restVoucherPrice.compareTo(BigDecimal.ZERO) <= 0) {
restVoucherPrice = BigDecimal.ZERO;
}
if (restVoucherPrice.compareTo(BigDecimal.ZERO) > 0) {
restVoucherPrice = restVoucherPrice.subtract(orderSku.getSkuPrice());
if (restVoucherPrice.compareTo(BigDecimal.ZERO) >= 0) {
orderSku.setPriceVoucher(orderSku.getSkuPrice());
} else {
orderSku.setPriceVoucher(restVoucherPrice.add(orderSku.getSkuPrice()));
}
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
} else if (restVoucherPrice.compareTo(BigDecimal.ZERO) == 0) {
orderSku.setPriceVoucher(BigDecimal.ZERO);
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
} else {
orderSku.setPriceVoucher(restVoucherPrice.add(orderSku.getSkuPrice()));
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
}
}
} else {//全部商品券
if (restVoucherPrice.compareTo(BigDecimal.ZERO) <= 0) {
restVoucherPrice = BigDecimal.ZERO;
}
if (restVoucherPrice.compareTo(BigDecimal.ZERO) > 0) {
restVoucherPrice = restVoucherPrice.subtract(orderSku.getSkuPrice());
if (restVoucherPrice.compareTo(BigDecimal.ZERO) >= 0) {
orderSku.setPriceVoucher(orderSku.getSkuPrice());
} else {
orderSku.setPriceVoucher(restVoucherPrice.add(orderSku.getSkuPrice()));
}
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
} else if (restVoucherPrice.compareTo(BigDecimal.ZERO) == 0) {
orderSku.setPriceVoucher(BigDecimal.ZERO);
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
} else {
orderSku.setPriceVoucher(restVoucherPrice.add(orderSku.getSkuPrice()));
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
}
}
}
sqlDataSku.add(new Object[]{
orderSku.getOrderSkuId(), orderSku.getOrderId(), orderSku.getSpuId(), orderSku.getSpuName(), orderSku.getSpuPic(), orderSku.getSkuId(), orderSku.getNum(), orderSku.getSkuPrice(), orderSku.getSkuPriceActual(), orderSku.getSkuName(),
orderSku.getSkuNo(), orderSku.getSkuImage(), orderSku.getSkuSpecs(), orderSku.getPriceVoucher(), orderSku.getCreatedAt()
});
//订单 orderSku Vo
GoblinOrderSkuVo orderSkuVo = GoblinOrderSkuVo.getNew().copy(orderSku);
redisUtils.setGoblinOrderSku(orderSkuVo.getOrderSkuId(), orderSkuVo);
goblinOrderSkuIdList.add(orderSkuVo.getOrderSkuId());
skuVoList.add(orderSkuVo);
}
GoblinStoreOrder storeOrder = item.getStoreOrder();
storeOrder.setPayCode(payCode);
nftOrder.setPayCode(payCode);
sqlDataOrder.add(new Object[]{
storeOrder.getMasterOrderCode(), storeOrder.getOrderId(), storeOrder.getStoreId(), storeOrder.getStoreName(), storeOrder.getOrderCode(), storeOrder.getUserId(), storeOrder.getUserName(), storeOrder.getUserMobile(), storeOrder.getPriceTotal(), storeOrder.getPayCode(),
storeOrder.getPriceActual(), storeOrder.getPriceRefund(), storeOrder.getPriceExpress(), storeOrder.getPriceCoupon(), storeOrder.getStorePriceCoupon(), storeOrder.getPriceVoucher(), storeOrder.getStatus(), storeOrder.getUcouponId(), storeOrder.getStoreCouponId(), storeOrder.getPayType(), storeOrder.getDeviceFrom(),
storeOrder.getSource(), storeOrder.getVersion(), storeOrder.getIsMember(), storeOrder.getOrderType(), storeOrder.getWriteOffCode(), storeOrder.getPayCountdownMinute(), storeOrder.getIpAddress(), storeOrder.getMarketId(), storeOrder.getMarketType(), storeOrder.getCreatedAt()
});
GoblinOrderAttr orderAttr = item.getOrderAttr();
sqlDataAttr.add(new Object[]{
orderAttr.getOrderAttrId(), orderAttr.getOrderId(), orderAttr.getExpressContacts(), orderAttr.getExpressAddress(), orderAttr.getExpressAddressDetail(), orderAttr.getExpressPhone(), orderAttr.getExpressType(), orderAttr.getCreatedAt()
nftOrder.getOrderId(), nftOrder.getStoreId(), nftOrder.getStoreName(), nftOrder.getOrderCode(), nftOrder.getUserId(), nftOrder.getUserName(), nftOrder.getUserMobile(), nftOrder.getPriceTotal(), nftOrder.getPayCode(),
nftOrder.getPriceActual(), nftOrder.getPriceCoupon(), nftOrder.getStorePriceCoupon(), nftOrder.getPriceVoucher(), nftOrder.getStatus(), nftOrder.getUcouponId(), nftOrder.getStoreCouponId(), nftOrder.getPayType(), nftOrder.getDeviceFrom(),
nftOrder.getSource(), nftOrder.getVersion(), nftOrder.getIsMember(), nftOrder.getOrderType(), nftOrder.getPayCountdownMinute(), nftOrder.getIpAddress(), nftOrder.getCreatedAt()
});
//订单vo
GoblinStoreOrderVo orderVo = GoblinStoreOrderVo.getNew().copy(storeOrder);
//订单attr vo
GoblinOrderAttrVo orderAttrVo = GoblinOrderAttrVo.getNew().copy(orderAttr);
//待支付发送队列
queueUtils.sendMsgByRedisGoblinStock(orderVo.getMasterOrderCode(), storeOrder.getCreatedAt());
//redis 赋值
orderVo.setOrderAttrVo(orderAttrVo);
orderVo.setOrderSkuVoIds(goblinOrderSkuIdList);
orderVo.setCreatedAt(getNowTime());
redisUtils.setGoblinOrder(orderVo.getOrderId(), orderVo);
redisUtils.setMasterCode(orderVo.getMasterOrderCode(), preParam.getOrderIdList().substring(1));
orderVoList.add(orderVo);
//redis 订单列表
if (orderUtils.noZhengzaiOrder(uid)) {
if (orderVo.getMarketType() == null) {
redisUtils.addOrderList(uid, orderVo.getOrderId());
} else if (orderVo.getMarketType().equals(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())) {
redisUtils.addZhengzaiOrderList(uid, orderVo.getOrderId());
}
}
}
mongoUtils.insertGoblinOrderSkuVoList(skuVoList);
mongoUtils.insertGoblinStoreOrderVos(orderVoList);
//mysql 执行sql
String sqlData = SqlMapping.gets(sqls, sqlDataSku, sqlDataOrder, sqlDataAttr);
// 订单vo
GoblinNftOrderVo orderVo = GoblinNftOrderVo.getNew().copy(nftOrder);
orderVo.setCreatedAt(nftOrder.getCreatedAt());
// 待支付发送队列
queueUtils.sendMsgByRedisGoblinStock(orderVo.getOrderCode(), nftOrder.getCreatedAt(), "NFT");
// redis 订单详情
nftOrderUtils.setNftOrder(orderVo);
// redis 订单列表
nftOrderUtils.addNftOrderList(uid, orderVo.getOrderId());
// mongo
goblinMongoUtils.setGoblinNftOrderVo(orderVo);
// 执行sql
String sqlData = SqlMapping.gets(sqls, sqlDataOrder);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CREATE_PAY.getKey(), sqlData);
log.info(UserPathDto.setData("下单(唤起支付)", preParam, ntfPayResultVo));
if (isFree && preParam.getPayType().equals("huifu")) {
// SyncOrderParam syncOrderParam = SyncOrderParam.getNew();
// syncOrderParam.setOrderCode(preParam.getOrderMasterCode());
// syncOrderParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
// syncOrderParam.setCode(payCode);
// syncOrderParam.setPrice(preParam.getPriceActual());
// syncOrderParam.setPaymentId("FREE_PAYMENT_ID");
// syncOrderParam.setPaymentType(null);
// syncOrderParam.setStatus(1);
// syncOrder(syncOrderParam);
return ResponseDto.success(ntfPayResultVo);
} else if (isFree) {
GoblinNtfOrderPayCallbackParam ntfOrderPayCallbackParam = GoblinNtfOrderPayCallbackParam.getNew();
ntfOrderPayCallbackParam.setOrderCode(preParam.getOrderMasterCode());
ntfOrderPayCallbackParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
ntfOrderPayCallbackParam.setCode(payCode);
ntfOrderPayCallbackParam.setPrice(preParam.getPriceActual());
ntfOrderPayCallbackParam.setPaymentId("FREE_PAYMENT_ID");
ntfOrderPayCallbackParam.setPaymentType(null);
ntfOrderPayCallbackParam.setStatus(1);
syncOrder(ntfOrderPayCallbackParam);
return ResponseDto.success(ntfPayResultVo);
} else {
return ResponseDto.success(ntfPayResultVo);
log.info(UserPathDto.setData("下单(唤起支付)", nftOrder, NftPayResultVo));
if (isFree) {// 免费直接回调
GoblinNftOrderPayCallbackParam NftOrderPayCallbackParam = GoblinNftOrderPayCallbackParam.getNew();
NftOrderPayCallbackParam.setCode(payCode);
NftOrderPayCallbackParam.setOrderCode(nftOrder.getOrderCode());
NftOrderPayCallbackParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
NftOrderPayCallbackParam.setPrice(nftOrder.getPriceActual());
NftOrderPayCallbackParam.setPaymentId("FREE_PAYMENT_ID");
NftOrderPayCallbackParam.setPaymentType(null);
NftOrderPayCallbackParam.setStatus(1);
syncOrder(NftOrderPayCallbackParam);
}
return NftPayResultVo;
}
@Override
public ResponseDto<GoblinNtfPayResultVo> payAgain(GoblinNtfOrderPayAgainParam param) {
String uid = CurrentUtil.getCurrentUid();
public ResponseDto<GoblinNftPayResultVo> payAgain(GoblinNftOrderPayAgainParam param) {
return ResponseDto.failure("暂不支持此接口");
/*String uid = CurrentUtil.getCurrentUid();
LocalDateTime now = LocalDateTime.now();
//检查订单时间 是否关闭
GoblinStoreOrderVo storeOrderVo = redisUtils.getGoblinOrder(param.getOrderId());
GoblinStoreOrderVo storeOrderVo = goblinRedisUtils.getGoblinOrder(param.getOrderId());
if (storeOrderVo == null) {
return ResponseDto.failure("订单不存在");
......@@ -660,33 +319,20 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
return ResponseDto.failure("订单已支付");
}
BigDecimal price = BigDecimal.ZERO;
String[] orderIds = redisUtils.getMasterCode(storeOrderVo.getMasterOrderCode());
String[] orderIds = goblinRedisUtils.getMasterCode(storeOrderVo.getMasterOrderCode());
for (String orderId : orderIds) {
GoblinStoreOrderVo orderVo = redisUtils.getGoblinOrder(orderId);
GoblinStoreOrderVo orderVo = goblinRedisUtils.getGoblinOrder(orderId);
price = price.add(orderVo.getPriceActual());
}
GoblinNtfPayResultVo ntfPayResultVo = GoblinNtfPayResultVo.getNew();
// if (!storeOrderVo.getPayType().equals("FREE") && storeOrderVo.getPayType().equals(param.getPayType()) && storeOrderVo.getDeviceFrom().equals(param.getDeviceFrom())) {
// payInnerResultVo.setCode(checkVo.getData().getCode());
// payInnerResultVo.setOrderCode(checkVo.getData().getOrderCode());
// payInnerResultVo.setPayData(checkVo.getData().getPayData());
// payInnerResultVo.setOrderId(param.getOrderId());
// payInnerResultVo.setPayType(param.getPayType());
// payInnerResultVo.setPrice(storeOrderVo.getPriceActual());
// storeOrderVo.setPayCode(payInnerResultVo.getCode());
// payInnerResultVo.setShowUrl(param.getShowUrl() + storeOrderVo.getOrderId());
// payInnerResultVo.setReturnUrl(param.getReturnUrl() + storeOrderVo.getOrderId());
// log.info(UserPathDto.setData("再次支付[原支付方式]", param, payInnerResultVo));
// } else
GoblinNftPayResultVo NftPayResultVo = GoblinNftPayResultVo.getNew();
if (!storeOrderVo.getPayType().equals("FREE")) {
// 调用支付
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("type", "PRODUCT");
httpData.add("price", price.toString());
httpData.add("name", redisUtils.getStoreInfoVo(storeOrderVo.getStoreId()).getStoreName());
httpData.add("name", goblinRedisUtils.getStoreInfoVo(storeOrderVo.getStoreId()).getStoreName());
httpData.add("detail", "查找最初订单");
httpData.add("orderCode", storeOrderVo.getMasterOrderCode());
// httpData.add("orderId", storeOrderVo.getOrderId());
httpData.add("clientIp", storeOrderVo.getIpAddress());
httpData.add("notifyUrl", synUrl);
httpData.add("createDate", storeOrderVo.getCreatedAt());
......@@ -697,59 +343,44 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
if (param.getDeviceFrom().equals("js") || param.getDeviceFrom().equals("applet")) {
httpData.add("openId", param.getOpenId());
}
// if (param.getPayType().equals("alipay") && param.getDeviceFrom().equals("wap")) {
// httpData.add("showUrl", param.getShowUrl() + storeOrderVo.getMasterOrderCode());
// httpData.add("returnUrl", param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
// }
// if (param.getPayType().equals("douyinpay")) {
// httpData.add("showUrl", param.getShowUrl() + storeOrderVo.getMasterOrderCode());
// httpData.add("returnUrl", param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
// }
// if (param.getPayType().equals("unionpay")) {
// httpData.add("returnUrl", param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
// }
httpData.add("showUrl", param.getShowUrl() + storeOrderVo.getMasterOrderCode());
httpData.add("returnUrl", param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
String returnData = HttpUtil.post(payUrl, httpData);
log.debug("调用 DRAGON 结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
ntfPayResultVo.setCode(dto.getData().getCode());
ntfPayResultVo.setOrderCode(storeOrderVo.getMasterOrderCode());
ntfPayResultVo.setOrderMasterCode(storeOrderVo.getMasterOrderCode());
ntfPayResultVo.setPayData(dto.getData().getPayData());
ntfPayResultVo.setOrderId(storeOrderVo.getMasterOrderCode());
ntfPayResultVo.setPayType(param.getPayType());
ntfPayResultVo.setPrice(price);
ntfPayResultVo.setShowUrl(param.getShowUrl() + storeOrderVo.getMasterOrderCode());
ntfPayResultVo.setReturnUrl(param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
NftPayResultVo.setCode(dto.getData().getCode());
NftPayResultVo.setOrderCode(storeOrderVo.getMasterOrderCode());
NftPayResultVo.setPayData(dto.getData().getPayData());
NftPayResultVo.setOrderId(storeOrderVo.getMasterOrderCode());
NftPayResultVo.setPayType(param.getPayType());
NftPayResultVo.setPrice(price);
NftPayResultVo.setShowUrl(param.getShowUrl() + storeOrderVo.getMasterOrderCode());
NftPayResultVo.setReturnUrl(param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
//redis
storeOrderVo.setPayType(param.getPayType());
storeOrderVo.setDeviceFrom(param.getDeviceFrom());
storeOrderVo.setPayCode(ntfPayResultVo.getCode());
redisUtils.setGoblinOrder(storeOrderVo.getOrderId(), storeOrderVo);
storeOrderVo.setPayCode(NftPayResultVo.getCode());
goblinRedisUtils.setGoblinOrder(storeOrderVo.getOrderId(), storeOrderVo);
//mongo
mongoUtils.updateGoblinStoreOrderVo(storeOrderVo.getOrderId(), storeOrderVo);
goblinMongoUtils.updateGoblinStoreOrderVo(storeOrderVo.getOrderId(), storeOrderVo);
//mysql
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_AGAIN.getKey(),
SqlMapping.get("goblin_order.pay.again", param.getPayType(), param.getDeviceFrom(), ntfPayResultVo.getCode(), param.getOrderId(), now, now));
log.info(UserPathDto.setData("再次支付[新支付方式]", param, ntfPayResultVo));
SqlMapping.get("goblin_order.pay.again", param.getPayType(), param.getDeviceFrom(), NftPayResultVo.getCode(), param.getOrderId(), now, now));
log.info(UserPathDto.setData("再次支付[新支付方式]", param, NftPayResultVo));
}
return ResponseDto.success(ntfPayResultVo);
return ResponseDto.success(NftPayResultVo);*/
}
@Override
public ResponseDto<Integer> checkOrderResult(String orderId) {
String uid = CurrentUtil.getCurrentUid();
GoblinStoreOrderVo storeOrderVo = redisUtils.getGoblinOrder(orderId);
if (storeOrderVo == null) {
GoblinNftOrderVo nftOrder = nftOrderUtils.getNftOrder(orderId);
if (null == nftOrder || !nftOrder.getUserId().equals(uid)) {
return ResponseDto.failure("订单不存在");
} else {
if (!storeOrderVo.getUserId().equals(uid)) {
return null;
}
String returnCheckData = HttpUtil.get(checkUrl + "?code=" + storeOrderVo.getPayCode(), null);
ResponseDto<GoblinNtfOrderPayCallbackParam> syncOrderDtoParam = JsonUtils.fromJson(returnCheckData, new TypeReference<ResponseDto<GoblinNtfOrderPayCallbackParam>>() {
String returnCheckData = HttpUtil.get(checkUrl + "?code=" + nftOrder.getPayCode(), null);
ResponseDto<GoblinNftOrderPayCallbackParam> syncOrderDtoParam = JsonUtils.fromJson(returnCheckData, new TypeReference<ResponseDto<GoblinNftOrderPayCallbackParam>>() {
});
if (syncOrderDtoParam.getData().getStatus() == 1) {
//处理订单
......@@ -762,250 +393,132 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
}
@Override
public String syncOrder(GoblinNtfOrderPayCallbackParam syncOrderParam) {
log.debug("SYNC PARAM = " + syncOrderParam.toString());
//支付时间
LocalDateTime now = LocalDateTime.now();
String[] array = redisUtils.getMasterCode(syncOrderParam.getOrderCode());
String uid;
BigDecimal priceActual = BigDecimal.ZERO;
for (String orderId : array) {
GoblinStoreOrderVo orderVo = redisUtils.getGoblinOrder(orderId);
if (orderVo == null) {
log.error("订单号:" + syncOrderParam.getOrderCode() + " 订单不存在");
return "fail";//订单不存在
}
if (orderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_2.getValue()) {
public String syncOrder(GoblinNftOrderPayCallbackParam syncOrderParam) {
log.info("SYNC PARAM = " + syncOrderParam.toString());
String orderCode = syncOrderParam.getOrderCode();
String orderId = syncOrderParam.getOrderId();
GoblinNftOrderVo orderVo = nftOrderUtils.getNftOrder(orderId);
if (null == orderVo) {
log.error("Nft订单不存在 param:[orderCode:{}]", orderCode);
return "fail";
}
if (orderVo.getPayCode().equals(syncOrderParam.getCode())) {
log.error("订单号:" + syncOrderParam.getOrderCode() + " 重复支付");
return "fail";//重复支付
log.error("Nft订单payCode不匹配 param:[orderCode:{}, payCode:{}]", orderCode, syncOrderParam.getCode());
return "fail";
}
if (!Objects.equals(orderVo.getStatus(), GoblinStatusConst.NftStatus.ORDER_STATUS_2.getValue())) {
log.error("Nft订单当前状态不能支付回调 param:[orderCode:{}, status:{}]", orderCode, orderVo.getStatus());
return "fail";
}
// if (orderVo.getPriceActual().compareTo(syncOrderParam.getPrice()) != 0) {
// log.error("订单号:" + syncOrderParam.getOrderCode() + " 价格不符");
// return "fail";//价格不符
// }
priceActual = priceActual.add(orderVo.getPriceActual());
uid = orderVo.getUserId();
if (Objects.equals(1, syncOrderParam.getStatus())) {// 超时支付
if (Objects.equals(orderVo.getStatus(), GoblinStatusConst.NftStatus.ORDER_STATUS_3.getValue())) {
log.error("Nft订单超时支付 param:[orderCode:{}]", orderCode);
// 退款
nftOrderUtils.refundOrderSku(orderId, syncOrderParam.getPaymentId(), syncOrderParam.getPaymentType());
} else if (syncOrderParam.getStatus().equals(1)) {// 正常流程
LocalDateTime now = LocalDateTime.now();
String uid = orderVo.getUserId();
GoblinNftOrder nftOrder = GoblinNftOrder.getNew();
nftOrder.setPaymentType(syncOrderParam.getPaymentType());
nftOrder.setPaymentId(syncOrderParam.getPaymentId());
nftOrder.setPayCode(syncOrderParam.getCode());
LocalDateTime payTime = LocalDateTime.parse(syncOrderParam.getPaymentAt(), DTF_YMD_HMS);
nftOrder.setPayTime(payTime);
nftOrder.setStatus(GoblinStatusConst.NftStatus.ORDER_STATUS_2.getValue());
nftOrder.setUpdatedAt(now);
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataSku = CollectionUtil.linkedListObjectArr();
GoblinStoreOrder storeOrder = GoblinStoreOrder.getNew();
if (orderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_5.getValue() && syncOrderParam.getStatus().equals(1)) {
log.error("订单号为 {} 的订单超时支付", syncOrderParam.getOrderCode());
// 商铺退款逻辑
orderUtils.refundOrderSku(orderId, syncOrderParam.getPaymentId(), syncOrderParam.getPaymentType());
// orderVo.setStatus(GoblinStatusConst.OrderStatus.ORDER_STATUS_61.getValue());
// redisUtils.setGoblinOrder(orderVo.getOrderId(),orderVo);
} else if ((orderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_6.getValue() || orderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_7.getValue()) && syncOrderParam.getStatus().equals(1)) {
log.error("订单号为 {} 的订单正在退款 或者已退款", syncOrderParam.getOrderCode());
} else if (syncOrderParam.getStatus().equals(1)) {
log.error("订单号为 {} 的订单正常流程", syncOrderParam.getOrderCode());
storeOrder.setPaymentType(syncOrderParam.getPaymentType());
storeOrder.setPaymentId(syncOrderParam.getPaymentId());
storeOrder.setPayCode(syncOrderParam.getCode());
LocalDateTime payTime = LocalDateTime.parse(syncOrderParam.getPaymentAt(), DTF_YMD_HMS);
storeOrder.setPayTime(payTime);
if (orderVo.getWriteOffCode().equals("EMPTY")) {
storeOrder.setWriteOffCode(IDGenerator.getWriteOffCode());
} else {
storeOrder.setWriteOffCode("");
}
storeOrder.setStatus(GoblinStatusConst.Status.ORDER_STATUS_2.getValue());
storeOrder.setUpdatedAt(now);
sqls.add(SqlMapping.get("goblin_order.pay.order"));
sqls.add(SqlMapping.get("goblin_nft_order.update.pay"));
sqlDataOrder.add(new Object[]{
storeOrder.getPaymentType(), storeOrder.getPaymentId(), storeOrder.getPayCode(), storeOrder.getPayTime(), storeOrder.getWriteOffCode(), storeOrder.getStatus(), storeOrder.getUpdatedAt(),
nftOrder.getPaymentType(), nftOrder.getPaymentId(), nftOrder.getPayCode(),
nftOrder.getPayTime(), nftOrder.getStatus(), nftOrder.getUpdatedAt(),
orderId, now, now
});
sqls.add(SqlMapping.get("goblin_order.pay.sku"));
List<String> skuList = orderVo.getOrderSkuVoIds();
for (String orderSkuVoIds : skuList) {
GoblinOrderSkuVo orderSkuVo = redisUtils.getGoblinOrderSkuVo(orderSkuVoIds);
//增加销量
log.debug("增加销量 spuId=" + orderSkuVo.getSpuId() + ",skuId=" + orderSkuVo.getSkuId());
redisUtils.incrSkuSaleCount(orderSkuVo.getSpuId(), orderSkuVo.getSkuId(), orderSkuVo.getNum());
orderSkuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_2.getValue());
//redis
redisUtils.setGoblinOrderSku(orderSkuVo.getOrderSkuId(), orderSkuVo);
//mongo
mongoUtils.updateGoblinOrderSkuVo(orderSkuVo.getOrderSkuId(), orderSkuVo);
//mongo 添加操作日志
GoblinOrderLogVo logVo = GoblinOrderLogVo.getNew();
logVo.setOrderId(orderVo.getOrderId());
logVo.setOrderCode(orderVo.getOrderCode());
logVo.setPayCode(orderVo.getPayCode());
logVo.setStoreId(orderVo.getStoreId());
if (orderSkuVo.getSkuId().indexOf(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue()) > 0) {
logVo.setOrderType("zhengzai");
} else {
logVo.setOrderType("order");
}
logVo.setSpuId(orderSkuVo.getSpuId());
logVo.setSkuId(orderSkuVo.getSkuId());
logVo.setSkuPriceActual(orderSkuVo.getSkuPriceActual().multiply(new BigDecimal(100)).longValue());
logVo.setStatus(GoblinStatusConst.Status.ORDER_LOG_STATUS_11.getValue());
logVo.setRemark(GoblinStatusConst.Status.ORDER_LOG_STATUS_11.getDesc());
logVo.setOperationId(uid);
logVo.setOperationName(orderVo.getUserName());
logVo.setOperationType(GoblinStatusConst.Type.OPERATION_TYPE_1.getValue());
logVo.setCreatedAt(LocalDateTime.now());
mongoUtils.insertGoblinOrderLogVo(logVo);
//mysql
sqlDataSku.add(new Object[]{
GoblinStatusConst.Status.ORDER_STATUS_2.getValue(), now,
orderSkuVo.getOrderSkuId(), now, now
});
}
//redis
orderVo.setPayCode(storeOrder.getPayCode());
orderVo.setPayTime(syncOrderParam.getPaymentAt());
orderVo.setWriteOffCode(storeOrder.getWriteOffCode());
orderVo.setStatus(storeOrder.getStatus());
// redis
orderVo.setStatus(GoblinStatusConst.NftStatus.ORDER_STATUS_2.getValue());
orderVo.setPayCode(syncOrderParam.getCode());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parsedDate = LocalDateTime.parse(syncOrderParam.getPaymentAt(), formatter);
orderVo.setPayTime(parsedDate);
orderVo.setPaymentId(syncOrderParam.getPaymentId());
orderVo.setPaymentType(syncOrderParam.getPaymentType());
orderVo.setOrderSkuVoIds(skuList);
redisUtils.setGoblinOrder(orderId, orderVo);
redisUtils.setOffCode(orderVo.getWriteOffCode(), orderVo.getMasterOrderCode());
//mongo
mongoUtils.updateGoblinStoreOrderVo(orderId, orderVo);
//mysql
nftOrderUtils.setNftOrder(orderVo);
// mongo
goblinMongoUtils.updateGoblinNftOrderVo(orderVo);
// mysql
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CREATE_PAY.getKey(),
SqlMapping.gets(sqls, sqlDataOrder, sqlDataSku));
}
//发短信
// SmsEnum.ADTemplate adTemplate = null;
// if (orderTicketData.getGetTicketType().equals("express")) {
// adTemplate = SmsEnum.ADTemplate.SMS_225995308;
// } else if (orderTicketData.getGetTicketType().equals("electronic")) {
// adTemplate = ticketData.getIsShowCode() == 1 ? SmsEnum.ADTemplate.SMS_225995308 : SmsEnum.ADTemplate.SMS_225995308;
// }
//
// if (null != adTemplate) {
// queueUtils.sendMsgByRedis(MQConst.KylinQueue.SMS_NOTICE.getKey(),
// SmsMessage.builder().setPhone(orderTicketData.getUserMobile())
// .setSignName(SmsEnum.ADSignName.M02.getVal())
// .setTemplateCode(adTemplate.name())
// .setTemplateParam("name", orderTicketData.getPerformanceTitle())
// .setTemplateParam("time", time1 + " " + time2).toJson()
// );
// }
//加分
if (orderUtils.noZhengzaiOrder(uid)) {
orderUtils.doTask(uid, priceActual);
SqlMapping.gets(sqls, sqlDataOrder));
// 加积分
goblinOrderUtils.doTask(uid, orderVo.getPriceActual());
}
}
return "success";
}
@Override
public String refundSyncOrder(GoblinNtfOrderRefundCallbackParam refundCallbackParam) {
public String refundSyncOrder(GoblinNftOrderRefundCallbackParam refundCallbackParam) {
LocalDateTime now = LocalDateTime.now();
String nowStr = DateUtil.getNowTime();
log.info("refundCallback订单退款回调参数: [RefundCallbackParam={}]", refundCallbackParam);
GoblinBackOrderVo backOrderVo = mongoUtils.getGoblinBackOrderVoByBackCode(refundCallbackParam.getOrderRefundCode());
if (backOrderVo == null) {
log.info("refundCallback: 退款订单查询失败,编号{}", refundCallbackParam.getOrderRefundCode());
return "fail";
}
if (backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_LOG_STATUS_20.getValue() || backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_LOG_STATUS_201.getValue()) {
log.info("refundCallback: 退款订单已取消,编号{}", refundCallbackParam.getOrderRefundCode());
log.info("NftRefundCallback订单退款回调参数: [RefundCallbackParam={}]", refundCallbackParam);
GoblinNftOrderCallBackVo nftOrderRefundVo = goblinMongoUtils.getGoblinNftOrderRefundVo(refundCallbackParam.getOrderRefundCode());
if (nftOrderRefundVo == null) {
log.info("NftRefundCallback: 退款订单查询失败,编号{}", refundCallbackParam.getOrderRefundCode());
return "fail";
}
if (backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_LOG_STATUS_22.getValue()) {
log.info("refundCallback: 退款订单已完成,编号{}", refundCallbackParam.getOrderRefundCode());
if (nftOrderRefundVo.getStatus() == GoblinStatusConst.NftStatus.ORDER_REFUND_STATUS_2.getValue()) {
log.info("NftRefundCallback: 退款订单已完成,编号{}", refundCallbackParam.getOrderRefundCode());
return "success";
}
Integer status = refundCallbackParam.getStatus();
if (1 == status && (backOrderVo.getStatus() == 0 || backOrderVo.getStatus() == 10)) { // 退款成功
if (1 == status) { // 退款成功
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlsOrderSku = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlsBackOrder = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("goblin_order.store.refundPrice"));
sqls.add(SqlMapping.get("goblin_order.store.refundSkuPrice"));
sqls.add(SqlMapping.get("goblin_order.store.refundBackOrder"));
String orderId = backOrderVo.getOrderId();
List<GoblinBackOrderSkuVo> backOrderSkuVos = backOrderVo.getBackOrderSkuVos();
GoblinStoreOrderVo orderVo = redisUtils.getGoblinOrder(orderId);
orderVo.setPriceRefund(orderVo.getPriceRefund() == null ? BigDecimal.ZERO : orderVo.getPriceRefund().add(refundCallbackParam.getRefundPrice()));
if (orderVo.getPriceRefund().compareTo(orderVo.getPriceActual()) >= 0) {
sqls.add(SqlMapping.get("goblin_nft_order.update.refund"));
sqls.add(SqlMapping.get("goblin_nft_order_refund.refund"));
String orderId = nftOrderRefundVo.getOrderId();
GoblinNftOrderVo nftOrder = nftOrderUtils.getNftOrder(orderId);
//整单退款 退券
orderVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_6.getValue());
if (!(orderVo.getUcouponId() == null || orderVo.getUcouponId().equals(""))) {
orderUtils.backCoupon(orderVo.getUcouponId(), orderVo.getUserId());
nftOrder.setStatus(GoblinStatusConst.NftStatus.ORDER_STATUS_5.getValue());
if (StringUtil.isNotEmpty(nftOrder.getUcouponId())) {
goblinOrderUtils.backCoupon(nftOrder.getUcouponId(), nftOrder.getUserId());
}
if (!(orderVo.getStoreCouponId() == null || orderVo.getStoreCouponId().equals(""))) {
if (StringUtil.isNotEmpty(nftOrder.getStoreCouponId())) {
List<BackCouponParam> params = ObjectUtil.getBackCouponParam();
BackCouponParam backCouponParam = BackCouponParam.getNew();
backCouponParam.setuCouponIds(orderVo.getStoreCouponId());
backCouponParam.setUid(orderVo.getUserId());
backCouponParam.setuCouponIds(nftOrder.getStoreCouponId());
backCouponParam.setUid(nftOrder.getUserId());
params.add(backCouponParam);
orderUtils.backStoreCoupon(params);
}
}
backOrderVo.setStatus(GoblinStatusConst.Status.ORDER_BACK_STATUS_2.getValue());
backOrderVo.setRefundAt(nowStr);
for (GoblinBackOrderSkuVo backOrderSkuVo : backOrderSkuVos) {
GoblinOrderSkuVo orderSkuVo = redisUtils.getGoblinOrderSkuVo(backOrderSkuVo.getOrderSkuId());
BigDecimal refundSkuPrice = backOrderSkuVo.getRefundPrice();
orderSkuVo.setPriceRefund(orderSkuVo.getPriceRefund() == null ? refundSkuPrice : orderSkuVo.getPriceRefund().add(refundSkuPrice));
if (orderSkuVo.getPriceRefund().compareTo(orderSkuVo.getSkuPriceActual()) >= 0) {
orderSkuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_6.getValue());
String pre = GoblinStatusConst.MarketPreStatus.getPre(orderSkuVo.getSkuId());
String skuId = orderSkuVo.getSkuId();
redisUtils.incrSkuStock(pre, skuId, orderSkuVo.getNum());
redisUtils.decrSkuCountByUid(orderVo.getUserId(), skuId, orderSkuVo.getNum());
}
redisUtils.setGoblinOrderSku(backOrderSkuVo.getOrderSkuId(), orderSkuVo);
mongoUtils.updateGoblinOrderSkuVo(backOrderSkuVo.getOrderSkuId(), orderSkuVo);
sqlsOrderSku.add(new Object[]{
orderSkuVo.getPriceRefund(), orderSkuVo.getStatus(), now,
backOrderSkuVo.getOrderSkuId(), now, now
});
GoblinOrderLogVo logVo = GoblinOrderLogVo.getNew();
logVo.setOrderId(orderVo.getOrderId());
logVo.setOrderCode(orderVo.getOrderCode());
logVo.setPayCode(orderVo.getPayCode());
if (orderSkuVo.getSkuId().indexOf(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue()) > 0) {
logVo.setOrderType("zhengzai");
} else {
logVo.setOrderType("order");
}
logVo.setStoreId(orderVo.getStoreId());
logVo.setSpuId(orderSkuVo.getSpuId());
logVo.setSpuName(backOrderSkuVo.getSpuName());
logVo.setSkuId(backOrderSkuVo.getSkuId());
// if (orderVo.getStatus().equals(GoblinStatusConst.Status.ORDER_STATUS_6.getValue())) {
// refundSkuPrice = refundSkuPrice.add(orderVo.getPriceExpress());
// }
logVo.setSkuPriceActual(refundSkuPrice.multiply(BigDecimal.valueOf(100)).negate().longValue());
logVo.setStatus(GoblinStatusConst.Status.ORDER_LOG_STATUS_22.getValue());
logVo.setRemark("订单退款");
logVo.setOperationId(backOrderVo.getUserId());
logVo.setOperationType(GoblinStatusConst.Type.OPERATION_TYPE_2.getValue());
logVo.setCreatedAt(now);
mongoUtils.insertGoblinOrderLogVo(logVo);
goblinOrderUtils.backStoreCoupon(params);
}
nftOrderRefundVo.setStatus(GoblinStatusConst.NftStatus.ORDER_REFUND_STATUS_2.getValue());
nftOrderRefundVo.setRefundAt(now);
//redis
redisUtils.setGoblinOrder(orderId, orderVo);
redisUtils.setBackOrderVo(backOrderVo.getBackOrderId(), backOrderVo);
nftOrderUtils.setNftOrder(nftOrder);
nftOrderUtils.setBackOrderVo(nftOrderRefundVo);
//mongo
mongoUtils.updateGoblinStoreOrderVo(orderId, orderVo);
mongoUtils.updateGoblinBackOrderVo(backOrderVo.getBackOrderId(), backOrderVo);
goblinMongoUtils.updateGoblinNftOrderVo(nftOrder);
goblinMongoUtils.updateGoblinNftOrderRefundVo(nftOrderRefundVo);
//mysql
sqlsOrder.add(new Object[]{
orderVo.getPriceRefund(), orderVo.getStatus(), now,
nftOrder.getStatus(), now,
orderId, now, now
});
sqlsBackOrder.add(new Object[]{
backOrderVo.getStatus(), now, now, backOrderVo.getBackOrderId(), now, now
nftOrderRefundVo.getStatus(), now, now, nftOrderRefundVo.getOrderRefundId(), now, now
});
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_STORE_ORDER_OPERA.getKey(),
SqlMapping.gets(sqls, sqlsOrder, sqlsOrderSku, sqlsBackOrder));
SqlMapping.gets(sqls, sqlsOrder, sqlsBackOrder));
//减积分
orderUtils.desTask(orderVo.getUserId(), backOrderVo.getRealBackPrice());
goblinOrderUtils.desTask(nftOrder.getUserId(), nftOrderRefundVo.getRealBackPrice());
} else if (0 == status) {
return "fail";
}
......
......@@ -582,7 +582,7 @@ public class GoblinOrderServiceImpl implements IGoblinOrderService {
GoblinOrderAttrVo orderAttrVo = GoblinOrderAttrVo.getNew().copy(orderAttr);
//待支付发送队列
queueUtils.sendMsgByRedisGoblinStock(orderVo.getMasterOrderCode(), storeOrder.getCreatedAt());
queueUtils.sendMsgByRedisGoblinStock(orderVo.getMasterOrderCode(), storeOrder.getCreatedAt(), "GOBLIN");
//redis 赋值
orderVo.setOrderAttrVo(orderAttrVo);
orderVo.setOrderSkuVoIds(goblinOrderSkuIdList);
......
package com.liquidnet.service.order.utils;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtCouponFilterParam;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsFilterParam;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtNoticeFilterParam;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinMgtCategorySpecVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtCouponListVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtGoodsListVo;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinFrontBanner;
import com.liquidnet.service.goblin.entity.GoblinFrontHotWord;
import com.liquidnet.service.goblin.entity.GoblinFrontNavigation;
import com.mongodb.BasicDBObject;
import com.mongodb.bulk.BulkWriteResult;
import com.mongodb.client.model.UpdateOneModel;
import com.mongodb.client.model.WriteModel;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Component
public class GoblinMongoUtils {
......@@ -140,4 +107,33 @@ public class GoblinMongoUtils {
return mongoTemplate.insert(vo, GoblinBackOrderVo.class.getSimpleName());
}
/* --------------------------------NFT--------------------------------- */
// 订单详情vo
public void setGoblinNftOrderVo(GoblinNftOrderVo vo) {
mongoTemplate.insert(vo, GoblinNftOrderVo.class.getSimpleName());
}
public UpdateResult updateGoblinNftOrderVo(GoblinNftOrderVo data) {
BasicDBObject object = ObjectUtil.cloneBasicDBObject().append("$set", mongoConverter.convertToMongoType(data));
return mongoTemplate.getCollection(GoblinNftOrderVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderId").is(data.getOrderId())).getQueryObject(),
object);
}
//添加 订单退款数据
public GoblinNftOrderCallBackVo insertGoblinNftOrderRefundVo(GoblinNftOrderCallBackVo vo) {
return mongoTemplate.insert(vo, GoblinNftOrderCallBackVo.class.getSimpleName());
}
//获取 订单退款数据
public GoblinNftOrderCallBackVo getGoblinNftOrderRefundVo(String refundCode) {
return mongoTemplate.findOne(Query.query(Criteria.where("refundCode").is(refundCode)), GoblinNftOrderCallBackVo.class, GoblinNftOrderCallBackVo.class.getSimpleName());
}
//修改 订单退款数据
public UpdateResult updateGoblinNftOrderRefundVo(GoblinNftOrderCallBackVo data) {
BasicDBObject object = ObjectUtil.cloneBasicDBObject().append("$set", mongoConverter.convertToMongoType(data));
return mongoTemplate.getCollection(GoblinBackOrderVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderRefundId").is(data.getOrderRefundId())).getQueryObject(),
object);
}
}
package com.liquidnet.service.order.utils;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.candy.param.BackCouponParam;
import com.liquidnet.service.candy.vo.CandyUseResultVo;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinBackOrder;
import com.liquidnet.service.goblin.entity.GoblinBackOrderLog;
import com.liquidnet.service.goblin.entity.GoblinOrderSku;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderCallBackVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinUseResultVo;
import com.liquidnet.service.goblin.dto.vo.GoblinUserCouponVo;
import com.liquidnet.service.goblin.entity.GoblinNftOrderRefund;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
......@@ -22,13 +22,13 @@ import org.springframework.util.MultiValueMap;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
@Component
@Slf4j
public class GoblinNtfOrderUtils {
public class GoblinNftOrderUtils {
@Value("${liquidnet.service.adam.url}")
private String adamUrl;
......@@ -42,49 +42,95 @@ public class GoblinNtfOrderUtils {
private String refundApply;
@Autowired
QueueUtils queueUtils;
private QueueUtils queueUtils;
@Autowired
GoblinRedisUtils redisUtils;
private GoblinRedisUtils goblinRedisUtils;
@Autowired
GoblinMongoUtils goblinMongoUtils;
private RedisUtil redisUtil;
@Autowired
private GoblinMongoUtils goblinMongoUtils;
@Autowired
private GoblinOrderUtils goblinOrderUtils;
// 库存
public int decrSkuStock(String skuId, Integer stock) {
String redisKey = GoblinRedisConst.REAL_STOCK_SKU.concat(skuId);
return (int) redisUtil.decr(redisKey, stock);
}
//判断 数量限购
public String judgeOrderLimit(String uid, String skuId, int number, int limitCount) {
int buyCount = redisUtils.incrSkuCountByUid(uid, skuId, number);
if (buyCount > limitCount) {
// redisUtils.decrSkuCountByUid(uid, skuId, number);
return "已超出限购数量";
public int incrSkuStock(String skuId, Integer stock) {
String redisKey = GoblinRedisConst.REAL_STOCK_SKU.concat(skuId);
return (int) redisUtil.incr(redisKey, stock);
}
// 是否是会员
public boolean isVipMember(String uid) {
Integer member = goblinRedisUtils.getMember(uid);
if (null == member) {
return false;
} else {
return "";
return true;
}
}
//判断指定人群购买
public Boolean judgeOrderRose(Boolean isMember, String skuId, String mobile, int buyFactor) {
Boolean result = false;
switch (buyFactor) {
case 0:
result = true;
break;
case 1:
result = isMember;
break;
case 2:
result = redisUtils.getSkuCanBuyByUid(mobile, skuId);
break;
// 订单详情vo
public void setNftOrder(GoblinNftOrderVo vo) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_INFO.concat(vo.getOrderId());
redisUtil.set(redisKey, vo);
}
// 获取 订单详情vo
public GoblinNftOrderVo getNftOrder(String orderId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_INFO.concat(orderId);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return null;
} else {
return (GoblinNftOrderVo) obj;
}
}
// 添加 订单id列表
public void addNftOrderList(String uid, String orderId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_USER_ID_LIST.concat(uid);
List<String> list = getNftOrderList(uid);
if (list.size() >= 40) {
list.remove(0);
list.add(orderId);
} else {
list.add(orderId);
}
return result;
redisUtil.set(redisKey, list);
}
// 获取 订单id列表
public List<String> getNftOrderList(String uid) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_USER_ID_LIST.concat(uid);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
} else {
return (List<String>) obj;
}
}
// 退款订单vo
public void setBackOrderVo(GoblinNftOrderCallBackVo vo) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_REFUND_INFO.concat(vo.getOrderRefundId());
redisUtil.set(redisKey, vo);
}
/**
* 使用优惠券
* 使用平台优惠券
*
* @param uCouponId 券id
* @param content 消费内容
* @param totalPrice 订单总价
* @param spuId spuId
* @param uid uid
* @return
*/
public HashMap<String, Object> useCoupon(String uCouponId, String content, BigDecimal totalPrice, String spuId, String uid, List<GoblinOrderSku> goblinOrderSkuList) {
public HashMap<String, Object> useCoupon(String uCouponId, String content, BigDecimal totalPrice, String spuId, String uid) {
HashMap<String, Object> hashMap = CollectionUtil.mapStringObject();
try {
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
......@@ -96,21 +142,22 @@ public class GoblinNtfOrderUtils {
params.add("timeId", "null");
params.add("ticketId", "null");
params.add("uid", uid);
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Authorization", "Bearer " + CurrentUtil.getToken());
header.add("Accept", "application/json;charset=UTF-8");
log.debug("url=" + candyUrl + "/candy-coupon/use");
String returnData = HttpUtil.post(candyUrl + "/candy-coupon/use", params, header);
ResponseDto<CandyUseResultVo> innerReturnVo = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<CandyUseResultVo>>() {
String returnData = HttpUtil.post(candyUrl.concat("/candy-coupon/use"), params, header);
ResponseDto<CandyUseResultVo> useResultVo = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<CandyUseResultVo>>() {
});
CandyUseResultVo candyUseResultVo = innerReturnVo.getData();
CandyUseResultVo candyUseResultVo = useResultVo.getData();
Integer type = candyUseResultVo.getCouType();
List<String> targetList = candyUseResultVo.getTargetIds();
BigDecimal fullValue = candyUseResultVo.getFullValue();
BigDecimal value = candyUseResultVo.getValue();
BigDecimal voucher = BigDecimal.ZERO;
BigDecimal targetPrice = BigDecimal.ZERO;
switch (type) {
switch (type) {// 券类型[-1-不可用 | 1-代金券|2-满减券|3-兑换券|4-折扣券|101-优先券]
case -1:
voucher = BigDecimal.valueOf(-1);
break;
......@@ -119,15 +166,8 @@ public class GoblinNtfOrderUtils {
targetPrice = totalPrice;
} else {
for (String targetId : targetList) {
for (GoblinOrderSku skuOrderVo : goblinOrderSkuList) {
String orderVoSpuId = skuOrderVo.getSpuId();
String pre = GoblinStatusConst.MarketPreStatus.getPre(orderVoSpuId);
if (pre != null) {
orderVoSpuId = orderVoSpuId.split(pre)[0];
}
if (targetId.equals(orderVoSpuId)) {
targetPrice = targetPrice.add(skuOrderVo.getSkuPriceActual());
}
if (targetId.equals(spuId)) {
targetPrice = totalPrice;
}
}
}
......@@ -137,27 +177,20 @@ public class GoblinNtfOrderUtils {
voucher = voucher.add(targetPrice);
}
break;
case 2://满减
case 2:
if (targetList.size() == 0) {
targetPrice = totalPrice;
} else {
for (String targetId : targetList) {
for (GoblinOrderSku skuOrderVo : goblinOrderSkuList) {
String orderVoSpuId = skuOrderVo.getSpuId();
String pre = GoblinStatusConst.MarketPreStatus.getPre(orderVoSpuId);
if (pre != null) {
orderVoSpuId = orderVoSpuId.split(pre)[0];
}
if (targetId.equals(orderVoSpuId)) {
targetPrice = targetPrice.add(skuOrderVo.getSkuPriceActual());
}
if (targetId.equals(spuId)) {
targetPrice = totalPrice;
}
}
}
if (fullValue.compareTo(targetPrice) <= 0) {
voucher = voucher.add(value);
} else {
backCoupon(uCouponId, uid);
goblinOrderUtils.backCoupon(uCouponId, uid);
hashMap.put("type", -1);
hashMap.put("voucher", BigDecimal.ZERO);
return hashMap;
......@@ -166,15 +199,13 @@ public class GoblinNtfOrderUtils {
case 3:
voucher = voucher.add(totalPrice);
break;
case 4://折扣
case 4:
if (targetList.size() == 0) {
targetPrice = totalPrice;
} else {
for (String targetId : targetList) {
for (GoblinOrderSku skuOrderVo : goblinOrderSkuList) {
if (targetId.equals(skuOrderVo.getSpuId())) {
targetPrice = targetPrice.add(skuOrderVo.getSkuPriceActual());
}
if (targetId.equals(spuId)) {
targetPrice = totalPrice;
}
}
}
......@@ -194,64 +225,26 @@ public class GoblinNtfOrderUtils {
}
}
public void backCoupon(String uCouponId, String uid) {
try {
BackCouponParam param = BackCouponParam.getNew();
param.setuCouponIds(uCouponId);
param.setUid(uid);
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Authorization", "Bearer " + CurrentUtil.getToken());
header.add("Accept", "application/json;charset=UTF-8");
ArrayList<BackCouponParam> params = new ArrayList();
params.add(param);
String jsonString = JSON.toJSONString(params);
String returnData = HttpUtil.postRaw(candyUrl + "/candy-coupon/useBack", jsonString, header);
} catch (Exception e) {
log.error("回退券ERROR:{}", e);
}
}
public void doTask(String uid, BigDecimal price) {
try {
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
params.add("score", price.intValue() + "");
params.add("content", "购买商品:");
params.add("uid", uid);
String resultData = HttpUtil.post(stoneUrl + "/user/logs/in2111", params, header);
} catch (Exception e) {
log.error("添加积分失败,e:{}", e);
e.printStackTrace();
}
}
public void desTask(String uid, BigDecimal price) {
try {
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
params.add("score", price.intValue() + "");
params.add("content", "购买商品:");
params.add("uid", uid);
String resultData = HttpUtil.post(stoneUrl + "/user/logs/de2111", params, header);
} catch (Exception e) {
log.error("添加积分失败,e:{}", e);
e.printStackTrace();
}
}
public GoblinUseResultVo useStoreCoupon(String ucouponId, String content, BigDecimal totalPrice, List<GoblinOrderSku> goblinOrderSkuList, String uid) {
/**
* 使用店铺优惠券
*
* @param uCouponId 券id
* @param content 消费内容
* @param totalPrice 订单总价
* @param spuId spuId
* @param uid uid
* @return
*/
public GoblinUseResultVo useStoreCoupon(String uCouponId, String content, BigDecimal totalPrice, String spuId, String uid) {
try {
List<GoblinUserCouponVo> voList = redisUtils.getUserCouponVos(uid);
List<GoblinUserCouponVo> voList = goblinRedisUtils.getUserCouponVos(uid);
GoblinUseResultVo returnVo = GoblinUseResultVo.getNew();
returnVo.setValue(BigDecimal.ZERO);
returnVo.setCouType("-1");
LocalDateTime now = LocalDateTime.now();
List<String> spuIds = CollectionUtil.linkedListString();
for (GoblinUserCouponVo vo : voList) {
if (vo.getUcouponId().equals(ucouponId) && vo.getDuedAt().isAfter(now)) {
if (vo.getUcouponId().equals(uCouponId) && vo.getDuedAt().isAfter(now)) {
//判断券状态 和 触发金额
if ((vo.getState().equals(1))) {
if (vo.getUseScope().equals("0") && vo.getTriggers().compareTo(totalPrice) <= 0) {
......@@ -276,22 +269,15 @@ public class GoblinNtfOrderUtils {
SqlMapping.get("goblin_user_coupon.updateState", vo.getState(), vo.getUsedFor(), LocalDateTime.now(), vo.getUcouponId()));
break;
} else {
spuIds = redisUtils.getStoreCouponSpuIds(vo.getStoreCouponId());
spuIds = goblinRedisUtils.getStoreCouponSpuIds(vo.getStoreCouponId());
if (spuIds == null || spuIds.size() == 0) {
continue;
}
//判断是否在可用商品内
BigDecimal contentPrice = BigDecimal.ZERO;
for (String item : spuIds) {
for (GoblinOrderSku param : goblinOrderSkuList) {
String spuId = param.getSpuId();
String pre = GoblinStatusConst.MarketPreStatus.getPre(spuId);
if (pre != null) {
spuId = spuId.split(pre)[0];
}
if (spuId.equals(item)) {
contentPrice = contentPrice.add(param.getSkuPriceActual());
}
contentPrice = totalPrice;
}
}
if (vo.getTriggers().compareTo(contentPrice) <= 0) {
......@@ -330,7 +316,7 @@ public class GoblinNtfOrderUtils {
}
}
if (!returnVo.getCouType().equals("-1")) {
redisUtils.setUserCouponVos(uid, voList);
goblinRedisUtils.setUserCouponVos(uid, voList);
}
returnVo.setSpuIds(spuIds);
return returnVo;
......@@ -340,125 +326,56 @@ public class GoblinNtfOrderUtils {
}
}
public Boolean backStoreCoupon(List<com.liquidnet.service.goblin.param.BackCouponParam> params) {
try {
for (com.liquidnet.service.goblin.param.BackCouponParam item : params) {
List<GoblinUserCouponVo> voList = redisUtils.getUserCouponVos(item.getUid());
for (GoblinUserCouponVo vo : voList) {
if (vo.getUcouponId().equals(item.getuCouponIds())) {
if (LocalDateTime.now().isBefore(vo.getDuedAt())) {
vo.setState(1);
vo.setUsedFor("");
redisUtils.setUserCouponVos(item.getUid(), voList);
goblinMongoUtils.changeCouponVos(vo.getUcouponId(), vo);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_COUPON.getKey(),
SqlMapping.get("goblin_user_coupon.updateState", vo.getState(), vo.getUsedFor(), LocalDateTime.now(), vo.getUcouponId()));
}
break;
}
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public Integer getMember(String uid) {
return redisUtils.getMember(uid);
}
//超时支付自动退款
public Boolean refundOrderSku(String orderId, String paymentId, String paymentType) {
int autoSize = redisUtils.getBackOrderByOrderId(orderId).size();
if (autoSize > 0) {
return true;
}
String uid = CurrentUtil.getCurrentUid();
LocalDateTime now = LocalDateTime.now();
String nowStr = DateUtil.getNowTime();
List<GoblinBackOrderSkuVo> orderSkuVoList = ObjectUtil.goblinBackOrderSkuVoArrayList();
GoblinStoreOrderVo orderVo = redisUtils.getGoblinOrder(orderId);
BigDecimal refundPrice = BigDecimal.ZERO;
for (String orderSkuIdItem : orderVo.getOrderSkuVoIds()) {
GoblinOrderSkuVo orderSkuVo = redisUtils.getGoblinOrderSkuVo(orderSkuIdItem);
GoblinBackOrderSkuVo backOrderSkuVo = GoblinBackOrderSkuVo.getNew();
backOrderSkuVo.setOrderSkuId(orderSkuIdItem);
backOrderSkuVo.setSpuId(orderSkuVo.getSpuId());
backOrderSkuVo.setSpuName(orderSkuVo.getSpuName());
backOrderSkuVo.setSkuId(orderSkuVo.getSkuId());
backOrderSkuVo.setSkuName(orderSkuVo.getSkuName());
backOrderSkuVo.setRefundPrice(orderSkuVo.getSkuPriceActual());
backOrderSkuVo.setSkuSpecs(orderSkuVo.getSkuSpecs());
backOrderSkuVo.setCreatedAt(nowStr);
backOrderSkuVo.setSkuPic(orderSkuVo.getSkuImage());
orderSkuVoList.add(backOrderSkuVo);
refundPrice = refundPrice.add(orderSkuVo.getSkuPriceActual().subtract(orderSkuVo.getPriceRefund()));
}
GoblinNftOrderVo NftOrder = getNftOrder(orderId);
BigDecimal refundPrice = NftOrder.getPriceActual();
//记录退款单
String refundCode = IDGenerator.storeRefundCode(orderVo.getMasterOrderCode());
GoblinBackOrder goblinBackOrder = GoblinBackOrder.getNew();
goblinBackOrder.setBackOrderId(IDGenerator.nextTimeId2());
goblinBackOrder.setBackCode(refundCode);
goblinBackOrder.setOrderId(orderVo.getOrderId());
goblinBackOrder.setOrderCode(orderVo.getOrderCode());
goblinBackOrder.setStoreId(orderVo.getStoreId());
goblinBackOrder.setUserId(orderVo.getUserId());
// goblinBackOrder.setSkuIdNums(orderSkuId);
goblinBackOrder.setType(GoblinStatusConst.Type.BACK_TYPE_1.getValue());
goblinBackOrder.setReason(GoblinStatusConst.Type.BACK_REASON_TYPE_10.getDesc());
goblinBackOrder.setDescribes("超时支付自动退款");
refundPrice = refundPrice.add(orderVo.getPriceExpress());
goblinBackOrder.setRealBackPrice(refundPrice);
goblinBackOrder.setStatus(GoblinStatusConst.Status.ORDER_BACK_STATUS_0.getValue());
goblinBackOrder.setAuditAt(now);
goblinBackOrder.setCreatedAt(now);
GoblinBackOrderVo backOrderVo = GoblinBackOrderVo.getNew().copy(goblinBackOrder);
backOrderVo.setCreatedAt(nowStr);
backOrderVo.setBackOrderSkuVos(orderSkuVoList);
//添加日志
GoblinBackOrderLog backOrderLog = initBackLog(goblinBackOrder.getBackOrderId(), uid, now);
backOrderLog.setStatus(GoblinStatusConst.Status.ORDER_LOG_STATUS_22.getValue());
backOrderLog.setOperationType(GoblinStatusConst.Type.OPERATION_TYPE_2.getValue());
backOrderLog.setMessage("商户发起[自动退款]:orderId=[" + orderId + "],refundPrice=[" + refundPrice + "],[refundCode=" + refundCode + "]");
String refundCode = IDGenerator.storeRefundCode(NftOrder.getOrderCode());
GoblinNftOrderRefund nftBackOrder = GoblinNftOrderRefund.getNew();
nftBackOrder.setOrderRefundId(IDGenerator.nextTimeId2());
nftBackOrder.setRefundCode(refundCode);
nftBackOrder.setOrderId(orderId);
nftBackOrder.setOrderCode(NftOrder.getOrderCode());
nftBackOrder.setStoreId(NftOrder.getStoreId());
nftBackOrder.setUserId(NftOrder.getUserId());
nftBackOrder.setSkuIdNums(NftOrder.getSkuId());
nftBackOrder.setRealBackPrice(refundPrice);
nftBackOrder.setStatus(GoblinStatusConst.NftStatus.ORDER_REFUND_STATUS_1.getValue());
nftBackOrder.setCreatedAt(now);
nftBackOrder.setUpdatedAt(now);
GoblinNftOrderCallBackVo backOrderVo = GoblinNftOrderCallBackVo.getNew().copy(nftBackOrder);
//调用退款
orderVo.setPaymentId(paymentId);
orderVo.setPaymentType(paymentType);
String returnString = initRefund(orderVo, refundPrice, refundCode);
NftOrder.setPaymentId(paymentId);
NftOrder.setPaymentType(paymentType);
String returnString = initRefund(NftOrder, refundPrice, refundCode);
HashMap hashMapResult = JsonUtils.fromJson(returnString, HashMap.class);
Boolean success = (Boolean) hashMapResult.get("success");
String message = (String) hashMapResult.get("message");
if (!success) {
if (!(backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_BACK_STATUS_8.getValue() || backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_BACK_STATUS_2.getValue())) {
backOrderVo.setStatus(GoblinStatusConst.Status.ORDER_BACK_STATUS_10.getValue());
if (!Objects.equals(backOrderVo.getStatus(), GoblinStatusConst.NftStatus.ORDER_REFUND_STATUS_2.getValue())) {
backOrderVo.setStatus(GoblinStatusConst.NftStatus.ORDER_REFUND_STATUS_3.getValue());
backOrderVo.setErrorReason(backOrderVo.getErrorReason() + ",失败原因:" + message);
log.error("REFUND DATA = " + returnString);
}
}
//redis
redisUtils.setBackOrderVo(backOrderVo.getBackOrderId(), backOrderVo);
redisUtils.addBackOrderByOrderId(orderVo.getOrderId(), backOrderVo.getBackOrderId());
//mongo
goblinMongoUtils.insertGoblinBackOrderVo(backOrderVo);
//添加退款
// redis
setBackOrderVo(backOrderVo);
// mongo
goblinMongoUtils.insertGoblinNftOrderRefundVo(backOrderVo);
// 添加退款
queueUtils.sendMsgByRedis(
MQConst.GoblinQueue.GOBLIN_STORE_ORDER_OPERA.getKey(),
SqlMapping.get("goblin_order.store.backOrder",
goblinBackOrder.getBackOrderId(), goblinBackOrder.getBackCode(), goblinBackOrder.getOrderId(),
goblinBackOrder.getOrderCode(), goblinBackOrder.getStoreId(), goblinBackOrder.getUserId(),
goblinBackOrder.getSkuIdNums(), goblinBackOrder.getType(), goblinBackOrder.getReason(),
goblinBackOrder.getDescribes(), goblinBackOrder.getRealBackPrice(), goblinBackOrder.getStatus(),
goblinBackOrder.getCreatedAt(), goblinBackOrder.getAuditAt(), goblinBackOrder.getErrorReason()
)
);
//添加日志
queueUtils.sendMsgByRedis(
MQConst.GoblinQueue.GOBLIN_STORE_ORDER_OPERA.getKey(),
SqlMapping.get("goblin_order.store.refundLog",
backOrderLog.getBackOrderLogId(), backOrderLog.getBackOrderId(), backOrderLog.getOperationType(),
backOrderLog.getMessage(), backOrderLog.getOperationName(), backOrderLog.getStatus(), now
SqlMapping.get("goblin_nft_order_refund.insert",
nftBackOrder.getOrderRefundId(), nftBackOrder.getRefundCode(), nftBackOrder.getOrderId(),
nftBackOrder.getOrderCode(), nftBackOrder.getStoreId(), nftBackOrder.getUserId(),
nftBackOrder.getSkuIdNums(), nftBackOrder.getRealBackPrice(), nftBackOrder.getStatus(),
nftBackOrder.getRefundAt(), nftBackOrder.getErrorReason()
)
);
if (success) {
......@@ -469,28 +386,17 @@ public class GoblinNtfOrderUtils {
}
}
private GoblinBackOrderLog initBackLog(String orderId, String uid, LocalDateTime now) {
GoblinBackOrderLog log = GoblinBackOrderLog.getNew();
log.setBackOrderId(orderId);
log.setOperationName(uid);
log.setBackOrderLogId(IDGenerator.nextTimeId2());
log.setCreatedAt(now);
return log;
}
private String initRefund(GoblinStoreOrderVo orderVo, BigDecimal price, String refundCode) {
private String initRefund(GoblinNftOrderVo orderVo, BigDecimal price, String refundCode) {
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
params.add("code", orderVo.getPayCode());
params.add("notifyUrl", synUrl);
params.add("orderCode", orderVo.getMasterOrderCode());
params.add("orderCode", orderVo.getOrderCode());
params.add("orderRefundCode", refundCode);
params.add("paymentId", orderVo.getPaymentId());
params.add("paymentType", orderVo.getPaymentType());
params.add("price", String.valueOf(price));
BigDecimal totalPrice = BigDecimal.ZERO;
totalPrice = totalPrice.add(price);
params.add("priceTotal", String.valueOf(totalPrice));
params.add("reason", "超时支付");
params.add("priceTotal", String.valueOf(price));
params.add("reason", "NFT超时支付");
MultiValueMap<String, String> headers = CollectionUtil.linkedMultiValueMapStringString();
headers.add("Accept", "application/json;charset=UTF-8");
String returnString = HttpUtil.post(refundApply, params, headers);
......@@ -498,44 +404,4 @@ public class GoblinNtfOrderUtils {
return returnString;
}
//订单异常处理
public ResponseDto<GoblinNtfPayResultVo> orderException(List<String> skuAndPreListAndNumber, List<String> platformCodeList, List<String> storeCodeList, String uid, String message) {
long time3 = System.currentTimeMillis();
//回顾限购 回滚库存
for (String item : skuAndPreListAndNumber) {
String[] array = item.split(",");
String skuId = array[0];
String pre = array[1];
int number = Integer.parseInt(array[2]);
redisUtils.incrSkuStock(pre, skuId, number);
if (noZhengzaiOrder(uid)) {
redisUtils.decrSkuCountByUid(uid, skuId, number);
}
}
//回退平台券
for (String platformCode : platformCodeList) {
backCoupon(platformCode, uid);
}
//回退店铺券
List<com.liquidnet.service.goblin.param.BackCouponParam> params = ObjectUtil.getBackCouponParam();
for (String storeCode : storeCodeList) {
com.liquidnet.service.goblin.param.BackCouponParam backCouponParam = com.liquidnet.service.goblin.param.BackCouponParam.getNew();
backCouponParam.setuCouponIds(storeCode);
backCouponParam.setUid(uid);
params.add(backCouponParam);
}
if (params.size() > 0) {
backStoreCoupon(params);
}
log.info("回滚逻辑 " + (System.currentTimeMillis() - time3) + "ms");
if (message == null && !message.equals("")) {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
} else {
return ResponseDto.failure(message);//乱七八糟异常
}
}
public boolean noZhengzaiOrder(String uid) {
return !uid.equals("zhengzai");
}
}
......@@ -51,7 +51,7 @@ public class QueueUtils {
* @param createTime 订单创建时间
* @param masterOrderCode Goblin主订单号
*/
public void sendMsgByRedisGoblinStock(String masterOrderCode, LocalDateTime createTime) {
public void sendMsgByRedisGoblinStock(String masterOrderCode, LocalDateTime createTime, String type) {
String streamKey;
int key = createTime.getMinute() % 10;
switch (key) {
......@@ -88,7 +88,7 @@ public class QueueUtils {
}
HashMap<String, String> map = ObjectUtil.cloneHashMapStringAndString();
map.put("id", masterOrderCode);
map.put("type", "GOBLIN");
map.put("type", type);
map.put("time", createTime.toString());
stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(streamKey));
}
......
......@@ -45,3 +45,10 @@ goblin_user_coupon.updateState=UPDATE goblin_user_coupon SET state = ? , used_fo
#----
goblin_order.store.refundLog=INSERT INTO goblin_back_order_log (`back_order_log_id`,`back_order_id`,`operation_type`,`message`,`operation_name`,`status`,`created_at`) VALUES(?,?,?,?,?,?,?)
goblin_order.store.backOrder=INSERT INTO goblin_back_order (`back_order_id`,`back_code`,`order_id`,`order_code`,`store_id`,`user_id`,`sku_id_nums`,`type`,`reason`,`describes`,`real_back_price`,`status`,`created_at`,`audit_at`,`error_reason`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
#-------- NFT -------
goblin_nft_order.insert=INSERT INTO goblin_nft_order (`order_id`,`store_id`,`store_name`,`order_code`,`user_id`,`user_name`,`user_mobile`,`price_total`,`pay_code`,`price_actual`,`price_coupon`,`store_price_coupon`,`price_voucher`,`status`,`ucoupon_id`,`store_coupon_id`,`pay_type`,`device_from`,`source`,`version`,`is_member`,`order_type`,`pay_countdown_minute`,`ip_address`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_nft_order.update.pay=UPDATE goblin_nft_order SET payment_type = ?, payment_id=?, pay_code = ?, pay_time = ?, status = ?, updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
goblin_nft_order.update.refund=UPDATE goblin_nft_order SET status = ?, updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
goblin_nft_order_refund.insert=INSERT INTO goblin_nft_order_refund (`order_refund_id`,`refund_code`,`order_id`,`order_code`,`store_id`,`user_id`,`sku_id_nums`,`real_back_price`,`status`,`refund_at`,`error_reason`) VALUES (?,?,?,?,?,?,?,?,?,?,?)
goblin_nft_order_refund.refund=UPDATE goblin_nft_order_refund SET status = ?, refund_at = ?, updated_at = ? WHERE order_refund_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
\ 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