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

Commit 9beb92d3 authored by 胡佳晨's avatar 胡佳晨

提交 混合售相关下单接口 除回调

parent b6dfd2f4
...@@ -19,6 +19,8 @@ public class GoblinMixDetailsItemVo implements Serializable, Cloneable { ...@@ -19,6 +19,8 @@ public class GoblinMixDetailsItemVo implements Serializable, Cloneable {
private String skuPic; private String skuPic;
@ApiModelProperty(value = "sku名称") @ApiModelProperty(value = "sku名称")
private String skuName; private String skuName;
@ApiModelProperty(value = "spu名称")
private String spuName;
@ApiModelProperty(value = "商品类型[1-商城|2-数字藏品]") @ApiModelProperty(value = "商品类型[1-商城|2-数字藏品]")
private String position; private String position;
@ApiModelProperty(value = "sku原价") @ApiModelProperty(value = "sku原价")
......
...@@ -142,6 +142,20 @@ public class GoblinNftOrderVo implements Serializable, Cloneable { ...@@ -142,6 +142,20 @@ public class GoblinNftOrderVo implements Serializable, Cloneable {
@ApiModelProperty(value = "更新时间") @ApiModelProperty(value = "更新时间")
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
@ApiModelProperty(value = "混合售id")
private String mixId;
@ApiModelProperty(value = "混合售名称")
private String mixName;
public String getMixId() {
return mixId == null ? "" : mixId;
}
public String getMixName() {
return mixName == null ? "" : mixName;
}
public GoblinNftOrderVo copy(GoblinNftOrder source) { public GoblinNftOrderVo copy(GoblinNftOrder source) {
if (null == source) return this; if (null == source) return this;
this.setOrderId(source.getOrderId()); this.setOrderId(source.getOrderId());
...@@ -180,6 +194,46 @@ public class GoblinNftOrderVo implements Serializable, Cloneable { ...@@ -180,6 +194,46 @@ public class GoblinNftOrderVo implements Serializable, Cloneable {
return this; return this;
} }
public GoblinNftOrderVo copyMix(GoblinNftOrder source,String mixId,String mixName) {
if (null == source) return this;
this.setOrderId(source.getOrderId());
this.setSpuId(source.getSpuId());
this.setSkuId(source.getSkuId());
this.setSkuTitle(source.getSkuTitle());
this.setBoxSkuId(source.getBoxSkuId());
this.setNum(source.getNum());
this.setStoreId(source.getStoreId());
this.setStoreName(source.getStoreName());
this.setOrderCode(source.getOrderCode());
this.setUserId(source.getUserId());
this.setUserName(source.getUserName());
this.setUserMobile(source.getUserMobile());
this.setListId(source.getListId());
this.setExCode(source.getExCode());
this.setPriceTotal(source.getPriceTotal());
this.setPriceCoupon(source.getPriceCoupon());
this.setStorePriceCoupon(source.getStorePriceCoupon());
this.setPriceRedEnvelope(source.getPriceRedEnvelope());
this.setPriceVoucher(source.getPriceVoucher());
this.setPriceActual(source.getPriceActual());
this.setUcouponId(source.getUcouponId());
this.setStoreCouponId(source.getStoreCouponId());
this.setRedEnvelopeCode(source.getRedEnvelopeCode());
this.setStatus(source.getStatus());
this.setSource(source.getSource());
this.setOrderType(source.getOrderType());
this.setPayType(source.getPayType());
this.setDeviceFrom(source.getDeviceFrom());
this.setVersion(source.getVersion());
this.setPayCountdownMinute(source.getPayCountdownMinute());
this.setPayCode(source.getPayCode());
this.setIpAddress(source.getIpAddress());
this.setCreatedAt(source.getCreatedAt());
this.setMixId(mixId);
this.setMixName(mixName);
return this;
}
private static final GoblinNftOrderVo obj = new GoblinNftOrderVo(); private static final GoblinNftOrderVo obj = new GoblinNftOrderVo();
public static GoblinNftOrderVo getNew() { public static GoblinNftOrderVo getNew() {
......
...@@ -121,6 +121,11 @@ public class GoblinStoreOrderVo implements Serializable, Cloneable { ...@@ -121,6 +121,11 @@ public class GoblinStoreOrderVo implements Serializable, Cloneable {
@ApiModelProperty(value = "orderSkuId") @ApiModelProperty(value = "orderSkuId")
private List<String> orderSkuVoIds; private List<String> orderSkuVoIds;
@ApiModelProperty(value = "混合售id")
private String mixId;
@ApiModelProperty(value = "混合售名称")
private String mixName;
public BigDecimal getPriceModify() { public BigDecimal getPriceModify() {
if (priceModify == null) { if (priceModify == null) {
return BigDecimal.ZERO; return BigDecimal.ZERO;
...@@ -135,6 +140,14 @@ public class GoblinStoreOrderVo implements Serializable, Cloneable { ...@@ -135,6 +140,14 @@ public class GoblinStoreOrderVo implements Serializable, Cloneable {
return priceVoucher; return priceVoucher;
} }
public String getMixId() {
return mixId == null ? "" : mixId;
}
public String getMixName() {
return mixName == null ? "" : mixName;
}
public GoblinStoreOrderVo copy(GoblinStoreOrder source) { public GoblinStoreOrderVo copy(GoblinStoreOrder source) {
if (null == source) return this; if (null == source) return this;
...@@ -186,6 +199,53 @@ public class GoblinStoreOrderVo implements Serializable, Cloneable { ...@@ -186,6 +199,53 @@ public class GoblinStoreOrderVo implements Serializable, Cloneable {
return this; return this;
} }
public GoblinStoreOrderVo copyMix(GoblinStoreOrder source,String mixId,String mixName) {
if (null == source) return this;
this.setOrderId(source.getOrderId());
this.setStoreId(source.getStoreId());
this.setStoreName(source.getStoreName());
this.setMasterOrderCode(source.getMasterOrderCode());
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.setPriceRefund(source.getPriceRefund());
this.setPriceExpress(source.getPriceExpress());
this.setPriceModify(source.getPriceModify());
this.setPriceCoupon(source.getPriceCoupon());
this.setStorePriceCoupon(source.getStorePriceCoupon());
this.setPriceVoucher(source.getPriceVoucher());
this.setStatus(source.getStatus());
this.setZhengzaiStatus(source.getZhengzaiStatus());
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.setLotteryStatus(source.getLotteryStatus());
this.setWriteOffCode(source.getWriteOffCode());
this.setPayCountdownMinute(source.getPayCountdownMinute());
this.setMailNo(source.getMailNo());
this.setLogisticsCompany(source.getLogisticsCompany());
this.setLogisticsCode(source.getLogisticsCode());
this.setIpAddress(source.getIpAddress());
this.setPaymentId(source.getPaymentId());
this.setPaymentType(source.getPaymentType());
this.setMarketType(source.getMarketType());
this.setMarketId(source.getMarketId());
this.setCreatedAt(source.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
this.setMixId(mixId);
this.setMixName(mixName);
return this;
}
private static final GoblinStoreOrderVo obj = new GoblinStoreOrderVo(); private static final GoblinStoreOrderVo obj = new GoblinStoreOrderVo();
public static GoblinStoreOrderVo getNew() { public static GoblinStoreOrderVo getNew() {
......
...@@ -91,11 +91,13 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin ...@@ -91,11 +91,13 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
if (durationToMillis >= 0) { if (durationToMillis >= 0) {
switch (type) { switch (type) {
case "GOBLIN": case "GOBLIN":
return checkOrderTime(orderCode, type); return checkOrderTime(orderCode);
case "NFT": case "NFT":
return checkNftOrderTime(orderCode); return checkNftOrderTime(orderCode);
case "TICKET": case "TICKET":
return checkTicketOrderTime(orderCode); return checkTicketOrderTime(orderCode);
case "MIX":
return checkMixOrderTime(orderCode);
default: default:
return false; return false;
} }
...@@ -118,10 +120,9 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin ...@@ -118,10 +120,9 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
protected abstract String getRedisStreamGroup(); protected abstract String getRedisStreamGroup();
public boolean checkOrderTime(String valueData, String type) { public boolean checkOrderTime(String valueData) {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
try { try {
if (type.equals("GOBLIN")) {
String[] orderIds = getMasterCode(valueData); String[] orderIds = getMasterCode(valueData);
for (String orderId : orderIds) { for (String orderId : orderIds) {
GoblinStoreOrderVo orderVo = getGoblinOrder(orderId); GoblinStoreOrderVo orderVo = getGoblinOrder(orderId);
...@@ -170,7 +171,6 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin ...@@ -170,7 +171,6 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
SqlMapping.gets(sqls, sqlDataOrder, sqlDataSku)); SqlMapping.gets(sqls, sqlDataOrder, sqlDataSku));
} }
} }
}
} catch (Exception e) { } catch (Exception e) {
log.error("库存回滚异常valueData={}", valueData, e); log.error("库存回滚异常valueData={}", valueData, e);
} }
...@@ -198,7 +198,7 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin ...@@ -198,7 +198,7 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
}*/ }*/
GoblinListCollectVo goblinListCollectVo = goblinNftUtils.getCollectByNowNext(nowTime, nftOrder.getSkuId()); GoblinListCollectVo goblinListCollectVo = goblinNftUtils.getCollectByNowNext(nowTime, nftOrder.getSkuId());
String listId = (null == goblinListCollectVo) ? null : goblinListCollectVo.getListId(); String listId = (null == goblinListCollectVo) ? null : goblinListCollectVo.getListId();
log.debug("listId : {}",listId); log.debug("listId : {}", listId);
if (StringUtils.isEmpty(nftOrder.getBoxSkuId())) {// 购买藏品 if (StringUtils.isEmpty(nftOrder.getBoxSkuId())) {// 购买藏品
goblinNftUtils.incrSkuStock(listId, nftOrder.getSkuId(), nftOrder.getNum()); goblinNftUtils.incrSkuStock(listId, nftOrder.getSkuId(), nftOrder.getNum());
} else {// 购买盲盒 } else {// 购买盲盒
...@@ -228,6 +228,72 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin ...@@ -228,6 +228,72 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
} }
} }
public boolean checkMixOrderTime(String orderCode) {
LocalDateTime now = LocalDateTime.now();
try {
HashMap<String, String[]> map = getMixMasterCode(orderCode);
String[] nft = map.get("nft");
String[] goblin = map.get("goblin");
for (String orderId : goblin) {
GoblinStoreOrderVo orderVo = getGoblinOrder(orderId);
if (orderVo.getStatus().equals(GoblinStatusConst.Status.ORDER_STATUS_0.getValue())) {//订单回滚
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataSku = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("goblin_order.close.order"));
sqls.add(SqlMapping.get("goblin_order.close.sku"));
for (String orderSkuId : orderVo.getOrderSkuVoIds()) {
GoblinOrderSkuVo skuVo = getGoblinOrderSkuVo(orderSkuId);
//订单详情
skuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_5.getValue());
updateGoblinOrderSkuVo(skuVo.getOrderSkuId(), skuVo);
setGoblinOrderSku(skuVo.getOrderSkuId(), skuVo);
//库存&限购&&待支付订单
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuVo.getSkuId());
incrSkuStock(pre, skuVo.getSkuId(), skuVo.getNum());
decrSkuCountByUid(orderVo.getUserId(), skuVo.getSkuId(), skuVo.getNum());
//mysql
sqlDataSku.add(new Object[]{
skuVo.getStatus(), now, skuVo.getOrderSkuId(), now, now
});
}
//订单
orderVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_5.getValue());
updateGoblinStoreOrderVo(orderVo.getOrderId(), orderVo);
setGoblinOrder(orderVo.getOrderId(), orderVo);
//店铺券退券
if (!(orderVo.getStoreCouponId().equals("") || orderVo.getStoreCouponId() == null)) {
BackCouponParam backCouponParam = BackCouponParam.getNew();
backCouponParam.setuCouponIds(orderVo.getStoreCouponId());
backCouponParam.setUid(orderVo.getUserId());
backStoreCoupon(backCouponParam);
}
//平台券
if (!(orderVo.getUcouponId().equals("") || orderVo.getUcouponId() == null)) {
backCoupon(orderVo.getUcouponId(), orderVo.getUserId());
}
//mysql
sqlDataOrder.add(new Object[]{
orderVo.getStatus(), now, now, "超时关闭", orderVo.getOrderId(), now, now
});
//执行sql
sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getKey(),
SqlMapping.gets(sqls, sqlDataOrder, sqlDataSku));
}
}
for (String orderId : nft) {
checkNftOrderTime(orderId);
}
} catch (Exception e) {
log.error("MIX库存回滚异常valueData={}", orderCode, e);
}
return true;
}
public boolean checkTicketOrderTime(String orderId) { public boolean checkTicketOrderTime(String orderId) {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
try { try {
...@@ -326,6 +392,22 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin ...@@ -326,6 +392,22 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
} }
} }
public HashMap<String, String[]> getMixMasterCode(String masterCode) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_MASTER.concat(masterCode);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return null;
} else {
String[] a = ((String) obj).split("&&");
String[] nftA = a[0].split(",");
String[] goblinA = a[1].split(",");
HashMap<String, String[]> map = mixIdMap();
map.put("nft", nftA);
map.put("goblin", goblinA);
return map;
}
}
// 获取 订单相关vo // 获取 订单相关vo
public GoblinStoreOrderVo getGoblinOrder(String orderId) { public GoblinStoreOrderVo getGoblinOrder(String orderId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER.concat(orderId); String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER.concat(orderId);
...@@ -447,6 +529,7 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin ...@@ -447,6 +529,7 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
private static final BasicDBObject basicDBObject = new BasicDBObject(); private static final BasicDBObject basicDBObject = new BasicDBObject();
private static final ArrayList<GoblinUserCouponVo> goblinUserCouponVo = new ArrayList<>(); private static final ArrayList<GoblinUserCouponVo> goblinUserCouponVo = new ArrayList<>();
private static final HashMap<String, String[]> mixIdMap = new HashMap();
public static BasicDBObject cloneBasicDBObject() { public static BasicDBObject cloneBasicDBObject() {
...@@ -457,4 +540,8 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin ...@@ -457,4 +540,8 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
return (ArrayList<GoblinUserCouponVo>) goblinUserCouponVo.clone(); return (ArrayList<GoblinUserCouponVo>) goblinUserCouponVo.clone();
} }
public static HashMap<String, String[]> mixIdMap() {
return (HashMap<String, String[]>) mixIdMap.clone();
}
} }
\ No newline at end of file
...@@ -82,8 +82,11 @@ public class GoblinMixAppServiceImpl implements IGoblinMixAppService { ...@@ -82,8 +82,11 @@ public class GoblinMixAppServiceImpl implements IGoblinMixAppService {
int stock = 0; int stock = 0;
for (GoblinMixDetailsItemVo item : vo.getItem()) { for (GoblinMixDetailsItemVo item : vo.getItem()) {
GoblinGoodsSkuInfoVo skuInfoVo = redisUtils.getGoodsSkuInfoVo(item.getSkuId()); GoblinGoodsSkuInfoVo skuInfoVo = redisUtils.getGoodsSkuInfoVo(item.getSkuId());
GoblinGoodsInfoVo spuInfoVo = redisUtils.getGoodsInfoVo(skuInfoVo.getSpuId());
item.setSkuPic(skuInfoVo.getSkuPic()); item.setSkuPic(skuInfoVo.getSkuPic());
item.setStock(0); item.setStock(0);
item.setSkuName(skuInfoVo.getName());
item.setSpuName(spuInfoVo.getName());
if (skuInfoVo.getUnbox().equals("1")) { if (skuInfoVo.getUnbox().equals("1")) {
List<String> relationIds = redisUtils.getGoblinMixRelationBox(item.getSkuId(), vo.getMixId()); List<String> relationIds = redisUtils.getGoblinMixRelationBox(item.getSkuId(), vo.getMixId());
for (String skuId : relationIds) { for (String skuId : relationIds) {
...@@ -115,8 +118,11 @@ public class GoblinMixAppServiceImpl implements IGoblinMixAppService { ...@@ -115,8 +118,11 @@ public class GoblinMixAppServiceImpl implements IGoblinMixAppService {
GoblinMixDetailsVo baseVo = redisUtils.getMixDetails(mixId); GoblinMixDetailsVo baseVo = redisUtils.getMixDetails(mixId);
for (GoblinMixDetailsItemVo item : baseVo.getItem()) { for (GoblinMixDetailsItemVo item : baseVo.getItem()) {
GoblinGoodsSkuInfoVo skuInfoVo = redisUtils.getGoodsSkuInfoVo(item.getSkuId()); GoblinGoodsSkuInfoVo skuInfoVo = redisUtils.getGoodsSkuInfoVo(item.getSkuId());
GoblinGoodsInfoVo spuInfoVo = redisUtils.getGoodsInfoVo(skuInfoVo.getSpuId());
item.setStock(0); item.setStock(0);
item.setSkuPic(skuInfoVo.getSkuPic()); item.setSkuPic(skuInfoVo.getSkuPic());
item.setSkuName(skuInfoVo.getName());
item.setSpuName(spuInfoVo.getName());
} }
return ResponseDto.success(baseVo.getItem()); return ResponseDto.success(baseVo.getItem());
} }
......
...@@ -494,7 +494,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -494,7 +494,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
nftOrder.getNum(), nftOrder.getStoreId(), nftOrder.getStoreName(), nftOrder.getOrderCode(), nftOrder.getUserId(), nftOrder.getUserName(), nftOrder.getUserMobile(), nftOrder.getPriceTotal(), nftOrder.getPriceCoupon(), nftOrder.getNum(), nftOrder.getStoreId(), nftOrder.getStoreName(), nftOrder.getOrderCode(), nftOrder.getUserId(), nftOrder.getUserName(), nftOrder.getUserMobile(), nftOrder.getPriceTotal(), nftOrder.getPriceCoupon(),
nftOrder.getStorePriceCoupon(), nftOrder.getPriceRedEnvelope(), nftOrder.getPriceVoucher(), nftOrder.getPriceActual(), nftOrder.getUcouponId(), nftOrder.getStoreCouponId(), nftOrder.getRedEnvelopeCode(), nftOrder.getStatus(), nftOrder.getSource(), nftOrder.getStorePriceCoupon(), nftOrder.getPriceRedEnvelope(), nftOrder.getPriceVoucher(), nftOrder.getPriceActual(), nftOrder.getUcouponId(), nftOrder.getStoreCouponId(), nftOrder.getRedEnvelopeCode(), nftOrder.getStatus(), nftOrder.getSource(),
nftOrder.getOrderType(), nftOrder.getPayType(), nftOrder.getDeviceFrom(), nftOrder.getVersion(), nftOrder.getPayCountdownMinute(), nftOrder.getIpAddress(), nftOrder.getCreatedAt(), nftOrder.getPayCode(), nftOrder.getOrderType(), nftOrder.getPayType(), nftOrder.getDeviceFrom(), nftOrder.getVersion(), nftOrder.getPayCountdownMinute(), nftOrder.getIpAddress(), nftOrder.getCreatedAt(), nftOrder.getPayCode(),
nftOrder.getSkuTitle(), nftOrder.getListId(), nftOrder.getExCode() nftOrder.getSkuTitle(), nftOrder.getListId(), nftOrder.getExCode(),""
}); });
// 订单vo // 订单vo
...@@ -889,7 +889,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -889,7 +889,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
nftOrder.getNum(), nftOrder.getStoreId(), nftOrder.getStoreName(), nftOrder.getOrderCode(), nftOrder.getUserId(), nftOrder.getUserName(), nftOrder.getUserMobile(), nftOrder.getPriceTotal(), nftOrder.getPriceCoupon(), nftOrder.getNum(), nftOrder.getStoreId(), nftOrder.getStoreName(), nftOrder.getOrderCode(), nftOrder.getUserId(), nftOrder.getUserName(), nftOrder.getUserMobile(), nftOrder.getPriceTotal(), nftOrder.getPriceCoupon(),
nftOrder.getStorePriceCoupon(), nftOrder.getPriceRedEnvelope(), nftOrder.getPriceVoucher(), nftOrder.getPriceActual(), nftOrder.getUcouponId(), nftOrder.getStoreCouponId(), nftOrder.getRedEnvelopeCode(), orderVo.getStatus(), nftOrder.getSource(), nftOrder.getStorePriceCoupon(), nftOrder.getPriceRedEnvelope(), nftOrder.getPriceVoucher(), nftOrder.getPriceActual(), nftOrder.getUcouponId(), nftOrder.getStoreCouponId(), nftOrder.getRedEnvelopeCode(), orderVo.getStatus(), nftOrder.getSource(),
nftOrder.getOrderType(), orderVo.getPayType(), nftOrder.getDeviceFrom(), nftOrder.getVersion(), nftOrder.getPayCountdownMinute(), nftOrder.getIpAddress(), nftOrder.getCreatedAt(), orderVo.getPayCode(), nftOrder.getOrderType(), orderVo.getPayType(), nftOrder.getDeviceFrom(), nftOrder.getVersion(), nftOrder.getPayCountdownMinute(), nftOrder.getIpAddress(), nftOrder.getCreatedAt(), orderVo.getPayCode(),
nftOrder.getSkuTitle(), nftOrder.getListId(), nftOrder.getExCode() nftOrder.getSkuTitle(), nftOrder.getListId(), nftOrder.getExCode(),""
}); });
String sqlData = SqlMapping.gets(sqls, sqlDataCode, sqlDataOrder); String sqlData = SqlMapping.gets(sqls, sqlDataCode, sqlDataOrder);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_NFT_ORDER.getKey(), sqlData); queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_NFT_ORDER.getKey(), sqlData);
......
...@@ -573,7 +573,7 @@ public class GoblinOrderServiceImpl implements IGoblinOrderService { ...@@ -573,7 +573,7 @@ public class GoblinOrderServiceImpl implements IGoblinOrderService {
sqlDataOrder.add(new Object[]{ 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.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.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() storeOrder.getSource(), storeOrder.getVersion(), storeOrder.getIsMember(), storeOrder.getOrderType(), storeOrder.getWriteOffCode(), storeOrder.getPayCountdownMinute(), storeOrder.getIpAddress(), storeOrder.getMarketId(), storeOrder.getMarketType(), storeOrder.getCreatedAt(),""
}); });
GoblinOrderAttr orderAttr = item.getOrderAttr(); GoblinOrderAttr orderAttr = item.getOrderAttr();
sqlDataAttr.add(new Object[]{ sqlDataAttr.add(new Object[]{
......
...@@ -2,10 +2,12 @@ package com.liquidnet.service.order.service.impl; ...@@ -2,10 +2,12 @@ package com.liquidnet.service.order.service.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.liquidnet.commons.lang.util.CollectionUtil; import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.commons.lang.util.CurrentUtil; import com.liquidnet.commons.lang.util.*;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst; import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.constant.NftAccStatusEnum; import com.liquidnet.service.goblin.constant.NftAccStatusEnum;
import com.liquidnet.service.goblin.dto.GoblinUserNftAccInfoVo; import com.liquidnet.service.goblin.dto.GoblinUserNftAccInfoVo;
...@@ -28,13 +30,17 @@ import org.apache.tomcat.jni.Local; ...@@ -28,13 +30,17 @@ import org.apache.tomcat.jni.Local;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import static com.liquidnet.commons.lang.util.DateUtil.DTF_YMD_HMS; import static com.liquidnet.commons.lang.util.DateUtil.DTF_YMD_HMS;
import static com.liquidnet.commons.lang.util.DateUtil.getNowTime;
@Service @Service
...@@ -54,20 +60,25 @@ public class MixOrderServiceImpl implements IMixOrderService { ...@@ -54,20 +60,25 @@ public class MixOrderServiceImpl implements IMixOrderService {
@Value("${liquidnet.service.order.url}") @Value("${liquidnet.service.order.url}")
private String orderUrl; private String orderUrl;
@Value("${liquidnet.service.order.url-pay.pay}")
private String payUrl;
@Value("${liquidnet.service.order.url-pay.check}")
private String checkUrl;
@Override @Override
public ResponseDto<GoblinPayInnerResultVo> checkOrder(MixOrderParam param, String uid) { public ResponseDto<GoblinPayInnerResultVo> checkOrder(MixOrderParam param, String uid) {
List<String> canBuyIds = CollectionUtil.linkedListString();//有库存的id
String mixId = param.getMixId();
String orderMasterCode = IDGenerator.storeMasterCode();//总订单号
HashMap<String, Object> boxSkuId = CollectionUtil.mapStringObject();//盲盒种的skuid
HashMap<String, Object> stockSkuId = CollectionUtil.mapStringObject(); // 盲盒id
boolean isUseLimit = false;//是否减限购
try {
GoblinMixDetailsVo mixVo = redisUtils.getMixDetails(param.getMixId()); GoblinMixDetailsVo mixVo = redisUtils.getMixDetails(param.getMixId());
String mixId = mixVo.getMixId();
String mobile = StringUtils.defaultString(((String) CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_MOBILE)), ""); String mobile = StringUtils.defaultString(((String) CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_MOBILE)), "");
String nickName = StringUtils.defaultString(((String) CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_NICKNAME)), ""); String nickName = StringUtils.defaultString(((String) CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_NICKNAME)), "");
String headerCliSource = CurrentUtil.getHeaderCliSource(), headerCliVersion = CurrentUtil.getHeaderCliVersion(); String headerCliSource = CurrentUtil.getHeaderCliSource(), headerCliVersion = CurrentUtil.getHeaderCliVersion();
String source = headerCliSource == null ? "" : headerCliSource, version = headerCliVersion == null ? "" : headerCliVersion; String source = headerCliSource == null ? "" : headerCliSource, version = headerCliVersion == null ? "" : headerCliVersion;
String orderMasterCode = IDGenerator.storeMasterCode();//总订单号
List<String> canBuyIds = CollectionUtil.linkedListString();//有库存的id
HashMap<String, Object> boxSkuId = CollectionUtil.mapStringObject();//盲盒种的skuid
HashMap<String, Object> stockSkuId = CollectionUtil.mapStringObject(); // 盲盒id
//判断 活动状态 //判断 活动状态
LocalDateTime st = LocalDateTime.parse(mixVo.getTimeStart(), DTF_YMD_HMS); LocalDateTime st = LocalDateTime.parse(mixVo.getTimeStart(), DTF_YMD_HMS);
LocalDateTime et = LocalDateTime.parse(mixVo.getTimeEnd(), DTF_YMD_HMS); LocalDateTime et = LocalDateTime.parse(mixVo.getTimeEnd(), DTF_YMD_HMS);
...@@ -77,16 +88,22 @@ public class MixOrderServiceImpl implements IMixOrderService { ...@@ -77,16 +88,22 @@ public class MixOrderServiceImpl implements IMixOrderService {
} }
//判断白名单 //判断白名单
int whiteType = mixVo.getWhiteType(); int whiteType = mixVo.getWhiteType();
Boolean canBuy = redisUtils.getListCanBuy(mixId, mixId, mobile, uid, whiteType == 2 ? -1 : whiteType); if (whiteType != 2) {
Boolean canBuy = redisUtils.getListCanBuy(mixId, mixId, mobile, uid, whiteType);
if (!canBuy) { if (!canBuy) {
return ResponseDto.failure("该藏品仅对部分用户开放~"); return ResponseDto.failure("该藏品仅对部分用户开放~");
} }
}
//判断限购 //判断限购
Integer limitCount = mixVo.getLimit(); Integer limitCount = mixVo.getLimit();
if (limitCount != 0) {
int buyCount = redisUtils.incrMixLimit(mixId, uid); int buyCount = redisUtils.incrMixLimit(mixId, uid);
isUseLimit = true;
if (buyCount > limitCount) { if (buyCount > limitCount) {
redisUtils.decrMixLimit(mixId, uid);
return ResponseDto.failure("超出限购数量"); return ResponseDto.failure("超出限购数量");
} }
}
//构建 各个商品信息 //构建 各个商品信息
List<GoblinGoodsSkuInfoVo> skuInfoList = ObjectUtil.cloneArrayGoblinGoodsSkuInfoListVo(); List<GoblinGoodsSkuInfoVo> skuInfoList = ObjectUtil.cloneArrayGoblinGoodsSkuInfoListVo();
List<GoblinGoodsSkuInfoVo> nftInfoList = ObjectUtil.cloneArrayGoblinGoodsSkuInfoListVo(); List<GoblinGoodsSkuInfoVo> nftInfoList = ObjectUtil.cloneArrayGoblinGoodsSkuInfoListVo();
...@@ -100,12 +117,14 @@ public class MixOrderServiceImpl implements IMixOrderService { ...@@ -100,12 +117,14 @@ public class MixOrderServiceImpl implements IMixOrderService {
GoblinGoodsInfoVo spuInfoVo = redisUtils.getGoodsInfoVo(skuInfoVo.getSpuId()); GoblinGoodsInfoVo spuInfoVo = redisUtils.getGoodsInfoVo(skuInfoVo.getSpuId());
List<String> skuIdList = spuInfoVo.getSkuIdList(); List<String> skuIdList = spuInfoVo.getSkuIdList();
if (CollectionUtil.isEmpty(skuIdList)) { if (CollectionUtil.isEmpty(skuIdList)) {
initStock(canBuyIds, mixId, isUseLimit, uid);
return ResponseDto.failure("该商品SPU不存在~"); return ResponseDto.failure("该商品SPU不存在~");
} else { } else {
GoblinGoodsSkuInfoVo boxSkuInfo = nftOrderUtils.lotteryDraw(skuIdList, itemVo.getCount(), nt, null); GoblinGoodsSkuInfoVo boxSkuInfo = nftOrderUtils.lotteryDraw(skuIdList, itemVo.getCount(), nt, mixId);
if (null == boxSkuInfo) { if (null == boxSkuInfo) {
return ResponseDto.failure("盲盒库存不足啦~"); return ResponseDto.failure("盲盒库存不足啦~");
} else { } else {
log.debug("stockId = " + boxSkuInfo.getSkuId() + " stock = " + itemVo.getCount());
canBuyIds.add(boxSkuInfo.getSkuId() + "," + itemVo.getCount()); canBuyIds.add(boxSkuInfo.getSkuId() + "," + itemVo.getCount());
} }
boxSkuId.put(skuId, skuInfoVo.getSkuId()); boxSkuId.put(skuId, skuInfoVo.getSkuId());
...@@ -140,22 +159,29 @@ public class MixOrderServiceImpl implements IMixOrderService { ...@@ -140,22 +159,29 @@ public class MixOrderServiceImpl implements IMixOrderService {
nftMix.put(skuInfoVo.getSkuId() + "produceId", itemVo.getProductId()); nftMix.put(skuInfoVo.getSkuId() + "produceId", itemVo.getProductId());
nftMix.put(skuInfoVo.getSkuId() + "count", itemVo.getCount()); nftMix.put(skuInfoVo.getSkuId() + "count", itemVo.getCount());
} else { } else {
initStock(canBuyIds, mixId, isUseLimit, uid);
return ResponseDto.failure("参数异常"); return ResponseDto.failure("参数异常");
} }
} }
// 认证验证 // // 认证验证
if (nftInfoList.size() > 0) { // if (nftInfoList.size() > 0) {
GoblinUserNftAccInfoVo openAccountInfo = redisUtils.getOpenAccountInfo(uid); // GoblinUserNftAccInfoVo openAccountInfo = redisUtils.getOpenAccountInfo(uid);
if (null == openAccountInfo || !NftAccStatusEnum.StatusAcc.SUCCESS.getCode().equals(openAccountInfo.getCode())) { // if (null == openAccountInfo || !NftAccStatusEnum.StatusAcc.SUCCESS.getCode().equals(openAccountInfo.getCode())) {
return ResponseDto.failure("您还未开通数字账户"); // initStock(canBuyIds, mixId, isUseLimit, uid);
} // return ResponseDto.failure("您还未开通数字账户");
} // }
// }
//下单 //下单
//生成nft订单 //生成nft订单
List<GoblinNftOrder> nftOrderList = nftOrder(nftInfoList, nftMix, boxSkuId, mobile, source, version, nickName, nt, uid, param.getPayType(), param.getDeviceFrom()); List<GoblinNftOrder> nftOrderList = nftOrder(nftInfoList, nftMix, boxSkuId, mobile, source, version, nickName, nt, uid, param.getPayType(), param.getDeviceFrom());
//生成goblin订单 //生成goblin订单
GoblinOrderPreParam preParam = goblinOrder(skuInfoList, nftMix, param.getAddressesVo(), mobile, source, version, nickName, nt, uid, param.getPayType(), param.getDeviceFrom()); GoblinOrderPreParam preParam = goblinOrder(skuInfoList, skuMix, param.getAddressesVo(), mobile, source, version, nickName, nt, uid, param.getPayType(), param.getDeviceFrom());
return ResponseDto.success(payOrder(nftOrderList,preParam)); return ResponseDto.success(payOrder(nftOrderList, preParam, orderMasterCode, param.getShowUrl(), param.getReturnUrl(), param.getDeviceFrom(), param.getPayType(), mixId, mixVo.getName()));
} catch (Exception e) {
e.printStackTrace();
initStock(canBuyIds, mixId, isUseLimit, uid);
return ResponseDto.failure();
}
} }
//商品订单 //商品订单
...@@ -172,6 +198,7 @@ public class MixOrderServiceImpl implements IMixOrderService { ...@@ -172,6 +198,7 @@ public class MixOrderServiceImpl implements IMixOrderService {
storeId = skuVo.getStoreId(); storeId = skuVo.getStoreId();
BigDecimal price;//sku应付价格 BigDecimal price;//sku应付价格
BigDecimal priceBase;//sku原价 BigDecimal priceBase;//sku原价
log.debug("number key = " + skuVo.getSkuId() + "count");
int number = (Integer) skuMix.get(skuVo.getSkuId() + "count"); int number = (Integer) skuMix.get(skuVo.getSkuId() + "count");
GoblinGoodsInfoVo spuVo = redisUtils.getGoodsInfoVo(skuVo.getSpuId()); GoblinGoodsInfoVo spuVo = redisUtils.getGoodsInfoVo(skuVo.getSpuId());
skuName = skuName.concat(skuVo.getName()).concat(","); skuName = skuName.concat(skuVo.getName()).concat(",");
...@@ -319,12 +346,181 @@ public class MixOrderServiceImpl implements IMixOrderService { ...@@ -319,12 +346,181 @@ public class MixOrderServiceImpl implements IMixOrderService {
} }
private GoblinPayInnerResultVo payOrder(List<GoblinNftOrder> nftOrder, GoblinOrderPreParam preParam) { private GoblinPayInnerResultVo payOrder(List<GoblinNftOrder> nftOrder, GoblinOrderPreParam preParam, String masterCode, String showUrl, String returnUrl, String deviceForm, String payType, String mixId, String mixName) {
GoblinPayInnerResultVo NftPayResultVo = GoblinPayInnerResultVo.getNew(); GoblinPayInnerResultVo NftPayResultVo = GoblinPayInnerResultVo.getNew();
//是否免费 //是否免费
boolean isFree = false; boolean isFree = false;
BigDecimal payPrice = BigDecimal.ZERO;
String details = "";
String payCode;
String orderStr = "";
StringBuilder orderMixStr = new StringBuilder();//nft订单id || 商品订单id
for (GoblinNftOrder item : nftOrder) {
payPrice = payPrice.add(item.getPriceActual());
details = details.concat(item.getSkuTitle()).concat(",");
orderStr = orderStr.concat(item.getOrderId()).concat(",");
}
details = details.concat(preParam.getSkuName()).substring(1);
orderStr = orderStr.concat(preParam.getOrderIdList());
payPrice = payPrice.add(preParam.getPriceActual());
if (payPrice.compareTo(BigDecimal.valueOf(0)) > 0) {
// 调用支付
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("type", "MIX");
httpData.add("price", payPrice.toString());
httpData.add("name", preParam.getStoreName());
httpData.add("detail", details);
httpData.add("orderCode", masterCode);
httpData.add("orderId", orderStr);
httpData.add("clientIp", CurrentUtil.getCliIpAddr());
httpData.add("notifyUrl", orderUrl + "/order/mix/syncOrder");
httpData.add("createDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
httpData.add("expireTime", "5");
httpData.add("payType", payType);
httpData.add("deviceFrom", deviceForm);
if (deviceForm.equals("js") || deviceForm.equals("applet")) {
httpData.add("openId", preParam.getOpenId());
}
httpData.add("showUrl", showUrl + masterCode);
httpData.add("returnUrl", returnUrl + masterCode);
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>>() {
});
NftPayResultVo.setCode(dto.getData().getCode());
NftPayResultVo.setOrderCode(dto.getData().getOrderCode());
NftPayResultVo.setPayData(dto.getData().getPayData());
NftPayResultVo.setPayType(payType);
NftPayResultVo.setPrice(payPrice);
payCode = NftPayResultVo.getCode();
NftPayResultVo.setShowUrl(showUrl);
NftPayResultVo.setReturnUrl(returnUrl);
} else if (payType == null) {
isFree = true;
payType = "FREE";
payCode = "FREE_PAY_CODE";
NftPayResultVo.setPrice(BigDecimal.valueOf(0));
NftPayResultVo.setPayType(payType);
} else {
isFree = true;
payType = "FREE";
payCode = "FREE_PAY_CODE";
NftPayResultVo.setPrice(BigDecimal.valueOf(0));
NftPayResultVo.setPayType(payType);
}
NftPayResultVo.setOrderMasterCode(masterCode);
// 待支付发送队列
queueUtils.sendMsgByRedisGoblinStock(masterCode, preParam.getStoreOrder().getCreatedAt(), "MIX", 5);
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_nft_order.insert"));
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"));
//构建 nft sql对象
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
for (GoblinNftOrder nftItem : nftOrder) {
orderMixStr.append(nftItem.getOrderId().contains(","));
nftItem.setPayCode(payCode);
sqlDataOrder.add(new Object[]{
nftItem.getOrderId(), nftItem.getSpuId(), nftItem.getSkuId(), nftItem.getBoxSkuId(),
nftItem.getNum(), nftItem.getStoreId(), nftItem.getStoreName(), nftItem.getOrderCode(), nftItem.getUserId(), nftItem.getUserName(), nftItem.getUserMobile(), nftItem.getPriceTotal(), nftItem.getPriceCoupon(),
nftItem.getStorePriceCoupon(), nftItem.getPriceRedEnvelope(), nftItem.getPriceVoucher(), nftItem.getPriceActual(), nftItem.getUcouponId(), nftItem.getStoreCouponId(), nftItem.getRedEnvelopeCode(), nftItem.getStatus(), nftItem.getSource(),
nftItem.getOrderType(), nftItem.getPayType(), nftItem.getDeviceFrom(), nftItem.getVersion(), nftItem.getPayCountdownMinute(), nftItem.getIpAddress(), nftItem.getCreatedAt(), nftItem.getPayCode(),
nftItem.getSkuTitle(), nftItem.getListId(), nftItem.getExCode(), mixId
});
// 订单vo redis
GoblinNftOrderVo orderVo = GoblinNftOrderVo.getNew().copyMix(nftItem, mixId, mixName);
orderVo.setCreatedAt(nftItem.getCreatedAt());
nftOrderUtils.setNftOrder(orderVo);
nftOrderUtils.setNftOrderIdOfCode(nftItem.getOrderCode(), nftItem.getOrderId());
//mongo
queueUtils.setMongoList(GoblinNftOrderVo.class.getSimpleName(), "orderId", orderVo.getOrderId(), GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_INFO, 1);
}
//构建 goblin sql 对象
LinkedList<Object[]> sqlDataSku = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataGoblin = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataAttr = CollectionUtil.linkedListObjectArr();
List<String> goblinOrderSkuIdList = CollectionUtil.linkedListString();
for (GoblinOrderSku orderSku : preParam.getOrderSkuList()) {
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());
}
GoblinStoreOrder storeOrder = preParam.getStoreOrder();
storeOrder.setPayCode(payCode);
sqlDataGoblin.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 = preParam.getOrderAttr();
sqlDataAttr.add(new Object[]{
orderAttr.getOrderAttrId(), orderAttr.getOrderId(), orderAttr.getExpressContacts(), orderAttr.getExpressAddress(), orderAttr.getExpressAddressDetail(), orderAttr.getExpressPhone(), orderAttr.getExpressType(), orderAttr.getCreatedAt()
});
//订单vo
GoblinStoreOrderVo orderVo = GoblinStoreOrderVo.getNew().copyMix(storeOrder, mixId, mixName);
//订单attr vo
GoblinOrderAttrVo orderAttrVo = GoblinOrderAttrVo.getNew().copy(orderAttr);
//redis 赋值
orderVo.setOrderAttrVo(orderAttrVo);
orderVo.setOrderSkuVoIds(goblinOrderSkuIdList);
orderVo.setCreatedAt(getNowTime());
redisUtils.setGoblinOrder(orderVo.getOrderId(), orderVo);
redisUtils.setMasterCode(orderVo.getMasterOrderCode(), orderStr);
queueUtils.setMongoList(GoblinStoreOrderVo.class.getSimpleName(), "orderId", orderVo.getOrderId(), GoblinRedisConst.REDIS_GOBLIN_ORDER, 1);
orderMixStr.append("&&".contains(orderStr));
redisUtils.setMasterCode(masterCode, orderMixStr.toString());
// 执行sql
String sqlData = SqlMapping.gets(sqls, sqlDataOrder, sqlDataSku, sqlDataGoblin, sqlDataAttr);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_NFT_ORDER.getKey(), sqlData);
if (isFree) {
SyncOrderParam syncOrderParam = SyncOrderParam.getNew();
syncOrderParam.setOrderCode(masterCode);
syncOrderParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
syncOrderParam.setCode(payCode);
syncOrderParam.setPrice(payPrice);
syncOrderParam.setPaymentId("FREE_PAYMENT_ID");
syncOrderParam.setPaymentType(null);
syncOrderParam.setStatus(1);
syncOrder(syncOrderParam);
return NftPayResultVo;
} else {
return NftPayResultVo; return NftPayResultVo;
} }
}
//回滚占用的库存
private void initStock(List<String> canBuyIds, String mixId, Boolean isUseLimit, String uid) {
for (String canBuyId : canBuyIds) {
String[] data = canBuyId.split(",");
String skuIdSingle = data[0];
int count = Integer.parseInt(data[1]);
int stock = redisUtils.incrSkuStock(mixId, skuIdSingle, count);
log.debug("stockId = " + skuIdSingle + " stock = " + stock);
}
if (isUseLimit) {
redisUtils.decrMixLimit(mixId, uid);
}
}
@Override @Override
public String syncOrder(SyncOrderParam syncOrderParam) { public String syncOrder(SyncOrderParam syncOrderParam) {
......
...@@ -2,6 +2,7 @@ package com.liquidnet.service.order.utils; ...@@ -2,6 +2,7 @@ package com.liquidnet.service.order.utils;
import com.liquidnet.service.base.SqlMapping; import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst; import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.dto.GoblinQueueBizMongoDto;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinIpAreaVo; import com.liquidnet.service.kylin.dto.vo.mongo.KylinIpAreaVo;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.StreamRecords; import org.springframework.data.redis.connection.stream.StreamRecords;
...@@ -89,10 +90,31 @@ public class QueueUtils { ...@@ -89,10 +90,31 @@ public class QueueUtils {
HashMap<String, String> map = ObjectUtil.cloneHashMapStringAndString(); HashMap<String, String> map = ObjectUtil.cloneHashMapStringAndString();
map.put("id", masterOrderCode); map.put("id", masterOrderCode);
map.put("type", type); map.put("type", type);
map.put("time", createTime.plusMinutes(getPayCountdownMinute-5).toString()); map.put("time", createTime.plusMinutes(getPayCountdownMinute - 5).toString());
stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(streamKey)); stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(streamKey));
} }
/**
* mongo操作入队列
*
* @param collect Mongo集合名
* @param column Mongo集合中的字段属性名称
* @param bizId Mongo集合中的字段属性值
* @param prefix Redis缓存中的Key前缀
* @param opType 操作类型[1-insert|2-update]
*/
public void setMongoList(String collect, String column, String bizId, String prefix, int opType) {
GoblinQueueBizMongoDto goblinQueueBizMongoDto = GoblinQueueBizMongoDto.getNew();
goblinQueueBizMongoDto.setCollect(collect);
goblinQueueBizMongoDto.setColumn(column);
goblinQueueBizMongoDto.setBizId(bizId);
goblinQueueBizMongoDto.setPrefix(prefix);
goblinQueueBizMongoDto.setOpType(opType);
HashMap<String, String> map = ObjectUtil.cloneHashMapStringAndString();
map.put(MQConst.QUEUE_MESSAGE_KEY, goblinQueueBizMongoDto.toJson());
stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(MQConst.GoblinQueue.BIZ_NFT_MONGO.getKey()));
}
public void pushPvUv(String uid, String accessType, String performanceId, String orderId, String orderCode, String ipAddress) { public void pushPvUv(String uid, String accessType, String performanceId, String orderId, String orderCode, String ipAddress) {
try { try {
KylinIpAreaVo vo = dataUtils.getKylinIpAreaVo(ipAddress); KylinIpAreaVo vo = dataUtils.getKylinIpAreaVo(ipAddress);
......
...@@ -30,7 +30,7 @@ kylin_order_refund_entities.overtimeRefund=INSERT INTO kylin_order_refund_entiti ...@@ -30,7 +30,7 @@ kylin_order_refund_entities.overtimeRefund=INSERT INTO kylin_order_refund_entiti
#-------- \u5546\u57CE ------- #-------- \u5546\u57CE -------
goblin.order.create.order_insert=INSERT INTO goblin_store_order (`master_order_code`,`order_id`,`store_id`,`store_name`,`order_code`,`user_id`,`user_name`,`user_mobile`,`price_total`,`pay_code`,`price_actual`,`price_refund`,`price_express`,`price_coupon`,`store_price_coupon`,`price_voucher`,`status`,`ucoupon_id`,`store_coupon_id`,`pay_type`,`device_from`,`source`,`version`,`is_member`,`order_type`,`write_off_code`,`pay_countdown_minute`,`ip_address`,`market_id`,`market_type`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) goblin.order.create.order_insert=INSERT INTO goblin_store_order (`master_order_code`,`order_id`,`store_id`,`store_name`,`order_code`,`user_id`,`user_name`,`user_mobile`,`price_total`,`pay_code`,`price_actual`,`price_refund`,`price_express`,`price_coupon`,`store_price_coupon`,`price_voucher`,`status`,`ucoupon_id`,`store_coupon_id`,`pay_type`,`device_from`,`source`,`version`,`is_member`,`order_type`,`write_off_code`,`pay_countdown_minute`,`ip_address`,`market_id`,`market_type`,`created_at`,`mix_id`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin.order.create.attr_insert=INSERT INTO goblin_order_attr (`order_attr_id`,`order_id`,`express_contacts`,`express_address`,`express_address_detail`,`express_phone`,`express_type`,`created_at`) VALUES (?,?,?,?,?,?,?,?) goblin.order.create.attr_insert=INSERT INTO goblin_order_attr (`order_attr_id`,`order_id`,`express_contacts`,`express_address`,`express_address_detail`,`express_phone`,`express_type`,`created_at`) VALUES (?,?,?,?,?,?,?,?)
goblin.order.create.sku_insert=INSERT INTO goblin_order_sku (`order_sku_id`,`order_id`,`spu_id`,`spu_name`,`spu_pic`,`sku_id`,`num`,`sku_price`,`sku_price_actual`,`sku_name`,`sku_no`,`sku_image`,`sku_specs`,`price_voucher`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) goblin.order.create.sku_insert=INSERT INTO goblin_order_sku (`order_sku_id`,`order_id`,`spu_id`,`spu_name`,`spu_pic`,`sku_id`,`num`,`sku_price`,`sku_price_actual`,`sku_name`,`sku_no`,`sku_image`,`sku_specs`,`price_voucher`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
#---- \u518D\u6B21\u652F\u4ED8 #---- \u518D\u6B21\u652F\u4ED8
...@@ -47,7 +47,7 @@ goblin_order.store.refundLog=INSERT INTO goblin_back_order_log (`back_order_log_ ...@@ -47,7 +47,7 @@ goblin_order.store.refundLog=INSERT INTO goblin_back_order_log (`back_order_log_
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 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 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 ------- #-------- NFT -------
goblin_nft_order.insert=INSERT INTO goblin_nft_order (`order_id`,`spu_id`,`sku_id`,`box_sku_id`,`num`,`store_id`,`store_name`,`order_code`,`user_id`,`user_name`,`user_mobile`,`price_total`,`price_coupon`,`store_price_coupon`,`price_red_envelope`,`price_voucher`,`price_actual`,`ucoupon_id`,`store_coupon_id`,`red_envelope_code`,`status`,`source`,`order_type`,`pay_type`,`device_from`,`version`,`pay_countdown_minute`,`ip_address`,`created_at`,`pay_code`,sku_title,list_id,ex_code) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) goblin_nft_order.insert=INSERT INTO goblin_nft_order (`order_id`,`spu_id`,`sku_id`,`box_sku_id`,`num`,`store_id`,`store_name`,`order_code`,`user_id`,`user_name`,`user_mobile`,`price_total`,`price_coupon`,`store_price_coupon`,`price_red_envelope`,`price_voucher`,`price_actual`,`ucoupon_id`,`store_coupon_id`,`red_envelope_code`,`status`,`source`,`order_type`,`pay_type`,`device_from`,`version`,`pay_countdown_minute`,`ip_address`,`created_at`,`pay_code`,sku_title,list_id,ex_code,mix_id) 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.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.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`,`price`,`status`,`error_reason`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?) goblin_nft_order_refund.insert=INSERT INTO goblin_nft_order_refund (`order_refund_id`,`refund_code`,`order_id`,`order_code`,`store_id`,`user_id`,`price`,`status`,`error_reason`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment