|
@@ -23,18 +23,14 @@ import edu.travel.commodity.service.ShopAddressService;
|
|
|
import edu.travel.commodity.service.ShopProductService;
|
|
|
import edu.travel.commodity.service.ShopProductSkuService;
|
|
|
import edu.travel.commodity.service.ShopSkuSpecValueService;
|
|
|
-import edu.travel.commodity.utils.StringUtil;
|
|
|
import edu.travel.commodity.utils.TokenData;
|
|
|
import edu.travel.exception.BaseException;
|
|
|
import edu.travel.remote.dto.*;
|
|
|
-import edu.travel.remote.vo.ShopSkuSpecValueVo;
|
|
|
-import edu.travel.remote.vo.ShopSnapshotVo;
|
|
|
-import edu.travel.remote.vo.SpecValueVo;
|
|
|
+import edu.travel.remote.vo.*;
|
|
|
import edu.travel.rpc.RPCBaseResponse;
|
|
|
import edu.travel.vo.BaseCountryServeVo;
|
|
|
import edu.travel.vo.ShopCurrencyVo;
|
|
|
import io.seata.spring.annotation.GlobalTransactional;
|
|
|
-import org.checkerframework.checker.units.qual.C;
|
|
|
import org.redisson.api.RLock;
|
|
|
import org.redisson.api.RedissonClient;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -46,6 +42,7 @@ import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -100,7 +97,7 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
|
|
|
//商品ID
|
|
|
Set<String> product = products.stream().map(AddShopProductOrderDto::getProductId).collect(Collectors.toSet());
|
|
|
List<ShopProduct> list1 = shopProductService.lambdaQuery().in(ShopProduct::getId, product).eq(ShopProduct::getStatus, 0).list();
|
|
|
- if(list1.size()<products.size()){
|
|
|
+ if(list1.size()!=product.size()){
|
|
|
throw new BaseException("商品不存在");
|
|
|
}
|
|
|
HashMap<String, ShopProduct> productMap = new HashMap<>();
|
|
@@ -244,14 +241,12 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
|
|
|
for (SkuValueDto skuValues : insertProductSkuDto.getSkuValues()) {
|
|
|
ShopSkuSpecValue skuValue = new ShopSkuSpecValue();
|
|
|
skuValue.setSkuId(bean.getSkuId());
|
|
|
- skuValue.setSpecId(Long.valueOf(skuValues.getSpecId()));
|
|
|
- List<InsertProductSpecDto> collect = specs.stream().filter(spec -> spec.getSpecId().equals(skuValues.getSpecId()))
|
|
|
- .collect(Collectors.toList());
|
|
|
+ List<InsertProductSpecDto> collect = specs.stream().filter(spec -> spec.getSpecName().equals(skuValues.getSpecName())).collect(Collectors.toList());
|
|
|
if(ObjectUtil.isEmpty(collect)){
|
|
|
throw new BaseException("规格不存在");
|
|
|
}
|
|
|
InsertProductSpecDto insertProductSpecDto = collect.get(0);
|
|
|
-
|
|
|
+ skuValue.setSpecId(Long.valueOf(insertProductSpecDto.getSpecId()));
|
|
|
List<SpecValueDto> collect1 = insertProductSpecDto.getSpecValues().stream()
|
|
|
.filter(specValue -> specValue.getSpecValueName().equals(skuValues.getSpecValueName())).collect(Collectors.toList());
|
|
|
skuValue.setSpecValueId(Long.valueOf(collect1.get(0).getSpecValueId()));
|
|
@@ -264,6 +259,62 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
|
|
|
return saveBatch(shopProductSkus);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+// @GlobalTransactional
|
|
|
+ public void payProductSku(PayShopOrderDto payShopOrderDto) {
|
|
|
+ //查询订单
|
|
|
+ RPCBaseResponse<ShowOrderInfoVo> showOrderInfoVoRPCBaseResponse = orderAdapter.orderInfoByOrderNum(payShopOrderDto.getOrderNum());
|
|
|
+ if(showOrderInfoVoRPCBaseResponse.getCode()!=200){
|
|
|
+ throw new BaseException(showOrderInfoVoRPCBaseResponse.getMsg());
|
|
|
+ }
|
|
|
+ ShowOrderInfoVo data = showOrderInfoVoRPCBaseResponse.getData();
|
|
|
+ if(!data.getStatus().equals(OrderStateEnum.WAITING_FOR_PAYMENT.getState())){
|
|
|
+ throw new BaseException("订单状态有误");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<OrderItemVo> orderItemVoList = data.getOrderItemVoList();
|
|
|
+ List<AddShopProductOrderDto> products = new ArrayList<AddShopProductOrderDto>();
|
|
|
+ Map<String, OrderItemVo> itemMap = new ConcurrentHashMap<>();
|
|
|
+ for (OrderItemVo orderItemVo : orderItemVoList) {
|
|
|
+ itemMap.put(orderItemVo.getProductId()+":"+orderItemVo.getSkuId(),orderItemVo);
|
|
|
+ AddShopProductOrderDto addShopProductOrderDto = new AddShopProductOrderDto();
|
|
|
+ addShopProductOrderDto.setProductId(orderItemVo.getProductId());
|
|
|
+ addShopProductOrderDto.setSkuId(orderItemVo.getSkuId());
|
|
|
+ products.add(addShopProductOrderDto);
|
|
|
+ }
|
|
|
+ List<String> collect = orderItemVoList.stream().map(item -> item.getProductId() + ":" + item.getSkuId()).sorted()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ RLock[] locks=new RLock[collect.size()];
|
|
|
+ for (int i = 0; i < locks.length; i++) {
|
|
|
+ String s = collect.get(i);
|
|
|
+ locks[i] = redissonClient.getFairLock(RedisKey.PRODUCT_ORDER+s);
|
|
|
+ }
|
|
|
+ RLock multiLock = redissonClient.getMultiLock(locks);
|
|
|
+ //扣除冻结和库存
|
|
|
+ try {
|
|
|
+ if(multiLock.tryLock(20, TimeUnit.SECONDS)){
|
|
|
+ List<ShopProductSku> ls = shopProductSkuMapper.getByProductSkus(products);
|
|
|
+ for (ShopProductSku shopProductSku : ls) {
|
|
|
+ OrderItemVo orderItemVo = itemMap.get(shopProductSku.getProductId() + ":" + shopProductSku.getSkuId());
|
|
|
+ String quantity = orderItemVo.getQuantity();
|
|
|
+ int i = Integer.parseInt(quantity);
|
|
|
+ //扣除冻结
|
|
|
+ shopProductSku.setFreeze(shopProductSku.getFreeze()-i);
|
|
|
+ //扣除库存
|
|
|
+ shopProductSku.setInventory(shopProductSku.getInventory()-i);
|
|
|
+ }
|
|
|
+ updateBatchById(ls);
|
|
|
+ // 订单状态扭转
|
|
|
+ orderAdapter.changeOrderState(payShopOrderDto.getOrderNum(),OrderStateEnum.AWAITING_RECEIPT.getState()+"");
|
|
|
+ }
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ throw new BaseException(e);
|
|
|
+ }finally {
|
|
|
+ multiLock.unlock();//解锁
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
//获取商品快照信息
|
|
|
public Map<String,ShopSnapshotVo> getSnapshot(List<AddShopProductOrderDto> products) {
|