Browse Source

更新 律师平台 用户端 获取推荐律师列表 接口

LuTong 1 month ago
parent
commit
e533bad885

+ 53 - 0
alien-store/src/main/java/shop/alien/store/controller/LawyerUserController.java

@@ -113,5 +113,58 @@ public class LawyerUserController {
                 .page(lawyerUserService);
         return R.data(pageResult);
     }
+
+    @ApiOperation("获取律师详情")
+    @ApiOperationSupport(order = 7)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "lawyerId", value = "律师ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/detail")
+    public R<Map<String, Object>> getLawyerDetail(@RequestParam Integer lawyerId) {
+        log.info("LawyerUserController.getLawyerDetail?lawyerId={}", lawyerId);
+        return lawyerUserService.getLawyerDetail(lawyerId);
+    }
+
+    @ApiOperation("获取律师在线状态")
+    @ApiOperationSupport(order = 8)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "lawyerIds", value = "律师ID数组(逗号分隔)", dataType = "String", paramType = "query", required = true)
+    })
+    @GetMapping("/onlineStatus")
+    public R<Map<Integer, Boolean>> getLawyerOnlineStatus(@RequestParam String lawyerIds) {
+        log.info("LawyerUserController.getLawyerOnlineStatus?lawyerIds={}", lawyerIds);
+        return lawyerUserService.getLawyerOnlineStatus(lawyerIds);
+    }
+
+    @ApiOperation("获取推荐律师列表")
+    @ApiOperationSupport(order = 9)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "页码(默认1)", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "pageSize", value = "每页数量(默认10)", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "categoryId", value = "分类ID(可选)", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/recommend/list")
+    public R<IPage<LawyerUser>> getRecommendedLawyerList(
+            @RequestParam(defaultValue = "1") int page,
+            @RequestParam(defaultValue = "10") int pageSize,
+            @RequestParam(required = false) Integer categoryId) {
+        log.info("LawyerUserController.getRecommendedLawyerList?page={},pageSize={},categoryId={}",
+                page, pageSize, categoryId);
+        return lawyerUserService.getRecommendedLawyerList(page, pageSize, categoryId);
+    }
+
+    @ApiOperation("根据会话获取推荐律师列表")
+    @ApiOperationSupport(order = 10)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "sessionId", value = "会话ID", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "messageId", value = "消息ID(可选)", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/recommend/bySession")
+    public R<IPage<LawyerUser>> getRecommendedLawyersBySession(
+            @RequestParam String sessionId,
+            @RequestParam(required = false) Integer messageId) {
+        log.info("LawyerUserController.getRecommendedLawyersBySession?sessionId={},messageId={}", sessionId, messageId);
+        return lawyerUserService.getRecommendedLawyersBySession(sessionId, messageId);
+    }
 }
 

+ 36 - 0
alien-store/src/main/java/shop/alien/store/service/LawyerUserService.java

@@ -6,6 +6,7 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerUser;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 律师用户 服务类
@@ -50,5 +51,40 @@ public interface LawyerUserService extends IService<LawyerUser> {
      * @return R<Boolean>
      */
     R<Boolean> deleteLawyerUser(Integer id);
+
+    /**
+     * 获取律师详情
+     *
+     * @param lawyerId 律师ID
+     * @return R<Map<String, Object>>
+     */
+    R<Map<String, Object>> getLawyerDetail(Integer lawyerId);
+
+    /**
+     * 获取律师在线状态
+     *
+     * @param lawyerIds 律师ID数组(逗号分隔)
+     * @return R<Map<Integer, Boolean>>
+     */
+    R<Map<Integer, Boolean>> getLawyerOnlineStatus(String lawyerIds);
+
+    /**
+     * 获取推荐律师列表
+     *
+     * @param page       页码
+     * @param pageSize   每页数量
+     * @param categoryId 分类ID(可选)
+     * @return R<IPage<LawyerUser>>
+     */
+    R<IPage<LawyerUser>> getRecommendedLawyerList(int page, int pageSize, Integer categoryId);
+
+    /**
+     * 根据会话获取推荐律师列表
+     *
+     * @param sessionId 会话ID
+     * @param messageId 消息ID(可选)
+     * @return R<IPage<LawyerUser>>
+     */
+    R<IPage<LawyerUser>> getRecommendedLawyersBySession(String sessionId, Integer messageId);
 }
 

