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

Commit 4d7ba024 authored by 胡佳晨's avatar 胡佳晨

提交 下单接口 未完成

parent f448c376
...@@ -45,6 +45,9 @@ public class GoblinRedisConst { ...@@ -45,6 +45,9 @@ public class GoblinRedisConst {
public static final String REDIS_GOBLIN_ZHENGZAI_LIST = PREFIX.concat("zhengzai:list");//全部正在下单内容 public static final String REDIS_GOBLIN_ZHENGZAI_LIST = PREFIX.concat("zhengzai:list");//全部正在下单内容
public static final String REDIS_GOBLIN_STORE_MARKET_ISCONFIG = PREFIX.concat("store:is_config:");//商铺活动-该活动配置了款式的商品 public static final String REDIS_GOBLIN_STORE_MARKET_ISCONFIG = PREFIX.concat("store:is_config:");//商铺活动-该活动配置了款式的商品
public static final String REDIS_GOBLIN_BUY_COUNT = PREFIX.concat("uid:");//用户sku购买数量 key:uid:skuId:$skuId
public static final String REDIS_GOBLIN_SALE_COUNT = PREFIX.concat("sale:skuId:");//用户sku购买数量 key:sale:skuId:$skuId
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
/** /**
* SKU剩余库存 * SKU剩余库存
......
...@@ -94,6 +94,15 @@ public class GoblinStatusConst { ...@@ -94,6 +94,15 @@ public class GoblinStatusConst {
public String getDesc() { public String getDesc() {
return desc; return desc;
} }
public static String getPre(String goblinId) {
if (goblinId.contains(MARKET_PRE_ZHENGZAI.getValue())) {
return MARKET_PRE_ZHENGZAI.getValue();
} else if (goblinId.contains(MARKET_PRE_PURCHASE.getValue())) {
return MARKET_PRE_PURCHASE.getValue();
}
return null;
}
} }
......
...@@ -4,25 +4,33 @@ import io.swagger.annotations.ApiModel; ...@@ -4,25 +4,33 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
@ApiModel(value = "GoblinOrderParam") @ApiModel(value = "GoblinOrderParam")
@Data @Data
public class GoblinOrderParam { public class GoblinOrderParam {
@ApiModelProperty(required = false, value = "活动id[添加操作不需要]", example = "1") @ApiModelProperty(required = false, value = "收货地址id[虚拟物品不需要]")
private ArrayList<String> addressIds; private ArrayList<String> addressIds;
@ApiModelProperty(value = "代理id")
private String agentId;
@ApiModelProperty(value = "支付类型")
@NotNull(message = "支付类型不能为空")
private String payType;
@ApiModelProperty(value = "支付来源")
@NotNull(message = "支付来源不能为空")
private String deviceFrom;
@ApiModelProperty(value = "openId")
private String openId;
@ApiModelProperty(value = "showUrl")
private String showUrl;
@ApiModelProperty(value = "returnUrl")
private String returnUrl;
@ApiModelProperty(value = "商品相关参数集合")
private List<GoblinOrderSpuParam> goblinOrderSpuParamList;
@ApiModelProperty(required = true, value = "商铺id", example = "活动名称")
private String storeId;
@ApiModelProperty(required = true, value = "活动名称", example = "活动名称")
private String name;
@ApiModelProperty(required = true, value = "活动开始时间", example = "2021-12-11 12:00:00")
private String startTime;
@ApiModelProperty(required = true, value = "活动结束时间", example = "2021-12-12 12:00:00")
private String endTime;
} }
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
@ApiModel(value = "GoblinOrderParam")
@Data
public class GoblinOrderSkuParam {
@ApiModelProperty(required = true, value = "skuId")
private String skuIds;
@ApiModelProperty(required = true, value = "数量")
private Integer number;
}
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
@ApiModel(value = "GoblinOrderParam")
@Data
public class GoblinOrderSpuParam {
@ApiModelProperty(required = true, value = "spuId")
private String spuId;
@ApiModelProperty(value = "平台券码")
private String platVoucherCode;
@ApiModelProperty(value = "商品券码")
private String storeVoucherCode;
@ApiModelProperty(required = true, value = "款式相关数据集合")
private ArrayList<GoblinOrderSkuParam> goblinOrderSkuParamArrayList;
}
...@@ -58,6 +58,25 @@ public class IDGenerator { ...@@ -58,6 +58,25 @@ public class IDGenerator {
return orderCode; return orderCode;
} }
/**
* 根据订单id生成总订单号
*
* @param orderId
* @return
*/
public static String storeCode(String orderId) {
return ticketOrderCode(orderId);
}
/**
* 根据订单id生成总订单号
*
* @return
*/
public static String storeMasterCode() {
return nextSnowId();
}
public static Long getDamaiCode(String code) { public static Long getDamaiCode(String code) {
if (code.length() < 13) { if (code.length() < 13) {
return Long.valueOf(code); return Long.valueOf(code);
......
...@@ -36,6 +36,12 @@ ...@@ -36,6 +36,12 @@
<artifactId>liquidnet-service-goblin-api</artifactId> <artifactId>liquidnet-service-goblin-api</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-service-adam-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
......
package com.liquidnet.service.goblin.service.impl; package com.liquidnet.service.goblin.service.impl;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
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.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
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.GoblinOrderSpuParam;
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.vo.GoblinGoodsSkuInfoVo;
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 com.liquidnet.service.goblin.util.GoblinMongoUtils; import com.liquidnet.service.goblin.util.*;
import com.liquidnet.service.goblin.util.GoblinRedisUtils; import lombok.extern.slf4j.Slf4j;
import com.liquidnet.service.goblin.util.QueueUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service @Service
@Slf4j
public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService { public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService {
@Autowired @Autowired
...@@ -20,9 +37,111 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService { ...@@ -20,9 +37,111 @@ public class GoblinAppOrderServiceImpl implements IGoblinAppOrderService {
GoblinMongoUtils mongoUtils; GoblinMongoUtils mongoUtils;
@Autowired @Autowired
QueueUtils queueUtils; QueueUtils queueUtils;
@Autowired
GoblinOrderUtils orderUtils;
@Override @Override
public ResponseDto<GoblinPayInnerResultVo> checkOrder(GoblinOrderParam param) { public ResponseDto<GoblinPayInnerResultVo> checkOrder(GoblinOrderParam param) {
return null; boolean isDownGeneral = false; //是否需要回滚库存
List<AdamEntersVo> entersVoList = ObjectUtil.cloneArrayListObject();
String uid = CurrentUtil.getCurrentUid();
List<String> skuAndPreListAndNumber = CollectionUtil.arrayListString();
try {
String orderMasterCode = IDGenerator.storeMasterCode();//总订单id
List<GoblinOrderSpuParam> goblinOrderSpuParamList = param.getGoblinOrderSpuParamList();//分订单
//获取用户相关
String addressId;
if (param.getAddressIds() == null || param.getAddressIds().size() == 0) {
addressId = "";
} else {
addressId = StringUtils.join(param.getAddressIds(), ",");
}
AdamRscPolymer01Vo userVo = orderUtils.adamAddressEnterMember(uid, null, addressId);
AdamAddressesVo addressesVo;
boolean isMember;
if (userVo == null) {
isMember = false;
addressesVo = null;
} else {
addressesVo = userVo.getAddressesVo();
switch (userVo.getMembership()) {
case 10:
case 11:
isMember = true;
break;
default:
isMember = false;
break;
}
}
for (GoblinOrderSpuParam spuParam : goblinOrderSpuParamList) {
String orderId = IDGenerator.nextSnowId();
String orderCode = IDGenerator.storeCode(orderId);
String spuId = spuParam.getSpuId();
GoblinGoodsInfoVo goblinGoodsInfoVo = redisUtils.getGoodsInfoVo(spuId);
if (goblinGoodsInfoVo == null) {
return null;//参数异常
}
if (!(goblinGoodsInfoVo.getStatus().equals("3") && goblinGoodsInfoVo.getShelvesStatus().equals("3"))) {
return null;//该spu不可购买
}
String storeId = goblinGoodsInfoVo.getStoreId();
String platVoucherCode = spuParam.getPlatVoucherCode();
String storeVoucherCode = spuParam.getStoreVoucherCode();
for (GoblinOrderSkuParam skuParam : spuParam.getGoblinOrderSkuParamArrayList()) {
String skuId = skuParam.getSkuIds();
int number = skuParam.getNumber();
if (!goblinGoodsInfoVo.getSkuIdList().contains(skuId)) {
return null;//参数异常
}
GoblinGoodsSkuInfoVo skuVo = redisUtils.getGoodsSkuInfoVo(skuId);
if (!(skuVo.getStatus().equals("3") && skuVo.getShelvesStatus().equals("3"))) {
return null;//该sku不可购买
}
// 判断库存
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuId);
int limitCount = skuVo.getBuyLimit() == 0 ? Integer.MAX_VALUE : skuVo.getBuyLimit();
int surplusGeneral = redisUtils.decrSkuStock(pre, skuId, number);
if (surplusGeneral < 0) {//库存回滚
redisUtils.incrSkuStock(pre, skuId, number);
return null;//售罄
} else {
skuAndPreListAndNumber.add(skuId + "," + pre + "," + number);
isDownGeneral = true;
//判断限购
String res1 = orderUtils.judgeOrderLimit(uid, skuId, number, limitCount);
if (!res1.equals("")) {
redisUtils.incrSkuStock(pre, skuId, number);
return ResponseDto.failure(res1);//乱七八糟异常
}
//下单
isDownGeneral = false;
return null;
}
}//GoblinOrderSkuParam
}//GoblinOrderSpuParam
return null;//参数异常
} catch (Exception e) {
log.error("Kylin Order Pay Error = {}", e);
if (isDownGeneral) {
//回顾限购 回滚库存
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);
redisUtils.decrSkuCountByUid(uid, skuId, number);
}
log.error("回滚库存");
}
if (e.getMessage() == null) {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
} else if (e.getMessage().equals("券不可用")) {
return ResponseDto.failure(ErrorMapping.get("20030"));//券不可用
} else {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
}
}
} }
} }
package com.liquidnet.service.goblin.util;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.adam.dto.vo.AdamRscPolymer01Vo;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
@Component
@Slf4j
public class GoblinOrderUtils {
@Value("${liquidnet.adam.url}")
private String adamUrl;
@Value("${liquidnet.candy.url}")
private String candyUrl;
@Value("${liquidnet.service.stone.url}")
private String stoneUrl;
@Autowired
GoblinRedisUtils redisUtils;
public AdamRscPolymer01Vo adamAddressEnterMember(String uid, String enterIds, String addressId) {
try {
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
params.add("addressId", addressId);
params.add("entersIds", enterIds);
params.add("uid", uid);
String resultData = HttpUtil.post(adamUrl + "/adam/rsc/inquire/of_buy_ticket", params, header);
ResponseDto<AdamRscPolymer01Vo> vo = JsonUtils.fromJson(resultData, new TypeReference<ResponseDto<AdamRscPolymer01Vo>>() {
});
if (null != vo.getData()) {
return vo.getData();
} else {
return null;
}
} catch (Exception e) {
log.error("获取用户信息,e:{}", e);
e.printStackTrace();
return null;
}
}
public String judgeOrderLimit(String uid, String skuId, int number, int limitCount) {
int buyCount = redisUtils.getSkuCountByUid(uid, skuId);
if (buyCount + number > limitCount) {
return "已超出限购数量";
} else {
redisUtils.incrSkuCountByUid(uid, skuId, number);
return "";
}
}
}
...@@ -335,4 +335,51 @@ public class GoblinRedisUtils { ...@@ -335,4 +335,51 @@ public class GoblinRedisUtils {
return (List<GoblinSelfMarketingVo>) obj; return (List<GoblinSelfMarketingVo>) obj;
} }
} }
//获取 用户sku购买个数
public Integer getSkuCountByUid(String uid, String skuId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_BUY_COUNT.concat(uid + ":skuId:" + skuId);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return null;
} else {
return (Integer) obj;
}
}
// 增加 用户sku购买个数
public int incrSkuCountByUid(String uid, String skuId, int number) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_BUY_COUNT.concat(uid + ":skuId:" + skuId);
return (int) redisUtil.incr(redisKey, number);
}
// 减少 用户sku购买个数
public int decrSkuCountByUid(String uid, String skuId, int number) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_BUY_COUNT.concat(uid + ":skuId:" + skuId);
return (int) redisUtil.decr(redisKey, number);
}
//获取 sku销量
public Integer getSkuSaleCount(String skuId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_SALE_COUNT.concat(skuId);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return null;
} else {
return (Integer) obj;
}
}
// 增加 sku销量
public int incrSkuSaleCount(String skuId, int number) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_SALE_COUNT.concat(skuId);
return (int) redisUtil.incr(redisKey, number);
}
// 减少 sku销量
public int decrSkuSaleCount(String skuId, int number) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_SALE_COUNT.concat(skuId);
return (int) redisUtil.decr(redisKey, number);
}
} }
package com.liquidnet.service.goblin.util; package com.liquidnet.service.goblin.util;
import com.liquidnet.service.adam.dto.vo.AdamEntersVo;
import com.liquidnet.service.base.PagedResult; import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtGoodsListVo; import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtGoodsListVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtThumbVo; import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtThumbVo;
...@@ -8,7 +9,6 @@ import com.liquidnet.service.goblin.entity.GoblinFrontBanner; ...@@ -8,7 +9,6 @@ import com.liquidnet.service.goblin.entity.GoblinFrontBanner;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
public class ObjectUtil { public class ObjectUtil {
private static final PagedResult<GoblinStoreMgtGoodsListVo> goblinStoreMgtGoodsVoPagedResult = new PagedResult<>(); private static final PagedResult<GoblinStoreMgtGoodsListVo> goblinStoreMgtGoodsVoPagedResult = new PagedResult<>();
...@@ -28,6 +28,8 @@ public class ObjectUtil { ...@@ -28,6 +28,8 @@ public class ObjectUtil {
private static final ArrayList<GoblinStorePurchaseSkuVo> goblinStorePurchaseSkuVoArrayList = new ArrayList<>(); private static final ArrayList<GoblinStorePurchaseSkuVo> goblinStorePurchaseSkuVoArrayList = new ArrayList<>();
private static final ArrayList<GoblinSelfZhengzaiSkuVo> goblinSelfZhengzaiSkuVoArrayList = new ArrayList<>(); private static final ArrayList<GoblinSelfZhengzaiSkuVo> goblinSelfZhengzaiSkuVoArrayList = new ArrayList<>();
private static final ArrayList<GoblinShowStoreInfoVo> goblinShowStoreInfoVoArrayList = new ArrayList<>(); private static final ArrayList<GoblinShowStoreInfoVo> goblinShowStoreInfoVoArrayList = new ArrayList<>();
private static final ArrayList<AdamEntersVo> arrayListObject = new ArrayList<>();
private static final BasicDBObject basicDBObject = new BasicDBObject(); private static final BasicDBObject basicDBObject = new BasicDBObject();
...@@ -35,6 +37,10 @@ public class ObjectUtil { ...@@ -35,6 +37,10 @@ public class ObjectUtil {
return goblinStoreMgtGoodsVoPagedResult.clone(); return goblinStoreMgtGoodsVoPagedResult.clone();
} }
public static ArrayList<AdamEntersVo> cloneArrayListObject() {
return (ArrayList<AdamEntersVo>) arrayListObject.clone();
}
public static ArrayList<GoblinShowStoreInfoVo> getGoblinShowStoreInfoVoArrayList() { public static ArrayList<GoblinShowStoreInfoVo> getGoblinShowStoreInfoVoArrayList() {
return (ArrayList<GoblinShowStoreInfoVo>) goblinShowStoreInfoVoArrayList.clone(); return (ArrayList<GoblinShowStoreInfoVo>) goblinShowStoreInfoVoArrayList.clone();
} }
......
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