Jelajahi Sumber

life_user_dynamics相关代码修改

zhangchen 11 jam lalu
induk
melakukan
9c280955ef

+ 8 - 4
alien-entity/src/main/java/shop/alien/mapper/LifeBrowseRecordMapper.java

@@ -35,7 +35,12 @@ public interface LifeBrowseRecordMapper extends BaseMapper<LifeBrowseRecord> {
             "lud.id dynamicsId, " +
             "IFNULL(lud.cover_image, '') coverImage, " +
             "lbr.liulan_date liulanDate, " +
-            "lud.phone_id phoneId, " +
+            "CASE WHEN lud.phone_user_type = 1 THEN CONCAT('user_', (SELECT user_phone FROM life_user WHERE id = lud.phone_ref_id AND delete_flag = 0 LIMIT 1)) " +
+            "WHEN lud.phone_user_type = 2 THEN CONCAT('store_', (SELECT phone FROM store_user WHERE id = lud.phone_ref_id AND delete_flag = 0 LIMIT 1)) " +
+            "WHEN lud.phone_user_type = 3 THEN CONCAT('lawyer_', (SELECT phone FROM lawyer_user WHERE id = lud.phone_ref_id AND delete_flag = 0 LIMIT 1)) " +
+            "END phoneId, " +
+            "lud.phone_user_type phoneUserType, " +
+            "lud.phone_ref_id phoneRefId, " +
             "lud.title, " +
             "lud.context, " +
             "lud.image_path imagePath, " +
@@ -74,9 +79,8 @@ public interface LifeBrowseRecordMapper extends BaseMapper<LifeBrowseRecord> {
             "INNER JOIN life_user_dynamics lud ON lud.id = lbr.dynamics_id " +
             "AND lud.delete_flag = 0 " +
             "AND lbr.delete_flag = 0 " +
-            "LEFT JOIN store_user su ON SUBSTRING_INDEX(lud.phone_id, '_', -1) = su.phone " +
-            "AND su.delete_flag = 0 " +
-            "AND SUBSTRING_INDEX(lud.phone_id, '_', 1) = 'store' " +
+            "LEFT JOIN store_user su ON su.delete_flag = 0 " +
+            "AND lud.phone_user_type = 2 AND su.id = lud.phone_ref_id " +
             "LEFT JOIN store_info si1 ON si1.id = su.store_id " +
             "AND si1.delete_flag = 0 " +
             "LEFT JOIN ( " +

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

@@ -319,7 +319,11 @@ public interface LifeFansMapper extends BaseMapper<LifeFans> {
             "( " +
             "    select count(id) " +
             "    from life_user_dynamics " +
-            "    where delete_flag = 0 and phone_id = #{phoneId} and draft = 0 and enable_status != 1 " +
+            "    where delete_flag = 0 and draft = 0 and enable_status != 1 " +
+            "    and phone_user_type = (case when #{phoneId} like 'user\\_%' then 1 when #{phoneId} like 'store\\_%' then 2 when #{phoneId} like 'lawyer\\_%' then 3 else null end) " +
+            "    and phone_ref_id = (case when #{phoneId} like 'user\\_%' then (select id from life_user where concat('user_', user_phone) = #{phoneId} and delete_flag = 0 limit 1) " +
+            "      when #{phoneId} like 'store\\_%' then (select id from store_user where concat('store_', phone) = #{phoneId} and delete_flag = 0 limit 1) " +
+            "      when #{phoneId} like 'lawyer\\_%' then (select id from lawyer_user where concat('lawyer_', phone) = #{phoneId} and delete_flag = 0 limit 1) else null end) " +
             ") dynamicsNum")
     LifeFansVo getHomePageInfo(@Param("phoneId") String phoneId);
 }

+ 44 - 31
alien-entity/src/main/java/shop/alien/mapper/LifeUserDynamicsMapper.java

@@ -16,45 +16,63 @@ import java.util.List;
 public interface LifeUserDynamicsMapper extends BaseMapper<LifeUserDynamics> {
 
     @Select("select dyna1.* from (with dynamice as( " +
-            "select lud.id, lud.top_status, lud.top_time, lud.title, lud.phone_id phoneId, " +
+            "select lud.id, lud.top_status, lud.top_time, lud.title, " +
+            "lud.phone_user_type phoneUserType, lud.phone_ref_id phoneRefId, " +
+            "case when lud.phone_user_type = 1 then concat('user_', (select user_phone from life_user where id = lud.phone_ref_id and delete_flag = 0 limit 1)) " +
+            "when lud.phone_user_type = 2 then concat('store_', (select phone from store_user where id = lud.phone_ref_id and delete_flag = 0 limit 1)) " +
+            "when lud.phone_user_type = 3 then concat('lawyer_', (select phone from lawyer_user where id = lud.phone_ref_id and delete_flag = 0 limit 1)) " +
+            "end phoneId, " +
             "lud.context, lud.image_path, lud.address, lud.address_name, lud.address_context, " +
-            "lud.liulan_count, lud.dianzan_count, lud.type, lud.created_time, substring_index(lud.phone_id, '_', 1) flag, " +
-            "substring_index(lud.phone_id, '_', -1) phone, lud.draft , lud.address_province, lud.transfer_count, lud.cover_image " +
+            "lud.liulan_count, lud.dianzan_count, lud.type, lud.created_time, " +
+            "case when lud.phone_user_type = 1 then 'user' when lud.phone_user_type = 2 then 'store' when lud.phone_user_type = 3 then 'lawyer' end flag, " +
+            "case when lud.phone_user_type = 1 then (select user_phone from life_user where id = lud.phone_ref_id and delete_flag = 0 limit 1) " +
+            "when lud.phone_user_type = 2 then (select phone from store_user where id = lud.phone_ref_id and delete_flag = 0 limit 1) " +
+            "when lud.phone_user_type = 3 then (select phone from lawyer_user where id = lud.phone_ref_id and delete_flag = 0 limit 1) end phone, " +
+            "lud.draft , lud.address_province, lud.transfer_count, lud.cover_image " +
             "from life_user_dynamics lud " +
-            "where lud.delete_flag = 0 and lud.enable_status = 0 and lud.draft = 0 and " +
+            "where lud.delete_flag = 0 and lud.enable_status = 0 and lud.draft = 0 " +
+            "and lud.phone_user_type is not null and lud.phone_ref_id is not null and " +
             "not exists (select 1 from life_user_violation luv where luv.delete_flag = 0 and luv.processing_status = 1 " +
             "AND luv.dynamics_id = lud.id) order by lud.created_time desc) " +
             "select dynamice.*, info.store_name userName, user.head_img userImage, info.id storeUserId, user.id storeOrUserId, 0 isExpert, info.score_avg scoreAvg, info.business_section businessSection, info.business_type_name businessTypeName " +
             "from dynamice " +
-            "join store_user user on dynamice.phone = user.phone and user.delete_flag = 0 " +
+            "join store_user user on dynamice.phoneUserType = 2 and user.id = dynamice.phoneRefId and user.delete_flag = 0 " +
             "and user.status = 0 and user.logout_flag = 0 " +
             "join store_info info on info.id = user.store_id and info.delete_flag = 0 " +
             "and info.store_status = 1 " +
             "left join store_img img on img.store_id = user.store_id and img.img_type = '10' and img.delete_flag = 0  " +
-            "where dynamice.flag = 'store' " +
+            "where dynamice.phoneUserType = 2 " +
             "union " +
             "select dynamice.*, user.user_name userName, user.user_image userImage, user.id storeUserId, user.id storeOrUserId, " +
             "IF(lue.expert_code IS NOT NULL , 1, 0) AS isExpert, 0 scoreAvg, 0 businessSection, 0 businessTypeName " +
             "from dynamice " +
-            "join life_user user on dynamice.phone = user.user_phone and user.delete_flag = 0 " +
+            "join life_user user on dynamice.phoneUserType = 1 and user.id = dynamice.phoneRefId and user.delete_flag = 0 " +
             "and user.logout_flag = 0 " +
             "left join life_user_expert  lue on lue.user_id = user.id and lue.delete_flag = 0 " +
-            "where dynamice.flag = 'user') dyna1 order by dyna1.top_status desc, dyna1.top_time desc, created_time desc")
+            "where dynamice.phoneUserType = 1) dyna1 order by dyna1.top_status desc, dyna1.top_time desc, created_time desc")
     List<LifeUserDynamicsVo> getLifeUserDynamicsList();
 
-    @Select("select lud.id ,lud.image_path,lud.context,lu.user_image,lu.user_name,IF(llr.huifu_id IS NOT NULL, 1, 0) AS isLike\n" +
+    @Select("select lud.id ,lud.image_path,lud.context, " +
+            "case when lud.phone_user_type = 2 then su.head_img else lu.user_image end user_image, " +
+            "case when lud.phone_user_type = 2 then su.nick_name else lu.user_name end user_name, " +
+            "IF(llr.huifu_id IS NOT NULL, 1, 0) AS isLike\n" +
             "from life_user_dynamics lud\n" +
-            "left join life_user lu \n" +
-            "on lud.phone_id = CONCAT('store_', lu.user_phone )\n" +
+            "left join store_user su on lud.phone_user_type = 2 and su.id = lud.phone_ref_id and su.delete_flag = 0\n" +
+            "left join life_user lu on lud.phone_user_type = 1 and lu.id = lud.phone_ref_id and lu.delete_flag = 0\n" +
             "left join life_like_record llr\n" +
             "on llr.huifu_id = lud.id\n" +
-            "and lu.user_phone = (select CONCAT('user_',lu1.user_phone) from life_user lu1 where lu1.id = #{userId})" +
+            "and llr.delete_flag = 0\n" +
+            "and llr.dianzan_id = (select CONCAT('user_',lu1.user_phone) from life_user lu1 where lu1.id = #{userId})" +
             "${ew.customSqlSegment}")
     List<LifeUserDynamicsVo> getStoreDynamicslistWithWrapper(@Param("userId") String userId, @Param(Constants.WRAPPER) QueryWrapper<LifeUserDynamics> dynamicsWrapper);
 
     @Select("with middle_lud as (\n" +
             "  select \n" +
-            "    lud.*,\n" +
+            "    lud.id, lud.title, lud.context, lud.image_path, lud.phone_user_type phoneUserType, lud.phone_ref_id phoneRefId, lud.type, lud.created_time,\n" +
+            "    case when lud.phone_user_type = 1 then concat('user_', (select user_phone from life_user where id = lud.phone_ref_id and delete_flag = 0 limit 1))\n" +
+            "         when lud.phone_user_type = 2 then concat('store_', (select phone from store_user where id = lud.phone_ref_id and delete_flag = 0 limit 1))\n" +
+            "         when lud.phone_user_type = 3 then concat('lawyer_', (select phone from lawyer_user where id = lud.phone_ref_id and delete_flag = 0 limit 1))\n" +
+            "    end as phoneId,\n" +
             "    '1' as isLike,\n" +
             "    llr_sub.like_created_time\n" +
             "  from life_user_dynamics lud\n" +
@@ -66,29 +84,22 @@ public interface LifeUserDynamicsMapper extends BaseMapper<LifeUserDynamics> {
             "    group by huifu_id\n" +
             "  ) llr_sub on lud.id = llr_sub.huifu_id\n" +
             "  where lud.delete_flag = 0\n" +
-            "    and not exists (  -- 替代NOT IN,避免NULL问题\n" +
+            "    and lud.phone_user_type is not null and lud.phone_ref_id is not null\n" +
+            "    and not exists (\n" +
             "      select 1 from life_blacklist lb\n" +
             "      where lb.blocker_phone_id = #{phoneId}\n" +
             "        and lb.delete_flag = 0\n" +
-            "        and lb.blocked_phone_id = lud.phone_id\n" +
+            "        and lb.blocked_phone_id = case when lud.phone_user_type = 1 then concat('user_', (select user_phone from life_user where id = lud.phone_ref_id and delete_flag = 0 limit 1))\n" +
+            "             when lud.phone_user_type = 2 then concat('store_', (select phone from store_user where id = lud.phone_ref_id and delete_flag = 0 limit 1))\n" +
+            "             when lud.phone_user_type = 3 then concat('lawyer_', (select phone from lawyer_user where id = lud.phone_ref_id and delete_flag = 0 limit 1)) end\n" +
             "    )\n" +
             ")\n" +
             "select middle_lud.*,\n" +
-            "  CASE \n" +
-            "    WHEN lf.id is not null THEN 1\n" +
-            "    ELSE 0                        \n" +
-            "  END AS isFollowThis,  \n" +
-            "  CASE \n" +
-            "    WHEN lf1.id is not null THEN 1\n" +
-            "    ELSE 0                        \n" +
-            "  END AS isFollowMe  \n" +
+            "  CASE WHEN lf.id is not null THEN 1 ELSE 0 END AS isFollowThis,\n" +
+            "  CASE WHEN lf1.id is not null THEN 1 ELSE 0 END AS isFollowMe\n" +
             "from middle_lud\n" +
-            "left join life_fans lf on lf.fans_id = #{phoneId} \n" +
-            "                      and lf.followed_id = middle_lud.phone_id\n" +
-            "                      and lf.delete_flag = '0'\n" +
-            "left join life_fans lf1 on lf1.fans_id = middle_lud.phone_id \n" +
-            "                      and lf1.followed_id = #{phoneId}\n" +
-            "                      and lf1.delete_flag = '0'\n" +
+            "left join life_fans lf on lf.fans_id = #{phoneId} and lf.followed_id = middle_lud.phoneId and lf.delete_flag = '0'\n" +
+            "left join life_fans lf1 on lf1.fans_id = middle_lud.phoneId and lf1.followed_id = #{phoneId} and lf1.delete_flag = '0'\n" +
             "order by middle_lud.like_created_time desc")
     List<LifeUserDynamicsVo> selectDianZanList(String phoneId);
 
@@ -96,8 +107,10 @@ public interface LifeUserDynamicsMapper extends BaseMapper<LifeUserDynamics> {
 
     List<LifeUserDynamicsVo> getDynamicsDetail(@Param("id") Integer id);
 
-    List<LifeUserDynamicsVo> getStoreDynamicslist(@Param("userId") String userId, @Param("phoneId") String phoneId);
+    List<LifeUserDynamicsVo> getStoreDynamicslist(@Param("userId") String userId,
+                                                  @Param("phoneUserType") Integer phoneUserType,
+                                                  @Param("phoneRefId") Integer phoneRefId);
 
     @Select("select * from life_user_dynamics ${ew.customSqlSegment}")
     LifeUserDynamics selectAll(@Param(Constants.WRAPPER) LambdaQueryWrapper<LifeUserDynamics> and);
-}
+}

+ 48 - 19
alien-entity/src/main/resources/mapper/LifeUserDynamicsMapper.xml

@@ -78,13 +78,21 @@
         WHEN image_path REGEXP '.jpg|.jpeg|.png|.bmp|.webp|.gif|.svg' THEN 1
         ELSE 0
         END AS dynamicsType,
-        id, title, phone_id phoneId, context, image_path, address,address_name,address_context,
+        id, title, phone_user_type phoneUserType, phone_ref_id phoneRefId,
+        CASE WHEN phone_user_type = 1 THEN CONCAT('user_', (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
+        WHEN phone_user_type = 2 THEN CONCAT('store_', (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
+        WHEN phone_user_type = 3 THEN CONCAT('lawyer_', (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
+        END AS phoneId,
+        context, image_path, address,address_name,address_context,
         liulan_count, dianzan_count, type, created_time,
-        SUBSTRING_INDEX(phone_id, '_', 1) userType,
-        SUBSTRING_INDEX(phone_id, '_', -1) phone,
+        CASE WHEN phone_user_type = 1 THEN 'user' WHEN phone_user_type = 2 THEN 'store' WHEN phone_user_type = 3 THEN 'lawyer' END userType,
+        CASE WHEN phone_user_type = 1 THEN (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
+        WHEN phone_user_type = 2 THEN (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
+        WHEN phone_user_type = 3 THEN (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
+        END phone,
         draft , address_province, top_status, top_time, enable_status, transfer_count
         FROM life_user_dynamics
-        WHERE delete_flag = 0 AND draft = 0
+        WHERE delete_flag = 0 AND draft = 0 AND phone_user_type IS NOT NULL AND phone_ref_id IS NOT NULL
         )
         SELECT
         dynamice.*,
@@ -92,10 +100,10 @@
         info.id storeUserId, user.id storeOrUserId,
         0 isExpert, info.store_name
         FROM dynamice
-        LEFT JOIN store_user user ON dynamice.phone = user.phone AND user.delete_flag = 0
+        LEFT JOIN store_user user ON user.delete_flag = 0 AND dynamice.phoneUserType = 2 AND user.id = dynamice.phoneRefId
         LEFT JOIN store_info info ON info.id = user.store_id AND info.delete_flag = 0
         LEFT JOIN store_img img ON img.store_id = user.store_id AND img.img_type = '10' AND img.delete_flag = 0
-        WHERE dynamice.userType = 'store'
+        WHERE dynamice.phoneUserType = 2
         UNION
         SELECT
         dynamice.*,
@@ -104,9 +112,9 @@
         IF(lue.expert_code IS NOT NULL , 1, 0) AS isExpert,
         '' store_name
         FROM dynamice
-        JOIN life_user user ON dynamice.phone = user.user_phone AND user.delete_flag = 0
+        JOIN life_user user ON user.delete_flag = 0 AND dynamice.phoneUserType = 1 AND user.id = dynamice.phoneRefId
         LEFT JOIN life_user_expert  lue ON lue.user_id = user.id AND lue.delete_flag = 0
-        WHERE dynamice.userType = 'user'
+        WHERE dynamice.phoneUserType = 1
         ) dyna
         LEFT JOIN life_comment lc ON lc.dongtai_shequ_id = dyna.id
         LEFT JOIN store_comment sc ON sc.business_id = dyna.id AND sc.business_type = 2 AND sc.delete_flag = 0
@@ -149,22 +157,33 @@
         WHEN image_path REGEXP '.mp4|.avi|.flv|.mkv|.rmvb|.wmv|.3gp|.mov' THEN 2
         WHEN image_path REGEXP '.jpg|.jpeg|.png|.bmp|.webp|.gif|.svg' THEN 1
         ELSE 0
-        END AS dynamicsType, id, title, phone_id phoneId, context, image_path, address,address_name,address_context, liulan_count, dianzan_count, type, created_time, substring_index(phone_id, '_', 1) userType, substring_index(phone_id, '_', -1) phone, draft , address_province, top_status, top_time, enable_status,transfer_count AS transferCount
+        END AS dynamicsType, id, title, phone_user_type phoneUserType, phone_ref_id phoneRefId,
+        CASE WHEN phone_user_type = 1 THEN CONCAT('user_', (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
+        WHEN phone_user_type = 2 THEN CONCAT('store_', (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
+        WHEN phone_user_type = 3 THEN CONCAT('lawyer_', (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
+        END AS phoneId,
+        context, image_path, address,address_name,address_context, liulan_count, dianzan_count, type, created_time,
+        CASE WHEN phone_user_type = 1 THEN 'user' WHEN phone_user_type = 2 THEN 'store' WHEN phone_user_type = 3 THEN 'lawyer' END userType,
+        CASE WHEN phone_user_type = 1 THEN (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
+        WHEN phone_user_type = 2 THEN (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
+        WHEN phone_user_type = 3 THEN (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
+        END phone,
+        draft , address_province, top_status, top_time, enable_status,transfer_count AS transferCount
         from life_user_dynamics
-        where id = #{id} and delete_flag = 0 and draft = 0 order by created_time desc
+        where id = #{id} and delete_flag = 0 and draft = 0 and phone_user_type is not null and phone_ref_id is not null order by created_time desc
         )
         select dynamice.*, user.nick_name userName, user.head_img userImage, info.id storeUserId, user.id storeOrUserId, 0 isExpert
         from dynamice
-        left join store_user user on dynamice.phone = user.phone and user.delete_flag = 0
+        left join store_user user on user.delete_flag = 0 and dynamice.phoneUserType = 2 and user.id = dynamice.phoneRefId
         left join store_info info on info.id = user.store_id and info.delete_flag = 0
         left join store_img img on img.store_id = user.store_id and img.img_type = '10' and img.delete_flag = 0
-        where dynamice.userType = 'store'
+        where dynamice.phoneUserType = 2
         union
         select dynamice.*, user.user_name userName, user.user_image userImage, user.id storeUserId, user.id storeOrUserId, IF(lue.expert_code IS NOT NULL , 1, 0) AS isExpert
         from dynamice
-        join life_user user on dynamice.phone = user.user_phone and user.delete_flag = 0
+        join life_user user on user.delete_flag = 0 and dynamice.phoneUserType = 1 and user.id = dynamice.phoneRefId
         left join life_user_expert  lue on lue.user_id = user.id and lue.delete_flag = 0
-        where dynamice.userType = 'user') dyna
+        where dynamice.phoneUserType = 1) dyna
         left join life_comment lc on lc.dongtai_shequ_id = dyna.id
         left join store_comment sc on sc.business_id = dyna.id and sc.business_type = 2 and sc.delete_flag = 0
         left join life_message lm on lm.business_id = dyna.id
@@ -247,10 +266,21 @@
         WHEN image_path REGEXP '.mp4|.avi|.flv|.mkv|.rmvb|.wmv|.3gp|.mov' THEN 2
         WHEN image_path REGEXP '.jpg|.jpeg|.png|.bmp|.webp|.gif|.svg' THEN 1
         ELSE 0
-        END AS dynamicsType, id, title, phone_id phoneId, context, image_path, address, address_name, address_context, liulan_count, dianzan_count, type, created_time, substring_index(phone_id, '_', 1) userType, substring_index(phone_id, '_', -1) phone, draft , address_province, top_status, top_time, enable_status,
+        END AS dynamicsType, id, title, phone_user_type phoneUserType, phone_ref_id phoneRefId,
+        CASE WHEN phone_user_type = 1 THEN CONCAT('user_', (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
+        WHEN phone_user_type = 2 THEN CONCAT('store_', (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
+        WHEN phone_user_type = 3 THEN CONCAT('lawyer_', (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
+        END AS phoneId,
+        context, image_path, address, address_name, address_context, liulan_count, dianzan_count, type, created_time,
+        CASE WHEN phone_user_type = 1 THEN 'user' WHEN phone_user_type = 2 THEN 'store' WHEN phone_user_type = 3 THEN 'lawyer' END userType,
+        CASE WHEN phone_user_type = 1 THEN (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
+        WHEN phone_user_type = 2 THEN (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
+        WHEN phone_user_type = 3 THEN (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
+        END phone,
+        draft , address_province, top_status, top_time, enable_status,
         business_id
         from life_user_dynamics
-        where phone_id = #{phoneId} and delete_flag = 0 and draft = 0 order by created_time desc
+        where phone_user_type = #{phoneUserType} and phone_ref_id = #{phoneRefId} and delete_flag = 0 and draft = 0 order by created_time desc
         )
         select
         dynamice.*,
@@ -264,8 +294,7 @@
         from
         dynamice
         left join store_user user on
-        dynamice.phone = user.phone
-        and user.delete_flag = 0
+        user.delete_flag = 0 and dynamice.phoneUserType = 2 and user.id = dynamice.phoneRefId
         left join store_info info on
         info.id = user.store_id
         and info.delete_flag = 0
@@ -294,7 +323,7 @@
         where
         lu2.id = #{userId})
         where
-        dynamice.userType = 'store') dyna
+        dynamice.phoneUserType = 2) dyna
         left join life_comment lc on
         lc.dongtai_shequ_id = dyna.id
         left join store_comment sc on

+ 1 - 1
alien-entity/src/main/resources/mapper/PlatformLifeUserMapper.xml

@@ -30,7 +30,7 @@
         IFNULL(comment.bad_num, 0) AS bad_num,
 --         (
 --         IFNULL((SELECT SUM(like_count) FROM store_comment WHERE user_id = user.id), 0) +
-        IFNULL((SELECT SUM(dianzan_count) FROM life_user_dynamics WHERE phone_id = phoneId), 0)
+        IFNULL((SELECT SUM(dianzan_count) FROM life_user_dynamics WHERE phone_user_type = 1 AND phone_ref_id = user.id), 0)
 --         )
             AS likesNumber,
         COUNT(lf.id) AS fans_count,

+ 6 - 6
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StoreBusinessServiceImpl.java

@@ -1250,11 +1250,6 @@ public class StoreBusinessServiceImpl extends ServiceImpl<StoreInfoMapper, Store
         result.setClockInNum(clockInNum);
 
         // 获取店铺动态列表
-        QueryWrapper<LifeUserDynamics> dynamicsWrapper = new QueryWrapper<>();
-        dynamicsWrapper.eq("phone_id", "store_" + result.getStorePhone()).orderByDesc("lud.created_time");
-        dynamicsWrapper.eq("lud.delete_flag", 0);
-        //List<LifeUserDynamicsVo> storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslist(userId, dynamicsWrapper);
-
         LambdaQueryWrapper<LifeBlacklist> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
         lambdaQueryWrapper1.eq(LifeBlacklist :: getBlockerId, userId);
         lambdaQueryWrapper1.eq(LifeBlacklist :: getBlockedPhoneId, "store_" + result.getStorePhone());
@@ -1263,7 +1258,12 @@ public class StoreBusinessServiceImpl extends ServiceImpl<StoreInfoMapper, Store
 
         //判断没有拉黑当前门店账户 查出门店动态
         if(blacklist == null){
-            storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslist(userId, "store_" + result.getStorePhone());
+            StoreUser storePublisherUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>()
+                    .eq(StoreUser::getPhone, result.getStorePhone())
+                    .eq(StoreUser::getDeleteFlag, 0)
+                    .last("LIMIT 1"));
+            Integer storeRefId = storePublisherUser != null ? storePublisherUser.getId() : null;
+            storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslist(userId, 2, storeRefId);
         }
 
         List<String> followList = new ArrayList<>();

+ 18 - 59
alien-store/src/main/java/shop/alien/store/aspect/TrackEventAspect.java

@@ -24,6 +24,7 @@ import shop.alien.mapper.*;
 import shop.alien.store.annotation.TrackEvent;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import shop.alien.store.config.BaseRedisService;
+import shop.alien.store.util.LifeDynamicsIdentityHelper;
 import shop.alien.store.util.UserAgentParserUtil;
 import shop.alien.util.common.JwtUtil;
 
@@ -53,6 +54,8 @@ public class TrackEventAspect {
     private final StorePriceMapper storePriceMapper;
     private final StoreCuisineMapper storeCuisineMapper;
     private final LifeUserMapper lifeUserMapper;
+
+    private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
     
     private final SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
     private final DefaultParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
@@ -437,18 +440,9 @@ public class TrackEventAspect {
             // type=2 表示社区动态
             if ("2".equals(type)) {
                 LifeUserDynamics dynamics = lifeUserDynamicsMapper.selectById(Integer.parseInt(huifuId));
-                if (dynamics != null && dynamics.getPhoneId() != null) {
-                    // phoneId格式:store_手机号 或 user_手机号
-                    if (dynamics.getPhoneId().startsWith("store_")) {
-                        String phone = dynamics.getPhoneId().substring(6);
-                        LambdaQueryWrapper<StoreUser> wrapper = new LambdaQueryWrapper<>();
-                        wrapper.eq(StoreUser::getPhone, phone)
-                                .eq(StoreUser::getDeleteFlag, 0);
-                        StoreUser storeUser = storeUserMapper.selectOne(wrapper);
-                        if (storeUser != null && storeUser.getStoreId() != null) {
-                            return storeUser.getStoreId();
-                        }
-                    }
+                Integer storeId = dynamicsIdentityHelper.resolveStoreIdForTrack(dynamics);
+                if (storeId != null) {
+                    return storeId;
                 }
             }
         } catch (Exception e) {
@@ -485,18 +479,9 @@ public class TrackEventAspect {
                 // sourceId是动态ID,通过LifeUserDynamics查询店铺ID
                 if (commonComment.getSourceId() != null) {
                     LifeUserDynamics dynamics = lifeUserDynamicsMapper.selectById(commonComment.getSourceId().intValue());
-                    if (dynamics != null && dynamics.getPhoneId() != null) {
-                        // phoneId格式:store_手机号 或 user_手机号
-                        if (dynamics.getPhoneId().startsWith("store_")) {
-                            String phone = dynamics.getPhoneId().substring(6);
-                            LambdaQueryWrapper<StoreUser> wrapper = new LambdaQueryWrapper<>();
-                            wrapper.eq(StoreUser::getPhone, phone)
-                                    .eq(StoreUser::getDeleteFlag, 0);
-                            StoreUser storeUser = storeUserMapper.selectOne(wrapper);
-                            if (storeUser != null && storeUser.getStoreId() != null) {
-                                return storeUser.getStoreId();
-                            }
-                        }
+                    Integer storeId = dynamicsIdentityHelper.resolveStoreIdForTrack(dynamics);
+                    if (storeId != null) {
+                        return storeId;
                     }
                 }
             }
@@ -525,17 +510,9 @@ public class TrackEventAspect {
             // reportContextType=2 表示动态
             if ("2".equals(reportContextType) && violation.getDynamicsId() != null) {
                 LifeUserDynamics dynamics = lifeUserDynamicsMapper.selectById(Integer.parseInt(violation.getDynamicsId()));
-                if (dynamics != null && dynamics.getPhoneId() != null) {
-                    if (dynamics.getPhoneId().startsWith("store_")) {
-                        String phone = dynamics.getPhoneId().substring(6);
-                        LambdaQueryWrapper<StoreUser> wrapper = new LambdaQueryWrapper<>();
-                        wrapper.eq(StoreUser::getPhone, phone)
-                                .eq(StoreUser::getDeleteFlag, 0);
-                        StoreUser storeUser = storeUserMapper.selectOne(wrapper);
-                        if (storeUser != null && storeUser.getStoreId() != null) {
-                            return storeUser.getStoreId();
-                        }
-                    }
+                Integer storeId = dynamicsIdentityHelper.resolveStoreIdForTrack(dynamics);
+                if (storeId != null) {
+                    return storeId;
                 }
             }
             // reportContextType=0 表示商户
@@ -561,17 +538,9 @@ public class TrackEventAspect {
             }
             
             LifeUserDynamics dynamics = (LifeUserDynamics) dynamicsObj;
-            
-            // 如果phoneId以store_开头,通过phoneId查询店铺ID
-            if (dynamics.getPhoneId() != null && dynamics.getPhoneId().startsWith("store_")) {
-                String phone = dynamics.getPhoneId().substring(6);
-                LambdaQueryWrapper<StoreUser> wrapper = new LambdaQueryWrapper<>();
-                wrapper.eq(StoreUser::getPhone, phone)
-                        .eq(StoreUser::getDeleteFlag, 0);
-                StoreUser storeUser = storeUserMapper.selectOne(wrapper);
-                if (storeUser != null && storeUser.getStoreId() != null) {
-                    return storeUser.getStoreId();
-                }
+            Integer storeId = dynamicsIdentityHelper.resolveStoreIdForTrack(dynamics);
+            if (storeId != null) {
+                return storeId;
             }
         } catch (Exception e) {
             log.debug("查询发布动态接口的店铺ID失败", e);
@@ -725,20 +694,10 @@ public class TrackEventAspect {
             }
             
             if (dynamicsId != null) {
-                // 通过动态ID查询LifeUserDynamics表获取phoneId
                 LifeUserDynamics dynamics = lifeUserDynamicsMapper.selectById(dynamicsId);
-                if (dynamics != null && dynamics.getPhoneId() != null) {
-                    // phoneId格式:store_手机号 或 user_手机号
-                    if (dynamics.getPhoneId().startsWith("store_")) {
-                        String phone = dynamics.getPhoneId().substring(6); // 去掉 "store_" 前缀
-                        LambdaQueryWrapper<StoreUser> wrapper = new LambdaQueryWrapper<>();
-                        wrapper.eq(StoreUser::getPhone, phone)
-                                .eq(StoreUser::getDeleteFlag, 0);
-                        StoreUser storeUser = storeUserMapper.selectOne(wrapper);
-                        if (storeUser != null && storeUser.getStoreId() != null) {
-                            return storeUser.getStoreId();
-                        }
-                    }
+                Integer storeId = dynamicsIdentityHelper.resolveStoreIdForTrack(dynamics);
+                if (storeId != null) {
+                    return storeId;
                 }
             }
         } catch (Exception e) {

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

@@ -14,6 +14,7 @@ import org.springframework.util.CollectionUtils;
 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.entity.second.SecondGoods;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.LifePinglunVo;
@@ -84,6 +85,8 @@ public class LifeCommentService {
 
     private final DynamicsRecommendCacheService dynamicsRecommendCacheService;
 
+    private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
+
     private final ClockInRecommendCacheService clockInRecommendCacheService;
 
     private TypeUtil typeUtil;
@@ -296,22 +299,15 @@ public class LifeCommentService {
         try {
             int dynamicsId = Integer.parseInt(dynamicsIdStr.trim());
             LifeUserDynamics dynamics = lifeUserDynamicsMapper.selectById(dynamicsId);
-            if (dynamics == null || !StringUtils.hasText(dynamics.getPhoneId())) {
+            if (dynamics == null) {
                 return null;
             }
-            String phoneId = dynamics.getPhoneId().trim();
-            if (!phoneId.startsWith("user_")) {
-                return null;
+            if (dynamics.getPhoneUserType() != null
+                    && dynamics.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_USER
+                    && dynamics.getPhoneRefId() != null) {
+                return dynamics.getPhoneRefId();
             }
-            String phone = phoneId.substring("user_".length());
-            if (!StringUtils.hasText(phone)) {
-                return null;
-            }
-            LifeUser u = lifeUserMapper.selectOne(new LambdaQueryWrapper<LifeUser>()
-                    .eq(LifeUser::getUserPhone, phone)
-                    .eq(LifeUser::getDeleteFlag, 0)
-                    .last("LIMIT 1"));
-            return u != null ? u.getId() : null;
+            return null;
         } catch (NumberFormatException e) {
             return null;
         }
@@ -329,7 +325,9 @@ public class LifeCommentService {
             lifeNotice.setTitle("动态通知");
             lifeNotice.setContext("点赞了你的动态");
             LifeUserDynamics lifeUserDynamics = lifeUserDynamicsMapper.selectById(Integer.parseInt(huifuId));
-            lifeNotice.setReceiverId(lifeUserDynamics == null ? null : lifeUserDynamics.getPhoneId());
+            lifeNotice.setReceiverId(lifeUserDynamics == null
+                    ? null
+                    : dynamicsIdentityHelper.resolveComparablePhoneId(lifeUserDynamics));
             lifeNoticeUtil.fillUserTypeAndRefId(lifeNotice);
             lifeNoticeMapper.insert(lifeNotice);
         }
@@ -344,10 +342,13 @@ public class LifeCommentService {
     }
 
     private void sendDynamicsLikeAppPushOnly(LifeUserDynamics dynamics, String title, String content, int dynamicsId) {
-        if (dynamics == null || !StringUtils.hasText(dynamics.getPhoneId())) {
+        if (dynamics == null) {
+            return;
+        }
+        String phoneId = dynamicsIdentityHelper.resolveComparablePhoneId(dynamics);
+        if (!StringUtils.hasText(phoneId)) {
             return;
         }
-        String phoneId = dynamics.getPhoneId().trim();
         List<String> cids = resolvePushClientIdsForDynamicsAuthor(phoneId);
         if (CollectionUtils.isEmpty(cids)) {
             return;

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

@@ -18,9 +18,9 @@ import shop.alien.entity.store.vo.CommonCommentVo;
 import shop.alien.entity.store.vo.LifePinglunVo;
 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.common.constant.CommentSourceTypeEnum;
-import shop.alien.util.type.PhoneTypeIdResult;
-import shop.alien.util.type.TypeUtil;
 
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -59,13 +59,15 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
 
     private final StoreInfoMapper storeInfoMapper;
 
+    private final StoreUserMapper storeUserMapper;
+
     private final CommonCommentMapper commonCommentMapper;
 
     private final CommonRatingService commonRatingService;
     
     private final CommonRatingMapper commonRatingMapper;
 
-    private final TypeUtil typeUtil;
+    private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
 
 
     public int addLiulanCount(String id) {
@@ -104,18 +106,12 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
     }
 
     public int addOrUpdateStore(LifeUserDynamics store) {
+        dynamicsIdentityHelper.normalizePublisherFields(store);
         if (StringUtils.isEmpty(store.getId())) {
-
-            //调用工具包,把电话号转换为用户分类和用户id
-            PhoneTypeIdResult phoneTypeIdResult =typeUtil.resolveTypeAndId(store.getPhoneId());
-            store.setPhoneUserType(phoneTypeIdResult.getType());
-            store.setPhoneRefId(phoneTypeIdResult.getId());
-
             Date nowDate = new Date(System.currentTimeMillis());
             store.setCreatedTime(new java.sql.Timestamp(nowDate.getTime()));
             return lifeUserDynamicsMapper.insert(store);
         } else {
-            //如果发布,则将创建时间修改为当前时间
             LifeUserDynamics lifeUserDynamics = lifeUserDynamicsMapper.selectById(store.getId());
             int draft = lifeUserDynamics.getDraft();
             if(draft == 1 && store.getDraft() == 0){
@@ -181,6 +177,7 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
         List<String> storeUserIdList = new ArrayList<>();
         //对lifeUserDynamicsVoList数据进行处理,当type为2的时候,把userName的数值赋值到storeName
         lifeUserDynamicsVoList.forEach(item -> {
+            dynamicsIdentityHelper.ensureVoLegacyPhoneId(item);
             if (item.getType().equals("2")) {
                 item.setStoreName(item.getUserName());
                 if (item.getStoreUserId() != null) {
@@ -236,8 +233,11 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
         List<String> likeList = likeListFuture.join();
 
         // 根据myself参数过滤动态:自己或非本人动态
+        PublisherScope viewerScope = dynamicsIdentityHelper.resolveFromPhoneId(phoneId);
         if ("1".equals(myself)) {
-            lifeUserDynamicsVoList = lifeUserDynamicsVoList.stream().filter(item -> item.getPhoneId().equals(phoneId)).collect(Collectors.toList());
+            lifeUserDynamicsVoList = lifeUserDynamicsVoList.stream()
+                    .filter(item -> dynamicsIdentityHelper.isSamePublisher(item, viewerScope))
+                    .collect(Collectors.toList());
         } else {
             lifeUserDynamicsVoList = lifeUserDynamicsVoList.stream().filter(item -> item.getDraft() == 0).collect(Collectors.toList());
         }
@@ -316,11 +316,10 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
 
             // 过滤掉发布者在黑名单中的动态
             lifeUserDynamicsVoList = lifeUserDynamicsVoList.stream().filter(dynamics -> {
-                String blackPhoneId = dynamics.getPhoneId();
+                dynamicsIdentityHelper.ensureVoLegacyPhoneId(dynamics);
+                String blackPhoneId = dynamicsIdentityHelper.resolveComparablePhoneId(dynamics);
                 String userId = dynamics.getStoreOrUserId();
-
-                // 确定用户类型(根据phoneId前缀)
-                String userType = blackPhoneId.startsWith("store") ? "1" : (blackPhoneId.startsWith("user") ? "2" : "0");
+                String userType = dynamicsIdentityHelper.resolveBlacklistBlockedType(dynamics);
 
                 // 如果无法识别类型或不在黑名单中,保留该动态
                 if ("0".equals(userType) || !blockedUserIdsByType.containsKey(userType)) {
@@ -404,10 +403,10 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
     }
 
     public List<LifeUserDynamicsVo> getStoreUserDynamics(String storePhone, String userType, String loginPhone) {
-            // 动态列表与点赞记录并行查询
+            PublisherScope storeScope = dynamicsIdentityHelper.resolveStorePublisherByStorePhone(storePhone);
             CompletableFuture<List<LifeUserDynamics>> dynamicsFuture = CompletableFuture.supplyAsync(() -> {
                 LambdaQueryWrapper<LifeUserDynamics> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-                lambdaQueryWrapper.eq(LifeUserDynamics::getPhoneId, storePhone);
+                dynamicsIdentityHelper.applyPublisherFilter(lambdaQueryWrapper, storeScope);
                 return lifeUserDynamicsMapper.selectList(lambdaQueryWrapper);
             });
             CompletableFuture<Set<String>> likeSetFuture = CompletableFuture.supplyAsync(() -> {
@@ -429,31 +428,31 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
                 .map(dynamics -> {
                     LifeUserDynamicsVo vo = new LifeUserDynamicsVo();
                     BeanUtils.copyProperties(dynamics, vo);
+                    dynamicsIdentityHelper.ensureVoLegacyPhoneId(vo);
                     return vo;
                 })
                 .collect(Collectors.toList());
 
-            // 收集所有 phoneId,批量查询用户/商户信息,消除 N+1
-            Set<String> userPhones = new HashSet<>();
-            Set<String> storePhones = new HashSet<>();
+            Set<Integer> userRefIds = new HashSet<>();
+            Set<Integer> storeRefIds = new HashSet<>();
             for (LifeUserDynamicsVo vo : lifeUserDynamicsVos) {
-                String phoneId = vo.getPhoneId();
-                if (StringUtils.hasText(phoneId)) {
-                    if (phoneId.startsWith("user_")) {
-                        userPhones.add(phoneId.substring(5));
-                    } else if (phoneId.startsWith("store_")) {
-                        storePhones.add(phoneId.substring(6));
+                if (vo.getPhoneUserType() != null && vo.getPhoneRefId() != null) {
+                    if (vo.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_USER) {
+                        userRefIds.add(vo.getPhoneRefId());
+                    } else if (vo.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_STORE) {
+                        storeRefIds.add(vo.getPhoneRefId());
                     }
                 }
             }
 
-            // 批量查询 LifeUser、StoreUser
-            Map<String, LifeUser> userByPhoneMap = CollectionUtils.isEmpty(userPhones) ? Collections.emptyMap()
-                    : lifeUserMapper.selectList(new LambdaQueryWrapper<LifeUser>().in(LifeUser::getUserPhone, userPhones))
-                            .stream().collect(Collectors.toMap(LifeUser::getUserPhone, u -> u, (a, b) -> a));
-            List<StoreUser> storeUserList = CollectionUtils.isEmpty(storePhones) ? Collections.emptyList()
-                    : storeUserService.list(new LambdaQueryWrapper<StoreUser>().in(StoreUser::getPhone, storePhones));
-            Map<String, StoreUser> storeUserByPhoneMap = storeUserList.stream().collect(Collectors.toMap(StoreUser::getPhone, u -> u, (a, b) -> a));
+            Map<Integer, LifeUser> userByIdMap = CollectionUtils.isEmpty(userRefIds) ? Collections.emptyMap()
+                    : lifeUserMapper.selectBatchIds(userRefIds).stream()
+                            .collect(Collectors.toMap(LifeUser::getId, u -> u, (a, b) -> a));
+            List<StoreUser> storeUserList = CollectionUtils.isEmpty(storeRefIds)
+                    ? Collections.<StoreUser>emptyList()
+                    : storeUserMapper.selectBatchIds(storeRefIds);
+            Map<Integer, StoreUser> storeUserByIdMap = storeUserList.stream()
+                    .collect(Collectors.toMap(StoreUser::getId, u -> u, (a, b) -> a));
 
             // 批量查询店铺信息
             List<Integer> storeIds = storeUserList.stream().map(StoreUser::getStoreId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
@@ -467,18 +466,15 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
                     vo.setIsLike("0");
                 }
 
-                String phoneId = vo.getPhoneId();
-                if (StringUtils.hasText(phoneId)) {
-                    if (phoneId.startsWith("user_")) {
-                        String userPhone = phoneId.substring(5);
-                        LifeUser lifeUser = userByPhoneMap.get(userPhone);
+                if (vo.getPhoneUserType() != null && vo.getPhoneRefId() != null) {
+                    if (vo.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_USER) {
+                        LifeUser lifeUser = userByIdMap.get(vo.getPhoneRefId());
                         if (lifeUser != null) {
                             vo.setUserName(lifeUser.getUserName());
                             vo.setUserImage(lifeUser.getUserImage());
                         }
-                    } else if (phoneId.startsWith("store_")) {
-                        String storePhoneNum = phoneId.substring(6);
-                        StoreUser storeUser = storeUserByPhoneMap.get(storePhoneNum);
+                    } else if (vo.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_STORE) {
+                        StoreUser storeUser = storeUserByIdMap.get(vo.getPhoneRefId());
                         if (storeUser != null) {
                             if (storeUser.getStoreId() != null) {
                                 StoreInfo storeInfo = storeInfoMap.get(storeUser.getStoreId());
@@ -654,15 +650,16 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
         int blockId = lifeBlacklist != null ? lifeBlacklist.getId() : 0;
 
         // 好友动态
+        PublisherScope profileScope = dynamicsIdentityHelper.resolveFromPhoneId(phoneId);
         LambdaQueryWrapper<LifeUserDynamics> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(LifeUserDynamics::getPhoneId, phoneId);
-//        wrapper.eq(LifeUserDynamics::getType, Integer.parseInt(type));
+        dynamicsIdentityHelper.applyPublisherFilter(wrapper, profileScope);
         wrapper.eq(LifeUserDynamics::getDraft, 0);
         IPage<LifeUserDynamics> lifeUserDynamicsPage = new Page<>(page, size);
         IPage<LifeUserDynamics> lifeUserDynamicsIPage = lifeUserDynamicsMapper.selectPage(lifeUserDynamicsPage, wrapper);
         List<LifeUserDynamicsVo> lifeUserDynamicsVoList = lifeUserDynamicsIPage.getRecords().stream().map(dynamics -> {
             LifeUserDynamicsVo dynamicsVo = new LifeUserDynamicsVo();
             BeanUtils.copyProperties(dynamics, dynamicsVo);
+            dynamicsIdentityHelper.ensureVoLegacyPhoneId(dynamicsVo);
             return dynamicsVo;
         }).collect(Collectors.toList());
 
@@ -695,20 +692,18 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
 //            int commentCount = storeCommentService.count(new QueryWrapper<StoreComment>().eq("business_id", dynamicsVo.getId()).eq("delete_flag", "0").eq("comment_type", "1"));
             int commonCommentCount = commonCommentMapper.selectCount(new QueryWrapper<CommonComment>().eq("source_id", dynamicsVo.getId()).eq("delete_flag", "0").eq("source_type", CommentSourceTypeEnum.DYNAMIC_COMMENT.getType()));
             dynamicsVo.setCommentCount(commonCommentCount);
-            String phoneId1 = dynamicsVo.getPhoneId();
-            String storeUserId = "";
-            String storeUserId1 = "";
-            if (phoneId1.startsWith("user_")) {
-                LifeUser lifeUser1 = lifeUserMapper.selectOne(new QueryWrapper<LifeUser>().eq("user_phone", phoneId1.substring(5)));
-                storeUserId = String.valueOf(lifeUser1.getId());
-                storeUserId1 = storeUserId;
-            } else {
-                StoreUser storeUser1 = storeUserService.getOne(new QueryWrapper<StoreUser>().eq("phone", phoneId1.substring(6)));
-                storeUserId = String.valueOf(storeUser1.getStoreId());
-                storeUserId1 = String.valueOf(storeUser1.getId());
+            if (dynamicsVo.getPhoneUserType() != null && dynamicsVo.getPhoneRefId() != null) {
+                if (dynamicsVo.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_USER) {
+                    dynamicsVo.setStoreUserId(String.valueOf(dynamicsVo.getPhoneRefId()));
+                    dynamicsVo.setStoreOrUserId(String.valueOf(dynamicsVo.getPhoneRefId()));
+                } else if (dynamicsVo.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_STORE) {
+                    StoreUser storeUser1 = storeUserService.getById(dynamicsVo.getPhoneRefId());
+                    if (storeUser1 != null) {
+                        dynamicsVo.setStoreUserId(storeUser1.getStoreId() != null ? String.valueOf(storeUser1.getStoreId()) : "");
+                        dynamicsVo.setStoreOrUserId(String.valueOf(storeUser1.getId()));
+                    }
+                }
             }
-            dynamicsVo.setStoreUserId(storeUserId);
-            dynamicsVo.setStoreOrUserId(storeUserId1);
         }
 
         // 好友获赞数量
@@ -725,21 +720,14 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
     }
 
     public List<LifeUserDynamics> getUserDraftDynamics(String phoneId) {
-//        List<LifeUserDynamics> lifeUserDynamics = lifeUserDynamicsMapper.selectList(new QueryWrapper<LifeUserDynamics>().eq("phone_id", phoneId).eq("draft", 1));
-
-        List<LifeUserDynamics> lifeUserDynamics = lifeUserDynamicsMapper.selectList(
-                new QueryWrapper<LifeUserDynamics>()
-                        .eq("phone_id", phoneId)
-                        .eq("draft", 1)
-                        .orderByAsc("updated_time")
-        );
-
-//        for (LifeUserDynamics lifeUserDynamic : lifeUserDynamics) {
-//            if(lifeUserDynamic.getImagePath().contains(",") && !lifeUserDynamic.getImagePath().contains(".mp4")){
-//                lifeUserDynamic.setImagePath(lifeUserDynamic.getImagePath().split(",")[0]);
-//            }
-//        }
-        return lifeUserDynamics;
+        PublisherScope scope = dynamicsIdentityHelper.resolveFromPhoneId(phoneId);
+        LambdaQueryWrapper<LifeUserDynamics> wrapper = new LambdaQueryWrapper<>();
+        dynamicsIdentityHelper.applyPublisherFilter(wrapper, scope);
+        wrapper.eq(LifeUserDynamics::getDraft, 1)
+                .orderByAsc(LifeUserDynamics::getUpdatedTime);
+        List<LifeUserDynamics> drafts = lifeUserDynamicsMapper.selectList(wrapper);
+        drafts.forEach(dynamicsIdentityHelper::ensureEntityLegacyPhoneId);
+        return drafts;
     }
 
     public List<LifeUserDynamicsVo> getDianZanList(String phoneId) {
@@ -789,23 +777,35 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
                 .collect(Collectors.toSet());
         if (!CollectionUtils.isEmpty(lifeUserDynamicsVos)){
             for (LifeUserDynamicsVo lifeUserDynamicsVo : lifeUserDynamicsVos) {
-                if(combinedSet.contains(lifeUserDynamicsVo.getPhoneId())){
+                dynamicsIdentityHelper.ensureVoLegacyPhoneId(lifeUserDynamicsVo);
+                String comparablePhoneId = dynamicsIdentityHelper.resolveComparablePhoneId(lifeUserDynamicsVo);
+                if (comparablePhoneId != null && combinedSet.contains(comparablePhoneId)) {
                     continue;
                 }
                 if (lifeUserDynamicsVo.getType().equals("2")){
-                    String phoneIdNew = lifeUserDynamicsVo.getPhoneId().substring(6);
-                     StoreInfo storeInfo=storeInfoMapper.getStoreNameByPhone(phoneIdNew);
-                     if(storeInfo != null){
-                         lifeUserDynamicsVo.setStoreName(storeInfo.getStoreName());
-                         lifeUserDynamicsVo.setBusinessSection(storeInfo.getBusinessSection().toString());
-                         lifeUserDynamicsVo.setBusinessTypeName(storeInfo.getBusinessTypeName());
-                         lifeUserDynamicsVo.setStoreUserId(storeInfo.getId().toString());
-                     }
+                    if (lifeUserDynamicsVo.getPhoneUserType() != null
+                            && lifeUserDynamicsVo.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_STORE
+                            && lifeUserDynamicsVo.getPhoneRefId() != null) {
+                        StoreUser su = storeUserService.getById(lifeUserDynamicsVo.getPhoneRefId());
+                        if (su != null && StringUtils.hasText(su.getPhone())) {
+                            StoreInfo storeInfo = storeInfoMapper.getStoreNameByPhone(su.getPhone());
+                            if (storeInfo != null) {
+                                lifeUserDynamicsVo.setStoreName(storeInfo.getStoreName());
+                                lifeUserDynamicsVo.setBusinessSection(storeInfo.getBusinessSection().toString());
+                                lifeUserDynamicsVo.setBusinessTypeName(storeInfo.getBusinessTypeName());
+                                lifeUserDynamicsVo.setStoreUserId(storeInfo.getId().toString());
+                            }
+                        }
+                    }
                 } else if (lifeUserDynamicsVo.getType().equals("1")) {
-                    String phoneIdNew = lifeUserDynamicsVo.getPhoneId().substring(5);
-                    //根据手机号查询用户表
-                    LifeUser lifeUser = lifeUserMapper.selectOne(new QueryWrapper<LifeUser>().eq("user_phone", phoneIdNew));
-                    lifeUserDynamicsVo.setUserName(lifeUser.getUserName());
+                    if (lifeUserDynamicsVo.getPhoneUserType() != null
+                            && lifeUserDynamicsVo.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_USER
+                            && lifeUserDynamicsVo.getPhoneRefId() != null) {
+                        LifeUser lifeUser = lifeUserMapper.selectById(lifeUserDynamicsVo.getPhoneRefId());
+                        if (lifeUser != null) {
+                            lifeUserDynamicsVo.setUserName(lifeUser.getUserName());
+                        }
+                    }
                 }
             }
         }
@@ -813,16 +813,17 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
     }
 
     public List<LifeUserDynamicsVo> getDynamicsList(Integer page, Integer size, String nickName, String userType, Integer dynamicsType, String releaseStartTime, String releaseEndTime, String storeName) {
-        // 查询动态数据并按类型过滤
-        return lifeUserDynamicsMapper.getDynamicsList(nickName, userType, dynamicsType, releaseStartTime, releaseEndTime, storeName);
+        List<LifeUserDynamicsVo> list = lifeUserDynamicsMapper.getDynamicsList(nickName, userType, dynamicsType, releaseStartTime, releaseEndTime, storeName);
+        list.forEach(dynamicsIdentityHelper::ensureVoLegacyPhoneId);
+        return list;
     }
 
     public LifeUserDynamicsVo getDynamicsDetail(Integer id) {
-        // 查询动态数据并按类型过滤
         LifeUserDynamicsVo lifeUserDynamicsVo = new LifeUserDynamicsVo();
         List<LifeUserDynamicsVo> lifeUserDynamicsVoList = lifeUserDynamicsMapper.getDynamicsDetail(id);
         if(!CollectionUtils.isEmpty(lifeUserDynamicsVoList)){
             lifeUserDynamicsVo = lifeUserDynamicsVoList.get(0);
+            dynamicsIdentityHelper.ensureVoLegacyPhoneId(lifeUserDynamicsVo);
             String imagePath = lifeUserDynamicsVo.getImagePath();
             if(!StringUtils.isEmpty(imagePath)){
                 List<String> imagePathList = Arrays.asList(imagePath.split(","));

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

@@ -40,6 +40,7 @@ import shop.alien.store.service.clockin.ClockInRecommendCacheService;
 import shop.alien.store.service.dynamics.DynamicsRecommendCacheService;
 import shop.alien.store.util.FunctionMagic;
 import shop.alien.store.util.LifeFansIdentityQuery;
+import shop.alien.store.util.LifeDynamicsIdentityHelper;
 import shop.alien.util.type.LifeNoticeUtil;
 import shop.alien.util.type.PhoneTypeIdResult;
 import shop.alien.util.type.TypeUtil;
@@ -77,6 +78,8 @@ public class LifeUserService extends ServiceImpl<LifeUserMapper, LifeUser> {
 
     private final LifeUserDynamicsMapper lifeUserDynamicsMapper;
 
+    private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
+
     private final BaseRedisService baseRedisService;
 
     private final LifeNoticeMapper lifeNoticeMapper;
@@ -495,8 +498,9 @@ public class LifeUserService extends ServiceImpl<LifeUserMapper, LifeUser> {
             user.setFansCount((int) fansCount);
 
             LambdaQueryWrapper<LifeUserDynamics> dynamicsWrapper = new LambdaQueryWrapper<>();
-            dynamicsWrapper.eq(LifeUserDynamics::getPhoneId, userId)
-                    .eq(LifeUserDynamics::getDeleteFlag, 0);
+            dynamicsIdentityHelper.applyPublisherFilter(dynamicsWrapper,
+                    dynamicsIdentityHelper.resolveFromPhoneId(userId));
+            dynamicsWrapper.eq(LifeUserDynamics::getDeleteFlag, 0);
             List<LifeUserDynamics> dynamicsList = lifeUserDynamicsMapper.selectList(dynamicsWrapper);
             long likeCount = 0L;
             if (dynamicsList != null && !dynamicsList.isEmpty()) {

+ 8 - 2
alien-store/src/main/java/shop/alien/store/service/LifeUserStoreService.java

@@ -12,10 +12,13 @@ import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.LifeUserDynamicsVo;
 import shop.alien.entity.store.vo.StoreInfoVo;
 import shop.alien.mapper.*;
+import shop.alien.store.util.LifeDynamicsIdentityHelper;
+import shop.alien.store.util.LifeDynamicsIdentityHelper.PublisherScope;
 import shop.alien.store.config.GaoDeMapUtil;
 import shop.alien.util.common.DistanceUtil;
 import shop.alien.util.common.ListToPage;
 import shop.alien.util.common.UniqueRandomNumGenerator;
+import shop.alien.util.common.UniqueRandomNumGenerator;
 import shop.alien.util.common.constant.DiscountCouponEnum;
 import shop.alien.util.type.LifeCollectIdentityQuery;
 import shop.alien.util.type.TypeUtil;
@@ -49,6 +52,8 @@ public class LifeUserStoreService {
 
     private final LifeUserDynamicsMapper lifeUserDynamicsMapper;
 
+    private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
+
     private final GaoDeMapUtil gaoDeMapUtil;
 
     private final TypeUtil typeUtil;
@@ -453,9 +458,10 @@ public class LifeUserStoreService {
         returnMap.put("clockInNum", clockInNum);
 
         // 获取店铺动态列表
+        PublisherScope storePublisher = dynamicsIdentityHelper.resolveStorePublisherByStorePhone(storeInfoVoOne.getStorePhone());
         QueryWrapper<LifeUserDynamics> dynamicsWrapper = new QueryWrapper<>();
-        dynamicsWrapper.eq("phone_id", "store_" + storeInfoVoOne.getStorePhone())
-                .orderByDesc("lud.created_time");
+        dynamicsIdentityHelper.applyPublisherFilter(dynamicsWrapper, storePublisher, "lud");
+        dynamicsWrapper.orderByDesc("lud.created_time");
         List<LifeUserDynamicsVo> storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslistWithWrapper(userId, dynamicsWrapper);
         List<Map<String, Object>> dynamicsList = new ArrayList<>();
         List<LifeUserDynamicsVo> storeDynamicslist2 = storeDynamicslist.stream().limit(10).collect(Collectors.toList());

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

@@ -17,6 +17,7 @@ import shop.alien.entity.store.vo.CommonRatingVo;
 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.store.util.ai.AiContentModerationUtil;
 import shop.alien.util.common.constant.CommentSourceTypeEnum;
 import shop.alien.util.common.safe.TextModerationUtil;
@@ -42,6 +43,8 @@ public class CommonCommentServiceImpl extends ServiceImpl<CommonCommentMapper, C
 
     private final CommonCommentMapper commonCommentMapper;
     private final LifeUserDynamicsMapper lifeUserDynamicsMapper;
+
+    private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
     private final StoreUserMapper storeUserMapper;
     private final LifeUserViolationMapper lifeUserViolationMapper;
@@ -279,13 +282,23 @@ public class CommonCommentServiceImpl extends ServiceImpl<CommonCommentMapper, C
             if(null != lifeUserDynamics){
                 map.put("likeCount",lifeUserDynamics.getDianzanCount());
                 map.put("transferCount",lifeUserDynamics.getTransferCount());
+                dynamicsIdentityHelper.ensureEntityLegacyPhoneId(lifeUserDynamics);
             } else {
                 map.put("likeCount",0);
                 map.put("transferCount",0);
             }
-            // 2.查询商家头像 TODO -> 动态发布的时候id不应该用Store_phone的格式,来不及重构动态的位置,后续等有缘人吧
-            StoreUser storeUser = storeUserMapper.selectOne(new QueryWrapper<StoreUser>().eq("phone", lifeUserDynamics.getPhoneId().split("_")[1]));
-            map.put("userImage",storeUser.getHeadImg()!= null?storeUser.getHeadImg():"");
+            StoreUser storeUser = null;
+            if (lifeUserDynamics != null
+                    && lifeUserDynamics.getPhoneUserType() != null
+                    && lifeUserDynamics.getPhoneUserType() == LifeDynamicsIdentityHelper.TYPE_STORE
+                    && lifeUserDynamics.getPhoneRefId() != null) {
+                storeUser = storeUserMapper.selectById(lifeUserDynamics.getPhoneRefId());
+            }
+            if (storeUser != null) {
+                map.put("userImage", storeUser.getHeadImg() != null ? storeUser.getHeadImg() : "");
+            } else {
+                map.put("userImage", "");
+            }
             String fansId = "";
             int fansType = 1;
             if ("user".equals(userType)) {
@@ -315,7 +328,8 @@ public class CommonCommentServiceImpl extends ServiceImpl<CommonCommentMapper, C
             }
             // 4.查询当前登录人是否关注了动态发布者
 
-            LifeFans lifeFans = lifeFansMapper.selectOne(new QueryWrapper<LifeFans>().eq("followed_id", lifeUserDynamics.getPhoneId())
+            String publisherPhoneId = dynamicsIdentityHelper.resolveComparablePhoneId(lifeUserDynamics);
+            LifeFans lifeFans = lifeFansMapper.selectOne(new QueryWrapper<LifeFans>().eq("followed_id", publisherPhoneId)
                     .eq("fans_id", fansId)
                     .eq("fans_type", fansType)
                     .last("limit 1"));

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

@@ -42,6 +42,8 @@ import shop.alien.store.config.GaoDeMapUtil;
 import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.*;
 import shop.alien.store.util.CommonConstant;
+import shop.alien.store.util.LifeDynamicsIdentityHelper;
+import shop.alien.store.util.LifeDynamicsIdentityHelper.PublisherScope;
 import shop.alien.store.util.FileUploadUtil;
 import shop.alien.store.util.GroupConstant;
 import shop.alien.store.util.ai.AiAuthTokenUtil;
@@ -133,6 +135,8 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
 
     private final LifeUserDynamicsMapper lifeUserDynamicsMapper;
 
+    private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
+
     private final StoreCommentMapper storeCommentMapper;
 
     private final CommonRatingMapper commonRatingMapper;
@@ -2084,11 +2088,6 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         result.setClockInNum(clockInNum);
 
         // 获取店铺动态列表
-        QueryWrapper<LifeUserDynamics> dynamicsWrapper = new QueryWrapper<>();
-        dynamicsWrapper.eq("phone_id", "store_" + result.getStorePhone()).orderByDesc("lud.created_time");
-        dynamicsWrapper.eq("lud.delete_flag", 0);
-        //List<LifeUserDynamicsVo> storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslist(userId, dynamicsWrapper);
-
         LambdaQueryWrapper<LifeBlacklist> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
         lambdaQueryWrapper1.eq(LifeBlacklist::getBlockerId, userId);
         lambdaQueryWrapper1.eq(LifeBlacklist::getBlockedPhoneId, "store_" + result.getStorePhone());
@@ -2097,7 +2096,11 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
 
         //判断没有拉黑当前门店账户 查出门店动态
         if (blacklist == null) {
-            storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslist(userId, "store_" + result.getStorePhone());
+            PublisherScope storePublisher = dynamicsIdentityHelper.resolveStorePublisherByStorePhone(result.getStorePhone());
+            storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslist(
+                    userId,
+                    storePublisher.getPhoneUserType(),
+                    storePublisher.getPhoneRefId());
         }
 
         List<String> followList = new ArrayList<>();
@@ -2125,6 +2128,7 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         }
 
         for (LifeUserDynamicsVo vo : storeDynamicslist) {
+            dynamicsIdentityHelper.ensureVoLegacyPhoneId(vo);
             if (followList.contains(vo.getPhoneId())) {
                 vo.setIsFollowThis("1");
             } else {

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

@@ -18,8 +18,10 @@ import shop.alien.entity.store.vo.StoreOperationalStatisticsComparisonVo;
 import shop.alien.entity.store.vo.StoreOperationalStatisticsVo;
 import shop.alien.mapper.*;
 import shop.alien.store.service.StoreOperationalStatisticsService;
+import shop.alien.store.util.LifeDynamicsIdentityHelper;
 import shop.alien.store.util.StatisticsComparisonImageUtil;
 import shop.alien.store.util.ai.AiAuthTokenUtil;
+import shop.alien.store.util.ai.AiAuthTokenUtil;
 import shop.alien.util.ali.AliOSSUtil;
 import shop.alien.util.common.RandomCreateUtil;
 import shop.alien.util.pdf.ImageToPdfUtil;
@@ -47,6 +49,8 @@ public class StoreOperationalStatisticsServiceImpl implements StoreOperationalSt
     private final LifeCollectMapper lifeCollectMapper;
     private final StoreClockInMapper storeClockInMapper;
     private final LifeUserDynamicsMapper lifeUserDynamicsMapper;
+
+    private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
     private final StoreCommentMapper storeCommentMapper;
     private final LifeCommentMapper lifeCommentMapper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
@@ -588,12 +592,13 @@ public class StoreOperationalStatisticsServiceImpl implements StoreOperationalSt
         StoreUser storeUser = storeUserMapper.selectOne(
                 new LambdaQueryWrapper<StoreUser>().eq(StoreUser::getStoreId, storeId).last("LIMIT 1"));
         if (storeUser != null) {
-            String phoneId = "store_" + storeUser.getPhone();
-
-            // 发布动态数量
             LambdaQueryWrapper<LifeUserDynamics> dynamicsWrapper = new LambdaQueryWrapper<>();
-            dynamicsWrapper.eq(LifeUserDynamics::getPhoneId, phoneId)
-                    .between(LifeUserDynamics::getCreatedTime, startDate, endDate)
+            dynamicsIdentityHelper.applyPublisherFilter(dynamicsWrapper,
+                    new LifeDynamicsIdentityHelper.PublisherScope(
+                            "store_" + storeUser.getPhone(),
+                            LifeDynamicsIdentityHelper.TYPE_STORE,
+                            storeUser.getId()));
+            dynamicsWrapper.between(LifeUserDynamics::getCreatedTime, startDate, endDate)
                     .eq(LifeUserDynamics::getDeleteFlag, 0)
                     .eq(LifeUserDynamics::getDraft, 0);
             long postsCount = lifeUserDynamicsMapper.selectCount(dynamicsWrapper);

+ 13 - 8
alien-store/src/main/java/shop/alien/store/service/impl/TrackEventServiceImpl.java

@@ -13,6 +13,7 @@ import shop.alien.entity.store.StoreTrackStatistics;
 import shop.alien.mapper.*;
 import shop.alien.store.config.BaseRedisService;
 import shop.alien.store.service.TrackEventService;
+import shop.alien.store.util.LifeDynamicsIdentityHelper;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -39,6 +40,8 @@ public class TrackEventServiceImpl extends ServiceImpl<StoreTrackEventMapper, St
     private final StoreUserMapper storeUserMapper;
     private final LifeFansMapper lifeFansMapper;
     private final LifeUserDynamicsMapper lifeUserDynamicsMapper;
+
+    private final LifeDynamicsIdentityHelper dynamicsIdentityHelper;
     private final CommonRatingMapper commonRatingMapper;
     private final StoreCommentAppealMapper storeCommentAppealMapper;
     private final LifeDiscountCouponUserMapper lifeDiscountCouponUserMapper;
@@ -475,17 +478,19 @@ public class TrackEventServiceImpl extends ServiceImpl<StoreTrackEventMapper, St
      */
     private long calculatePostCount(Integer storeId, Date startDate, Date endDate) {
         try {
-            String storePhoneId = getStorePhoneId(storeId);
-            if (storePhoneId == null) {
+            StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>()
+                    .eq(StoreUser::getStoreId, storeId)
+                    .eq(StoreUser::getDeleteFlag, 0)
+                    .last("LIMIT 1"));
+            if (storeUser == null || storeUser.getId() == null) {
                 return 0L;
             }
-            
+
             LambdaQueryWrapper<LifeUserDynamics> wrapper = new LambdaQueryWrapper<>();
-            wrapper.eq(LifeUserDynamics::getPhoneId, storePhoneId)
-                    .eq(LifeUserDynamics::getType, "2") // 商家社区
-                    .eq(LifeUserDynamics::getDraft, 0) // 非草稿
-                    // 统计发布动态数量,统计全部而不是当天的数据
-//                    .ge(LifeUserDynamics::getCreatedTime, startDate)
+            wrapper.eq(LifeUserDynamics::getPhoneUserType, LifeDynamicsIdentityHelper.TYPE_STORE)
+                    .eq(LifeUserDynamics::getPhoneRefId, storeUser.getId())
+                    .eq(LifeUserDynamics::getType, "2")
+                    .eq(LifeUserDynamics::getDraft, 0)
                     .lt(LifeUserDynamics::getCreatedTime, endDate)
                     .eq(LifeUserDynamics::getDeleteFlag, 0);
             return lifeUserDynamicsMapper.selectCount(wrapper);

+ 289 - 0
alien-store/src/main/java/shop/alien/store/util/LifeDynamicsIdentityHelper.java

@@ -0,0 +1,289 @@
+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.LifeUserDynamics;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.store.vo.LifeUserDynamicsVo;
+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;
+
+/**
+ * life_user_dynamics 发布人身份工具。
+ * <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 LifeDynamicsIdentityHelper {
+
+    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;
+        }
+
+        public boolean isEmpty() {
+            return !hasTypeRef();
+        }
+    }
+
+    /** 将前端传入的 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());
+    }
+
+    /** 从库表记录解析发布人(仅认 phone_user_type + phone_ref_id)。 */
+    public PublisherScope resolveFromDynamics(LifeUserDynamics dynamics) {
+        if (dynamics == null
+                || dynamics.getPhoneUserType() == null
+                || dynamics.getPhoneRefId() == null) {
+            return new PublisherScope(null, null, null);
+        }
+        String legacy = buildLegacyPhoneId(dynamics.getPhoneUserType(), dynamics.getPhoneRefId());
+        return new PublisherScope(legacy, dynamics.getPhoneUserType(), dynamics.getPhoneRefId());
+    }
+
+    /** 写入前:由前端 phoneId 或显式 type+refId 填充新字段,不落库 phone_id。 */
+    public void normalizePublisherFields(LifeUserDynamics dynamics) {
+        if (dynamics == null) {
+            return;
+        }
+        if (dynamics.getPhoneUserType() == null || dynamics.getPhoneRefId() == null) {
+            if (StringUtils.hasText(dynamics.getPhoneId())) {
+                PhoneTypeIdResult resolved = typeUtil.resolveTypeAndId(dynamics.getPhoneId().trim());
+                if (resolved != null) {
+                    dynamics.setPhoneUserType(resolved.getType());
+                    dynamics.setPhoneRefId(resolved.getId());
+                }
+            }
+        }
+        dynamics.setPhoneId(null);
+    }
+
+    public void applyPublisherFilter(LambdaQueryWrapper<LifeUserDynamics> wrapper, PublisherScope scope) {
+        if (wrapper == null || scope == null || !scope.hasTypeRef()) {
+            return;
+        }
+        wrapper.eq(LifeUserDynamics::getPhoneUserType, scope.getPhoneUserType())
+                .eq(LifeUserDynamics::getPhoneRefId, scope.getPhoneRefId());
+    }
+
+    public void applyPublisherFilter(QueryWrapper<LifeUserDynamics> wrapper, PublisherScope scope) {
+        applyPublisherFilter(wrapper, scope, null);
+    }
+
+    public void applyPublisherFilter(QueryWrapper<LifeUserDynamics> 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());
+    }
+
+    public PublisherScope resolveStorePublisherByStorePhone(String storePhone) {
+        if (!StringUtils.hasText(storePhone)) {
+            return new PublisherScope(null, null, null);
+        }
+        String rawPhone = storePhone.trim();
+        if (rawPhone.startsWith("store_")) {
+            rawPhone = rawPhone.substring(6);
+        }
+        StoreUser storeUser = storeUserMapper.selectOne(
+                new LambdaQueryWrapper<StoreUser>()
+                        .eq(StoreUser::getPhone, rawPhone)
+                        .eq(StoreUser::getDeleteFlag, 0)
+                        .last("LIMIT 1"));
+        if (storeUser != null && storeUser.getId() != null) {
+            return new PublisherScope("store_" + rawPhone, TYPE_STORE, storeUser.getId());
+        }
+        return resolveFromPhoneId("store_" + rawPhone);
+    }
+
+    public boolean isSamePublisher(LifeUserDynamics dynamics, PublisherScope scope) {
+        if (dynamics == null || scope == null || !scope.hasTypeRef()) {
+            return false;
+        }
+        PublisherScope itemScope = resolveFromDynamics(dynamics);
+        return itemScope.hasTypeRef()
+                && Objects.equals(scope.getPhoneUserType(), itemScope.getPhoneUserType())
+                && Objects.equals(scope.getPhoneRefId(), itemScope.getPhoneRefId());
+    }
+
+    public boolean isSamePublisher(LifeUserDynamicsVo vo, PublisherScope scope) {
+        if (vo == null || scope == null || !scope.hasTypeRef()) {
+            return false;
+        }
+        if (vo.getPhoneUserType() != null && vo.getPhoneRefId() != null) {
+            return Objects.equals(scope.getPhoneUserType(), vo.getPhoneUserType())
+                    && Objects.equals(scope.getPhoneRefId(), vo.getPhoneRefId());
+        }
+        return isSamePublisher(copyToEntity(vo), scope);
+    }
+
+    /** 用于与 life_fans / life_like_record 等仍使用 legacy phoneId 的模块比对。 */
+    public String resolveComparablePhoneId(LifeUserDynamics dynamics) {
+        PublisherScope scope = resolveFromDynamics(dynamics);
+        if (scope.hasTypeRef()) {
+            return buildLegacyPhoneId(scope.getPhoneUserType(), scope.getPhoneRefId());
+        }
+        return resolveFromPhoneId(dynamics != null ? dynamics.getPhoneId() : null).getLegacyPhoneId();
+    }
+
+    public String resolveComparablePhoneId(LifeUserDynamicsVo vo) {
+        if (vo == null) {
+            return null;
+        }
+        if (vo.getPhoneUserType() != null && vo.getPhoneRefId() != null) {
+            return buildLegacyPhoneId(vo.getPhoneUserType(), vo.getPhoneRefId());
+        }
+        if (StringUtils.hasText(vo.getPhoneId())) {
+            return vo.getPhoneId();
+        }
+        return resolveComparablePhoneId(copyToEntity(vo));
+    }
+
+    public String resolveBlacklistBlockedType(LifeUserDynamics dynamics) {
+        if (dynamics == null || dynamics.getPhoneUserType() == null) {
+            return "0";
+        }
+        if (dynamics.getPhoneUserType() == TYPE_STORE) {
+            return "1";
+        }
+        if (dynamics.getPhoneUserType() == TYPE_USER) {
+            return "2";
+        }
+        return "0";
+    }
+
+    public Integer resolveStoreIdFromDynamics(LifeUserDynamics dynamics) {
+        if (dynamics == null
+                || dynamics.getPhoneUserType() == null
+                || dynamics.getPhoneUserType() != TYPE_STORE
+                || dynamics.getPhoneRefId() == null) {
+            return null;
+        }
+        StoreUser storeUser = storeUserMapper.selectById(dynamics.getPhoneRefId());
+        return storeUser != null ? storeUser.getStoreId() : null;
+    }
+
+    /** 埋点等场景:优先认库表 type+refId,否则从入参 phoneId 解析。 */
+    public Integer resolveStoreIdForTrack(LifeUserDynamics dynamics) {
+        if (dynamics == null) {
+            return null;
+        }
+        Integer storeId = resolveStoreIdFromDynamics(dynamics);
+        if (storeId != null) {
+            return storeId;
+        }
+        PublisherScope scope = resolveFromPhoneId(dynamics.getPhoneId());
+        if (scope.hasTypeRef() && scope.getPhoneUserType() == TYPE_STORE) {
+            StoreUser storeUser = storeUserMapper.selectById(scope.getPhoneRefId());
+            return storeUser != null ? storeUser.getStoreId() : null;
+        }
+        return null;
+    }
+
+    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(LifeUserDynamicsVo vo) {
+        if (vo == null || vo.getPhoneUserType() == null || vo.getPhoneRefId() == null) {
+            return;
+        }
+        vo.setPhoneId(buildLegacyPhoneId(vo.getPhoneUserType(), vo.getPhoneRefId()));
+    }
+
+    public void ensureEntityLegacyPhoneId(LifeUserDynamics dynamics) {
+        if (dynamics == null || dynamics.getPhoneUserType() == null || dynamics.getPhoneRefId() == null) {
+            return;
+        }
+        dynamics.setPhoneId(buildLegacyPhoneId(dynamics.getPhoneUserType(), dynamics.getPhoneRefId()));
+    }
+
+    private LifeUserDynamics copyToEntity(LifeUserDynamicsVo vo) {
+        LifeUserDynamics d = new LifeUserDynamics();
+        d.setPhoneUserType(vo.getPhoneUserType());
+        d.setPhoneRefId(vo.getPhoneRefId());
+        d.setPhoneId(vo.getPhoneId());
+        return d;
+    }
+}