diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java index 08f5bc07..6145dfc6 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java @@ -57,4 +57,8 @@ public class ProductQuantityConsumption { @ApiModelProperty(value = "更新时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; + + @TableField(value = "sale_time",updateStrategy = FieldStrategy.NOT_EMPTY) + @ApiModelProperty(value = "下单时间") + private Long saleTime; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index d1b6066e..47b7a73f 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -1580,7 +1580,13 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl returnItemQueryWrapper = new QueryWrapper<>(); returnItemQueryWrapper.in("return_id", return_ids); List returnItems = orderReturnItemService.find(returnItemQueryWrapper); - + QueryWrapper shopOrderReturnQueryWrapper= new QueryWrapper<>(); + shopOrderReturnQueryWrapper.in("return_id", return_ids); + List shopOrderReturnList= shopOrderReturnService.find(shopOrderReturnQueryWrapper); + Map shopOrderReturnMap=new HashMap<>(); + if(!shopOrderReturnList.isEmpty()){ + shopOrderReturnMap=shopOrderReturnList.stream().collect(Collectors.toMap(ShopOrderReturn::getReturn_id, s->s.getUpdated_at().getTime())); + } if (CollUtil.isNotEmpty(returnItems)) { for (ShopOrderReturnItem returnItem : returnItems) { String order_id = returnItem.getOrder_id(); @@ -1631,9 +1637,13 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl stockDeltaMap = new HashMap<>(); String item_src_id = productItem.getItem_src_id(); - stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id() + "-" + shopOrderItem.getItem_unit_price(), returnNum); + String mapKey=item_src_id + "-" + shopOrderItem.getOrder_id() + "-" + shopOrderItem.getItem_unit_price(); + if(null!=shopOrderReturnMap.get(returnItem.getReturn_id())){ + mapKey=mapKey+"-" + shopOrderReturnMap.get(returnItem.getReturn_id()); + } + stockDeltaMap.put(mapKey, returnNum); syncThirdDataService.incrProductStockToRedis(stockDeltaMap, returnItem.getReturn_item_subtotal()); - logger.info("退货返回给思迅,存入redis成功,item_src_id:{},订单号:{},数量:{}", item_src_id, shopOrderReturn.getOrder_id(), returnNum); + logger.info("退货返回给思迅,存入redis成功,item_src_id:{},订单号:{},数量:{},mapKey:{}", item_src_id, shopOrderReturn.getOrder_id(), returnNum,mapKey); } else { logger.warn("退货数量为空,无法增加库存,订单项ID: {}", orderItemId); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java index 25160b6c..f4a4f1c4 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java @@ -1170,6 +1170,11 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { String order_id = shopStoreSfOrder.getShop_order_id(); itemQueryWrapper.eq("order_id", order_id); List order_item_rows = shopOrderItemService.find(itemQueryWrapper); + ShopOrderBase shopOrderBase=shopOrderBaseService.get(order_id); + String saleTimeStr=null; + if(null!=shopOrderBase){ + saleTimeStr= String.valueOf(shopOrderBase.getOrder_time().getTime()); + } if (picking(order_item_rows)) { logger.info("顺丰发货商品扣减库存成功"); } @@ -1178,7 +1183,11 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { Map stockDeltaMap = new HashMap<>(); String item_src_id = shopOrderItem.getItem_src_id(); Integer order_item_quantity = shopOrderItem.getOrder_item_quantity(); - stockDeltaMap.put(item_src_id + "-" + shopStoreSfOrder.getShop_order_id()+"-"+shopOrderItem.getItem_unit_price(), -order_item_quantity); + String mapKey=item_src_id + "-" + shopStoreSfOrder.getShop_order_id()+"-"+shopOrderItem.getItem_unit_price(); + if(StringUtils.isNotEmpty(saleTimeStr)){ + mapKey=mapKey+"-"+saleTimeStr; + } + stockDeltaMap.put(mapKey, -order_item_quantity); syncThirdDataService.incrProductStockToRedis(stockDeltaMap,null); } } @@ -1347,7 +1356,8 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { Map stockDeltaMap = new HashMap<>(); String item_src_id = shopOrderItem.getItem_src_id(); Integer order_item_quantity = shopOrderItem.getOrder_item_quantity(); - stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id()+"-"+shopOrderItem.getItem_unit_price(), -order_item_quantity); + String mapKey=item_src_id + "-" + shopOrderItem.getOrder_id()+"-"+shopOrderItem.getItem_unit_price()+"-"+shopOrderBase.getOrder_time().getTime(); + stockDeltaMap.put(mapKey, -order_item_quantity); syncThirdDataService.incrProductStockToRedis(stockDeltaMap,null); } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 1144d7c8..ddff290b 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -989,13 +989,16 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements ProductQuantityConsumption productQuantityConsumption=new ProductQuantityConsumption(); String productKey= (String) k; String[] productKeyArrys=productKey.split("-"); - if(productKeyArrys.length!=4){ + if(productKeyArrys.length<4){ return; } String productNumber=productKeyArrys[0]; String orderId=productKeyArrys[1]; String unitPrice=productKeyArrys[2]; String saleAmount=productKeyArrys[3]; + if(productKeyArrys.length==5){ + productQuantityConsumption.setSaleTime(Long.parseLong(productKeyArrys[4])); + } productQuantityConsumption.setConsumeId(IdUtil.getSnowflakeNextIdStr()); productQuantityConsumption.setOrderId(orderId); productQuantityConsumption.setProductNumber(productNumber); @@ -1027,7 +1030,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements continue; } String[] productKeyArrys=productKey.split("-"); - if(productKeyArrys.length!=3){ + if(productKeyArrys.length<3){ continue; } try { @@ -1063,12 +1066,17 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements cn.hutool.json.JSONArray array_item_spec = JSONUtil.parseArray(spuItem.getItem_spec()); logger.info("array_item_spec:{}",array_item_spec); logger.info("key:{},Product_number:{}",key,itemId); + String mapKey=""; if(array_item_spec.isEmpty()){ BigDecimal saleAmount=new BigDecimal(unitPrice).multiply(new BigDecimal(delta)); if(saleAmount.compareTo(BigDecimal.ZERO)<0){ saleAmount=saleAmount.multiply(new BigDecimal("-1")); } - redisTemplate.opsForHash().increment(key, itemId+"-"+orderId+"-"+unitPrice+"-"+saleAmount.toPlainString(), delta.doubleValue()); + mapKey=itemId+"-"+orderId+"-"+unitPrice+"-"+saleAmount.toPlainString(); + if(productKeyArrys.length==4){ + mapKey=mapKey+"-"+productKeyArrys[3]; + } + redisTemplate.opsForHash().increment(key,mapKey, delta.doubleValue()); logger.info("存储无规格库存成功"); continue; } @@ -1089,8 +1097,12 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements itemReturnAmount=itemReturnAmount.multiply(new BigDecimal("-1")); } // 使用 Redis 的 HINCRBY 保证原子性和高性能 - redisTemplate.opsForHash().increment(key, itemId+"-"+orderId+"-"+unitPriceBg.toPlainString()+"-"+itemReturnAmount.toPlainString(), itemQuaryty.doubleValue()); - logger.info("存储有规格库存成功",itemId+"-"+orderId+"-"+unitPriceBg.toPlainString()); + mapKey=itemId+"-"+orderId+"-"+unitPriceBg.toPlainString()+"-"+itemReturnAmount.toPlainString(); + if(productKeyArrys.length==4){ + mapKey=mapKey+"-"+productKeyArrys[3]; + } + redisTemplate.opsForHash().increment(key, mapKey, itemQuaryty.doubleValue()); + logger.info("存储有规格库存成功mapKey:{},",mapKey); } catch (Exception e) { logger.error("库存累计失败,productKey={}, delta={}, error={}", productKey, delta, e.getMessage(), e); } diff --git a/sql/shop/dev/20251119_dml.sql b/sql/shop/dev/20251119_dml.sql new file mode 100644 index 00000000..8e3473b8 --- /dev/null +++ b/sql/shop/dev/20251119_dml.sql @@ -0,0 +1 @@ +ALTER table product_quantity_consumption add sale_time bigint unsigned DEFAULT NULL COMMENT '下单时间'; \ No newline at end of file