Переглянути джерело

Merge branch 'sit' into sit-OrderFood

lutong 1 місяць тому
батько
коміт
85d9a28315

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/StoreOperationalActivityMySignupVo.java

@@ -76,4 +76,7 @@ public class StoreOperationalActivityMySignupVo {
 
     @ApiModelProperty(value = "状态文案")
     private String statusLabel;
+
+     @ApiModelProperty(value = "店铺名称")
+    private String storeName;
 }

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

@@ -274,7 +274,7 @@ public interface LifeFansMapper extends BaseMapper<LifeFans> {
             "( " +
             "    select count(id) " +
             "    from life_user_dynamics " +
-            "    where delete_flag = 0 and phone_id = #{phoneId} and draft = 0 " +
+            "    where delete_flag = 0 and phone_id = #{phoneId} and draft = 0 and enable_status != 1 " +
             ") dynamicsNum")
     LifeFansVo getHomePageInfo(@Param("phoneId") String phoneId);
 }

+ 13 - 11
alien-entity/src/main/resources/mapper/LifeUserDynamicsMapper.xml

@@ -4,7 +4,7 @@
 
     <select id="getDynamicsList" resultType="shop.alien.entity.store.vo.LifeUserDynamicsVo">
         SELECT
-        -- 1. 用ANY_VALUE()包裹非聚合列,符合only_full_group_by规则
+        -- 1. 用 ANY_VALUE() 包裹非聚合列,符合 only_full_group_by 规则
         ANY_VALUE(dyna1.id) AS id,
         ANY_VALUE(dyna1.dynamicsType) AS dynamicsType,
         ANY_VALUE(dyna1.title) AS title,
@@ -31,14 +31,15 @@
         ANY_VALUE(dyna1.storeOrUserId) AS storeOrUserId,
         ANY_VALUE(dyna1.isExpert) AS isExpert,
         ANY_VALUE(dyna1.store_name) AS store_name,
-        -- 2. 修正聚合计数逻辑:用COUNT(DISTINCT)避免重复计数,粉丝数统计lf1.id而非dyna1.id
+        ANY_VALUE(dyna1.transfer_count) AS transferCount,
+        -- 2. 修正聚合计数逻辑:用 COUNT(DISTINCT) 避免重复计数,粉丝数统计 lf1.id 而非 dyna1.id
         COUNT(DISTINCT lf1.id) AS fansCount,
-        -- 保留内层的评论数、转发数(从dyna1中取聚合后的值)
+        -- 保留内层的评论数、转发数(从 dyna1 中取聚合后的值)
         ANY_VALUE(dyna1.commentCount) AS commentCount,
         ANY_VALUE(dyna1.transferNum) AS transferNum
         FROM (
         SELECT
-        -- 内层同样用ANY_VALUE()包裹非聚合列
+        -- 内层同样用 ANY_VALUE() 包裹非聚合列
         ANY_VALUE(dyna.id) AS id,
         ANY_VALUE(dyna.dynamicsType) AS dynamicsType,
         ANY_VALUE(dyna.title) AS title,
@@ -59,13 +60,14 @@
         ANY_VALUE(dyna.top_status) AS top_status,
         ANY_VALUE(dyna.top_time) AS top_time,
         ANY_VALUE(dyna.enable_status) AS enable_status,
+        ANY_VALUE(dyna.transfer_count) AS transfer_count,
         ANY_VALUE(dyna.userName) AS userName,
         ANY_VALUE(dyna.userImage) AS userImage,
         ANY_VALUE(dyna.storeUserId) AS storeUserId,
         ANY_VALUE(dyna.storeOrUserId) AS storeOrUserId,
         ANY_VALUE(dyna.isExpert) AS isExpert,
         ANY_VALUE(dyna.store_name) AS store_name,
-        -- 3. 修正评论数/转发数:COUNT(DISTINCT)避免LEFT JOIN导致的重复计数
+        -- 3. 修正评论数/转发数:COUNT(DISTINCT) 避免 LEFT JOIN 导致的重复计数
         COUNT(DISTINCT sc.id) AS commentCount,
         COUNT(DISTINCT lm.id) AS transferNum
         FROM (
@@ -80,7 +82,7 @@
         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
+        draft , address_province, top_status, top_time, enable_status, transfer_count
         FROM life_user_dynamics
         WHERE delete_flag = 0 AND draft = 0
         )
@@ -109,7 +111,7 @@
         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
-        -- 4. GROUP BY仅保留主键id(因dyna.id是唯一主键,ANY_VALUE()包裹的列在同一id下值唯一)
+        -- 4. GROUP BY 仅保留主键 id(因 dyna.id 是唯一主键,ANY_VALUE() 包裹的列在同一 id 下值唯一)
         GROUP BY dyna.id
         ) dyna1
         LEFT JOIN life_fans lf1 ON lf1.followed_id = dyna1.phoneId
