|
|
@@ -7,6 +7,7 @@ import cn.hutool.core.util.ReUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -25,8 +26,10 @@ import org.dromara.external.api.zhongche.domain.bo.*;
|
|
|
import org.dromara.external.api.zhongche.domain.vo.*;
|
|
|
import org.dromara.external.api.zhongche.domain.Catalog;
|
|
|
import org.dromara.external.controller.zhongche.handle.MallMessageDispatcher;
|
|
|
+import org.dromara.external.domain.ExternalItem;
|
|
|
import org.dromara.external.domain.ExternalProduct;
|
|
|
import org.dromara.external.domain.ExternalProductCategory;
|
|
|
+import org.dromara.external.service.IExternalItemService;
|
|
|
import org.dromara.external.service.IExternalProductCategoryService;
|
|
|
import org.dromara.external.service.IExternalProductService;
|
|
|
import org.dromara.external.util.SM2SignatureUtils;
|
|
|
@@ -73,6 +76,8 @@ public class ZhongChePushController {
|
|
|
|
|
|
private final IExternalProductService externalProductService;
|
|
|
|
|
|
+ private final IExternalItemService externalItemService;
|
|
|
+
|
|
|
//电商私钥
|
|
|
private final static String DEVELOPER_PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgQu0H97EPqkgz1YS5LkzZNmkG3mS5Er8rJ2LSoJtuOlGgCgYIKoEcz1UBgi2hRANCAARP6NYwTHpW2QTL8A2f2hpgunEpDVkJBhErBQPLqNS/Si5Q+9I9wUpCYdk1EvB5Hw6yzkE4bYk5IZM1j+/SnNFn";
|
|
|
//企采公钥
|
|
|
@@ -258,6 +263,24 @@ public class ZhongChePushController {
|
|
|
return ZCR.ok(respDataBase64, respSign);
|
|
|
}
|
|
|
|
|
|
+ @GetMapping("testQueryGoodsStock")
|
|
|
+ public R<List<Stocks>> testQueryGoodsStock() {
|
|
|
+ AreaStockBo areaStockBo = new AreaStockBo();
|
|
|
+ areaStockBo.setAreaId("1");
|
|
|
+ List<Goods> goods = new ArrayList<>();
|
|
|
+ Goods goods1 = new Goods();
|
|
|
+ goods1.setGoodsId("002171765");
|
|
|
+ goods1.setGoodsNum(2);
|
|
|
+ goods.add(goods1);
|
|
|
+ Goods goods2 = new Goods();
|
|
|
+ goods2.setGoodsId("002171772");
|
|
|
+ goods2.setGoodsNum(2);
|
|
|
+ goods.add(goods2);
|
|
|
+ areaStockBo.setGoods(goods);
|
|
|
+ List<Stocks> stocks = queryGoodsStock(areaStockBo);
|
|
|
+ return R.ok(stocks);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 核心业务:查询商品库存,映射文档返回格式(包含库存状态、剩余数量等规则)
|
|
|
*/
|
|
|
@@ -271,8 +294,67 @@ public class ZhongChePushController {
|
|
|
goodsMap.put(goodsId, goodsNum); // 对应Dubbo服务要求:key=商品ID,value=所需库存
|
|
|
}
|
|
|
|
|
|
+
|
|
|
// 3. 调用Dubbo服务,获取库存结果(你的remoteProductService)
|
|
|
- StocksResultDto stocksResultDto = remoteProductService.queryProductStock(goodsMap, areaId);
|
|
|
+ StocksResultDto stocksResultDto = new StocksResultDto();
|
|
|
+ stocksResultDto.setStocks(new ArrayList<>());
|
|
|
+
|
|
|
+ // 2. 提取商品ID列表,准备查询库存
|
|
|
+ List<String> goodsIds = goodsMap.keySet().stream().collect(Collectors.toList());
|
|
|
+ ExternalItem one = externalItemService.getOne(Wrappers.lambdaQuery(ExternalItem.class).eq(ExternalItem::getItemKey, "zhongche").last("LIMIT 1"));
|
|
|
+ List<ExternalProduct> externalProducts = externalProductService.queryProductStock(one.getId(),goodsIds);
|
|
|
+ // 5. 遍历查询结果,封装返回数据
|
|
|
+ externalProducts.forEach(product -> {
|
|
|
+ // 5.1 提取商品核心信息
|
|
|
+ String productIdStr = product.getProductNo();
|
|
|
+ Integer nowInventory = product.getAvailableInventory();
|
|
|
+ Integer goodsNum = goodsMap.get(productIdStr); // 入参的所需库存数量
|
|
|
+ //可用库存
|
|
|
+
|
|
|
+
|
|
|
+ // 5.2 初始化单个商品库存结果
|
|
|
+ StocksResult stocksResult = new StocksResult();
|
|
|
+ stocksResult.setGoodsId(productIdStr);
|
|
|
+ stocksResult.setAreaId(areaId == null ? "" : areaId); // 地区id为空时赋值空字符串,保证格式统一
|
|
|
+
|
|
|
+ if (nowInventory > 0){
|
|
|
+ //有货
|
|
|
+ stocksResult.setStockState("1");
|
|
|
+ stocksResult.setStockStateDesc("下单立即发货");
|
|
|
+ if (goodsNum < 50){
|
|
|
+ stocksResult.setRemainNum(nowInventory.intValue());
|
|
|
+ }else if (goodsNum <= 100){
|
|
|
+ stocksResult.setRemainNum(-1);
|
|
|
+ }else {
|
|
|
+ stocksResult.setRemainNum(goodsNum);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //无货
|
|
|
+ stocksResult.setStockState("5");
|
|
|
+ stocksResult.setStockStateDesc("无货");
|
|
|
+ stocksResult.setRemainNum(-999);
|
|
|
+ }
|
|
|
+ // 5.6 添加到结果列表(已提前初始化,无需判断null)
|
|
|
+ stocksResultDto.getStocks().add(stocksResult);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 6. 补充:处理「未查询到库存」的商品(即 goods 中有,但 productPriceInventories 中没有的商品)
|
|
|
+ // 提取已查询到的商品ID
|
|
|
+ Set<String> queriedGoodsIds = externalProducts.stream()
|
|
|
+ .map(p -> p.getProductNo())
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ // 遍历入参goods,补充未查询到的商品,返回 remainNum=-1
|
|
|
+ goodsMap.keySet().stream()
|
|
|
+ .filter(goodsId -> !queriedGoodsIds.contains(goodsId))
|
|
|
+ .forEach(goodsId -> {
|
|
|
+ StocksResult noStockResult = new StocksResult();
|
|
|
+ noStockResult.setGoodsId(goodsId);
|
|
|
+ noStockResult.setAreaId(areaId == null ? "" : areaId);
|
|
|
+ noStockResult.setStockState(""); // 未查询到,库存状态为空
|
|
|
+ noStockResult.setStockStateDesc("未查询到商品库存");
|
|
|
+ noStockResult.setRemainNum(-1); // 文档规定:未查询到返回 -1
|
|
|
+ stocksResultDto.getStocks().add(noStockResult);
|
|
|
+ });
|
|
|
|
|
|
List<Stocks> goodsStockRespList = new ArrayList<>();
|
|
|
if (stocksResultDto != null || stocksResultDto.getStocks() != null || !stocksResultDto.getStocks().isEmpty()) {
|