|
|
@@ -11,11 +11,16 @@ 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.LawyerLegalProblemScenario;
|
|
|
import shop.alien.entity.store.LawyerServiceArea;
|
|
|
import shop.alien.entity.store.LawyerUser;
|
|
|
+import shop.alien.entity.store.LawyerUserSearchHistory;
|
|
|
import shop.alien.mapper.LawyerUserMapper;
|
|
|
+import shop.alien.store.service.LawyerLegalProblemScenarioService;
|
|
|
import shop.alien.store.service.LawyerServiceAreaService;
|
|
|
+import shop.alien.store.service.LawyerUserSearchHistoryService;
|
|
|
import shop.alien.store.service.LawyerUserService;
|
|
|
+import shop.alien.util.myBaticsPlus.QueryBuilder;
|
|
|
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
@@ -34,6 +39,8 @@ public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerU
|
|
|
|
|
|
private final LawyerUserMapper lawyerUserMapper;
|
|
|
private final LawyerServiceAreaService lawyerServiceAreaService;
|
|
|
+ private final LawyerUserSearchHistoryService userSearchHistoryService;
|
|
|
+ private final LawyerLegalProblemScenarioService lawyerLegalProblemScenarioService;
|
|
|
|
|
|
@Override
|
|
|
public R<IPage<LawyerUser>> getLawyerUserList(int pageNum, int pageSize, String name, String phone, Integer status) {
|
|
|
@@ -163,44 +170,114 @@ public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerU
|
|
|
// 构建查询条件
|
|
|
QueryWrapper<LawyerUser> queryWrapper = new QueryWrapper<>();
|
|
|
queryWrapper.eq("delete_flag", 0)
|
|
|
- .eq("status", 1) // 已启用
|
|
|
- .eq("order_receiving_status", 1); // 接单中
|
|
|
+ .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);
|
|
|
+ List<Integer> lawyerIds = getLawyerIdsByCategoryId(categoryId);
|
|
|
+ if (lawyerIds.isEmpty()) {
|
|
|
+ // 如果没有匹配的律师,返回空结果
|
|
|
+ return R.data(new Page<>(pageNum, pageSizeNum));
|
|
|
}
|
|
|
+ queryWrapper.in("id", lawyerIds);
|
|
|
}
|
|
|
|
|
|
// 排序:优先推荐律师 -> 在线律师 -> 注册时间
|
|
|
- queryWrapper.orderByDesc("is_recommended") // 优先推荐律师(1在前,0在后)
|
|
|
- .orderByDesc("is_online") // 然后在线律师(1在前,0在后)
|
|
|
- .orderByAsc("created_time"); // 最后按注册时间升序(最早注册的在前面)
|
|
|
+ queryWrapper.orderByDesc("is_recommended")
|
|
|
+ .orderByDesc("is_online")
|
|
|
+ .orderByAsc("created_time");
|
|
|
|
|
|
// 分页查询
|
|
|
Page<LawyerUser> pageObj = new Page<>(pageNum, pageSizeNum);
|
|
|
IPage<LawyerUser> pageResult = this.page(pageObj, queryWrapper);
|
|
|
|
|
|
+ // 为每个律师设置关联的法律问题场景列表
|
|
|
+ if (pageResult.getRecords() != null && !pageResult.getRecords().isEmpty()) {
|
|
|
+ setLawyerScenarios(pageResult.getRecords());
|
|
|
+ }
|
|
|
+
|
|
|
return R.data(pageResult);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 根据分类ID获取律师ID列表
|
|
|
+ */
|
|
|
+ private List<Integer> getLawyerIdsByCategoryId(Integer categoryId) {
|
|
|
+ QueryWrapper<LawyerServiceArea> areaQuery = new QueryWrapper<>();
|
|
|
+ areaQuery.eq("problem_scenario_id", categoryId)
|
|
|
+ .eq("delete_flag", 0)
|
|
|
+ .eq("status", 1)
|
|
|
+ .select("lawyer_user_id");
|
|
|
+ List<LawyerServiceArea> serviceAreas = lawyerServiceAreaService.list(areaQuery);
|
|
|
+ return serviceAreas.stream()
|
|
|
+ .map(LawyerServiceArea::getLawyerUserId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 为律师列表设置关联的法律问题场景
|
|
|
+ */
|
|
|
+ private void setLawyerScenarios(List<LawyerUser> lawyers) {
|
|
|
+ List<Integer> lawyerIds = lawyers.stream()
|
|
|
+ .map(LawyerUser::getId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 批量查询律师服务领域关联
|
|
|
+ QueryWrapper<LawyerServiceArea> areaQuery = new QueryWrapper<>();
|
|
|
+ areaQuery.in("lawyer_user_id", lawyerIds)
|
|
|
+ .eq("delete_flag", 0)
|
|
|
+ .eq("status", 1)
|
|
|
+ .orderByAsc("sort_order");
|
|
|
+ List<LawyerServiceArea> serviceAreas = lawyerServiceAreaService.list(areaQuery);
|
|
|
+
|
|
|
+ if (serviceAreas.isEmpty()) {
|
|
|
+ // 如果没有服务领域关联,设置空列表
|
|
|
+ lawyers.forEach(lawyer -> lawyer.setLawyerLegalProblemScenarioList(new ArrayList<>()));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取所有关联的法律问题场景ID
|
|
|
+ Set<Integer> scenarioIds = serviceAreas.stream()
|
|
|
+ .map(LawyerServiceArea::getProblemScenarioId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 批量查询法律问题场景
|
|
|
+ Map<Integer, LawyerLegalProblemScenario> scenarioMap = getScenarioMap(scenarioIds);
|
|
|
+
|
|
|
+ // 按律师ID分组服务领域(已按sort_order排序)
|
|
|
+ Map<Integer, List<LawyerServiceArea>> lawyerAreaMap = serviceAreas.stream()
|
|
|
+ .collect(Collectors.groupingBy(LawyerServiceArea::getLawyerUserId));
|
|
|
+
|
|
|
+ // 为每个律师设置关联的法律问题场景列表
|
|
|
+ lawyers.forEach(lawyer -> {
|
|
|
+ List<LawyerLegalProblemScenario> scenarioList = lawyerAreaMap.getOrDefault(lawyer.getId(), Collections.emptyList())
|
|
|
+ .stream()
|
|
|
+ .map(area -> scenarioMap.get(area.getProblemScenarioId()))
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ lawyer.setLawyerLegalProblemScenarioList(scenarioList);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量查询法律问题场景并转换为Map
|
|
|
+ */
|
|
|
+ private Map<Integer, LawyerLegalProblemScenario> getScenarioMap(Set<Integer> scenarioIds) {
|
|
|
+ if (scenarioIds.isEmpty()) {
|
|
|
+ return Collections.emptyMap();
|
|
|
+ }
|
|
|
+ List<LawyerLegalProblemScenario> scenarios = new ArrayList<>(lawyerLegalProblemScenarioService.listByIds(scenarioIds));
|
|
|
+ return scenarios.stream()
|
|
|
+ .filter(s -> s.getDeleteFlag() != null && s.getDeleteFlag() == 0)
|
|
|
+ .collect(Collectors.toMap(LawyerLegalProblemScenario::getId, s -> s, (k1, k2) -> k1));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
public R<IPage<LawyerUser>> getRecommendedLawyersBySession(String sessionId, Integer messageId) {
|
|
|
log.info("LawyerUserServiceImpl.getRecommendedLawyersBySession?sessionId={},messageId={}", sessionId, messageId);
|
|
|
@@ -209,5 +286,58 @@ public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerU
|
|
|
// 这里暂时返回推荐列表(可以复用上面的逻辑)
|
|
|
return getRecommendedLawyerList(1, 10, null);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R<IPage<LawyerUser>> searchLawyerByName(String name, int page, int pageSize, Integer clientUserId) {
|
|
|
+ log.info("LawyerUserServiceImpl.searchLawyerByName?name={},page={},pageSize={},clientUserId={}", name, page, pageSize, clientUserId);
|
|
|
+
|
|
|
+ // 参数校验
|
|
|
+ if (name == null || name.trim().isEmpty()) {
|
|
|
+ return R.fail("姓名不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ int pageNum = page > 0 ? page : 1;
|
|
|
+ int pageSizeNum = pageSize > 0 ? pageSize : 10;
|
|
|
+
|
|
|
+ // 通过姓名模糊查询律师(分页)
|
|
|
+ LawyerUser query = new LawyerUser();
|
|
|
+ query.setName(name.trim());
|
|
|
+ IPage<LawyerUser> pageResult = QueryBuilder.of(query)
|
|
|
+ .likeFields("name") // 姓名支持模糊查询
|
|
|
+ .page(pageNum, pageSizeNum)
|
|
|
+ .build()
|
|
|
+ .page(this);
|
|
|
+
|
|
|
+ // 如果提供了用户ID,保存搜索历史(如果不存在则添加)
|
|
|
+ if (clientUserId != null) {
|
|
|
+ try {
|
|
|
+ String keyword = name.trim();
|
|
|
+ // 检查是否已存在相同的搜索历史记录
|
|
|
+ LambdaQueryWrapper<LawyerUserSearchHistory> checkWrapper = new LambdaQueryWrapper<>();
|
|
|
+ checkWrapper.eq(LawyerUserSearchHistory::getClientUserId, clientUserId)
|
|
|
+ .eq(LawyerUserSearchHistory::getSearchKeyword, keyword)
|
|
|
+ .eq(LawyerUserSearchHistory::getSearchType, 0) // 0:律师姓名
|
|
|
+ .eq(LawyerUserSearchHistory::getDeleteFlag, 0);
|
|
|
+ long count = userSearchHistoryService.count(checkWrapper);
|
|
|
+
|
|
|
+ // 如果不存在相同的记录,则添加
|
|
|
+ if (count == 0) {
|
|
|
+ LawyerUserSearchHistory searchHistory = new LawyerUserSearchHistory();
|
|
|
+ searchHistory.setClientUserId(clientUserId);
|
|
|
+ searchHistory.setSearchKeyword(keyword);
|
|
|
+ searchHistory.setSearchType(0); // 0:律师姓名
|
|
|
+ userSearchHistoryService.addUserSearchHistory(searchHistory);
|
|
|
+ log.info("保存搜索历史成功:用户ID={}, 关键词={}", clientUserId, keyword);
|
|
|
+ } else {
|
|
|
+ log.debug("搜索历史已存在,跳过添加:用户ID={}, 关键词={}", clientUserId, keyword);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("保存搜索历史失败:用户ID={}, 关键词={}, 错误={}", clientUserId, name, e.getMessage(), e);
|
|
|
+ // 保存历史失败不影响查询结果返回
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return R.data(pageResult);
|
|
|
+ }
|
|
|
}
|
|
|
|