Przeglądaj źródła

LifeLikeIdentityHelper相关代码修改

zhangchen 7 godzin temu
rodzic
commit
0405bf0514
25 zmienionych plików z 983 dodań i 136 usunięć
  1. 5 1
      alien-entity/src/main/java/shop/alien/mapper/StoreClockInMapper.java
  2. 5 5
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/OrderReviewServiceImpl.java
  3. 6 6
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/ReviewCommentServiceImpl.java
  4. 12 12
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/StoreCommentServiceImpl.java
  5. 26 36
      alien-lawyer/src/main/java/shop/alien/lawyer/util/LawyerLikeRecordIdentityHelper.java
  6. 5 5
      alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java
  7. 204 0
      alien-second/src/main/java/shop/alien/second/util/SecondLikeRecordIdentityHelper.java
  8. 5 5
      alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StoreMenuPlatformServiceImpl.java
  9. 204 0
      alien-store-platform/src/main/java/shop/alien/storeplatform/util/PlatformLikeRecordIdentityHelper.java
  10. 4 0
      alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java
  11. 6 6
      alien-store/src/main/java/shop/alien/store/service/LifeActivityService.java
  12. 5 5
      alien-store/src/main/java/shop/alien/store/service/LifeCommentService.java
  13. 3 3
      alien-store/src/main/java/shop/alien/store/service/LifeUserDynamicsService.java
  14. 4 4
      alien-store/src/main/java/shop/alien/store/service/impl/CommonCommentServiceImpl.java
  15. 5 5
      alien-store/src/main/java/shop/alien/store/service/impl/CommonRatingServiceImpl.java
  16. 5 5
      alien-store/src/main/java/shop/alien/store/service/impl/OrderReviewServiceImpl.java
  17. 6 6
      alien-store/src/main/java/shop/alien/store/service/impl/ReviewCommentServiceImpl.java
  18. 5 5
      alien-store/src/main/java/shop/alien/store/service/impl/StoreClockInServiceImpl.java
  19. 5 5
      alien-store/src/main/java/shop/alien/store/service/impl/StoreCommentServiceImpl.java
  20. 7 7
      alien-store/src/main/java/shop/alien/store/service/impl/StoreMenuServiceImpl.java
  21. 6 6
      alien-store/src/main/java/shop/alien/store/service/impl/StoreStaffCommentServiceImpl.java
  22. 4 4
      alien-store/src/main/java/shop/alien/store/service/impl/StoreStaffConfigServiceImpl.java
  23. 5 5
      alien-store/src/main/java/shop/alien/store/service/impl/StoreStaffReviewServiceImpl.java
  24. 237 0
      alien-store/src/main/java/shop/alien/store/util/StoreClockInIdentityHelper.java
  25. 204 0
      alien-store/src/main/java/shop/alien/store/util/StoreLikeRecordIdentityHelper.java

+ 5 - 1
alien-entity/src/main/java/shop/alien/mapper/StoreClockInMapper.java

@@ -24,7 +24,11 @@ import java.util.Map;
 public interface StoreClockInMapper extends BaseMapper<StoreClockIn> {
 
     @Select("select clock.id, clock.user_id, clock.store_id, clock.permission, user.user_name, store.store_name, store.store_blurb storeBlurb, store.score_avg score, clock.like_count, store.store_position, clock.content, clock.created_time, clock.img_url clockImg, img.img_url storeImg, user.user_image userImg,clock.maybe_ai_content," +
-            "store.administrative_region_district_name region, dict.dict_detail storeType, concat('user_', user.user_phone) phoneId, store.business_section,store.business_section_name,business_types_name,img1.img_url entranceImage," +
+            "store.administrative_region_district_name region, dict.dict_detail storeType, clock.phone_user_type phoneUserType, clock.phone_ref_id phoneRefId, " +
+            "CASE WHEN clock.phone_user_type = 1 THEN CONCAT('user_', (SELECT user_phone FROM life_user WHERE id = clock.phone_ref_id AND delete_flag = 0 LIMIT 1)) " +
+            "WHEN clock.phone_user_type = 2 THEN CONCAT('store_', (SELECT phone FROM store_user WHERE id = clock.phone_ref_id AND delete_flag = 0 LIMIT 1)) " +
+            "WHEN clock.phone_user_type = 3 THEN CONCAT('lawyer_', (SELECT phone FROM lawyer_user WHERE id = clock.phone_ref_id AND delete_flag = 0 LIMIT 1)) " +
+            "END phoneId, store.business_section,store.business_section_name,business_types_name,img1.img_url entranceImage," +
             "( " +
             " select ifnull(round(sum(uorder.price) / count(1), 0), 0) " +
             " from life_user_order uorder " +

+ 5 - 5
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/OrderReviewServiceImpl.java

@@ -27,8 +27,8 @@ import shop.alien.lawyer.service.OrderReviewService;
 import shop.alien.lawyer.service.ReviewCommentService;
 import shop.alien.mapper.*;
 import shop.alien.util.type.LifeNoticeUtil;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.lawyer.util.LawyerLikeRecordIdentityHelper;
+import shop.alien.lawyer.util.LawyerLikeRecordIdentityHelper.LawyerLikerScope;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -51,7 +51,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     private final ReviewCommentService reviewCommentService;
     private final ReviewCommentMapper reviewCommentMapper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final LawyerLikeRecordIdentityHelper lifeLikeIdentityHelper;
     private final LawyerUserMapper lawyerUserMapper;
     private final LifeNoticeMapper lifeNoticeMapper;
 
@@ -555,7 +555,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         }
 
         // 检查是否已点赞
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "7")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(reviewId))
@@ -603,7 +603,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         }
 
         // 查询点赞记录
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "7")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(reviewId))

+ 6 - 6
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/ReviewCommentServiceImpl.java

@@ -18,8 +18,8 @@ import shop.alien.entity.store.dto.ReviewReplyDto;
 import shop.alien.entity.store.vo.ReviewCommentVo;
 import shop.alien.lawyer.service.OrderReviewService;
 import shop.alien.lawyer.service.ReviewCommentService;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.lawyer.util.LawyerLikeRecordIdentityHelper;
+import shop.alien.lawyer.util.LawyerLikeRecordIdentityHelper.LawyerLikerScope;
 import shop.alien.mapper.LawyerUserMapper;
 import shop.alien.mapper.LifeLikeRecordMapper;
 import shop.alien.mapper.ReviewCommentMapper;
@@ -44,13 +44,13 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
     private final OrderReviewService orderReviewService;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
     private final LawyerUserMapper lawyerUserMapper;
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final LawyerLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     public ReviewCommentServiceImpl(ReviewCommentMapper reviewCommentMapper,
                                     @Lazy OrderReviewService orderReviewService,
                                     LifeLikeRecordMapper lifeLikeRecordMapper,
                                     LawyerUserMapper lawyerUserMapper,
-                                    LifeLikeIdentityHelper lifeLikeIdentityHelper) {
+                                    LawyerLikeRecordIdentityHelper lifeLikeIdentityHelper) {
         this.reviewCommentMapper = reviewCommentMapper;
         this.orderReviewService = orderReviewService;
         this.lifeLikeRecordMapper = lifeLikeRecordMapper;
@@ -190,7 +190,7 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
         }
 
         // 检查是否已点赞
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "8")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))
@@ -240,7 +240,7 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
         }
 
         // 查询点赞记录
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "8")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))

+ 12 - 12
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/StoreCommentServiceImpl.java

@@ -37,8 +37,8 @@ import shop.alien.util.common.safe.TextModerationResultVO;
 import shop.alien.util.common.safe.TextModerationUtil;
 import shop.alien.util.common.safe.TextReviewServiceEnum;
 import shop.alien.util.type.LifeNoticeUtil;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.lawyer.util.LawyerLikeRecordIdentityHelper;
+import shop.alien.lawyer.util.LawyerLikeRecordIdentityHelper.LawyerLikerScope;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -64,7 +64,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
 
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final LawyerLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     private final FileUploadUtil fileUploadUtil;
 
