From c8a179a0bdbc7bdc987788e129efce16d467889f Mon Sep 17 00:00:00 2001
From: p-honggang.li <p-honggang.li@pcitc.com>
Date: 星期四, 04 九月 2025 20:44:57 +0800
Subject: [PATCH] 修改购物车逻辑

---
 src/main/java/com/webmanage/controller/ProductPricingController.java     |    3 
 src/main/java/com/webmanage/service/impl/CartPersistenceServiceImpl.java |   10 
 src/main/java/com/webmanage/mapper/CartMapper.java                       |    6 
 src/main/java/com/webmanage/service/impl/ProductPricingServiceImpl.java  |    8 +
 src/main/resources/mapper/CartMapper.xml                                 |    7 +
 src/main/java/com/webmanage/service/impl/CartServiceImpl.java            |  148 +++++++++++++++---------
 src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java      |   14 +-
 src/main/java/com/webmanage/service/CartService.java                     |   28 ++-
 src/main/java/com/webmanage/service/ProductPricingService.java           |    2 
 src/main/java/com/webmanage/controller/CartController.java               |   84 +++++++++----
 src/main/java/com/webmanage/service/CartPersistenceService.java          |    4 
 11 files changed, 198 insertions(+), 116 deletions(-)

diff --git a/src/main/java/com/webmanage/controller/CartController.java b/src/main/java/com/webmanage/controller/CartController.java
index 350e3a7..666983d 100644
--- a/src/main/java/com/webmanage/controller/CartController.java
+++ b/src/main/java/com/webmanage/controller/CartController.java
@@ -54,9 +54,10 @@
     @ApiOperation("浠庤喘鐗╄溅绉婚櫎鍟嗗搧")
     public Result<Object> removeFromCart(@RequestParam @NotNull String userId,
                                         @RequestParam  String unitId,
+                                         @RequestParam @NotNull String productId,
                                         @RequestParam @NotNull Long pricingId) {
         try {
-            boolean result = cartService.removeFromCart(userId, unitId, pricingId);
+            boolean result = cartService.removeFromCart(userId, unitId, productId, pricingId);
             if (result) {
                 return Result.success("浠庤喘鐗╄溅绉婚櫎鍟嗗搧鎴愬姛");
             } else {
@@ -72,10 +73,32 @@
     @ApiOperation("鏇存柊璐墿杞﹀晢鍝佹暟閲�")
     public Result<Object> updateCartItemQuantity(@RequestParam @NotNull String userId,
                                                @RequestParam  String unitId,
+                                               @RequestParam @NotNull String productId,
                                                @RequestParam @NotNull Long pricingId,
                                                @RequestParam @NotNull @Min(1) Integer quantity) {
         try {
-            boolean result = cartService.updateCartItemQuantity(userId, unitId, pricingId, quantity);
+            boolean result = cartService.updateCartItemQuantity(userId, unitId, productId, pricingId, quantity);
+            if (result) {
+                return Result.success("鏇存柊璐墿杞﹀晢鍝佹暟閲忔垚鍔�");
+            } else {
+                return Result.error("鏇存柊璐墿杞﹀晢鍝佹暟閲忓け璐�");
+            }
+        } catch (Exception e) {
+            log.error("鏇存柊璐墿杞﹀晢鍝佹暟閲忓け璐�", e);
+            return Result.error("鏇存柊璐墿杞﹀晢鍝佹暟閲忓け璐ワ細" + e.getMessage());
+        }
+    }
+
+
+    @PutMapping("/update/duration")
+    @ApiOperation("鏇存柊璐墿杞﹀晢鍝佹暟閲�")
+    public Result<Object> updateCartItemDuration(@RequestParam @NotNull String userId,
+                                                 @RequestParam  String unitId,
+                                                 @RequestParam @NotNull String productId,
+                                                 @RequestParam @NotNull Long pricingId,
+                                                 @RequestParam @NotNull @Min(1) Integer duration) {
+        try {
+            boolean result = cartService.updateCartItemDuration(userId, unitId, productId, pricingId, duration);
             if (result) {
                 return Result.success("鏇存柊璐墿杞﹀晢鍝佹暟閲忔垚鍔�");
             } else {
@@ -90,9 +113,10 @@
     @DeleteMapping("/clear")
     @ApiOperation("娓呯┖璐墿杞�")
     public Result<Object> clearCart(@RequestParam @NotNull String userId,
-                                   @RequestParam  String unitId) {
+                                   @RequestParam  String unitId,
+                                    @RequestParam @NotNull String productId) {
         try {
-            boolean result = cartService.clearCart(userId, unitId);
+            boolean result = cartService.clearCart(userId, unitId, productId);
             if (result) {
                 return Result.success("娓呯┖璐墿杞︽垚鍔�");
             } else {
@@ -107,9 +131,10 @@
     @GetMapping("/info")
     @ApiOperation("鑾峰彇璐墿杞︿俊鎭�")
     public Result<Object> getCart(@RequestParam @NotNull String userId,
-                                 @RequestParam  String unitId) {
+                                 @RequestParam  String unitId,
+                                  @RequestParam @NotNull String productId ) {
         try {
-            CartVO cart = cartService.getCart(userId, unitId);
+            CartVO cart = cartService.getCart(userId, unitId, productId);
             return Result.success(cart);
         } catch (Exception e) {
             log.error("鑾峰彇璐墿杞︿俊鎭け璐�", e);
@@ -120,9 +145,10 @@
     @GetMapping("/items")
     @ApiOperation("鑾峰彇璐墿杞﹀晢鍝佸垪琛�")
     public Result<Object> getCartItems(@RequestParam @NotNull String userId,
-                                      @RequestParam  String unitId) {
+                                      @RequestParam  String unitId,
+                                       @RequestParam @NotNull String productId) {
         try {
-            List<CartItemVO> items = cartService.getCartItems(userId, unitId);
+            List<CartItemVO> items = cartService.getCartItems(userId, unitId, productId);
             return Result.success(items);
         } catch (Exception e) {
             log.error("鑾峰彇璐墿杞﹀晢鍝佸垪琛ㄥけ璐�", e);
@@ -134,9 +160,10 @@
     @ApiOperation("鎵归噺鍒犻櫎璐墿杞﹀晢鍝�")
     public Result<Object> batchRemoveFromCart(@RequestParam @NotNull String userId,
                                              @RequestParam  String unitId,
+                                              @RequestParam @NotNull String productId,
                                              @RequestBody List<Long> pricingIds) {
         try {
-            boolean result = cartService.batchRemoveFromCart(userId, unitId, pricingIds);
+            boolean result = cartService.batchRemoveFromCart(userId, unitId, productId, pricingIds);
             if (result) {
                 return Result.success("鎵归噺鍒犻櫎璐墿杞﹀晢鍝佹垚鍔�");
             } else {
@@ -151,9 +178,10 @@
     @GetMapping("/count")
     @ApiOperation("鑾峰彇璐墿杞﹀晢鍝佹暟閲�")
     public Result<Object> getCartItemCount(@RequestParam @NotNull String userId,
-                                          @RequestParam  String unitId) {
+                                          @RequestParam  String unitId,
+                                           @RequestParam @NotNull String productId ) {
         try {
-            Integer count = cartService.getCartItemCount(userId, unitId);
+            Integer count = cartService.getCartItemCount(userId, unitId, productId);
             return Result.success(count);
         } catch (Exception e) {
             log.error("鑾峰彇璐墿杞﹀晢鍝佹暟閲忓け璐�", e);
@@ -164,26 +192,27 @@
     @PostMapping("/sync-to-db")
     @ApiOperation("鍚屾Redis璐墿杞︽暟鎹埌鏁版嵁搴�")
     public Result<Object> syncCartToDatabase(@RequestParam @NotNull String userId,
-                                            @RequestParam @NotNull String unitId) {
-        try {
-            boolean result = cartService.syncCartToDatabase(userId, unitId);
-            if (result) {
-                return Result.success("鍚屾璐墿杞︽暟鎹埌鏁版嵁搴撴垚鍔�");
-            } else {
-                return Result.error("鍚屾璐墿杞︽暟鎹埌鏁版嵁搴撳け璐�");
+                                            @RequestParam @NotNull String unitId,
+                                             @RequestParam @NotNull String productId ) {
+            try {
+                boolean result = cartService.syncCartToDatabase(userId, unitId, productId);
+                if (result) {
+                    return Result.success("鍚屾璐墿杞︽暟鎹埌鏁版嵁搴撴垚鍔�");
+                } else {
+                    return Result.error("鍚屾璐墿杞︽暟鎹埌鏁版嵁搴撳け璐�");
+                }
+            } catch (Exception e) {
+                log.error("鍚屾璐墿杞︽暟鎹埌鏁版嵁搴撳け璐�", e);
+                return Result.error("鍚屾璐墿杞︽暟鎹埌鏁版嵁搴撳け璐ワ細" + e.getMessage());
             }
-        } catch (Exception e) {
-            log.error("鍚屾璐墿杞︽暟鎹埌鏁版嵁搴撳け璐�", e);
-            return Result.error("鍚屾璐墿杞︽暟鎹埌鏁版嵁搴撳け璐ワ細" + e.getMessage());
-        }
     }
-    
     @PostMapping("/load-from-db")
     @ApiOperation("浠庢暟鎹簱鍔犺浇璐墿杞︽暟鎹埌Redis")
     public Result<Object> loadCartFromDatabase(@RequestParam @NotNull String userId,
-                                              @RequestParam @NotNull String unitId) {
+                                              @RequestParam @NotNull String unitId,
+                                              @RequestParam @NotNull String productId ) {
         try {
-            boolean result = cartService.loadCartFromDatabase(userId, unitId);
+            boolean result = cartService.loadCartFromDatabase(userId, unitId,productId);
             if (result) {
                 return Result.success("浠庢暟鎹簱鍔犺浇璐墿杞︽暟鎹垚鍔�");
             } else {
@@ -198,9 +227,10 @@
     @GetMapping("/consistency")
     @ApiOperation("妫�鏌ヨ喘鐗╄溅鏁版嵁涓�鑷存��")
     public Result<Object> checkCartConsistency(@RequestParam @NotNull String userId,
-                                              @RequestParam @NotNull String unitId) {
+                                              @RequestParam @NotNull String unitId,
+                                              @RequestParam @NotNull String productId) {
         try {
-            boolean isConsistent = cartService.checkCartConsistency(userId, unitId);
+            boolean isConsistent = cartService.checkCartConsistency(userId, unitId, productId);
             if (isConsistent) {
                 return Result.success("璐墿杞︽暟鎹竴鑷�");
             } else {
diff --git a/src/main/java/com/webmanage/controller/ProductPricingController.java b/src/main/java/com/webmanage/controller/ProductPricingController.java
index 6432aea..fc59a67 100644
--- a/src/main/java/com/webmanage/controller/ProductPricingController.java
+++ b/src/main/java/com/webmanage/controller/ProductPricingController.java
@@ -127,13 +127,14 @@
     @GetMapping("/condition")
     @ApiOperation("鏍规嵁鏉′欢鏌ヨ浜у搧瀹氫环")
     public Result<List<ProductPricing>> getPricingByCondition(
+            @ApiParam("浜у搧ID") @RequestParam(required = false) String productId,
             @ApiParam("濂椾欢鍚嶇О") @RequestParam(required = false) String suiteName,
             @ApiParam("閿�鍞舰寮�") @RequestParam(required = false) String salesForm,
             @ApiParam("瀹㈡埛瀵硅薄") @RequestParam(required = false) String customerType,
             @ApiParam("浠锋牸绫诲瀷") @RequestParam(required = false) String priceType,
             @ApiParam("鍚敤鐘舵��") @RequestParam(required = false) Boolean isActive) {
         try {
-            List<ProductPricing> result = productPricingService.getPricingByCondition(
+            List<ProductPricing> result = productPricingService.getPricingByCondition(productId,
                     suiteName, salesForm, customerType, priceType, isActive);
             return Result.success("鏌ヨ鎴愬姛", result);
         } catch (Exception e) {
diff --git a/src/main/java/com/webmanage/mapper/CartMapper.java b/src/main/java/com/webmanage/mapper/CartMapper.java
index 592dc9d..88b3f43 100644
--- a/src/main/java/com/webmanage/mapper/CartMapper.java
+++ b/src/main/java/com/webmanage/mapper/CartMapper.java
@@ -16,17 +16,17 @@
     /**
      * 鏍规嵁鐢ㄦ埛ID鍜屽崟浣岻D鏌ヨ璐墿杞﹀晢鍝佸垪琛�
      */
-    List<Cart> selectByUserIdAndUnitId(@Param("userId") String userId, @Param("unitId") String unitId);
+    List<Cart> selectByUserIdAndUnitId(@Param("userId") String userId, @Param("unitId") String unitId, @Param("productId") String productId);
     
     /**
      * 鏍规嵁鐢ㄦ埛ID銆佸崟浣岻D鍜屽畾浠稩D鏌ヨ璐墿杞﹀晢鍝�
      */
-    Cart selectByUserIdUnitIdAndPricingId(@Param("userId") String userId, @Param("unitId") String unitId, @Param("pricingId") Long pricingId);
+    Cart selectByUserIdUnitIdAndPricingId(@Param("userId") String userId, @Param("unitId") String unitId,@Param("productId") String productId, @Param("pricingId") Long pricingId);
     
     /**
      * 鏍规嵁鐢ㄦ埛ID鍜屽崟浣岻D缁熻璐墿杞﹀晢鍝佹暟閲�
      */
-    Integer countByUserIdAndUnitId(@Param("userId") String userId, @Param("unitId") String unitId);
+    Integer countByUserIdAndUnitId(@Param("userId") String userId, @Param("unitId") String unitId, @Param("productId") String productId);
     
     /**
      * 鏍规嵁鐢ㄦ埛ID鍜屽崟浣岻D璁$畻璐墿杞︽�婚噾棰�
diff --git a/src/main/java/com/webmanage/service/CartPersistenceService.java b/src/main/java/com/webmanage/service/CartPersistenceService.java
index 7f51314..7cb27d6 100644
--- a/src/main/java/com/webmanage/service/CartPersistenceService.java
+++ b/src/main/java/com/webmanage/service/CartPersistenceService.java
@@ -4,8 +4,8 @@
 
 public interface CartPersistenceService {
     void saveOrUpdate(String userId, String unitId, CartItemVO item);
-    void remove(String userId, String unitId, Long pricingId);
-    void clear(String userId, String unitId);
+    void remove(String userId, String unitId, String productId, Long pricingId);
+    void clear(String userId, String unitId, String productId);
 }
 
 
diff --git a/src/main/java/com/webmanage/service/CartService.java b/src/main/java/com/webmanage/service/CartService.java
index 027f6f9..478ab64 100644
--- a/src/main/java/com/webmanage/service/CartService.java
+++ b/src/main/java/com/webmanage/service/CartService.java
@@ -19,27 +19,33 @@
     /**
      * 浠庤喘鐗╄溅绉婚櫎鍟嗗搧锛圧edis + 鏁版嵁搴擄級
      */
-    boolean removeFromCart(String userId, String unitId, Long pricingId);
+    boolean removeFromCart(String userId, String unitId, String productId, Long pricingId);
     
     /**
      * 鏇存柊璐墿杞﹀晢鍝佹暟閲忥紙Redis + 鏁版嵁搴擄級
      */
-    boolean updateCartItemQuantity(String userId, String unitId, Long pricingId, Integer quantity);
-    
+    boolean updateCartItemQuantity(String userId, String unitId,String productId, Long pricingId, Integer quantity);
+
+    /**
+     * 鏇存柊璐墿杞﹀晢鍝佸勾闄愶紙Redis + 鏁版嵁搴擄級
+     */
+    boolean updateCartItemDuration(String userId, String unitId,String productId, Long pricingId, Integer duration);
+
+
     /**
      * 娓呯┖璐墿杞︼紙Redis + 鏁版嵁搴擄級
      */
-    boolean clearCart(String userId, String unitId);
+    boolean clearCart(String userId, String unitId,String productId);
     
     /**
      * 鑾峰彇璐墿杞︿俊鎭紙浼樺厛Redis锛屽け璐ュ垯浠庢暟鎹簱鍔犺浇锛�
      */
-    CartVO getCart(String userId, String unitId);
+    CartVO getCart(String userId, String unitId, String productId);
     
     /**
      * 鑾峰彇璐墿杞﹀晢鍝佸垪琛紙浼樺厛Redis锛屽け璐ュ垯浠庢暟鎹簱鍔犺浇锛�
      */
-    List<CartItemVO> getCartItems(String userId, String unitId);
+    List<CartItemVO> getCartItems(String userId, String unitId,String productId);
     
     /**
      * 妫�鏌ヨ喘鐗╄溅鍟嗗搧搴撳瓨
@@ -49,25 +55,25 @@
     /**
      * 鎵归噺鍒犻櫎璐墿杞﹀晢鍝侊紙Redis + 鏁版嵁搴擄級
      */
-    boolean batchRemoveFromCart(String userId, String unitId, List<Long> pricingIds);
+    boolean batchRemoveFromCart(String userId, String unitId, String productId,List<Long> pricingIds);
     
     /**
      * 鑾峰彇璐墿杞﹀晢鍝佹暟閲忥紙浼樺厛Redis锛屽け璐ュ垯浠庢暟鎹簱鍔犺浇锛�
      */
-    Integer getCartItemCount(String userId, String unitId);
+    Integer getCartItemCount(String userId, String unitId, String productId);
     
     /**
      * 浠庢暟鎹簱鍔犺浇璐墿杞︽暟鎹埌Redis
      */
-    boolean loadCartFromDatabase(String userId, String unitId);
+    boolean loadCartFromDatabase(String userId, String unitId, String productId);
     
     /**
      * 鍚屾Redis鏁版嵁鍒版暟鎹簱
      */
-    boolean syncCartToDatabase(String userId, String unitId);
+    boolean syncCartToDatabase(String userId, String unitId, String productId);
     
     /**
      * 妫�鏌ヨ喘鐗╄溅鏁版嵁涓�鑷存��
      */
-    boolean checkCartConsistency(String userId, String unitId);
+    boolean checkCartConsistency(String userId, String unitId, String productId);
 }
diff --git a/src/main/java/com/webmanage/service/ProductPricingService.java b/src/main/java/com/webmanage/service/ProductPricingService.java
index 2965484..109fda4 100644
--- a/src/main/java/com/webmanage/service/ProductPricingService.java
+++ b/src/main/java/com/webmanage/service/ProductPricingService.java
@@ -43,6 +43,6 @@
     /**
      * 鏍规嵁鏉′欢鏌ヨ浜у搧瀹氫环
      */
-    List<ProductPricing> getPricingByCondition(String suiteName, String salesForm, 
+    List<ProductPricing> getPricingByCondition(String productId, String suiteName, String salesForm,
                                              String customerType, String priceType, Boolean isActive);
 }
diff --git a/src/main/java/com/webmanage/service/impl/CartPersistenceServiceImpl.java b/src/main/java/com/webmanage/service/impl/CartPersistenceServiceImpl.java
index a41e5a0..ccb18c0 100644
--- a/src/main/java/com/webmanage/service/impl/CartPersistenceServiceImpl.java
+++ b/src/main/java/com/webmanage/service/impl/CartPersistenceServiceImpl.java
@@ -30,7 +30,7 @@
                 cart.setUnitId(unitId);
             }
             cart.setUpdateTime(LocalDateTime.now());
-            Cart existing = cartMapper.selectByUserIdUnitIdAndPricingId(userId, unitId, item.getPricingId());
+            Cart existing = cartMapper.selectByUserIdUnitIdAndPricingId(userId, unitId,item.getProductId(), item.getPricingId());
             if (existing != null) {
                 cart.setId(existing.getId());
                 cartMapper.updateById(cart);
@@ -43,9 +43,9 @@
 
     @Override
     @Async("asyncExecutor")
-    public void remove(String userId, String unitId, Long pricingId) {
+    public void remove(String userId, String unitId, String productId,Long pricingId) {
         try {
-            Cart existing = cartMapper.selectByUserIdUnitIdAndPricingId(userId, unitId, pricingId);
+            Cart existing = cartMapper.selectByUserIdUnitIdAndPricingId(userId, unitId, productId,pricingId);
             if (existing != null) {
                 cartMapper.deleteById(existing.getId());
             }
@@ -54,9 +54,9 @@
 
     @Override
     @Async("asyncExecutor")
-    public void clear(String userId, String unitId) {
+    public void clear(String userId, String unitId,String productId) {
         try {
-            java.util.List<Cart> cartItems = cartMapper.selectByUserIdAndUnitId(userId, unitId);
+            java.util.List<Cart> cartItems = cartMapper.selectByUserIdAndUnitId(userId, unitId, productId);
             for (Cart item : cartItems) {
                 cartMapper.deleteById(item.getId());
             }
diff --git a/src/main/java/com/webmanage/service/impl/CartServiceImpl.java b/src/main/java/com/webmanage/service/impl/CartServiceImpl.java
index 716c8a2..258e3bd 100644
--- a/src/main/java/com/webmanage/service/impl/CartServiceImpl.java
+++ b/src/main/java/com/webmanage/service/impl/CartServiceImpl.java
@@ -65,8 +65,8 @@
             }
 
             // 鏋勫缓璐墿杞ey
-            String cartKey = buildCartKey(userId,unitId);
-            String cartItemKey = buildCartItemKey(userId, unitId, cartItemDTO.getPricingId());
+            String cartKey = buildCartKey(userId,unitId, cartItemDTO.getProductId());
+            String cartItemKey = buildCartItemKey(userId, unitId, cartItemDTO.getProductId(),cartItemDTO.getPricingId());
 
             // 妫�鏌ュ晢鍝佹槸鍚﹀凡鍦ㄨ喘鐗╄溅涓�
             CartItemVO existingItem = (CartItemVO) redisTemplate.opsForValue().get(cartItemKey);
@@ -91,7 +91,7 @@
             redisTemplate.opsForValue().set(cartItemKey, existingItem, (cartProperties.getExpireDays() != null ? cartProperties.getExpireDays() : CART_EXPIRE_DAYS), TimeUnit.DAYS);
 
             // 鏇存柊璐墿杞﹀晢鍝佸垪琛�
-            updateCartItemList(userId, unitId, cartItemDTO.getPricingId(), true);
+            updateCartItemList(userId, unitId, cartItemDTO.getProductId(), cartItemDTO.getPricingId(), true);
 
             // 璁剧疆璐墿杞﹁繃鏈熸椂闂�
             redisTemplate.expire(cartKey, (cartProperties.getExpireDays() != null ? cartProperties.getExpireDays() : CART_EXPIRE_DAYS), TimeUnit.DAYS);
@@ -111,19 +111,19 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean removeFromCart(String userId, String unitId, Long pricingId) {
+    public boolean removeFromCart(String userId, String unitId, String productId, Long pricingId) {
         try {
-            String cartItemKey = buildCartItemKey(userId, unitId, pricingId);
+            String cartItemKey = buildCartItemKey(userId, unitId, productId, pricingId);
 
             // 浠嶳edis涓垹闄ゅ晢鍝侀」
             Boolean removed = redisTemplate.delete(cartItemKey);
             if (Boolean.TRUE.equals(removed)) {
                 // 鏇存柊璐墿杞﹀晢鍝佸垪琛�
-                updateCartItemList(userId, unitId, pricingId, false);
+                updateCartItemList(userId, unitId, productId, pricingId, false);
 
                 // 寮傛浠庢暟鎹簱涓垹闄わ紙鏍规嵁閰嶇疆锛�
                 if (Boolean.TRUE.equals(cartProperties.getEnablePersistence()) && "realtime".equalsIgnoreCase(cartProperties.getSyncStrategy())) {
-                    cartPersistenceService.remove(userId, unitId, pricingId);
+                    cartPersistenceService.remove(userId, unitId, productId,pricingId);
                 }
 
                 log.info("鐢ㄦ埛{}鎴愬姛浠庤喘鐗╄溅绉婚櫎鍟嗗搧{}", userId, pricingId);
@@ -138,13 +138,13 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean updateCartItemQuantity(String userId, String unitId, Long pricingId, Integer quantity) {
+    public boolean updateCartItemQuantity(String userId, String unitId, String productId, Long pricingId, Integer quantity) {
         try {
             if (quantity <= 0) {
-                return removeFromCart(userId, unitId, pricingId);
+                return removeFromCart(userId, unitId, productId, pricingId);
             }
 
-            String cartItemKey = buildCartItemKey(userId, unitId, pricingId);
+            String cartItemKey = buildCartItemKey(userId, unitId, productId, pricingId);
             CartItemVO cartItem = (CartItemVO) redisTemplate.opsForValue().get(cartItemKey);
             if (cartItem == null) {
                 throw new BusinessException("璐墿杞﹀晢鍝佷笉瀛樺湪");
@@ -170,16 +170,48 @@
         }
     }
 
+
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean clearCart(String userId, String unitId) {
+    public boolean updateCartItemDuration(String userId, String unitId, String productId, Long pricingId, Integer duration) {
         try {
-            String cartKey = buildCartKey(userId, unitId);
-            List<Long> pricingIds = getCartItemPricingIds(userId, unitId);
+
+            String cartItemKey = buildCartItemKey(userId, unitId, productId, pricingId);
+            CartItemVO cartItem = (CartItemVO) redisTemplate.opsForValue().get(cartItemKey);
+            if (cartItem == null) {
+                throw new BusinessException("璐墿杞﹀晢鍝佷笉瀛樺湪");
+            }
+
+            cartItem.setDuration(duration);
+            cartItem.setUpdateTime(LocalDateTime.now());
+
+            // 鏇存柊鍒癛edis
+            redisTemplate.opsForValue().set(cartItemKey, cartItem, (cartProperties.getExpireDays() != null ? cartProperties.getExpireDays() : CART_EXPIRE_DAYS), TimeUnit.DAYS);
+
+            // 寮傛鎸佷箙鍖栧埌鏁版嵁搴擄紙鏍规嵁閰嶇疆锛�
+            if (Boolean.TRUE.equals(cartProperties.getEnablePersistence()) && "realtime".equalsIgnoreCase(cartProperties.getSyncStrategy())) {
+                cartPersistenceService.saveOrUpdate(userId, unitId, cartItem);
+            }
+
+            log.info("鐢ㄦ埛{}鎴愬姛鏇存柊璐墿杞﹀晢鍝亄}骞撮檺涓簕}", userId, pricingId, duration);
+            return true;
+        } catch (Exception e) {
+            log.error("鏇存柊璐墿杞﹀晢鍝佹暟閲忓け璐�", e);
+            throw new BusinessException("鏇存柊璐墿杞﹀晢鍝佹暟閲忓け璐ワ細" + e.getMessage());
+        }
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean clearCart(String userId, String unitId, String productId) {
+        try {
+            String cartKey = buildCartKey(userId, unitId, productId);
+            List<Long> pricingIds = getCartItemPricingIds(userId, unitId, productId);
 
             // 鍒犻櫎鎵�鏈夊晢鍝侀」
             for (Long pricingId : pricingIds) {
-                String cartItemKey = buildCartItemKey(userId, unitId, pricingId);
+                String cartItemKey = buildCartItemKey(userId, unitId, productId,pricingId);
                 redisTemplate.delete(cartItemKey);
             }
 
@@ -188,7 +220,7 @@
 
             // 寮傛娓呯┖鏁版嵁搴撲腑鐨勮喘鐗╄溅鏁版嵁锛堟牴鎹厤缃級
             if (Boolean.TRUE.equals(cartProperties.getEnablePersistence()) && "realtime".equalsIgnoreCase(cartProperties.getSyncStrategy())) {
-                cartPersistenceService.clear(userId, unitId);
+                cartPersistenceService.clear(userId, unitId, productId);
             }
 
             log.info("鐢ㄦ埛{}鎴愬姛娓呯┖璐墿杞�", userId);
@@ -200,14 +232,14 @@
     }
 
     @Override
-    public CartVO getCart(String userId, String unitId) {
+    public CartVO getCart(String userId, String unitId, String productId) {
         try {
             CartVO cartVO = new CartVO();
             cartVO.setUserId(userId);
             if (StringUtils.hasText(unitId)){
                 cartVO.setUnitId(unitId);
             }
-            List<CartItemVO> items = getCartItems(userId, unitId);
+            List<CartItemVO> items = getCartItems(userId, unitId, productId);
             cartVO.setItems(items);
 
             // 璁$畻鎬绘暟閲忓拰鎬婚噾棰�
@@ -228,21 +260,21 @@
     }
 
     @Override
-    public List<CartItemVO> getCartItems(String userId, String unitId) {
+    public List<CartItemVO> getCartItems(String userId, String unitId,String productId) {
         try {
             // 浼樺厛浠嶳edis鑾峰彇
-            List<CartItemVO> items = getCartItemsFromRedis(userId, unitId);
+            List<CartItemVO> items = getCartItemsFromRedis(userId, unitId,productId);
             if (items != null && !items.isEmpty()) {
                 return items;
             }
 
             // Redis涓病鏈夋暟鎹紝浠庢暟鎹簱鍔犺浇
             log.info("Redis涓棤璐墿杞︽暟鎹紝浠庢暟鎹簱鍔犺浇鐢ㄦ埛{}鐨勮喘鐗╄溅", userId);
-            return loadCartFromDatabase(userId, unitId) ? getCartItemsFromRedis(userId, unitId) : new ArrayList<>();
+            return loadCartFromDatabase(userId, unitId, productId) ? getCartItemsFromRedis(userId, unitId, productId) : new ArrayList<>();
         } catch (Exception e) {
             log.error("鑾峰彇璐墿杞﹀晢鍝佸垪琛ㄥけ璐�", e);
             // 闄嶇骇鍒版暟鎹簱鏌ヨ
-            return getCartItemsFromDatabase(userId, unitId);
+            return getCartItemsFromDatabase(userId, unitId, productId);
         }
     }
 
@@ -254,14 +286,14 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean batchRemoveFromCart(String userId, String unitId, List<Long> pricingIds) {
+    public boolean batchRemoveFromCart(String userId, String unitId, String productId,List<Long> pricingIds) {
         try {
             if (CollectionUtils.isEmpty(pricingIds)) {
                 return true;
             }
 
             for (Long pricingId : pricingIds) {
-                removeFromCart(userId, unitId, pricingId);
+                removeFromCart(userId, unitId, productId,pricingId);
             }
 
             return true;
@@ -272,17 +304,17 @@
     }
 
     @Override
-    public Integer getCartItemCount(String userId, String unitId) {
+    public Integer getCartItemCount(String userId, String unitId, String productId) {
         try {
             // 浼樺厛浠嶳edis鑾峰彇
-            String cartKey = buildCartKey(userId, unitId);
+            String cartKey = buildCartKey(userId, unitId, productId);
             List<Long> pricingIds = (List<Long>) redisTemplate.opsForValue().get(cartKey);
             if (pricingIds != null) {
                 return pricingIds.size();
             }
 
             // 浠庢暟鎹簱鑾峰彇
-            return cartMapper.countByUserIdAndUnitId(userId, unitId);
+            return cartMapper.countByUserIdAndUnitId(userId, unitId, productId);
         } catch (Exception e) {
             log.error("鑾峰彇璐墿杞﹀晢鍝佹暟閲忓け璐�", e);
             return 0;
@@ -290,19 +322,19 @@
     }
 
     @Override
-    public boolean loadCartFromDatabase(String userId, String unitId) {
+    public boolean loadCartFromDatabase(String userId, String unitId, String productId) {
         try {
-            List<Cart> cartItems = cartMapper.selectByUserIdAndUnitId(userId, unitId);
+            List<Cart> cartItems = cartMapper.selectByUserIdAndUnitId(userId, unitId, productId);
             if (CollectionUtils.isEmpty(cartItems)) {
                 return false;
             }
 
-            String cartKey = buildCartKey(userId, unitId);
+            String cartKey = buildCartKey(userId, unitId, productId);
             List<Long> pricingIds = new ArrayList<>();
 
             for (Cart cartItem : cartItems) {
                 CartItemVO itemVO = convertCartToCartItemVO(cartItem);
-                String cartItemKey = buildCartItemKey(userId, unitId, cartItem.getPricingId());
+                String cartItemKey = buildCartItemKey(userId, unitId,cartItem.getProductId(), cartItem.getPricingId());
 
                 // 淇濆瓨鍒癛edis
                 redisTemplate.opsForValue().set(cartItemKey, itemVO, CART_EXPIRE_DAYS, TimeUnit.DAYS);
@@ -321,19 +353,19 @@
     }
 
     @Override
-    public boolean syncCartToDatabase(String userId, String unitId) {
+    public boolean syncCartToDatabase(String userId, String unitId, String productId) {
         try {
-            List<CartItemVO> redisItems = getCartItemsFromRedis(userId, unitId);
+            List<CartItemVO> redisItems = getCartItemsFromRedis(userId, unitId, productId);
             if (CollectionUtils.isEmpty(redisItems)) {
                 return true;
             }
 
             // 娓呯┖鏁版嵁搴撲腑鐨勮喘鐗╄溅鏁版嵁
-            clearCartFromDatabase(userId, unitId);
+            clearCartFromDatabase(userId, unitId, productId);
 
             // 鍚屾Redis鏁版嵁鍒版暟鎹簱
             for (CartItemVO item : redisItems) {
-                syncCartItemToDatabase(userId, unitId, item);
+                syncCartItemToDatabase(userId, unitId,productId, item);
             }
 
             log.info("鎴愬姛鍚屾Redis璐墿杞︽暟鎹埌鏁版嵁搴擄紝鐢ㄦ埛{}", userId);
@@ -345,10 +377,10 @@
     }
 
     @Override
-    public boolean checkCartConsistency(String userId, String unitId) {
+    public boolean checkCartConsistency(String userId, String unitId, String productId) {
         try {
-            List<CartItemVO> redisItems = getCartItemsFromRedis(userId, unitId);
-            List<Cart> dbItems = cartMapper.selectByUserIdAndUnitId(userId, unitId);
+            List<CartItemVO> redisItems = getCartItemsFromRedis(userId, unitId, productId);
+            List<Cart> dbItems = cartMapper.selectByUserIdAndUnitId(userId, unitId, productId);
 
             if (redisItems.size() != dbItems.size()) {
                 log.warn("璐墿杞︽暟鎹笉涓�鑷达細Redis鏁伴噺{}锛屾暟鎹簱鏁伴噺{}", redisItems.size(), dbItems.size());
@@ -380,22 +412,22 @@
 
     // ==================== 绉佹湁鏂规硶 ====================
 
-    private String buildCartKey(String userId, String unitId) {
+    private String buildCartKey(String userId, String unitId,String productId) {
         if(StringUtils.hasText(unitId)){
-            return CART_KEY_PREFIX + userId + ":" + unitId;
+            return CART_KEY_PREFIX + userId + ":" + unitId + ":" + productId;
         }
-        return CART_KEY_PREFIX + userId;
+        return CART_KEY_PREFIX + userId + ":" + productId;
     }
 
-    private String buildCartItemKey(String userId, String unitId, Long pricingId) {
+    private String buildCartItemKey(String userId, String unitId,String productId, Long pricingId) {
         if(StringUtils.hasText(unitId)){
-            return CART_ITEM_KEY_PREFIX + userId + ":" + unitId + ":" + pricingId;
+            return CART_ITEM_KEY_PREFIX + userId + ":" + unitId + ":" + productId + ":" + pricingId;
         }
-        return CART_ITEM_KEY_PREFIX + userId + ":" + pricingId;
+        return CART_ITEM_KEY_PREFIX + userId + ":" + productId + ":" + pricingId;
     }
 
-    private void updateCartItemList(String userId, String unitId, Long pricingId, boolean add) {
-        String cartKey = buildCartKey(userId, unitId);
+    private void updateCartItemList(String userId, String unitId,String productId ,Long pricingId, boolean add) {
+        String cartKey = buildCartKey(userId, unitId, productId);
         List<Long> pricingIds = (List<Long>) redisTemplate.opsForValue().get(cartKey);
 
         if (pricingIds == null) {
@@ -411,15 +443,15 @@
         redisTemplate.opsForValue().set(cartKey, pricingIds, CART_EXPIRE_DAYS, TimeUnit.DAYS);
     }
 
-    private List<Long> getCartItemPricingIds(String userId, String unitId) {
-        String cartKey = buildCartKey(userId, unitId);
+    private List<Long> getCartItemPricingIds(String userId, String unitId, String productId) {
+        String cartKey = buildCartKey(userId, unitId, productId);
         List<Long> pricingIds = (List<Long>) redisTemplate.opsForValue().get(cartKey);
         return pricingIds != null ? pricingIds : new ArrayList<>();
     }
 
-    private List<CartItemVO> getCartItemsFromRedis(String userId, String unitId) {
+    private List<CartItemVO> getCartItemsFromRedis(String userId, String unitId, String productId) {
         try {
-            String cartKey = buildCartKey(userId, unitId);
+            String cartKey = buildCartKey(userId, unitId, productId);
             List<Long> pricingIds = (List<Long>) redisTemplate.opsForValue().get(cartKey);
 
             if (CollectionUtils.isEmpty(pricingIds)) {
@@ -428,7 +460,7 @@
 
             List<CartItemVO> items = new ArrayList<>();
             for (Long pricingId : pricingIds) {
-                String cartItemKey = buildCartItemKey(userId, unitId, pricingId);
+                String cartItemKey = buildCartItemKey(userId, unitId, productId,pricingId);
                 CartItemVO item = (CartItemVO) redisTemplate.opsForValue().get(cartItemKey);
                 if (item != null) {
                     items.add(item);
@@ -442,9 +474,9 @@
         }
     }
     
-    private List<CartItemVO> getCartItemsFromDatabase(String userId, String unitId) {
+    private List<CartItemVO> getCartItemsFromDatabase(String userId, String unitId, String productId) {
         try {
-            List<Cart> cartItems = cartMapper.selectByUserIdAndUnitId(userId, unitId);
+            List<Cart> cartItems = cartMapper.selectByUserIdAndUnitId(userId, unitId, productId);
             List<CartItemVO> items = new ArrayList<>();
             
             for (Cart cartItem : cartItems) {
@@ -464,7 +496,7 @@
         return itemVO;
     }
     
-    private void syncCartItemToDatabase(String userId, String unitId, CartItemVO item) {
+    private void syncCartItemToDatabase(String userId, String unitId, String productId,CartItemVO item) {
         try {
             Cart cart = new Cart();
             BeanUtils.copyProperties(item, cart);
@@ -473,7 +505,7 @@
             cart.setUpdateTime(LocalDateTime.now());
             
             // 妫�鏌ユ槸鍚﹀凡瀛樺湪
-            Cart existingCart = cartMapper.selectByUserIdUnitIdAndPricingId(userId, unitId, item.getPricingId());
+            Cart existingCart = cartMapper.selectByUserIdUnitIdAndPricingId(userId, unitId, productId,item.getPricingId());
             if (existingCart != null) {
                 // 鏇存柊
                 cart.setId(existingCart.getId());
@@ -488,9 +520,9 @@
         }
     }
     
-    private void removeCartItemFromDatabase(String userId, String unitId, Long pricingId) {
+    private void removeCartItemFromDatabase(String userId, String unitId, String productId, Long pricingId) {
         try {
-            Cart existingCart = cartMapper.selectByUserIdUnitIdAndPricingId(userId, unitId, pricingId);
+            Cart existingCart = cartMapper.selectByUserIdUnitIdAndPricingId(userId, unitId, productId,pricingId);
             if (existingCart != null) {
                 cartMapper.deleteByCustomerCondition(existingCart.getId());
             }
@@ -499,10 +531,10 @@
         }
     }
     
-    private void clearCartFromDatabase(String userId, String unitId) {
+    private void clearCartFromDatabase(String userId, String unitId, String productId) {
         try {
             // 浣跨敤閫昏緫鍒犻櫎
-            List<Cart> cartItems = cartMapper.selectByUserIdAndUnitId(userId, unitId);
+            List<Cart> cartItems = cartMapper.selectByUserIdAndUnitId(userId, unitId, productId);
             for (Cart item : cartItems) {
                 cartMapper.deleteById(item.getId());
             }
diff --git a/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java b/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java
index 14fd125..00d5dfd 100644
--- a/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java
+++ b/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java
@@ -221,7 +221,7 @@
         if (applyProvider && providerPointsChange != 0) {
             PointsFlow providerFlow = new PointsFlow();
             providerFlow.setUserId(providerId);
-            providerFlow.setUnitId(providerId);
+            providerFlow.setUnitId(null);
             providerFlow.setDataType(ruleType);
             providerFlow.setDataCategory(addPointsFlowDTO.getCategory());
             providerFlow.setPoints(providerPointsChange);
@@ -233,8 +233,8 @@
             if (!providerSaved) {
                 throw new BusinessException("淇濆瓨鎻愪緵鑰呯Н鍒嗘祦姘村け璐�");
             }
-
-            updateProviderUnitPoints(providerId, providerPointsChange);
+            updateUserPointsByRule(providerId, null, userPointsChange);
+            // updateProviderUnitPoints(providerId, providerPointsChange);
         }
 
         return true;
@@ -492,7 +492,9 @@
             
             userPoints = new UserPoints();
             userPoints.setUserId(userId);
-            userPoints.setUnitId(unitId);
+            if(StringUtils.hasText(unitId)){
+                userPoints.setUnitId(unitId);
+            }
             userPoints.setBalance(pointsValue);
             userPoints.setTotalEarned(pointsValue > 0 ? pointsValue : 0);
             userPoints.setTotalConsumed(pointsValue < 0 ? Math.abs(pointsValue) : 0);
@@ -522,7 +524,7 @@
         }
 
         // 鏇存柊鍗曚綅绉垎璐︽埛
-        QueryWrapper<UserPoints> unitWrapper = new QueryWrapper<>();
+         /* QueryWrapper<UserPoints> unitWrapper = new QueryWrapper<>();
         unitWrapper.eq("deleted", 0)
                   .eq("unit_id", unitId);
         
@@ -562,7 +564,7 @@
             
             unitPoints.setUpdateTime(LocalDateTime.now());
             userPointsMapper.updateById(unitPoints);
-        }
+        } */
     }
 
     /**
diff --git a/src/main/java/com/webmanage/service/impl/ProductPricingServiceImpl.java b/src/main/java/com/webmanage/service/impl/ProductPricingServiceImpl.java
index a5a63ee..77e20b3 100644
--- a/src/main/java/com/webmanage/service/impl/ProductPricingServiceImpl.java
+++ b/src/main/java/com/webmanage/service/impl/ProductPricingServiceImpl.java
@@ -172,11 +172,15 @@
     }
 
     @Override
-    public List<ProductPricing> getPricingByCondition(String suiteName, String salesForm, 
+    public List<ProductPricing> getPricingByCondition(String productId, String suiteName, String salesForm,
                                                     String customerType, String priceType, Boolean isActive) {
         try {
             QueryWrapper<ProductPricing> queryWrapper = new QueryWrapper<>();
-            
+
+            if (StringUtils.hasText(productId)) {
+                queryWrapper.like("product_id", productId);
+            }
+
             if (StringUtils.hasText(suiteName)) {
                 queryWrapper.like("suite_name", suiteName);
             }
diff --git a/src/main/resources/mapper/CartMapper.xml b/src/main/resources/mapper/CartMapper.xml
index 22f7e4c..1226da6 100644
--- a/src/main/resources/mapper/CartMapper.xml
+++ b/src/main/resources/mapper/CartMapper.xml
@@ -43,6 +43,9 @@
         <if test="unitId !=null and unitId != ''">
             AND unit_id = #{unitId}
         </if>
+        <if test="productId !=null and productId != ''">
+            AND product_id = #{productId}
+        </if>
         ORDER BY add_time DESC
     </select>
     
@@ -55,6 +58,7 @@
             AND unit_id = #{unitId}
         </if>
         AND pricing_id = #{pricingId}
+        AND product_id = #{productId}
         LIMIT 1
     </select>
     
@@ -66,6 +70,9 @@
         <if test="unitId != '' and unitId != null">
             AND unit_id = #{unitId}
         </if>
+        <if test="productId != '' and productId != null">
+            AND product_id = #{productId}
+        </if>
     </select>
     
     <select id="sumTotalAmountByUserIdAndUnitId" resultType="java.math.BigDecimal">

--
Gitblit v1.8.0