+ 132 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LawyerUserServiceImpl.java

@@ -1,5 +1,6 @@
 package shop.alien.store.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,10 +11,15 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.result.R;
+import shop.alien.entity.store.LawyerServiceArea;
 import shop.alien.entity.store.LawyerUser;
 import shop.alien.mapper.LawyerUserMapper;
+import shop.alien.store.service.LawyerServiceAreaService;
 import shop.alien.store.service.LawyerUserService;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * 律师用户 服务实现类
  *
@@ -27,6 +33,7 @@ import shop.alien.store.service.LawyerUserService;
 public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerUser> implements LawyerUserService {
 
     private final LawyerUserMapper lawyerUserMapper;
+    private final LawyerServiceAreaService lawyerServiceAreaService;
 
     @Override
     public R<IPage<LawyerUser>> getLawyerUserList(int pageNum, int pageSize, String name, String phone, Integer status) {
@@ -77,5 +84,130 @@ public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerU
         }
         return R.fail("删除失败");
     }
+
+    @Override
+    public R<Map<String, Object>> getLawyerDetail(Integer lawyerId) {
+        log.info("LawyerUserServiceImpl.getLawyerDetail?lawyerId={}", lawyerId);
+
+        LawyerUser lawyer = this.getById(lawyerId);
+        if (lawyer == null || lawyer.getDeleteFlag() == 1) {
+            return R.fail("律师不存在");
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("id", lawyer.getId());
+        result.put("name", lawyer.getName());
+        result.put("avatar", lawyer.getHeadImg() != null ? lawyer.getHeadImg() : "");
+        result.put("intro", lawyer.getPersonalIntroduction() != null ? lawyer.getPersonalIntroduction() :
+                (lawyer.getAccountBlurb() != null ? lawyer.getAccountBlurb() : "Ta还没有个人业务介绍"));
+        result.put("field", lawyer.getSpecialtyFields() != null ? lawyer.getSpecialtyFields() : "");
+        result.put("experience", lawyer.getPracticeYears() != null ? lawyer.getPracticeYears() : 0);
+        result.put("lawFirm", lawyer.getLawFirm() != null ? lawyer.getLawFirm() : "");
+        result.put("online", lawyer.getIsOnline() != null && lawyer.getIsOnline() == 1);
+        result.put("price", lawyer.getConsultationFee() != null ? lawyer.getConsultationFee() / 100 : 0);
+
+        // 获取服务标签
+        QueryWrapper<LawyerServiceArea> tagQuery = new QueryWrapper<>();
+        tagQuery.eq("lawyer_user_id", lawyer.getId())
+                .eq("delete_flag", 0)
+                .eq("status", 1)
+                .orderByAsc("sort_order");
+        List<LawyerServiceArea> serviceAreas = lawyerServiceAreaService.list(tagQuery);
+        result.put("serviceTags", new ArrayList<>());  // TODO: 需要关联查询问题场景名称
+
+        // 额外字段
+        result.put("education", lawyer.getEducationBackground() != null ? lawyer.getEducationBackground() : "");
+        result.put("credentials", new ArrayList<>());  // TODO: 需要查询资质证书
+        result.put("caseCount", lawyer.getServiceCount() != null ? lawyer.getServiceCount() : 0);
+        // 评分:服务评分转换为0-5星评分
+        result.put("rating", lawyer.getServiceScore() != null ? lawyer.getServiceScore() / 20.0 : 0.0);
+        result.put("reviewCount", lawyer.getGoodReviewCount() != null ?
+                (lawyer.getGoodReviewCount() + (lawyer.getMediumReviewCount() != null ? lawyer.getMediumReviewCount() : 0) +
+                 (lawyer.getBadReviewCount() != null ? lawyer.getBadReviewCount() : 0)) : 0);
+
+        return R.data(result);
+    }
+
+    @Override
+    public R<Map<Integer, Boolean>> getLawyerOnlineStatus(String lawyerIds) {
+        log.info("LawyerUserServiceImpl.getLawyerOnlineStatus?lawyerIds={}", lawyerIds);
+
+        String[] ids = lawyerIds.split(",");
+        List<Integer> idList = Arrays.stream(ids)
+                .map(String::trim)
+                .filter(s -> !s.isEmpty())
+                .map(Integer::parseInt)
+                .collect(Collectors.toList());
+
+        if (idList.isEmpty()) {
+            return R.data(new HashMap<>());
+        }
+
+        List<LawyerUser> lawyers = new ArrayList<>(this.listByIds(idList));
+        Map<Integer, Boolean> result = new HashMap<>();
+        for (LawyerUser lawyer : lawyers) {
+            result.put(lawyer.getId(), lawyer.getIsOnline() != null && lawyer.getIsOnline() == 1);
+        }
+
+        return R.data(result);
+    }
+
+    @Override
+    public R<IPage<LawyerUser>> getRecommendedLawyerList(int page, int pageSize, Integer categoryId) {
+        log.info("LawyerUserServiceImpl.getRecommendedLawyerList?page={},pageSize={},categoryId={}",
+                page, pageSize, categoryId);
+
+        int pageNum = page > 0 ? page : 1;
+        int pageSizeNum = pageSize > 0 ? pageSize : 10;
+
+        // 构建查询条件
+        QueryWrapper<LawyerUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("delete_flag", 0)
+                .eq("status", 1)  // 已启用
+                .eq("order_receiving_status", 1);  // 接单中
+
+        // 分类筛选:通过律师服务领域关联表查询
+        if (categoryId != null) {
+            QueryWrapper<LawyerServiceArea> areaQuery = new QueryWrapper<>();
+            areaQuery.eq("problem_scenar_id", categoryId)
+                    .eq("delete_flag", 0)
+                    .eq("status", 1);
+            List<LawyerServiceArea> serviceAreas = lawyerServiceAreaService.list(areaQuery);
+            if (!serviceAreas.isEmpty()) {
+                List<Integer> lawyerIds = serviceAreas.stream()
+                        .map(LawyerServiceArea::getLawyerUserId)
+                        .distinct()
+                        .collect(Collectors.toList());
+                if (!lawyerIds.isEmpty()) {
+                    queryWrapper.in("id", lawyerIds);
+                } else {
+                    // 如果没有匹配的律师,返回空结果
+                    queryWrapper.eq("id", -1);
+                }
+            } else {
+                queryWrapper.eq("id", -1);
+            }
+        }
+
+        // 排序:优先推荐律师 -> 在线律师 -> 注册时间
+        queryWrapper.orderByDesc("is_recommended")  // 优先推荐律师(1在前,0在后)
+                .orderByDesc("is_online")  // 然后在线律师(1在前,0在后)
+                .orderByAsc("created_time");  // 最后按注册时间升序(最早注册的在前面)
+
+        // 分页查询
+        Page<LawyerUser> pageObj = new Page<>(pageNum, pageSizeNum);
+        IPage<LawyerUser> pageResult = this.page(pageObj, queryWrapper);
+
+        return R.data(pageResult);
+    }
+
+    @Override
+    public R<IPage<LawyerUser>> getRecommendedLawyersBySession(String sessionId, Integer messageId) {
+        log.info("LawyerUserServiceImpl.getRecommendedLawyersBySession?sessionId={},messageId={}", sessionId, messageId);
+
+        // TODO: 根据会话ID查询AI交互日志,获取关联的问题场景ID,然后推荐相关律师
+        // 这里暂时返回推荐列表(可以复用上面的逻辑)
+        return getRecommendedLawyerList(1, 10, null);
+    }
 }