@@ -256,7 +256,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
             storeCommentVo.setCommitCount(0);
             //父级点赞状态
             if (StringUtils.isNotEmpty(phoneId)) {
-                LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
+                LawyerLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
                 LambdaQueryWrapper<LifeLikeRecord> likeRecordQueryWrapper = new LambdaQueryWrapper<>();
                 likeRecordQueryWrapper.eq(LifeLikeRecord::getHuifuId, storeCommentVo.getId());
                 lifeLikeIdentityHelper.applyLikerFilter(likeRecordQueryWrapper, likerScope);
@@ -326,7 +326,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
             //子级点赞状态
             if (StringUtils.isNotEmpty(phoneId)) {
                 childCommentList.forEach(child -> {
-                    LikerScope childLikerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
+                    LawyerLikerScope childLikerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
                     LambdaQueryWrapper<LifeLikeRecord> childlikeRecordQueryWrapper = new LambdaQueryWrapper<>();
                     childlikeRecordQueryWrapper.eq(LifeLikeRecord::getHuifuId, child.getId());
                     lifeLikeIdentityHelper.applyLikerFilter(childlikeRecordQueryWrapper, childLikerScope);
@@ -1483,7 +1483,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
 
         // 检查当前用户是否已点赞
         if (currentUserId != null) {
-            LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(currentUserId);
+            LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(currentUserId);
             LambdaQueryWrapper<LifeLikeRecord> likeWrapper = new LambdaQueryWrapper<>();
             likeWrapper.eq(LifeLikeRecord::getType, "7")
                     .eq(LifeLikeRecord::getHuifuId, String.valueOf(review.getId()))
@@ -1534,7 +1534,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
         }
 
         // 检查是否已点赞(type=7 表示订单评价点赞)
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "7")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(reviewId))
@@ -1574,7 +1574,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
         log.info("StoreCommentServiceImpl.cancelLikeOrderReview?reviewId={}, userId={}", reviewId, userId);
 
         // 查询点赞记录
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "7")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(reviewId))
@@ -1767,7 +1767,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
             
             // 检查是否已点赞
             if (currentUserId != null) {
-                LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(currentUserId);
+                LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(currentUserId);
                 LambdaQueryWrapper<LifeLikeRecord> likeWrapper = new LambdaQueryWrapper<>();
                 likeWrapper.eq(LifeLikeRecord::getType, "8")
                         .eq(LifeLikeRecord::getHuifuId, String.valueOf(comment.getId()))
@@ -1811,7 +1811,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
         }
 
         // 检查是否已点赞(type=8 表示评论点赞)
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "8")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))
@@ -1860,7 +1860,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
         }
 
         // 查询点赞记录
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "8")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))
@@ -1973,7 +1973,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
             
             // 检查是否已点赞
             if (currentUserId != null) {
-                LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(currentUserId);
+                LawyerLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(currentUserId);
                 LambdaQueryWrapper<LifeLikeRecord> likeWrapper = new LambdaQueryWrapper<>();
                 likeWrapper.eq(LifeLikeRecord::getType, "8")
                         .eq(LifeLikeRecord::getHuifuId, String.valueOf(reply.getId()))

+ 26 - 36
alien-entity/src/main/java/shop/alien/util/LifeLikeIdentityHelper.java → alien-lawyer/src/main/java/shop/alien/lawyer/util/LawyerLikeRecordIdentityHelper.java

@@ -1,4 +1,4 @@
-package shop.alien.util;
+package shop.alien.lawyer.util;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -19,16 +19,11 @@ import shop.alien.util.type.TypeUtil;
 import java.util.Objects;
 
 /**
- * life_like_record 点赞人身份工具。
- * <p>
- * 入参:兼容前端 legacy {@code dianzanId}(user_/store_/lawyer_ 或纯数字 life_user.id)。<br>
- * 库表:查询/新增/修改只使用 {@code dianzan_user_type} + {@code dianzan_ref_id},不读写 {@code dianzan_id} 列。<br>
- * 响应:由 type+refId 合成 {@code dianzanId} 返回给前端。
- * </p>
+ * alien-lawyer:life_like_record 点赞人身份工具。
  */
 @Component
 @RequiredArgsConstructor
-public class LifeLikeIdentityHelper {
+public class LawyerLikeRecordIdentityHelper {
 
     public static final int TYPE_USER = 1;
     public static final int TYPE_STORE = 2;
@@ -39,12 +34,12 @@ public class LifeLikeIdentityHelper {
     private final StoreUserMapper storeUserMapper;
     private final LawyerUserMapper lawyerUserMapper;
 
-    public static final class LikerScope {
+    public static final class LawyerLikerScope {
         private final String legacyDianzanId;
         private final Integer dianzanUserType;
         private final Integer dianzanRefId;
 
-        public LikerScope(String legacyDianzanId, Integer dianzanUserType, Integer dianzanRefId) {
+        public LawyerLikerScope(String legacyDianzanId, Integer dianzanUserType, Integer dianzanRefId) {
             this.legacyDianzanId = legacyDianzanId;
             this.dianzanUserType = dianzanUserType;
             this.dianzanRefId = dianzanRefId;
@@ -67,63 +62,60 @@ public class LifeLikeIdentityHelper {
         }
     }
 
-    /** 将前端传入的 legacy dianzanId 解析为 type+refId(仅入参侧兼容)。 */
-    public LikerScope resolveFromDianzanId(String dianzanId) {
+    public LawyerLikerScope resolveFromDianzanId(String dianzanId) {
         if (!StringUtils.hasText(dianzanId)) {
-            return new LikerScope(null, null, null);
+            return new LawyerLikerScope(null, null, null);
         }
         String trimmed = dianzanId.trim();
         if (typeUtil.containsUnderscore(trimmed)) {
             PhoneTypeIdResult resolved = typeUtil.resolveTypeAndId(trimmed);
             if (resolved != null) {
-                return new LikerScope(trimmed, resolved.getType(), resolved.getId());
+                return new LawyerLikerScope(trimmed, resolved.getType(), resolved.getId());
             }
-            return new LikerScope(trimmed, null, null);
+            return new LawyerLikerScope(trimmed, null, null);
         }
         try {
             int refId = Integer.parseInt(trimmed);
-            return new LikerScope(trimmed, TYPE_USER, refId);
+            return new LawyerLikerScope(trimmed, TYPE_USER, refId);
         } catch (NumberFormatException e) {
-            return new LikerScope(trimmed, null, null);
+            return new LawyerLikerScope(trimmed, null, null);
         }
     }
 
-    public LikerScope fromLifeUserId(Integer lifeUserId) {
+    public LawyerLikerScope fromLifeUserId(Integer lifeUserId) {
         if (lifeUserId == null) {
-            return new LikerScope(null, null, null);
+            return new LawyerLikerScope(null, null, null);
         }
-        return new LikerScope(String.valueOf(lifeUserId), TYPE_USER, lifeUserId);
+        return new LawyerLikerScope(String.valueOf(lifeUserId), TYPE_USER, lifeUserId);
     }
 
-    public LikerScope fromStoreUserId(Integer storeUserId) {
+    public LawyerLikerScope fromStoreUserId(Integer storeUserId) {
         if (storeUserId == null) {
-            return new LikerScope(null, null, null);
+            return new LawyerLikerScope(null, null, null);
         }
         StoreUser storeUser = storeUserMapper.selectById(storeUserId);
         String legacy = storeUser != null && StringUtils.hasText(storeUser.getPhone())
                 ? "store_" + storeUser.getPhone()
                 : String.valueOf(storeUserId);
-        return new LikerScope(legacy, TYPE_STORE, storeUserId);
+        return new LawyerLikerScope(legacy, TYPE_STORE, storeUserId);
     }
 
-    /** 从库表记录解析点赞人(仅认 dianzan_user_type + dianzan_ref_id)。 */
-    public LikerScope resolveFromRecord(LifeLikeRecord record) {
+    public LawyerLikerScope resolveFromRecord(LifeLikeRecord record) {
         if (record == null
                 || record.getDianzanUserType() == null
                 || record.getDianzanRefId() == null) {
-            return new LikerScope(null, null, null);
+            return new LawyerLikerScope(null, null, null);
         }
         String legacy = buildLegacyDianzanId(record.getDianzanUserType(), record.getDianzanRefId());
-        return new LikerScope(legacy, record.getDianzanUserType(), record.getDianzanRefId());
+        return new LawyerLikerScope(legacy, record.getDianzanUserType(), record.getDianzanRefId());
     }
 
-    /** 写入前:由入参 dianzanId 或显式 type+refId 填充新字段,不落库 dianzan_id。 */
     public void normalizeBeforeSave(LifeLikeRecord record) {
         if (record == null) {
             return;
         }
         if (record.getDianzanUserType() == null || record.getDianzanRefId() == null) {
-            LikerScope scope = resolveFromDianzanId(record.getDianzanId());
+            LawyerLikerScope scope = resolveFromDianzanId(record.getDianzanId());
             if (scope.hasTypeRef()) {
                 record.setDianzanUserType(scope.getDianzanUserType());
                 record.setDianzanRefId(scope.getDianzanRefId());
@@ -132,7 +124,7 @@ public class LifeLikeIdentityHelper {
         record.setDianzanId(null);
     }
 
-    public void applyLikerFilter(LambdaQueryWrapper<LifeLikeRecord> wrapper, LikerScope scope) {
+    public void applyLikerFilter(LambdaQueryWrapper<LifeLikeRecord> wrapper, LawyerLikerScope scope) {
         if (wrapper == null || scope == null || !scope.hasTypeRef()) {
             return;
         }
@@ -140,7 +132,7 @@ public class LifeLikeIdentityHelper {
                 .eq(LifeLikeRecord::getDianzanRefId, scope.getDianzanRefId());
     }
 
-    public void applyLikerFilter(LambdaUpdateWrapper<LifeLikeRecord> wrapper, LikerScope scope) {
+    public void applyLikerFilter(LambdaUpdateWrapper<LifeLikeRecord> wrapper, LawyerLikerScope scope) {
         if (wrapper == null || scope == null || !scope.hasTypeRef()) {
             return;
         }
@@ -148,11 +140,11 @@ public class LifeLikeIdentityHelper {
                 .eq(LifeLikeRecord::getDianzanRefId, scope.getDianzanRefId());
     }
 
-    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, LikerScope scope) {
+    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, LawyerLikerScope scope) {
         applyLikerFilter(wrapper, scope, null);
     }
 
-    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, LikerScope scope, String tableAlias) {
+    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, LawyerLikerScope scope, String tableAlias) {
         if (wrapper == null || scope == null || !scope.hasTypeRef()) {
             return;
         }
@@ -161,9 +153,8 @@ public class LifeLikeIdentityHelper {
                 .eq(prefix + "dianzan_ref_id", scope.getDianzanRefId());
     }
 
-    /** 与 life_fans 等仍使用 legacy 字符串的模块比对。 */
     public String resolveComparableDianzanId(LifeLikeRecord record) {
-        LikerScope scope = resolveFromRecord(record);
+        LawyerLikerScope scope = resolveFromRecord(record);
         if (scope.hasTypeRef()) {
             String legacy = buildLegacyDianzanId(scope.getDianzanUserType(), scope.getDianzanRefId());
             if (legacy != null) {
@@ -201,7 +192,6 @@ public class LifeLikeIdentityHelper {
         }
     }
 
-    /** 响应侧:由 type+refId 合成 dianzanId,不读库表 dianzan_id。 */
     public void ensureEntityLegacyDianzanId(LifeLikeRecord record) {
         if (record == null || record.getDianzanUserType() == null || record.getDianzanRefId() == null) {
             return;

+ 5 - 5
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -38,8 +38,8 @@ import shop.alien.util.common.VideoUtils;
 import shop.alien.util.common.safe.*;
 import shop.alien.util.type.LifeCollectIdentityQuery;
 import shop.alien.util.type.LifeNoticeUtil;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.second.util.SecondLikeRecordIdentityHelper;
+import shop.alien.second.util.SecondLikeRecordIdentityHelper.SecondLikerScope;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -126,7 +126,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
      */
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final SecondLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     /**
      * 收藏Mapper,用于操作收藏记录表
@@ -1573,7 +1573,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         searchGoodsList.getRecords().forEach(goods -> {
             if (userId != null) {
                 // 设置点赞状态
-                LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+                SecondLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
                 LambdaQueryWrapper<LifeLikeRecord> likeQueryWrapper = new LambdaQueryWrapper<>();
                 likeQueryWrapper.eq(LifeLikeRecord::getHuifuId, goods.getId())
                         .eq(LifeLikeRecord::getType, Constants.LikeType.SECOND_HAND_GOODS);
@@ -1788,7 +1788,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
      */
     @Override
     public IPage<SecondGoodsVo> getLikeGoodsPage(IPage<SecondGoodsVo> page, int userId, String phone) {
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        SecondLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
         queryWrapper
                 .eq("lc.delete_flag", Constants.DeleteFlag.NOT_DELETED)

+ 204 - 0
alien-second/src/main/java/shop/alien/second/util/SecondLikeRecordIdentityHelper.java

@@ -0,0 +1,204 @@
+package shop.alien.second.util;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import shop.alien.entity.store.LawyerUser;
+import shop.alien.entity.store.LifeLikeRecord;
+import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.mapper.LawyerUserMapper;
+import shop.alien.mapper.LifeUserMapper;
+import shop.alien.mapper.StoreUserMapper;
+import shop.alien.util.type.PhoneTypeIdResult;
+import shop.alien.util.type.TypeUtil;
+
+import java.util.Objects;
+
+/**
+ * alien-second:life_like_record 点赞人身份工具。
+ */
+@Component
+@RequiredArgsConstructor
+public class SecondLikeRecordIdentityHelper {
+
+    public static final int TYPE_USER = 1;
+    public static final int TYPE_STORE = 2;
+    public static final int TYPE_LAWYER = 3;
+
+    private final TypeUtil typeUtil;
+    private final LifeUserMapper lifeUserMapper;
+    private final StoreUserMapper storeUserMapper;
+    private final LawyerUserMapper lawyerUserMapper;
+
+    public static final class SecondLikerScope {
+        private final String legacyDianzanId;
+        private final Integer dianzanUserType;
+        private final Integer dianzanRefId;
+
+        public SecondLikerScope(String legacyDianzanId, Integer dianzanUserType, Integer dianzanRefId) {
+            this.legacyDianzanId = legacyDianzanId;
+            this.dianzanUserType = dianzanUserType;
+            this.dianzanRefId = dianzanRefId;
+        }
+
+        public String getLegacyDianzanId() {
+            return legacyDianzanId;
+        }
+
+        public Integer getDianzanUserType() {
+            return dianzanUserType;
+        }
+
+        public Integer getDianzanRefId() {
+            return dianzanRefId;
+        }
+
+        public boolean hasTypeRef() {
+            return dianzanUserType != null && dianzanRefId != null;
+        }
+    }
+
+    public SecondLikerScope resolveFromDianzanId(String dianzanId) {
+        if (!StringUtils.hasText(dianzanId)) {
+            return new SecondLikerScope(null, null, null);
+        }
+        String trimmed = dianzanId.trim();
+        if (typeUtil.containsUnderscore(trimmed)) {
+            PhoneTypeIdResult resolved = typeUtil.resolveTypeAndId(trimmed);
+            if (resolved != null) {
+                return new SecondLikerScope(trimmed, resolved.getType(), resolved.getId());
+            }
+            return new SecondLikerScope(trimmed, null, null);
+        }
+        try {
+            int refId = Integer.parseInt(trimmed);
+            return new SecondLikerScope(trimmed, TYPE_USER, refId);
+        } catch (NumberFormatException e) {
+            return new SecondLikerScope(trimmed, null, null);
+        }
+    }
+
+    public SecondLikerScope fromLifeUserId(Integer lifeUserId) {
+        if (lifeUserId == null) {
+            return new SecondLikerScope(null, null, null);
+        }
+        return new SecondLikerScope(String.valueOf(lifeUserId), TYPE_USER, lifeUserId);
+    }
+
+    public SecondLikerScope fromStoreUserId(Integer storeUserId) {
+        if (storeUserId == null) {
+            return new SecondLikerScope(null, null, null);
+        }
+        StoreUser storeUser = storeUserMapper.selectById(storeUserId);
+        String legacy = storeUser != null && StringUtils.hasText(storeUser.getPhone())
+                ? "store_" + storeUser.getPhone()
+                : String.valueOf(storeUserId);
+        return new SecondLikerScope(legacy, TYPE_STORE, storeUserId);
+    }
+
+    public SecondLikerScope resolveFromRecord(LifeLikeRecord record) {
+        if (record == null
+                || record.getDianzanUserType() == null
+                || record.getDianzanRefId() == null) {
+            return new SecondLikerScope(null, null, null);
+        }
+        String legacy = buildLegacyDianzanId(record.getDianzanUserType(), record.getDianzanRefId());
+        return new SecondLikerScope(legacy, record.getDianzanUserType(), record.getDianzanRefId());
+    }
+
+    public void normalizeBeforeSave(LifeLikeRecord record) {
+        if (record == null) {
+            return;
+        }
+        if (record.getDianzanUserType() == null || record.getDianzanRefId() == null) {
+            SecondLikerScope scope = resolveFromDianzanId(record.getDianzanId());
+            if (scope.hasTypeRef()) {
+                record.setDianzanUserType(scope.getDianzanUserType());
+                record.setDianzanRefId(scope.getDianzanRefId());
+            }
+        }
+        record.setDianzanId(null);
+    }
+
+    public void applyLikerFilter(LambdaQueryWrapper<LifeLikeRecord> wrapper, SecondLikerScope scope) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        wrapper.eq(LifeLikeRecord::getDianzanUserType, scope.getDianzanUserType())
+                .eq(LifeLikeRecord::getDianzanRefId, scope.getDianzanRefId());
+    }
+
+    public void applyLikerFilter(LambdaUpdateWrapper<LifeLikeRecord> wrapper, SecondLikerScope scope) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        wrapper.eq(LifeLikeRecord::getDianzanUserType, scope.getDianzanUserType())
+                .eq(LifeLikeRecord::getDianzanRefId, scope.getDianzanRefId());
+    }
+
+    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, SecondLikerScope scope) {
+        applyLikerFilter(wrapper, scope, null);
+    }
+
+    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, SecondLikerScope scope, String tableAlias) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        String prefix = StringUtils.hasText(tableAlias) ? tableAlias + "." : "";
+        wrapper.eq(prefix + "dianzan_user_type", scope.getDianzanUserType())
+                .eq(prefix + "dianzan_ref_id", scope.getDianzanRefId());
+    }
+
+    public String resolveComparableDianzanId(LifeLikeRecord record) {
+        SecondLikerScope scope = resolveFromRecord(record);
+        if (scope.hasTypeRef()) {
+            String legacy = buildLegacyDianzanId(scope.getDianzanUserType(), scope.getDianzanRefId());
+            if (legacy != null) {
+                return legacy;
+            }
+            if (Objects.equals(scope.getDianzanUserType(), TYPE_USER)) {
+                return String.valueOf(scope.getDianzanRefId());
+            }
+        }
+        return record != null ? record.getDianzanId() : null;
+    }
+
+    public String buildLegacyDianzanId(Integer dianzanUserType, Integer dianzanRefId) {
+        if (dianzanUserType == null || dianzanRefId == null) {
+            return null;
+        }
+        switch (dianzanUserType) {
+            case TYPE_USER: {
+                LifeUser user = lifeUserMapper.selectById(dianzanRefId);
+                return user != null && StringUtils.hasText(user.getUserPhone())
+                        ? "user_" + user.getUserPhone() : String.valueOf(dianzanRefId);
+            }
+            case TYPE_STORE: {
+                StoreUser storeUser = storeUserMapper.selectById(dianzanRefId);
+                return storeUser != null && StringUtils.hasText(storeUser.getPhone())
+                        ? "store_" + storeUser.getPhone() : null;
+            }
+            case TYPE_LAWYER: {
+                LawyerUser lawyerUser = lawyerUserMapper.selectById(dianzanRefId);
+                return lawyerUser != null && StringUtils.hasText(lawyerUser.getPhone())
+                        ? "lawyer_" + lawyerUser.getPhone() : null;
+            }
+            default:
+                return null;
+        }
+    }
+
+    public void ensureEntityLegacyDianzanId(LifeLikeRecord record) {
+        if (record == null || record.getDianzanUserType() == null || record.getDianzanRefId() == null) {
+            return;
+        }
+        String legacy = buildLegacyDianzanId(record.getDianzanUserType(), record.getDianzanRefId());
+        if (legacy != null) {
+            record.setDianzanId(legacy);
+        }
+    }
+}

+ 5 - 5
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StoreMenuPlatformServiceImpl.java

@@ -29,8 +29,8 @@ import shop.alien.mapper.StoreImgMapper;
 import shop.alien.mapper.StoreMenuMapper;
 import shop.alien.storeplatform.feign.AlienStoreFeign;
 import shop.alien.storeplatform.service.StoreMenuPlatformService;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.storeplatform.util.PlatformLikeRecordIdentityHelper;
+import shop.alien.storeplatform.util.PlatformLikeRecordIdentityHelper.PlatformLikerScope;
 import shop.alien.util.ali.AliOSSUtil;
 
 import java.io.ByteArrayInputStream;
@@ -56,7 +56,7 @@ public class StoreMenuPlatformServiceImpl extends ServiceImpl<StoreMenuMapper, S
 
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final PlatformLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     private final StoreImgMapper storeImgMapper;
 
@@ -84,7 +84,7 @@ public class StoreMenuPlatformServiceImpl extends ServiceImpl<StoreMenuMapper, S
             List<StoreMenuVo> collect = storeMenuMapper.getStoreMenuList(storeId, dishType);
             collect.forEach(item -> {
                 if (StringUtils.isNotEmpty(phoneId)) {
-                    LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
+                    PlatformLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
                     LambdaQueryWrapper<LifeLikeRecord> query = new LambdaQueryWrapper<>();
                     query.eq(LifeLikeRecord::getHuifuId, item.getId());
                     lifeLikeIdentityHelper.applyLikerFilter(query, likerScope);
@@ -301,7 +301,7 @@ public class StoreMenuPlatformServiceImpl extends ServiceImpl<StoreMenuMapper, S
      */
     @Override
     public boolean getMenuLikeStatus(String userId, Integer menuId) {
-        LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
+        PlatformLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
         LambdaQueryWrapper<LifeLikeRecord> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(LifeLikeRecord::getHuifuId, menuId).eq(LifeLikeRecord::getDeleteFlag, 0);
         lifeLikeIdentityHelper.applyLikerFilter(wrapper, likerScope);

+ 204 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/util/PlatformLikeRecordIdentityHelper.java

@@ -0,0 +1,204 @@
+package shop.alien.storeplatform.util;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import shop.alien.entity.store.LawyerUser;
+import shop.alien.entity.store.LifeLikeRecord;
+import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.mapper.LawyerUserMapper;
+import shop.alien.mapper.LifeUserMapper;
+import shop.alien.mapper.StoreUserMapper;
+import shop.alien.util.type.PhoneTypeIdResult;
+import shop.alien.util.type.TypeUtil;
+
+import java.util.Objects;
+
+/**
+ * alien-store-platform:life_like_record 点赞人身份工具。
+ */
+@Component
+@RequiredArgsConstructor
+public class PlatformLikeRecordIdentityHelper {
+
+    public static final int TYPE_USER = 1;
+    public static final int TYPE_STORE = 2;
+    public static final int TYPE_LAWYER = 3;
+
+    private final TypeUtil typeUtil;
+    private final LifeUserMapper lifeUserMapper;
+    private final StoreUserMapper storeUserMapper;
+    private final LawyerUserMapper lawyerUserMapper;
+
+    public static final class PlatformLikerScope {
+        private final String legacyDianzanId;
+        private final Integer dianzanUserType;
+        private final Integer dianzanRefId;
+
+        public PlatformLikerScope(String legacyDianzanId, Integer dianzanUserType, Integer dianzanRefId) {
+            this.legacyDianzanId = legacyDianzanId;
+            this.dianzanUserType = dianzanUserType;
+            this.dianzanRefId = dianzanRefId;
+        }
+
+        public String getLegacyDianzanId() {
+            return legacyDianzanId;
+        }
+
+        public Integer getDianzanUserType() {
+            return dianzanUserType;
+        }
+
+        public Integer getDianzanRefId() {
+            return dianzanRefId;
+        }
+
+        public boolean hasTypeRef() {
+            return dianzanUserType != null && dianzanRefId != null;
+        }
+    }
+
+    public PlatformLikerScope resolveFromDianzanId(String dianzanId) {
+        if (!StringUtils.hasText(dianzanId)) {
+            return new PlatformLikerScope(null, null, null);
+        }
+        String trimmed = dianzanId.trim();
+        if (typeUtil.containsUnderscore(trimmed)) {
+            PhoneTypeIdResult resolved = typeUtil.resolveTypeAndId(trimmed);
+            if (resolved != null) {
+                return new PlatformLikerScope(trimmed, resolved.getType(), resolved.getId());
+            }
+            return new PlatformLikerScope(trimmed, null, null);
+        }
+        try {
+            int refId = Integer.parseInt(trimmed);
+            return new PlatformLikerScope(trimmed, TYPE_USER, refId);
+        } catch (NumberFormatException e) {
+            return new PlatformLikerScope(trimmed, null, null);
+        }
+    }
+
+    public PlatformLikerScope fromLifeUserId(Integer lifeUserId) {
+        if (lifeUserId == null) {
+            return new PlatformLikerScope(null, null, null);
+        }
+        return new PlatformLikerScope(String.valueOf(lifeUserId), TYPE_USER, lifeUserId);
+    }
+
+    public PlatformLikerScope fromStoreUserId(Integer storeUserId) {
+        if (storeUserId == null) {
+            return new PlatformLikerScope(null, null, null);
+        }
+        StoreUser storeUser = storeUserMapper.selectById(storeUserId);
+        String legacy = storeUser != null && StringUtils.hasText(storeUser.getPhone())
+                ? "store_" + storeUser.getPhone()
+                : String.valueOf(storeUserId);
+        return new PlatformLikerScope(legacy, TYPE_STORE, storeUserId);
+    }
+
+    public PlatformLikerScope resolveFromRecord(LifeLikeRecord record) {
+        if (record == null
+                || record.getDianzanUserType() == null
+                || record.getDianzanRefId() == null) {
+            return new PlatformLikerScope(null, null, null);
+        }
+        String legacy = buildLegacyDianzanId(record.getDianzanUserType(), record.getDianzanRefId());
+        return new PlatformLikerScope(legacy, record.getDianzanUserType(), record.getDianzanRefId());
+    }
+
+    public void normalizeBeforeSave(LifeLikeRecord record) {
+        if (record == null) {
+            return;
+        }
+        if (record.getDianzanUserType() == null || record.getDianzanRefId() == null) {
+            PlatformLikerScope scope = resolveFromDianzanId(record.getDianzanId());
+            if (scope.hasTypeRef()) {
+                record.setDianzanUserType(scope.getDianzanUserType());
+                record.setDianzanRefId(scope.getDianzanRefId());
+            }
+        }
+        record.setDianzanId(null);
+    }
+
+    public void applyLikerFilter(LambdaQueryWrapper<LifeLikeRecord> wrapper, PlatformLikerScope scope) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        wrapper.eq(LifeLikeRecord::getDianzanUserType, scope.getDianzanUserType())
+                .eq(LifeLikeRecord::getDianzanRefId, scope.getDianzanRefId());
+    }
+
+    public void applyLikerFilter(LambdaUpdateWrapper<LifeLikeRecord> wrapper, PlatformLikerScope scope) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        wrapper.eq(LifeLikeRecord::getDianzanUserType, scope.getDianzanUserType())
+                .eq(LifeLikeRecord::getDianzanRefId, scope.getDianzanRefId());
+    }
+
+    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, PlatformLikerScope scope) {
+        applyLikerFilter(wrapper, scope, null);
+    }
+
+    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, PlatformLikerScope scope, String tableAlias) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        String prefix = StringUtils.hasText(tableAlias) ? tableAlias + "." : "";
+        wrapper.eq(prefix + "dianzan_user_type", scope.getDianzanUserType())
+                .eq(prefix + "dianzan_ref_id", scope.getDianzanRefId());
+    }
+
+    public String resolveComparableDianzanId(LifeLikeRecord record) {
+        PlatformLikerScope scope = resolveFromRecord(record);
+        if (scope.hasTypeRef()) {
+            String legacy = buildLegacyDianzanId(scope.getDianzanUserType(), scope.getDianzanRefId());
+            if (legacy != null) {
+                return legacy;
+            }
+            if (Objects.equals(scope.getDianzanUserType(), TYPE_USER)) {
+                return String.valueOf(scope.getDianzanRefId());
+            }
+        }
+        return record != null ? record.getDianzanId() : null;
+    }
+
+    public String buildLegacyDianzanId(Integer dianzanUserType, Integer dianzanRefId) {
+        if (dianzanUserType == null || dianzanRefId == null) {
+            return null;
+        }
+        switch (dianzanUserType) {
+            case TYPE_USER: {
+                LifeUser user = lifeUserMapper.selectById(dianzanRefId);
+                return user != null && StringUtils.hasText(user.getUserPhone())
+                        ? "user_" + user.getUserPhone() : String.valueOf(dianzanRefId);
+            }
+            case TYPE_STORE: {
+                StoreUser storeUser = storeUserMapper.selectById(dianzanRefId);
+                return storeUser != null && StringUtils.hasText(storeUser.getPhone())
+                        ? "store_" + storeUser.getPhone() : null;
+            }
+            case TYPE_LAWYER: {
+                LawyerUser lawyerUser = lawyerUserMapper.selectById(dianzanRefId);
+                return lawyerUser != null && StringUtils.hasText(lawyerUser.getPhone())
+                        ? "lawyer_" + lawyerUser.getPhone() : null;
+            }
+            default:
+                return null;
+        }
+    }
+
+    public void ensureEntityLegacyDianzanId(LifeLikeRecord record) {
+        if (record == null || record.getDianzanUserType() == null || record.getDianzanRefId() == null) {
+            return;
+        }
+        String legacy = buildLegacyDianzanId(record.getDianzanUserType(), record.getDianzanRefId());
+        if (legacy != null) {
+            record.setDianzanId(legacy);
+        }
+    }
+}

+ 4 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java

@@ -30,6 +30,7 @@ import shop.alien.store.service.*;
 import shop.alien.entity.store.StoreCuisine;
 import shop.alien.entity.store.StorePrice;
 import shop.alien.entity.store.UserLoginInfo;
+import shop.alien.store.util.StoreClockInIdentityHelper;
 import shop.alien.util.common.TokenInfo;
 import springfox.documentation.annotations.ApiIgnore;
 
@@ -76,6 +77,8 @@ public class StoreInfoController {
     private final StoreUserMapper storeUserMapper;
     private final LifeFansMapper lifeFansMapper;
 
+    private final StoreClockInIdentityHelper clockInIdentityHelper;
+
     private final StoreCuisineService storeCuisineService;
     private final StorePriceService storePriceService;
     private final StoreStaffConfigService storeStaffConfigService;
@@ -1043,6 +1046,7 @@ public class StoreInfoController {
         if( list.size()>0) {
             StoreClockInVo  storeClockInVo = new StoreClockInVo();
             BeanUtils.copyProperties(list.get(0), storeClockInVo);
+            clockInIdentityHelper.ensureEntityLegacyPhoneId(storeClockInVo);
             LifeUser lifeUser = lifeUserMapper.selectById(list.get(0).getUserId());
             storeClockInVo.setUserImg(lifeUser.getUserImage());
             result.add(storeClockInVo);

+ 6 - 6
alien-store/src/main/java/shop/alien/store/service/LifeActivityService.java

@@ -20,8 +20,8 @@ import shop.alien.mapper.LifeActivityMapper;
 import shop.alien.mapper.LifeCommentMapper;
 import shop.alien.mapper.LifeLikeRecordMapper;
 import shop.alien.mapper.LifeUserMapper;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 import shop.alien.util.common.ListToPage;
 
 import java.util.*;
@@ -42,7 +42,7 @@ public class LifeActivityService {
 
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     private final WebAuditService webAuditService;
 
@@ -73,7 +73,7 @@ public class LifeActivityService {
         IPage<LifeActivity> activityList = lifeActivityMapper.selectPage(storePage, queryWrapper);
 
         // 查询点赞数据
-        LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
         LambdaQueryWrapper<LifeLikeRecord> likeWrapper = new LambdaQueryWrapper<>();
         likeWrapper.eq(LifeLikeRecord::getType, "3")
                 .eq(LifeLikeRecord::getDeleteFlag, "0");
@@ -107,7 +107,7 @@ public class LifeActivityService {
         LifeActivity lifeActivity = lifeActivityMapper.selectById(id);
         LifeActivityVo hdVo = new LifeActivityVo();
         BeanUtils.copyProperties(lifeActivity, hdVo);
-        LikerScope currentLikerScope = lifeLikeIdentityHelper.resolveFromDianzanId(currentId);
+        StoreLikerScope currentLikerScope = lifeLikeIdentityHelper.resolveFromDianzanId(currentId);
         LambdaQueryWrapper<LifeLikeRecord> recordQueryWrapper = new LambdaQueryWrapper<>();
         recordQueryWrapper.eq(LifeLikeRecord::getHuifuId, lifeActivity.getId());
         lifeLikeIdentityHelper.applyLikerFilter(recordQueryWrapper, currentLikerScope);
@@ -164,7 +164,7 @@ public class LifeActivityService {
         LifeActivity lifeActivity = lifeActivityMapper.selectById(id);
         LifeActivityVo hdVo = new LifeActivityVo();
         BeanUtils.copyProperties(lifeActivity, hdVo);
-        LikerScope currentLikerScope = lifeLikeIdentityHelper.resolveFromDianzanId(currentId);
+        StoreLikerScope currentLikerScope = lifeLikeIdentityHelper.resolveFromDianzanId(currentId);
         LambdaQueryWrapper<LifeLikeRecord> recordQueryWrapper = new LambdaQueryWrapper<>();
         recordQueryWrapper.eq(LifeLikeRecord::getHuifuId, lifeActivity.getId());
         lifeLikeIdentityHelper.applyLikerFilter(recordQueryWrapper, currentLikerScope);

+ 5 - 5
alien-store/src/main/java/shop/alien/store/service/LifeCommentService.java

@@ -15,8 +15,8 @@ import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 import shop.alien.store.util.CommonConstant;
 import shop.alien.store.util.LifeDynamicsIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 import shop.alien.entity.second.SecondGoods;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.LifePinglunVo;
@@ -89,7 +89,7 @@ public class LifeCommentService {
 
     private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     private final ClockInRecommendCacheService clockInRecommendCacheService;
 
@@ -128,7 +128,7 @@ public class LifeCommentService {
         }
         
         try {
-            LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
+            StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
             LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(LifeLikeRecord::getType, type)
                     .eq(LifeLikeRecord::getHuifuId, huifuId)
@@ -415,7 +415,7 @@ public class LifeCommentService {
         }
         
         try {
-            LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
+            StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
             LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(LifeLikeRecord::getHuifuId, huifuId)
                     .eq(LifeLikeRecord::getType, type)

+ 3 - 3
alien-store/src/main/java/shop/alien/store/service/LifeUserDynamicsService.java

@@ -20,8 +20,8 @@ import shop.alien.entity.store.vo.LifeUserDynamicsVo;
 import shop.alien.mapper.*;
 import shop.alien.store.util.LifeDynamicsIdentityHelper;
 import shop.alien.store.util.LifeDynamicsIdentityHelper.PublisherScope;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 import shop.alien.util.common.constant.CommentSourceTypeEnum;
 
 import java.util.*;
@@ -71,7 +71,7 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
 
     private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
 
     public int addLiulanCount(String id) {

+ 4 - 4
alien-store/src/main/java/shop/alien/store/service/impl/CommonCommentServiceImpl.java

@@ -18,8 +18,8 @@ import shop.alien.mapper.*;
 import shop.alien.store.service.CommonCommentService;
 import shop.alien.store.util.CommonConstant;
 import shop.alien.store.util.LifeDynamicsIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 import shop.alien.store.util.ai.AiContentModerationUtil;
 import shop.alien.util.common.constant.CommentSourceTypeEnum;
 import shop.alien.util.common.safe.TextModerationUtil;
@@ -48,7 +48,7 @@ public class CommonCommentServiceImpl extends ServiceImpl<CommonCommentMapper, C
 
     private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
     private final StoreUserMapper storeUserMapper;
     private final LifeUserViolationMapper lifeUserViolationMapper;
     private final LifeUserMapper lifeUserMapper;
@@ -319,7 +319,7 @@ public class CommonCommentServiceImpl extends ServiceImpl<CommonCommentMapper, C
             }
 
             // 3.查询当前用户是否喜欢
-            LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(fansId);
+            StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(fansId);
             LambdaQueryWrapper<LifeLikeRecord> likeQueryWrapper = new LambdaQueryWrapper<>();
             likeQueryWrapper.eq(LifeLikeRecord::getType, CommonConstant.LIKE_TYPE_DYNAMICS)
                     .eq(LifeLikeRecord::getHuifuId, sourceId)

+ 5 - 5
alien-store/src/main/java/shop/alien/store/service/impl/CommonRatingServiceImpl.java

@@ -46,8 +46,8 @@ import shop.alien.util.common.safe.TextModerationUtil;
 import shop.alien.util.common.safe.TextReviewServiceEnum;
 import shop.alien.util.type.LifeCollectIdentityQuery;
 import shop.alien.util.type.LifeNoticeUtil;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -83,7 +83,7 @@ public class CommonRatingServiceImpl extends ServiceImpl<CommonRatingMapper, Com
     private final LifeUserMapper lifeUserMapper;
     private final CommonCommentMapper commonCommentMapper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
     private final LifeCollectMapper lifeCollectMapper;
     private final LifeFansMapper lifeFansMapper;
     private final TagsSynonymMapper tagsSynonymMapper;
@@ -875,7 +875,7 @@ public class CommonRatingServiceImpl extends ServiceImpl<CommonRatingMapper, Com
      * @param commonRatingVo 评价vo
      */
     private void setIsLike(Integer ratingId, Long userId, CommonRatingVo commonRatingVo) {
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId != null ? userId.intValue() : null);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId != null ? userId.intValue() : null);
         LambdaQueryWrapper<LifeLikeRecord> likeQueryWrapper = new LambdaQueryWrapper<>();
         likeQueryWrapper.eq(LifeLikeRecord::getHuifuId, ratingId)
                 .eq(LifeLikeRecord::getDeleteFlag, 0)
@@ -977,7 +977,7 @@ public class CommonRatingServiceImpl extends ServiceImpl<CommonRatingMapper, Com
             List<LifeLikeRecord> lifeLikeRecords = new ArrayList<>();
             Map<String, LifeLikeRecord> likeRecordMap = new HashMap<>();
             if (userId != null) {
-                LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId.intValue());
+                StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId.intValue());
                 LambdaQueryWrapper<LifeLikeRecord> likeQueryWrapper = new LambdaQueryWrapper<>();
                 likeQueryWrapper.eq(LifeLikeRecord::getType, CommonConstant.RATING_LIKE);
                 lifeLikeIdentityHelper.applyLikerFilter(likeQueryWrapper, likerScope);

+ 5 - 5
alien-store/src/main/java/shop/alien/store/service/impl/OrderReviewServiceImpl.java

@@ -22,8 +22,8 @@ import shop.alien.entity.store.vo.PendingReviewVo;
 import shop.alien.mapper.*;
 import shop.alien.store.service.OrderReviewService;
 import shop.alien.store.service.ReviewCommentService;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -46,7 +46,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     private final ReviewCommentService reviewCommentService;
     private final ReviewCommentMapper reviewCommentMapper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
     private final LawyerUserMapper lawyerUserMapper;
 
     @Override
@@ -505,7 +505,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         }
 
         // 检查是否已点赞
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "7")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(reviewId))
@@ -553,7 +553,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         }
 
         // 查询点赞记录
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "7")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(reviewId))

+ 6 - 6
alien-store/src/main/java/shop/alien/store/service/impl/ReviewCommentServiceImpl.java

@@ -22,8 +22,8 @@ import shop.alien.mapper.ReviewCommentMapper;
 import shop.alien.entity.store.LawyerUser;
 import shop.alien.store.service.OrderReviewService;
 import shop.alien.store.service.ReviewCommentService;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 
 import java.util.Date;
 import java.util.List;
@@ -44,13 +44,13 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
     private final OrderReviewService orderReviewService;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
     private final LawyerUserMapper lawyerUserMapper;
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     public ReviewCommentServiceImpl(ReviewCommentMapper reviewCommentMapper,
                                     @Lazy OrderReviewService orderReviewService,
                                     LifeLikeRecordMapper lifeLikeRecordMapper,
                                     LawyerUserMapper lawyerUserMapper,
-                                    LifeLikeIdentityHelper lifeLikeIdentityHelper) {
+                                    StoreLikeRecordIdentityHelper lifeLikeIdentityHelper) {
         this.reviewCommentMapper = reviewCommentMapper;
         this.orderReviewService = orderReviewService;
         this.lifeLikeRecordMapper = lifeLikeRecordMapper;
@@ -190,7 +190,7 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
         }
 
         // 检查是否已点赞
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "8")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))
@@ -240,7 +240,7 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
         }
 
         // 查询点赞记录
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, "8")
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))

+ 5 - 5
alien-store/src/main/java/shop/alien/store/service/impl/StoreClockInServiceImpl.java

@@ -31,8 +31,8 @@ import shop.alien.util.common.constant.CommentSourceTypeEnum;
 import shop.alien.util.type.PhoneTypeIdResult;
 import shop.alien.util.type.LifeCollectIdentityQuery;
 import shop.alien.util.type.TypeUtil;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
@@ -65,7 +65,7 @@ public class StoreClockInServiceImpl extends ServiceImpl<StoreClockInMapper, Sto
 
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     private final StoreCommentService storeCommentService;
 
@@ -160,7 +160,7 @@ public class StoreClockInServiceImpl extends ServiceImpl<StoreClockInMapper, Sto
         
         // 优化:提前查询所有需要的数据,避免在循环中查询
         // 查询我的点赞 - 使用Set提高查找效率
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> likeWrapper = new LambdaQueryWrapper<>();
         likeWrapper.eq(LifeLikeRecord::getType, "5");
         lifeLikeIdentityHelper.applyLikerFilter(likeWrapper, likerScope);
@@ -549,7 +549,7 @@ public class StoreClockInServiceImpl extends ServiceImpl<StoreClockInMapper, Sto
                 storeClockInVo.setIsCollect("1");
             }
 
-            LikerScope viewerLikerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+            StoreLikerScope viewerLikerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
             LambdaQueryWrapper<LifeLikeRecord> likeQw = new LambdaQueryWrapper<>();
             likeQw.eq(LifeLikeRecord::getType, "5")
                     .eq(LifeLikeRecord::getHuifuId, String.valueOf(storeClockIn.getId()));

+ 5 - 5
alien-store/src/main/java/shop/alien/store/service/impl/StoreCommentServiceImpl.java

@@ -32,8 +32,8 @@ import shop.alien.util.common.safe.TextModerationResultVO;
 import shop.alien.util.common.safe.TextModerationUtil;
 import shop.alien.util.common.safe.TextReviewServiceEnum;
 import shop.alien.util.type.LifeNoticeUtil;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -59,7 +59,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
 
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     private final FileUploadUtil fileUploadUtil;
 
@@ -262,7 +262,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
             storeCommentVo.setCommitCount(0);
             //父级点赞状态
             if (StringUtils.isNotEmpty(phoneId)) {
-                LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
+                StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
                 LambdaQueryWrapper<LifeLikeRecord> likeRecordQueryWrapper = new LambdaQueryWrapper<>();
                 likeRecordQueryWrapper.eq(LifeLikeRecord::getHuifuId, storeCommentVo.getId());
                 lifeLikeIdentityHelper.applyLikerFilter(likeRecordQueryWrapper, likerScope);
@@ -332,7 +332,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
             //子级点赞状态
             if (StringUtils.isNotEmpty(phoneId)) {
                 childCommentList.forEach(child -> {
-                    LikerScope childLikerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
+                    StoreLikerScope childLikerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
                     LambdaQueryWrapper<LifeLikeRecord> childlikeRecordQueryWrapper = new LambdaQueryWrapper<>();
                     childlikeRecordQueryWrapper.eq(LifeLikeRecord::getHuifuId, child.getId());
                     lifeLikeIdentityHelper.applyLikerFilter(childlikeRecordQueryWrapper, childLikerScope);

+ 7 - 7
alien-store/src/main/java/shop/alien/store/service/impl/StoreMenuServiceImpl.java

@@ -22,8 +22,8 @@ import shop.alien.mapper.LifeLikeRecordMapper;
 import shop.alien.mapper.StoreMenuMapper;
 import shop.alien.store.service.StoreImgService;
 import shop.alien.store.service.StoreMenuService;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 
 import java.util.Collections;
 import java.util.Comparator;
@@ -48,7 +48,7 @@ public class StoreMenuServiceImpl extends ServiceImpl<StoreMenuMapper, StoreMenu
 
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     private final StoreImgService storeImgService;
 
@@ -98,7 +98,7 @@ public class StoreMenuServiceImpl extends ServiceImpl<StoreMenuMapper, StoreMenu
                     .collect(Collectors.toSet());
 
             // 批量查询点赞记录
-            LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
+            StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
             LambdaQueryWrapper<LifeLikeRecord> likeQuery = new LambdaQueryWrapper<>();
             likeQuery.in(LifeLikeRecord::getHuifuId, menuIdStrSet);
             lifeLikeIdentityHelper.applyLikerFilter(likeQuery, likerScope);
@@ -327,7 +327,7 @@ public class StoreMenuServiceImpl extends ServiceImpl<StoreMenuMapper, StoreMenu
      */
     @Override
     public boolean getMenuLikeStatus(String userId, Integer menuId) {
-        LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
         LambdaQueryWrapper<LifeLikeRecord> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(LifeLikeRecord::getHuifuId, menuId).eq(LifeLikeRecord::getDeleteFlag, 0);
         lifeLikeIdentityHelper.applyLikerFilter(wrapper, likerScope);
@@ -491,7 +491,7 @@ public class StoreMenuServiceImpl extends ServiceImpl<StoreMenuMapper, StoreMenu
         }
 
         // 批量查询点赞记录
-        LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
         LambdaQueryWrapper<LifeLikeRecord> likeQuery = new LambdaQueryWrapper<>();
         likeQuery.eq(LifeLikeRecord::getDeleteFlag, 0)
                 .in(LifeLikeRecord::getHuifuId, menuIdStrSet);
@@ -534,7 +534,7 @@ public class StoreMenuServiceImpl extends ServiceImpl<StoreMenuMapper, StoreMenu
         StoreMenuVo storeMenuVo = storeMenuMapper.getClientMenuInfoById(id);
         if(StringUtils.isNotEmpty(phoneId)){
             // 批量查询点赞记录
-            LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
+            StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(phoneId);
             LambdaQueryWrapper<LifeLikeRecord> likeQuery = new LambdaQueryWrapper<>();
             likeQuery.eq(LifeLikeRecord::getDeleteFlag, 0)
                     .eq(LifeLikeRecord::getHuifuId, storeMenuVo.getId());

+ 6 - 6
alien-store/src/main/java/shop/alien/store/service/impl/StoreStaffCommentServiceImpl.java

@@ -21,8 +21,8 @@ import shop.alien.mapper.StoreStaffCommentMapper;
 import shop.alien.store.service.StoreStaffCommentService;
 import shop.alien.store.service.StoreStaffReviewService;
 import shop.alien.store.util.ai.AiContentModerationUtil;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 
 import java.util.Date;
 import java.util.List;
@@ -47,12 +47,12 @@ public class StoreStaffCommentServiceImpl extends ServiceImpl<StoreStaffCommentM
     private final StoreStaffReviewService storeStaffReviewService;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
     private final AiContentModerationUtil aiContentModerationUtil;
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     public StoreStaffCommentServiceImpl(StoreStaffCommentMapper storeStaffCommentMapper,
                                         @Lazy StoreStaffReviewService storeStaffReviewService,
                                         LifeLikeRecordMapper lifeLikeRecordMapper, AiContentModerationUtil aiContentModerationUtil,
-                                        LifeLikeIdentityHelper lifeLikeIdentityHelper) {
+                                        StoreLikeRecordIdentityHelper lifeLikeIdentityHelper) {
         this.storeStaffCommentMapper = storeStaffCommentMapper;
         this.storeStaffReviewService = storeStaffReviewService;
         this.lifeLikeRecordMapper = lifeLikeRecordMapper;
@@ -443,7 +443,7 @@ public class StoreStaffCommentServiceImpl extends ServiceImpl<StoreStaffCommentM
      * 检查是否已点赞
      */
     private boolean isLiked(Integer commentId, Integer userId, String type) {
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, type)
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))
@@ -492,7 +492,7 @@ public class StoreStaffCommentServiceImpl extends ServiceImpl<StoreStaffCommentM
     private R<Boolean> doCancelLikeComment(Integer commentId, Integer userId) {
         try {
             // 查询点赞记录
-            LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+            StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
             LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(LifeLikeRecord::getType, LIKE_TYPE_COMMENT)
                     .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))

+ 4 - 4
alien-store/src/main/java/shop/alien/store/service/impl/StoreStaffConfigServiceImpl.java

@@ -38,8 +38,8 @@ import shop.alien.store.service.StoreStaffFitnessCertificationService;
 import shop.alien.store.service.StoreStaffFitnessCourseService;
 import shop.alien.store.service.StoreStaffFitnessExperienceService;
 import shop.alien.store.util.CommonConstant;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 import shop.alien.util.ali.AliOSSUtil;
 
 import java.io.File;
@@ -86,7 +86,7 @@ public class StoreStaffConfigServiceImpl implements StoreStaffConfigService {
 
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
 
     private final StoreStaffAuditAsyncService storeStaffAuditAsyncService;
 
@@ -1806,7 +1806,7 @@ public class StoreStaffConfigServiceImpl implements StoreStaffConfigService {
         }
 
         try {
-            LikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
+            StoreLikerScope likerScope = lifeLikeIdentityHelper.resolveFromDianzanId(userId);
             LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(LifeLikeRecord::getType, "8") // 8-点赞员工
                     .eq(LifeLikeRecord::getHuifuId, String.valueOf(staffId))

+ 5 - 5
alien-store/src/main/java/shop/alien/store/service/impl/StoreStaffReviewServiceImpl.java

@@ -21,8 +21,8 @@ import shop.alien.mapper.*;
 import shop.alien.store.service.StoreStaffCommentService;
 import shop.alien.store.service.StoreStaffReviewService;
 import shop.alien.store.util.ai.AiContentModerationUtil;
-import shop.alien.util.LifeLikeIdentityHelper;
-import shop.alien.util.LifeLikeIdentityHelper.LikerScope;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper;
+import shop.alien.store.util.StoreLikeRecordIdentityHelper.StoreLikerScope;
 import shop.alien.util.common.DistanceUtil;
 
 import java.math.BigDecimal;
@@ -47,7 +47,7 @@ public class StoreStaffReviewServiceImpl extends ServiceImpl<StoreStaffReviewMap
     private final StoreStaffCommentService storeStaffCommentService;
     private final StoreStaffCommentMapper storeStaffCommentMapper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
-    private final LifeLikeIdentityHelper lifeLikeIdentityHelper;
+    private final StoreLikeRecordIdentityHelper lifeLikeIdentityHelper;
     private final StoreStaffConfigMapper storeStaffConfigMapper;
     private final StoreInfoMapper storeInfoMapper;
     private final StoreUserMapper storeUserMapper;
@@ -392,7 +392,7 @@ public class StoreStaffReviewServiceImpl extends ServiceImpl<StoreStaffReviewMap
      * 检查是否已点赞
      */
     private boolean isLiked(Integer targetId, Integer userId, String type) {
-        LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+        StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
         LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(LifeLikeRecord::getType, type)
                 .eq(LifeLikeRecord::getHuifuId, String.valueOf(targetId))
@@ -441,7 +441,7 @@ public class StoreStaffReviewServiceImpl extends ServiceImpl<StoreStaffReviewMap
     private <T> R<Boolean> doCancelLike(Integer targetId, Integer userId, String type, Class<T> entityClass) {
         try {
             // 查询点赞记录
-            LikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
+            StoreLikerScope likerScope = lifeLikeIdentityHelper.fromLifeUserId(userId);
             LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(LifeLikeRecord::getType, type)
                     .eq(LifeLikeRecord::getHuifuId, String.valueOf(targetId))

+ 237 - 0
alien-store/src/main/java/shop/alien/store/util/StoreClockInIdentityHelper.java

@@ -0,0 +1,237 @@
+package shop.alien.store.util;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import shop.alien.entity.store.LawyerUser;
+import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.StoreClockIn;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.store.vo.StoreClockInVo;
+import shop.alien.mapper.LawyerUserMapper;
+import shop.alien.mapper.LifeUserMapper;
+import shop.alien.mapper.StoreUserMapper;
+import shop.alien.util.type.PhoneTypeIdResult;
+import shop.alien.util.type.TypeUtil;
+
+import java.util.Objects;
+
+/**
+ * store_clock_in 打卡人身份工具。
+ * <p>
+ * 入参:兼容前端 legacy {@code phoneId}(解析为 type+refId)。<br>
+ * 库表:查询/新增/修改只使用 {@code phone_user_type} + {@code phone_ref_id},不读写 {@code phone_id} 列。<br>
+ * 响应:由 type+refId 合成 {@code phoneId} 返回给前端。
+ * </p>
+ */
+@Component
+@RequiredArgsConstructor
+public class StoreClockInIdentityHelper {
+
+    public static final int TYPE_USER = 1;
+    public static final int TYPE_STORE = 2;
+    public static final int TYPE_LAWYER = 3;
+
+    private final TypeUtil typeUtil;
+    private final LifeUserMapper lifeUserMapper;
+    private final StoreUserMapper storeUserMapper;
+    private final LawyerUserMapper lawyerUserMapper;
+
+    public static final class PublisherScope {
+        private final String legacyPhoneId;
+        private final Integer phoneUserType;
+        private final Integer phoneRefId;
+
+        public PublisherScope(String legacyPhoneId, Integer phoneUserType, Integer phoneRefId) {
+            this.legacyPhoneId = legacyPhoneId;
+            this.phoneUserType = phoneUserType;
+            this.phoneRefId = phoneRefId;
+        }
+
+        public String getLegacyPhoneId() {
+            return legacyPhoneId;
+        }
+
+        public Integer getPhoneUserType() {
+            return phoneUserType;
+        }
+
+        public Integer getPhoneRefId() {
+            return phoneRefId;
+        }
+
+        public boolean hasTypeRef() {
+            return phoneUserType != null && phoneRefId != null;
+        }
+    }
+
+    /** 将前端传入的 legacy phoneId 解析为 type+refId(仅入参侧兼容)。 */
+    public PublisherScope resolveFromPhoneId(String phoneId) {
+        if (!StringUtils.hasText(phoneId)) {
+            return new PublisherScope(null, null, null);
+        }
+        String trimmed = phoneId.trim();
+        if (!typeUtil.containsUnderscore(trimmed)) {
+            return new PublisherScope(trimmed, null, null);
+        }
+        PhoneTypeIdResult resolved = typeUtil.resolveTypeAndId(trimmed);
+        if (resolved == null) {
+            return new PublisherScope(trimmed, null, null);
+        }
+        return new PublisherScope(trimmed, resolved.getType(), resolved.getId());
+    }
+
+    public PublisherScope fromLifeUserId(Integer lifeUserId) {
+        if (lifeUserId == null) {
+            return new PublisherScope(null, null, null);
+        }
+        LifeUser user = lifeUserMapper.selectById(lifeUserId);
+        if (user != null && StringUtils.hasText(user.getUserPhone())) {
+            return new PublisherScope("user_" + user.getUserPhone(), TYPE_USER, lifeUserId);
+        }
+        return new PublisherScope(String.valueOf(lifeUserId), TYPE_USER, lifeUserId);
+    }
+
+    /** 从库表记录解析打卡人(仅认 phone_user_type + phone_ref_id)。 */
+    public PublisherScope resolveFromClockIn(StoreClockIn clockIn) {
+        if (clockIn == null
+                || clockIn.getPhoneUserType() == null
+                || clockIn.getPhoneRefId() == null) {
+            return new PublisherScope(null, null, null);
+        }
+        String legacy = buildLegacyPhoneId(clockIn.getPhoneUserType(), clockIn.getPhoneRefId());
+        return new PublisherScope(legacy, clockIn.getPhoneUserType(), clockIn.getPhoneRefId());
+    }
+
+    /** 写入前:由前端 phoneId 或显式 type+refId 填充新字段,不落库 phone_id。 */
+    public void normalizePublisherFields(StoreClockIn clockIn) {
+        if (clockIn == null) {
+            return;
+        }
+        if (clockIn.getPhoneUserType() == null || clockIn.getPhoneRefId() == null) {
+            if (StringUtils.hasText(clockIn.getPhoneId())) {
+                PhoneTypeIdResult resolved = typeUtil.resolveTypeAndId(clockIn.getPhoneId().trim());
+                if (resolved != null) {
+                    clockIn.setPhoneUserType(resolved.getType());
+                    clockIn.setPhoneRefId(resolved.getId());
+                }
+            }
+        }
+        clockIn.setPhoneId(null);
+    }
+
+    public void applyPublisherFilter(LambdaQueryWrapper<StoreClockIn> wrapper, PublisherScope scope) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        wrapper.eq(StoreClockIn::getPhoneUserType, scope.getPhoneUserType())
+                .eq(StoreClockIn::getPhoneRefId, scope.getPhoneRefId());
+    }
+
+    public void applyPublisherFilter(QueryWrapper<StoreClockIn> wrapper, PublisherScope scope) {
+        applyPublisherFilter(wrapper, scope, null);
+    }
+
+    public void applyPublisherFilter(QueryWrapper<StoreClockIn> wrapper, PublisherScope scope, String tableAlias) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        String colPrefix = StringUtils.hasText(tableAlias) ? tableAlias + "." : "";
+        wrapper.eq(colPrefix + "phone_user_type", scope.getPhoneUserType())
+                .eq(colPrefix + "phone_ref_id", scope.getPhoneRefId());
+    }
+
+    /** 与 life_fans 等仍使用 legacy 字符串的模块比对。 */
+    public String resolveComparablePhoneId(StoreClockIn clockIn) {
+        PublisherScope scope = resolveFromClockIn(clockIn);
+        if (scope.hasTypeRef()) {
+            String legacy = buildLegacyPhoneId(scope.getPhoneUserType(), scope.getPhoneRefId());
+            if (legacy != null) {
+                return legacy;
+            }
+        }
+        return clockIn != null ? clockIn.getPhoneId() : null;
+    }
+
+    public String resolveComparablePhoneId(StoreClockInVo vo) {
+        if (vo == null) {
+            return null;
+        }
+        if (vo.getPhoneUserType() != null && vo.getPhoneRefId() != null) {
+            String legacy = buildLegacyPhoneId(vo.getPhoneUserType(), vo.getPhoneRefId());
+            if (legacy != null) {
+                return legacy;
+            }
+        }
+        if (StringUtils.hasText(vo.getPhoneId())) {
+            return vo.getPhoneId();
+        }
+        return resolveComparablePhoneId(copyToEntity(vo));
+    }
+
+    public String buildLegacyPhoneId(Integer phoneUserType, Integer phoneRefId) {
+        if (phoneUserType == null || phoneRefId == null) {
+            return null;
+        }
+        switch (phoneUserType) {
+            case TYPE_USER: {
+                LifeUser user = lifeUserMapper.selectById(phoneRefId);
+                return user != null && StringUtils.hasText(user.getUserPhone())
+                        ? "user_" + user.getUserPhone() : null;
+            }
+            case TYPE_STORE: {
+                StoreUser storeUser = storeUserMapper.selectById(phoneRefId);
+                return storeUser != null && StringUtils.hasText(storeUser.getPhone())
+                        ? "store_" + storeUser.getPhone() : null;
+            }
+            case TYPE_LAWYER: {
+                LawyerUser lawyerUser = lawyerUserMapper.selectById(phoneRefId);
+                return lawyerUser != null && StringUtils.hasText(lawyerUser.getPhone())
+                        ? "lawyer_" + lawyerUser.getPhone() : null;
+            }
+            default:
+                return null;
+        }
+    }
+
+    /** 响应侧:由 type+refId 合成 phoneId,不读库表 phone_id。 */
+    public void ensureVoLegacyPhoneId(StoreClockInVo vo) {
+        if (vo == null || vo.getPhoneUserType() == null || vo.getPhoneRefId() == null) {
+            return;
+        }
+        String legacy = buildLegacyPhoneId(vo.getPhoneUserType(), vo.getPhoneRefId());
+        if (legacy != null) {
+            vo.setPhoneId(legacy);
+        }
+    }
+
+    public void ensureEntityLegacyPhoneId(StoreClockIn clockIn) {
+        if (clockIn == null || clockIn.getPhoneUserType() == null || clockIn.getPhoneRefId() == null) {
+            return;
+        }
+        String legacy = buildLegacyPhoneId(clockIn.getPhoneUserType(), clockIn.getPhoneRefId());
+        if (legacy != null) {
+            clockIn.setPhoneId(legacy);
+        }
+    }
+
+    public boolean isSamePublisher(StoreClockIn clockIn, PublisherScope scope) {
+        if (clockIn == null || scope == null || !scope.hasTypeRef()) {
+            return false;
+        }
+        PublisherScope itemScope = resolveFromClockIn(clockIn);
+        return itemScope.hasTypeRef()
+                && Objects.equals(scope.getPhoneUserType(), itemScope.getPhoneUserType())
+                && Objects.equals(scope.getPhoneRefId(), itemScope.getPhoneRefId());
+    }
+
+    private StoreClockIn copyToEntity(StoreClockInVo vo) {
+        StoreClockIn entity = new StoreClockIn();
+        entity.setPhoneUserType(vo.getPhoneUserType());
+        entity.setPhoneRefId(vo.getPhoneRefId());
+        entity.setPhoneId(vo.getPhoneId());
+        return entity;
+    }
+}

+ 204 - 0
alien-store/src/main/java/shop/alien/store/util/StoreLikeRecordIdentityHelper.java

@@ -0,0 +1,204 @@
+package shop.alien.store.util;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import shop.alien.entity.store.LawyerUser;
+import shop.alien.entity.store.LifeLikeRecord;
+import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.mapper.LawyerUserMapper;
+import shop.alien.mapper.LifeUserMapper;
+import shop.alien.mapper.StoreUserMapper;
+import shop.alien.util.type.PhoneTypeIdResult;
+import shop.alien.util.type.TypeUtil;
+
+import java.util.Objects;
+
+/**
+ * alien-store:life_like_record 点赞人身份工具。
+ */
+@Component
+@RequiredArgsConstructor
+public class StoreLikeRecordIdentityHelper {
+
+    public static final int TYPE_USER = 1;
+    public static final int TYPE_STORE = 2;
+    public static final int TYPE_LAWYER = 3;
+
+    private final TypeUtil typeUtil;
+    private final LifeUserMapper lifeUserMapper;
+    private final StoreUserMapper storeUserMapper;
+    private final LawyerUserMapper lawyerUserMapper;
+
+    public static final class StoreLikerScope {
+        private final String legacyDianzanId;
+        private final Integer dianzanUserType;
+        private final Integer dianzanRefId;
+
+        public StoreLikerScope(String legacyDianzanId, Integer dianzanUserType, Integer dianzanRefId) {
+            this.legacyDianzanId = legacyDianzanId;
+            this.dianzanUserType = dianzanUserType;
+            this.dianzanRefId = dianzanRefId;
+        }
+
+        public String getLegacyDianzanId() {
+            return legacyDianzanId;
+        }
+
+        public Integer getDianzanUserType() {
+            return dianzanUserType;
+        }
+
+        public Integer getDianzanRefId() {
+            return dianzanRefId;
+        }
+
+        public boolean hasTypeRef() {
+            return dianzanUserType != null && dianzanRefId != null;
+        }
+    }
+
+    public StoreLikerScope resolveFromDianzanId(String dianzanId) {
+        if (!StringUtils.hasText(dianzanId)) {
+            return new StoreLikerScope(null, null, null);
+        }
+        String trimmed = dianzanId.trim();
+        if (typeUtil.containsUnderscore(trimmed)) {
+            PhoneTypeIdResult resolved = typeUtil.resolveTypeAndId(trimmed);
+            if (resolved != null) {
+                return new StoreLikerScope(trimmed, resolved.getType(), resolved.getId());
+            }
+            return new StoreLikerScope(trimmed, null, null);
+        }
+        try {
+            int refId = Integer.parseInt(trimmed);
+            return new StoreLikerScope(trimmed, TYPE_USER, refId);
+        } catch (NumberFormatException e) {
+            return new StoreLikerScope(trimmed, null, null);
+        }
+    }
+
+    public StoreLikerScope fromLifeUserId(Integer lifeUserId) {
+        if (lifeUserId == null) {
+            return new StoreLikerScope(null, null, null);
+        }
+        return new StoreLikerScope(String.valueOf(lifeUserId), TYPE_USER, lifeUserId);
+    }
+
+    public StoreLikerScope fromStoreUserId(Integer storeUserId) {
+        if (storeUserId == null) {
+            return new StoreLikerScope(null, null, null);
+        }
+        StoreUser storeUser = storeUserMapper.selectById(storeUserId);
+        String legacy = storeUser != null && StringUtils.hasText(storeUser.getPhone())
+                ? "store_" + storeUser.getPhone()
+                : String.valueOf(storeUserId);
+        return new StoreLikerScope(legacy, TYPE_STORE, storeUserId);
+    }
+
+    public StoreLikerScope resolveFromRecord(LifeLikeRecord record) {
+        if (record == null
+                || record.getDianzanUserType() == null
+                || record.getDianzanRefId() == null) {
+            return new StoreLikerScope(null, null, null);
+        }
+        String legacy = buildLegacyDianzanId(record.getDianzanUserType(), record.getDianzanRefId());
+        return new StoreLikerScope(legacy, record.getDianzanUserType(), record.getDianzanRefId());
+    }
+
+    public void normalizeBeforeSave(LifeLikeRecord record) {
+        if (record == null) {
+            return;
+        }
+        if (record.getDianzanUserType() == null || record.getDianzanRefId() == null) {
+            StoreLikerScope scope = resolveFromDianzanId(record.getDianzanId());
+            if (scope.hasTypeRef()) {
+                record.setDianzanUserType(scope.getDianzanUserType());
+                record.setDianzanRefId(scope.getDianzanRefId());
+            }
+        }
+        record.setDianzanId(null);
+    }
+
+    public void applyLikerFilter(LambdaQueryWrapper<LifeLikeRecord> wrapper, StoreLikerScope scope) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        wrapper.eq(LifeLikeRecord::getDianzanUserType, scope.getDianzanUserType())
+                .eq(LifeLikeRecord::getDianzanRefId, scope.getDianzanRefId());
+    }
+
+    public void applyLikerFilter(LambdaUpdateWrapper<LifeLikeRecord> wrapper, StoreLikerScope scope) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        wrapper.eq(LifeLikeRecord::getDianzanUserType, scope.getDianzanUserType())
+                .eq(LifeLikeRecord::getDianzanRefId, scope.getDianzanRefId());
+    }
+
+    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, StoreLikerScope scope) {
+        applyLikerFilter(wrapper, scope, null);
+    }
+
+    public void applyLikerFilter(QueryWrapper<LifeLikeRecord> wrapper, StoreLikerScope scope, String tableAlias) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        String prefix = StringUtils.hasText(tableAlias) ? tableAlias + "." : "";
+        wrapper.eq(prefix + "dianzan_user_type", scope.getDianzanUserType())
+                .eq(prefix + "dianzan_ref_id", scope.getDianzanRefId());
+    }
+
+    public String resolveComparableDianzanId(LifeLikeRecord record) {
+        StoreLikerScope scope = resolveFromRecord(record);
+        if (scope.hasTypeRef()) {
+            String legacy = buildLegacyDianzanId(scope.getDianzanUserType(), scope.getDianzanRefId());
+            if (legacy != null) {
+                return legacy;
+            }
+            if (Objects.equals(scope.getDianzanUserType(), TYPE_USER)) {
+                return String.valueOf(scope.getDianzanRefId());
+            }
+        }
+        return record != null ? record.getDianzanId() : null;
+    }
+
+    public String buildLegacyDianzanId(Integer dianzanUserType, Integer dianzanRefId) {
+        if (dianzanUserType == null || dianzanRefId == null) {
+            return null;
+        }
+        switch (dianzanUserType) {
+            case TYPE_USER: {
+                LifeUser user = lifeUserMapper.selectById(dianzanRefId);
+                return user != null && StringUtils.hasText(user.getUserPhone())
+                        ? "user_" + user.getUserPhone() : String.valueOf(dianzanRefId);
+            }
+            case TYPE_STORE: {
+                StoreUser storeUser = storeUserMapper.selectById(dianzanRefId);
+                return storeUser != null && StringUtils.hasText(storeUser.getPhone())
+                        ? "store_" + storeUser.getPhone() : null;
+            }
+            case TYPE_LAWYER: {
+                LawyerUser lawyerUser = lawyerUserMapper.selectById(dianzanRefId);
+                return lawyerUser != null && StringUtils.hasText(lawyerUser.getPhone())
+                        ? "lawyer_" + lawyerUser.getPhone() : null;
+            }
+            default:
+                return null;
+        }
+    }
+
+    public void ensureEntityLegacyDianzanId(LifeLikeRecord record) {
+        if (record == null || record.getDianzanUserType() == null || record.getDianzanRefId() == null) {
+            return;
+        }
+        String legacy = buildLegacyDianzanId(record.getDianzanUserType(), record.getDianzanRefId());
+        if (legacy != null) {
+            record.setDianzanId(legacy);
+        }
+    }
+}