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

Commit f69d27f6 authored by 胡佳晨's avatar 胡佳晨

提交下单接口(待测试)

parent 293994bc
...@@ -31,6 +31,6 @@ public class GoblinOrderParam { ...@@ -31,6 +31,6 @@ public class GoblinOrderParam {
private String returnUrl; private String returnUrl;
@ApiModelProperty(value = "商品相关参数集合") @ApiModelProperty(value = "商品相关参数集合")
private List<GoblinOrderSpuParam> goblinOrderSpuParamList; private List<GoblinOrderStoreParam> goblinOrderStoreParamList;
} }
...@@ -11,7 +11,9 @@ import java.util.ArrayList; ...@@ -11,7 +11,9 @@ import java.util.ArrayList;
@Data @Data
public class GoblinOrderSkuParam { public class GoblinOrderSkuParam {
@ApiModelProperty(required = true, value = "skuId") @ApiModelProperty(required = true, value = "skuId")
private String skuIds; private String skuId;
@ApiModelProperty(required = true, value = "spuId")
private String spuId;
@ApiModelProperty(required = true, value = "数量") @ApiModelProperty(required = true, value = "数量")
private Integer number; private Integer number;
} }
...@@ -10,10 +10,10 @@ import java.util.ArrayList; ...@@ -10,10 +10,10 @@ import java.util.ArrayList;
@ApiModel(value = "GoblinOrderParam") @ApiModel(value = "GoblinOrderParam")
@Data @Data
public class GoblinOrderSpuParam { public class GoblinOrderStoreParam {
@ApiModelProperty(required = true, value = "spuId") @ApiModelProperty(value = "商铺id")
private String spuId; private String storeId;
@ApiModelProperty(value = "平台券码") @ApiModelProperty(value = "平台券码")
private String platVoucherCode; private String platVoucherCode;
@ApiModelProperty(value = "商品券码") @ApiModelProperty(value = "商品券码")
......
package com.liquidnet.service.goblin.dto.manage.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SyncOrderParam implements Cloneable {
@ApiModelProperty(value = "status")
private Integer status;
@ApiModelProperty(value = "type")
private String type;
@ApiModelProperty(value = "code")
private String code;
@ApiModelProperty(value = "paymentId")
private String paymentId;
@ApiModelProperty(value = "orderCode")
private String orderCode;
@ApiModelProperty(value = "price")
private BigDecimal price;
@ApiModelProperty(value = "paymentType")
private String paymentType;
@ApiModelProperty(value = "paymentAt")
private String paymentAt;
private static final SyncOrderParam obj = new SyncOrderParam();
public static SyncOrderParam getNew() {
try {
return (SyncOrderParam) obj.clone();
} catch (CloneNotSupportedException e) {
return new SyncOrderParam();
}
}
}
...@@ -68,6 +68,10 @@ public class IDGenerator { ...@@ -68,6 +68,10 @@ public class IDGenerator {
return ticketOrderCode(orderId); return ticketOrderCode(orderId);
} }
public static String getWriteOffCode(){
return "";
}
/** /**
* 根据订单id生成总订单号 * 根据订单id生成总订单号
* *
......
...@@ -90,6 +90,7 @@ liquidnet: ...@@ -90,6 +90,7 @@ liquidnet:
pay: http://devdragon.zhengzai.tv/dragon/pay/dragonPay pay: http://devdragon.zhengzai.tv/dragon/pay/dragonPay
check: http://devdragon.zhengzai.tv/dragon/pay/checkOrder check: http://devdragon.zhengzai.tv/dragon/pay/checkOrder
localUrl: http://devorder.zhengzai.tv/order/order/syncOrder localUrl: http://devorder.zhengzai.tv/order/order/syncOrder
goblinUrl: http://devorder.zhengzai.tv/order/goblin/syncOrder
candy: candy:
url: http://devcandy.zhengzai.tv/candy url: http://devcandy.zhengzai.tv/candy
goblin: goblin:
......
...@@ -17,7 +17,7 @@ import lombok.EqualsAndHashCode; ...@@ -17,7 +17,7 @@ import lombok.EqualsAndHashCode;
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class GoblinOrderAttr implements Serializable { public class GoblinOrderAttr implements Serializable,Cloneable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
...@@ -130,5 +130,13 @@ public class GoblinOrderAttr implements Serializable { ...@@ -130,5 +130,13 @@ public class GoblinOrderAttr implements Serializable {
private String comment; private String comment;
private static final GoblinOrderAttr obj = new GoblinOrderAttr();
public static GoblinOrderAttr getNew() {
try {
return (GoblinOrderAttr) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinOrderAttr();
}
}
} }
...@@ -18,7 +18,7 @@ import lombok.EqualsAndHashCode; ...@@ -18,7 +18,7 @@ import lombok.EqualsAndHashCode;
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class GoblinOrderSku implements Serializable { public class GoblinOrderSku implements Serializable,Cloneable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
...@@ -116,5 +116,13 @@ public class GoblinOrderSku implements Serializable { ...@@ -116,5 +116,13 @@ public class GoblinOrderSku implements Serializable {
private String comment; private String comment;
private static final GoblinOrderSku obj = new GoblinOrderSku();
public static GoblinOrderSku getNew() {
try {
return (GoblinOrderSku) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinOrderSku();
}
}
} }
...@@ -170,6 +170,11 @@ public class GoblinStoreOrder implements Serializable,Cloneable { ...@@ -170,6 +170,11 @@ public class GoblinStoreOrder implements Serializable,Cloneable {
*/ */
private String version; private String version;
/**
* 是否会员
*/
private Integer isMember;
/** /**
* 订单类型[0-普通订单|1-定金预售订单|2-全款预售订单|3-拼团订单|4-众筹全款|5-众筹1元|6-众筹无回报|7-虚拟商品订单|8-社区团购订单|9-正在下单] * 订单类型[0-普通订单|1-定金预售订单|2-全款预售订单|3-拼团订单|4-众筹全款|5-众筹1元|6-众筹无回报|7-虚拟商品订单|8-社区团购订单|9-正在下单]
*/ */
......
package com.liquidnet.service.goblin.controller; package com.liquidnet.service.goblin.controller;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.codec.vo.EncryptedReq;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderParam;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinPayInnerResultVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSelfMarketingVo;
import com.liquidnet.service.goblin.service.IGoblinAppOrderService; import com.liquidnet.service.goblin.service.IGoblinAppOrderService;
import com.liquidnet.service.goblin.service.IGoblinAppZhengzaiService; import com.liquidnet.service.goblin.service.IGoblinAppZhengzaiService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Slf4j @Slf4j
@Api(tags = "订单相关") @Api(tags = "订单相关")
...@@ -16,4 +23,17 @@ public class GoblinAppOrderController { ...@@ -16,4 +23,17 @@ public class GoblinAppOrderController {
@Autowired @Autowired
IGoblinAppOrderService goblinAppOrderService; IGoblinAppOrderService goblinAppOrderService;
@PostMapping("pre")
@ApiOperation("下单")
public ResponseDto<GoblinPayInnerResultVo> getZhengzaiMarketList(@RequestBody EncryptedReq<GoblinOrderParam> param) {
GoblinOrderParam payOrderParam = param.getData();
return goblinAppOrderService.checkOrder(payOrderParam);
}
@PostMapping("fc7bce6d6c2213b866f76493f92224b7")
@ApiOperation("fc7bce6d6c2213b866f76493f92224b7")
public ResponseDto<GoblinPayInnerResultVo> getZhengzaiMarketList(@RequestBody GoblinOrderParam param) {
return goblinAppOrderService.checkOrder(param);
}
} }
package com.liquidnet.service.goblin.service.impl; package com.liquidnet.service.goblin.service.impl;
import com.liquidnet.commons.lang.util.CollectionUtil; import com.alibaba.fastjson.JSON;
import com.liquidnet.commons.lang.util.CurrentUtil; import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.commons.lang.util.DateUtil; import com.fasterxml.jackson.databind.JsonNode;
import com.liquidnet.commons.lang.util.IDGenerator; import com.google.gson.JsonObject;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.adam.dto.vo.AdamAddressesVo; import com.liquidnet.service.adam.dto.vo.AdamAddressesVo;
import com.liquidnet.service.adam.dto.vo.AdamEntersVo;
import com.liquidnet.service.adam.dto.vo.AdamRscPolymer01Vo; import com.liquidnet.service.adam.dto.vo.AdamRscPolymer01Vo;
import com.liquidnet.service.base.ErrorMapping; import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.UserPathDto;
import com.liquidnet.service.goblin.constant.GoblinStatusConst; import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.GoblinGoodsSpecDto;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderParam; import com.liquidnet.service.goblin.dto.manage.GoblinOrderParam;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderSkuParam; import com.liquidnet.service.goblin.dto.manage.GoblinOrderSkuParam;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderSpuParam; import com.liquidnet.service.goblin.dto.manage.GoblinOrderStoreParam;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinPayInnerResultVo; import com.liquidnet.service.goblin.dto.manage.vo.GoblinPayInnerResultVo;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsInfoVo; import com.liquidnet.service.goblin.dto.manage.vo.SyncOrderParam;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo; import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
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.GoblinStoreOrder;
import com.liquidnet.service.goblin.service.IGoblinAppOrderService; import com.liquidnet.service.goblin.service.IGoblinAppOrderService;
import com.liquidnet.service.goblin.service.IGoblinAppZhengzaiService;
import com.liquidnet.service.goblin.util.*; import com.liquidnet.service.goblin.util.*;
import io.github.classgraph.json.JSONUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
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.*; import java.util.*;
@Service @Service
...@@ -42,15 +49,20 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService { ...@@ -42,15 +49,20 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService {
@Autowired @Autowired
GoblinOrderUtils orderUtils; GoblinOrderUtils orderUtils;
@Value("${liquidnet.service.order.url-pay.pay}")
private String payUrl;
@Value("${liquidnet.service.order.url-pay.check}")
private String checkUrl;
@Value("${liquidnet.service.order.url-pay.goblinUrl}")
private String synUrl;
@Override @Override
public ResponseDto<GoblinPayInnerResultVo> checkOrder(GoblinOrderParam param) { public ResponseDto<GoblinPayInnerResultVo> checkOrder(GoblinOrderParam param) {
boolean isDownGeneral = false; //是否需要回滚库存
List<AdamEntersVo> entersVoList = ObjectUtil.cloneArrayListObject();
String uid = CurrentUtil.getCurrentUid(); String uid = CurrentUtil.getCurrentUid();
List<String> skuAndPreListAndNumber = CollectionUtil.arrayListString(); List<String> skuAndPreListAndNumber = CollectionUtil.arrayListString();
try { try {
String orderMasterCode = IDGenerator.storeMasterCode();//总订单id String orderMasterCode = IDGenerator.storeMasterCode();//总订单id
List<GoblinOrderSpuParam> goblinOrderSpuParamList = param.getGoblinOrderSpuParamList();//分订单 List<GoblinOrderStoreParam> goblinOrderStoreParamList = param.getGoblinOrderStoreParamList();//分订单
//获取用户相关 //获取用户相关
String addressId; String addressId;
if (param.getAddressIds() == null || param.getAddressIds().size() == 0) { if (param.getAddressIds() == null || param.getAddressIds().size() == 0) {
...@@ -76,57 +88,49 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService { ...@@ -76,57 +88,49 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService {
break; break;
} }
} }
for (GoblinOrderSpuParam spuParam : goblinOrderSpuParamList) { for (GoblinOrderStoreParam storeParam : goblinOrderStoreParamList) {//商铺维度循环
String orderId = IDGenerator.nextSnowId(); String orderId = IDGenerator.nextSnowId();
String orderCode = IDGenerator.storeCode(orderId); String orderCode = IDGenerator.storeCode(orderId);
String spuId = spuParam.getSpuId(); for (GoblinOrderSkuParam skuParam : storeParam.getGoblinOrderSkuParamArrayList()) {//商品维度循环
GoblinGoodsInfoVo goblinGoodsInfoVo = redisUtils.getGoodsInfoVo(spuId); String skuId = skuParam.getSkuId();
if (goblinGoodsInfoVo == null) { // String spuId = skuParam.getSpuId();
return null;//参数异常 // GoblinGoodsInfoVo goblinGoodsInfoVo = redisUtils.getGoodsInfoVo(spuId);
} // if (goblinGoodsInfoVo == null) {
if (!(goblinGoodsInfoVo.getStatus().equals("3") && goblinGoodsInfoVo.getShelvesStatus().equals("3"))) { // return null;//参数异常
return null;//该spu不可购买 // }
} // if (!(goblinGoodsInfoVo.getStatus().equals("3") && goblinGoodsInfoVo.getShelvesStatus().equals("3"))) {
String storeId = goblinGoodsInfoVo.getStoreId(); // return null;//该spu不可购买
String platVoucherCode = spuParam.getPlatVoucherCode(); // }
String storeVoucherCode = spuParam.getStoreVoucherCode(); // if (!goblinGoodsInfoVo.getSkuIdList().contains(skuId)) {
for (GoblinOrderSkuParam skuParam : spuParam.getGoblinOrderSkuParamArrayList()) { // return null;//参数异常
String skuId = skuParam.getSkuIds(); // }
int number = skuParam.getNumber(); int number = skuParam.getNumber();
if (!goblinGoodsInfoVo.getSkuIdList().contains(skuId)) {
return null;//参数异常
}
GoblinGoodsSkuInfoVo skuVo = redisUtils.getGoodsSkuInfoVo(skuId); GoblinGoodsSkuInfoVo skuVo = redisUtils.getGoodsSkuInfoVo(skuId);
if (!(skuVo.getStatus().equals("3") && skuVo.getShelvesStatus().equals("3"))) { if (!(skuVo.getStatus().equals("3") && skuVo.getShelvesStatus().equals("3"))) {
return null;//该sku不可购买 throw new Exception("不可购买");
} }
// 判断库存 // 判断库存
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuId); String pre = GoblinStatusConst.MarketPreStatus.getPre(skuId);
int limitCount = skuVo.getBuyLimit() == 0 ? Integer.MAX_VALUE : skuVo.getBuyLimit(); int limitCount = skuVo.getBuyLimit() == 0 ? Integer.MAX_VALUE : skuVo.getBuyLimit();
int surplusGeneral = redisUtils.decrSkuStock(pre, skuId, number); int surplusGeneral = redisUtils.decrSkuStock(pre, skuId, number);
if (surplusGeneral < 0) {//库存回滚
redisUtils.incrSkuStock(pre, skuId, number);
return null;//售罄
} else {
skuAndPreListAndNumber.add(skuId + "," + pre + "," + number); skuAndPreListAndNumber.add(skuId + "," + pre + "," + number);
isDownGeneral = true;
//判断限购 //判断限购
String res1 = orderUtils.judgeOrderLimit(uid, skuId, number, limitCount); String res1 = orderUtils.judgeOrderLimit(uid, skuId, number, limitCount);
if (!res1.equals("")) { if (!res1.equals("")) {
redisUtils.incrSkuStock(pre, skuId, number); throw new Exception("已超出限购数量");
return ResponseDto.failure(res1);//乱七八糟异常
} }
//下单 //库存回滚
ResponseDto<GoblinPayInnerResultVo> resultData = order(param, skuVo, uid, isMember, addressesVo, orderMasterCode, orderId, orderCode, storeId, number, pre, spuParam.getPlatVoucherCode()); if (surplusGeneral < 0) {
isDownGeneral = false; throw new Exception("已售罄");
return resultData;
} }
}//GoblinOrderSkuParam }//GoblinOrderSkuParam
}//GoblinOrderSpuParam //下单
return null;//参数异常 return order(param, storeParam, uid, isMember, addressesVo, orderMasterCode, orderId, orderCode);
}//GoblinOrderStoreParam
throw new Exception("参数异常");
} catch (Exception e) { } catch (Exception e) {
log.error("Kylin Order Pay Error = {}", e); log.error("Kylin Order Pay Error = {}", e);
if (isDownGeneral) {
//回顾限购 回滚库存 //回顾限购 回滚库存
for (String item : skuAndPreListAndNumber) { for (String item : skuAndPreListAndNumber) {
String[] array = item.split(","); String[] array = item.split(",");
...@@ -137,48 +141,92 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService { ...@@ -137,48 +141,92 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService {
redisUtils.decrSkuCountByUid(uid, skuId, number); redisUtils.decrSkuCountByUid(uid, skuId, number);
} }
log.error("回滚库存"); log.error("回滚库存");
}
if (e.getMessage() == null) { if (e.getMessage() == null) {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常 return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
} else if (e.getMessage().equals("券不可用")) { } else if (e.getMessage().equals("券不可用")) {
return ResponseDto.failure(ErrorMapping.get("20030"));//券不可用 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 { } else {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常 return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
} }
} }
} }
private ResponseDto<GoblinPayInnerResultVo> order(GoblinOrderParam param, GoblinGoodsSkuInfoVo skuInfoVo, String uid, boolean isMember, AdamAddressesVo addressesVo, String orderMasterCode, String orderId, String orderCode, String storeId, int number, String pre, String platVoucherCode) throws Exception { private ResponseDto<GoblinPayInnerResultVo> order(GoblinOrderParam param, GoblinOrderStoreParam storeParam, String uid, boolean isMember, AdamAddressesVo addressesVo, String orderMasterCode, String orderId, String orderCode) throws Exception {
String platVoucherCode = storeParam.getPlatVoucherCode();
String storeId = storeParam.getStoreId();
LinkedList<String> sqls = CollectionUtil.linkedListString(); LinkedList<String> sqls = CollectionUtil.linkedListString();
Map token = CurrentUtil.getTokenClaims(); Map token = CurrentUtil.getTokenClaims();
String headerCliSource = CurrentUtil.getHeaderCliSource(), headerCliVersion = CurrentUtil.getHeaderCliVersion(); String headerCliSource = CurrentUtil.getHeaderCliSource(), headerCliVersion = CurrentUtil.getHeaderCliVersion();
String source = headerCliSource == null ? "" : headerCliSource; String source = headerCliSource == null ? "" : headerCliSource;
String version = headerCliVersion == null ? "" : headerCliVersion; String version = headerCliVersion == null ? "" : headerCliVersion;
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
String skuName = "";
//价格判断 BigDecimal price;//sku应付价格
BigDecimal price = skuInfoVo.getPrice(); BigDecimal priceBase;//sku原价
BigDecimal priceBase = skuInfoVo.getPrice(); BigDecimal storeTotalPrice = BigDecimal.ZERO;//订单总金额
if (pre != null) { BigDecimal voucherMarket = BigDecimal.ZERO;//活动优惠金额
priceBase = redisUtils.getGoodsSkuInfoVo(skuInfoVo.getSkuId().split(pre)[0]).getPrice(); String writeOffCode = ""; //取货码
for (GoblinOrderSkuParam skuParam : storeParam.getGoblinOrderSkuParamArrayList()) {
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuParam.getSkuId());
GoblinGoodsSkuInfoVo skuVo = redisUtils.getGoodsSkuInfoVo(skuParam.getSkuId());
skuName = skuName.concat(skuVo.getName()).concat(",");
if (pre != null && pre.contains(GoblinStatusConst.MarketPreStatus.MARKET_PRE_PURCHASE.getValue())) {
writeOffCode = IDGenerator.getWriteOffCode();
}
//获得 商品原价和活动价格
priceBase = skuVo.getPrice();
if (isMember) { if (isMember) {
priceBase = skuInfoVo.getPriceMember(); priceBase = skuVo.getPriceMember();
} }
if (pre != null) {
GoblinGoodsSkuInfoVo skuMarketVo = redisUtils.getGoodsSkuInfoVo(skuParam.getSkuId().split(pre)[0]);
price = skuMarketVo.getPrice();
if (isMember) {
price = skuMarketVo.getPriceMember();
} }
} else {
price = skuVo.getPrice();
if (isMember) { if (isMember) {
price = skuInfoVo.getPriceMember(); price = skuVo.getPriceMember();
}
} }
BigDecimal voucherMarket = priceBase.subtract(price).multiply(BigDecimal.valueOf(number)); //获得活动优惠价格
voucherMarket = voucherMarket.add(priceBase.subtract(price));
storeTotalPrice = storeTotalPrice.add(price);
//订单sku
GoblinOrderSku orderSku = GoblinOrderSku.getNew();
orderSku.setOrderSkuId(IDGenerator.nextTimeId2());
orderSku.setOrderId(orderId);
orderSku.setSpuId(skuParam.getSpuId());
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(priceBase.subtract(price));
orderSku.setCreatedAt(now);
}
//优惠券
BigDecimal voucherPrice = BigDecimal.ZERO; BigDecimal voucherPrice = BigDecimal.ZERO;
if (platVoucherCode != null && platVoucherCode != "") { if (platVoucherCode != null && !platVoucherCode.equals("")) {
HashMap<String, Object> hashMap = orderUtils.useCoupon(platVoucherCode, "购买商品spu", priceBase.multiply(BigDecimal.valueOf(number)), "");//todo HashMap<String, Object> hashMap = orderUtils.useCoupon(platVoucherCode, "购买商品[" + orderCode + "]", storeTotalPrice, "");//todo
voucherPrice = (BigDecimal) hashMap.get("voucher"); voucherPrice = (BigDecimal) hashMap.get("voucher");
Integer typeVoucher = (Integer) hashMap.get("type"); Integer typeVoucher = (Integer) hashMap.get("type");
if (typeVoucher.equals(-1)) { if (typeVoucher.equals(-1)) {
throw new Exception("券不可用"); throw new Exception("券不可用");
} }
} }
//生成订单 //生成订单
GoblinStoreOrder storeOrder = GoblinStoreOrder.getNew(); GoblinStoreOrder storeOrder = GoblinStoreOrder.getNew();
storeOrder.setMasterOrderCode(orderMasterCode); storeOrder.setMasterOrderCode(orderMasterCode);
...@@ -188,11 +236,11 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService { ...@@ -188,11 +236,11 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService {
storeOrder.setUserId(uid); storeOrder.setUserId(uid);
storeOrder.setUserName(StringUtils.defaultString(((String) token.get("nickname")), "")); storeOrder.setUserName(StringUtils.defaultString(((String) token.get("nickname")), ""));
storeOrder.setUserMobile(StringUtils.defaultString(((String) token.get("mobile")), "")); storeOrder.setUserMobile(StringUtils.defaultString(((String) token.get("mobile")), ""));
storeOrder.setPriceTotal(priceBase.multiply(BigDecimal.valueOf(number))); storeOrder.setPriceTotal(storeTotalPrice);
storeOrder.setPriceActual(storeOrder.getPriceTotal().subtract(voucherMarket).subtract(voucherPrice)); storeOrder.setPriceActual(storeOrder.getPriceTotal().subtract(voucherMarket).subtract(voucherPrice));
storeOrder.setPriceRefund(BigDecimal.ZERO); storeOrder.setPriceRefund(BigDecimal.ZERO);
storeOrder.setPreSalePrice(BigDecimal.ZERO); storeOrder.setPreSalePrice(BigDecimal.ZERO);
storeOrder.setPriceExpress(BigDecimal.ZERO);//todo 快递费 storeOrder.setPriceExpress(BigDecimal.TEN);//todo 快递费 暂时写死
storeOrder.setPriceModify(BigDecimal.ZERO); storeOrder.setPriceModify(BigDecimal.ZERO);
storeOrder.setPricePoint((BigDecimal.ZERO)); storeOrder.setPricePoint((BigDecimal.ZERO));
storeOrder.setPriceCoupon(voucherPrice); storeOrder.setPriceCoupon(voucherPrice);
...@@ -209,26 +257,93 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService { ...@@ -209,26 +257,93 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService {
storeOrder.setPreDepositPay(0); storeOrder.setPreDepositPay(0);
storeOrder.setSource(source); storeOrder.setSource(source);
storeOrder.setVersion(version); storeOrder.setVersion(version);
storeOrder.setIsMember(isMember ? 1 : 0);
storeOrder.setOrderType(0); storeOrder.setOrderType(0);
storeOrder.setLotteryStatus("0"); storeOrder.setLotteryStatus("0");
storeOrder.setWriteOffCode("");//todo storeOrder.setWriteOffCode(writeOffCode);
storeOrder.setPayCountdownMinute(5); storeOrder.setPayCountdownMinute(5);
storeOrder.setIpAddress(CurrentUtil.getCliIpAddr()); storeOrder.setIpAddress(CurrentUtil.getCliIpAddr());
storeOrder.setCreatedAt(now); storeOrder.setCreatedAt(now);
// storeOrder.setMailNo(); //订单attr
// storeOrder.setDeliveryTime(); GoblinOrderAttr orderAttr = GoblinOrderAttr.getNew();
// storeOrder.setLogisticsCompany(); orderAttr.setOrderAttrId(IDGenerator.nextTimeId2());
// storeOrder.setLogisticsCode(); orderAttr.setOrderId(orderId);
// storeOrder.setPayTime(); orderAttr.setExpressContacts(addressesVo.getName());
// storeOrder.setCancelTime(); orderAttr.setExpressAddress(addressesVo.getProvince() + "," + addressesVo.getCounty() + "," + addressesVo.getCity());
// storeOrder.setModifyTime(); orderAttr.setExpressAddressDetail(addressesVo.getAddress());
// storeOrder.setEvaluationTime(); orderAttr.setExpressPhone(addressesVo.getPhone());
// storeOrder.setPreSaleTime(); orderAttr.setExpressType(1);
// storeOrder.setRecommendedId(); orderAttr.setCreatedAt(now);
// storeOrder.setSRecommendedId(); //是否免费
// storeOrder.setCrowdfundingId(); boolean isFree = false;
// storeOrder.setPayCode(); GoblinPayInnerResultVo payInnerResultVo;
// storeOrder.setPayStoreId(); if (storeOrder.getPriceActual().compareTo(BigDecimal.valueOf(0)) > 0) {
return null; // 调用支付
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("type", "PRODUCT");
httpData.add("price", storeOrder.getPriceActual().toString());
httpData.add("name", redisUtils.getStoreInfoVo(storeParam.getStoreId()).getStoreName());
httpData.add("detail", skuName);
httpData.add("orderCode", storeOrder.getOrderCode());
httpData.add("clientIp", storeOrder.getIpAddress());
httpData.add("notifyUrl", synUrl);
httpData.add("createDate", storeOrder.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
httpData.add("expireTime", storeOrder.getPayCountdownMinute().toString());
httpData.add("payType", storeOrder.getPayType());
httpData.add("deviceFrom", param.getDeviceFrom());
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() + storeOrder.getOrderId());
httpData.add("returnUrl", param.getReturnUrl() + storeOrder.getOrderId());
}
if (param.getPayType().equals("douyinpay")) {
httpData.add("showUrl", param.getShowUrl() + storeOrder.getOrderId());
httpData.add("returnUrl", param.getReturnUrl() + storeOrder.getOrderId());
}
if (param.getPayType().equals("unionpay")) {
httpData.add("returnUrl", param.getReturnUrl() + storeOrder.getOrderId());
}
String returnData = HttpUtil.post(payUrl, httpData);
log.info("调用 DRAGON 结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
payInnerResultVo = GoblinPayInnerResultVo.getNew();
payInnerResultVo.setCode(dto.getData().getCode());
payInnerResultVo.setOrderCode(dto.getData().getOrderCode());
payInnerResultVo.setPayData(dto.getData().getPayData());
payInnerResultVo.setOrderId(storeOrder.getOrderId());
payInnerResultVo.setPayType(storeOrder.getPayType());
payInnerResultVo.setPrice(storeOrder.getPriceActual());
storeOrder.setPayCode(payInnerResultVo.getCode());
payInnerResultVo.setShowUrl(param.getShowUrl() + storeOrder.getOrderId());
payInnerResultVo.setReturnUrl(param.getReturnUrl() + storeOrder.getOrderId());
} else {
isFree = true;
storeOrder.setPayType("FREE");
storeOrder.setPayCode("FREE_PAY_CODE");
payInnerResultVo = GoblinPayInnerResultVo.getNew();
payInnerResultVo.setPrice(BigDecimal.valueOf(0));
payInnerResultVo.setOrderId(storeOrder.getOrderId());
payInnerResultVo.setPayType(storeOrder.getPayType());
}
//todo vo redisList
log.info(UserPathDto.setData("下单(唤起支付)", param, payInnerResultVo));
if (isFree) {
SyncOrderParam syncOrderParam = SyncOrderParam.getNew();
syncOrderParam.setOrderCode(storeOrder.getOrderCode());
syncOrderParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
syncOrderParam.setCode(storeOrder.getPayCode());
syncOrderParam.setPrice(storeOrder.getPriceActual());
syncOrderParam.setPaymentId("FREE_PAYMENT_ID");
syncOrderParam.setPaymentType(null);
syncOrderParam.setStatus(1);
// syncOrder(syncOrderParam);
return ResponseDto.success(payInnerResultVo);
} else {
return ResponseDto.success(payInnerResultVo);
}
} }
} }
...@@ -32,7 +32,7 @@ public class GoblinRedisUtils { ...@@ -32,7 +32,7 @@ public class GoblinRedisUtils {
public int getSkuStock(String marketPre, String skuId) { public int getSkuStock(String marketPre, String skuId) {
String rk = GoblinRedisConst.REAL_STOCK_SKU; String rk = GoblinRedisConst.REAL_STOCK_SKU;
if (marketPre != null) { if (marketPre != null && !marketPre.equals("null")) {
rk = rk.concat(marketPre + ":"); rk = rk.concat(marketPre + ":");
} }
rk = rk.concat(skuId); rk = rk.concat(skuId);
...@@ -46,7 +46,7 @@ public class GoblinRedisUtils { ...@@ -46,7 +46,7 @@ public class GoblinRedisUtils {
public int incrSkuStock(String marketPre, String skuId, Integer stock) { public int incrSkuStock(String marketPre, String skuId, Integer stock) {
String rk = GoblinRedisConst.REAL_STOCK_SKU; String rk = GoblinRedisConst.REAL_STOCK_SKU;
if (marketPre != null) { if (marketPre != null && !marketPre.equals("null")) {
rk = rk.concat(marketPre + ":"); rk = rk.concat(marketPre + ":");
} }
rk = rk.concat(skuId); rk = rk.concat(skuId);
...@@ -55,7 +55,7 @@ public class GoblinRedisUtils { ...@@ -55,7 +55,7 @@ public class GoblinRedisUtils {
public int decrSkuStock(String marketPre, String skuId, Integer stock) { public int decrSkuStock(String marketPre, String skuId, Integer stock) {
String rk = GoblinRedisConst.REAL_STOCK_SKU; String rk = GoblinRedisConst.REAL_STOCK_SKU;
if (marketPre != null) { if (marketPre != null && !marketPre.equals("null")) {
rk = rk.concat(marketPre + ":"); rk = rk.concat(marketPre + ":");
} }
rk = rk.concat(skuId); rk = rk.concat(skuId);
......
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