@@ -132,22 +134,22 @@
         <if test="releaseEndTime != null and releaseEndTime != ''">
             AND dyna1.created_time &lt;= #{releaseEndTime}
         </if>
-        -- 5. 外层GROUP BY仅保留主键id,保证分组逻辑正确
+        -- 5. 外层 GROUP BY 仅保留主键 id,保证分组逻辑正确
         GROUP BY dyna1.id
-        -- 6. 最终排序移到外层,子查询的ORDER BY无意义且影响性能
+        -- 6. 最终排序移到外层,子查询的 ORDER BY 无意义且影响性能
         ORDER BY dyna1.top_status DESC, dyna1.top_time DESC;
     </select>
 
     <select id="getDynamicsDetail" resultType="shop.alien.entity.store.vo.LifeUserDynamicsVo">
         select dyna1.*, COUNT(dyna1.id) AS fansCount from (
-        select dyna.*,COUNT(sc.id) AS commentCount,  COUNT(lm.id) AS transferNum from (
+        select dyna.*,COUNT(sc.id) AS commentCount from (
         with dynamice as(
         select
         CASE
         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_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
         from life_user_dynamics
         where id = #{id} and delete_flag = 0 and draft = 0 order by created_time desc
         )

+ 3 - 1
alien-entity/src/main/resources/mapper/storePlatform/StoreOperationalActivitySignupMapper.xml

@@ -110,7 +110,8 @@
             s.status AS signupAuditStatus,
             CASE WHEN a.status = 7 THEN 1 ELSE 0 END AS activityStartStatus,
             CASE WHEN ach.signup_id IS NULL THEN 0 ELSE 1 END AS hasAchievement,
-            s.signup_time AS signupTime
+            s.signup_time AS signupTime,
+            si.store_name AS storeName
         FROM store_operational_activity_signup s
         INNER JOIN store_operational_activity a ON a.id = s.activity_id
         LEFT JOIN store_img img ON img.store_id = a.store_id
@@ -120,6 +121,7 @@
         LEFT JOIN store_user su ON su.store_id = a.store_id
             AND su.account_type = 1
             AND su.delete_flag = 0
+        LEFT JOIN store_info si ON si.id = a.store_id
         LEFT JOIN (
             SELECT DISTINCT signup_id
             FROM store_operational_activity_achievement

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

@@ -1670,7 +1670,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
         queryWrapper
                 // 可以查看已删除的商品数据
-//                .eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
+                .eq("sg.delete_flag", Constants.DeleteFlag.NOT_DELETED)
                 .eq("lc.delete_flag", Constants.DeleteFlag.NOT_DELETED)
                 .notIn(CollectionUtil.isNotEmpty(shieldedGoodsIds), "sg.id", shieldedGoodsIds)
                 .eq("lc.user_id", "user_"+lifeUser.getUserPhone())

+ 19 - 11
alien-store/src/main/java/shop/alien/store/controller/AiSearchController.java

@@ -3,6 +3,7 @@ package shop.alien.store.controller;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.annotations.Api;
 import lombok.RequiredArgsConstructor;
@@ -20,8 +21,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
 import shop.alien.entity.result.R;
-import shop.alien.entity.store.*;
+import shop.alien.entity.store.CommonRating;
+import shop.alien.entity.store.LifeBlacklist;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.entity.store.StoreUser;
 import shop.alien.entity.store.vo.StoreBannerVo;
+import shop.alien.entity.store.vo.StoreBusinessStatusVo;
 import shop.alien.entity.store.vo.StoreInfoVo;
 import shop.alien.mapper.CommonRatingMapper;
 import shop.alien.mapper.LifeBlacklistMapper;
@@ -32,15 +37,12 @@ import shop.alien.store.service.CommonRatingService;
 import shop.alien.store.service.StoreBannerService;
 import shop.alien.store.service.StoreImgService;
 import shop.alien.store.service.StoreInfoService;
-import shop.alien.entity.store.vo.StoreBusinessStatusVo;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 
 import java.time.Instant;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executor;
 import java.util.stream.Collectors;
 
 
@@ -136,7 +138,7 @@ public class AiSearchController {
 
             jsonObject1.put("total", jsonObject.get("total"));
             jsonObject1.put("size", map.get("pageSize"));
-            log.info("调用AI搜索店铺列表最上面根据店铺名查询 后端处理后数据接口返回------{}", body);
+            log.info("调用AI搜索店铺列表最上面根据店铺名查询 后端处理后数据接口返回------{}", jsonObject1);
             return R.data(jsonObject1);
         } catch (Exception e) {
             log.error("调用AI搜索接口 接口异常------", e);
@@ -167,27 +169,33 @@ public class AiSearchController {
             log.info("调用AI首页店铺列表搜索接口 AI接口返回------{}  AI结束时间: {}", body, formatter.format(Instant.now()));
             JSONObject jsonObject = JSONObject.parseObject(body);
             JSONObject jsonObject1 = new JSONObject();
-            // 模糊搜索:从related_results和matched_results字段获取数据
-            List<StoreInfoVo> result = convertToStoreInfoList(jsonObject.getJSONArray("results"),map.get("userId"));
+            // 模糊搜索:从 results 字段获取数据(AI 服务返回格式)
+            List<StoreInfoVo> result = convertToStoreInfoList(jsonObject.getJSONArray("results"), map.get("userId"));
 
             // 并发处理图片、评论数据和营业时间,提升性能
             CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> fillStoreImages(result, 1));
             CompletableFuture<Void> ratingFuture = CompletableFuture.runAsync(() -> fillRatingCountBatch(result));
             CompletableFuture<Void> businessHoursFuture = CompletableFuture.runAsync(() -> fillBusinessHours(result));
             
-            // 等待所有任务完成
             CompletableFuture.allOf(imageFuture, ratingFuture, businessHoursFuture).join();
 
             jsonObject1.put("records", result);
-
             jsonObject1.put("total", jsonObject.get("total"));
             jsonObject1.put("size", map.get("pageSize"));
-            log.info("调用AI首页店铺列表搜索 Java数据处理后接口返回------{}  最终时间: {}", body, formatter.format(Instant.now()));
+            log.info("调用AI首页店铺列表搜索 Java数据处理后接口返回------{}  最终时间: {}", jsonObject1, formatter.format(Instant.now()));
             return R.data(jsonObject1);
+        } catch (org.springframework.web.client.HttpServerErrorException e) {
+            String responseBody = e.getResponseBodyAsString();
+            log.error("调用AI模糊搜索接口 上游返回5xx------ status={}, body={}", e.getStatusCode(), responseBody, e);
+            // Meilisearch 报 store_application_status is not filterable 时,需在 AI 搜索服务或 Meilisearch 索引中将 store_application_status 加入 filterableAttributes,或去掉该过滤条件
+            if (responseBody != null && responseBody.contains("store_application_status") && responseBody.contains("not filterable")) {
+                log.error("Meilisearch 不可用 store_application_status 筛选:请在第三方 AI 搜索服务或 Meilisearch 索引配置中将 store_application_status 加入 filterableAttributes,或移除该过滤条件。参见 docs/ai-search-meilisearch-filterable.md");
+            }
+            return R.fail("搜索服务暂时不可用,请稍后重试");
         } catch (Exception e) {
             log.error("调用AI模糊搜索接口 接口异常------", e);
         }
-        return  R.fail("请求失败");
+        return R.fail("请求失败");
     }
 
     private List<StoreInfoVo> convertToStoreInfoList(JSONArray results, String  userId) {

+ 3 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreOperationalActivityServiceImpl.java

@@ -536,6 +536,9 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
             if (auditStatus == 1) {
                 return 5;
             }
+            if (auditStatus == 0) {
+                return 7;
+            }
         }
 
         if (activityStatus != null && activityStatus == 2) {