|
@@ -120,10 +120,34 @@ public class QwExternalContactController extends BaseController
|
|
|
qwExternalContact.setStatusCondition(split);
|
|
qwExternalContact.setStatusCondition(split);
|
|
|
}
|
|
}
|
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 批量查询所有客户的标签名称,避免N+1查询
|
|
|
|
|
+ List<String> allTagIds = list.stream()
|
|
|
|
|
+ .map(QwExternalContactVO::getTagIds)
|
|
|
|
|
+ .filter(tagIds -> !Objects.equals(tagIds, "[]") && tagIds != null)
|
|
|
|
|
+ .flatMap(tagIds -> {
|
|
|
|
|
+ Gson gson = new Gson();
|
|
|
|
|
+ List<String> ids = gson.fromJson(tagIds, new TypeToken<List<String>>() {}.getType());
|
|
|
|
|
+ return ids.stream();
|
|
|
|
|
+ })
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, String> tagIdToName = batchQueryTagIdToName(allTagIds);
|
|
|
|
|
+
|
|
|
|
|
+ // 批量查询所有客户的下载APP状态,避免N+1查询
|
|
|
|
|
+ Set<Long> downloadAppUserIds = list.stream()
|
|
|
|
|
+ .map(QwExternalContactVO::getFsUserId)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
+
|
|
|
|
|
+ downloadAppUserIds = batchQueryDownloadAppUserIds(downloadAppUserIds);
|
|
|
|
|
+
|
|
|
|
|
+ Set<Long> finalDownloadAppUserIds = downloadAppUserIds;
|
|
|
list.forEach(item->{
|
|
list.forEach(item->{
|
|
|
|
|
|
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
|
- QwTagSearchParam param = new QwTagSearchParam();
|
|
|
|
|
Gson gson = new Gson();
|
|
Gson gson = new Gson();
|
|
|
List<String> tagIds = gson.fromJson(
|
|
List<String> tagIds = gson.fromJson(
|
|
|
item.getTagIds(),
|
|
item.getTagIds(),
|
|
@@ -131,25 +155,20 @@ public class QwExternalContactController extends BaseController
|
|
|
}.getType()
|
|
}.getType()
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- param.setTagIds(tagIds);
|
|
|
|
|
-
|
|
|
|
|
- item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
|
|
|
|
|
|
|
+ List<String> tagNames = tagIds.stream()
|
|
|
|
|
+ .filter(tagIdToName::containsKey)
|
|
|
|
|
+ .map(tagIdToName::get)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ item.setTagIdsName(tagNames);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|
|
|
item.setState(item.getState()+"-"+getContactWayNameStream(item.getState(), wayList));
|
|
item.setState(item.getState()+"-"+getContactWayNameStream(item.getState(), wayList));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (item.getFsUserId() != null) {
|
|
|
|
|
- FsUser fsUser = fsUserService.selectFsUserByUserId(item.getFsUserId());
|
|
|
|
|
- if (fsUser != null && (fsUser.getSource() != null || fsUser.getLoginDevice() != null)) {
|
|
|
|
|
- item.setIsDownloadApp(1);
|
|
|
|
|
- } else {
|
|
|
|
|
- item.setIsDownloadApp(0);
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- item.setIsDownloadApp(0);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ item.setIsDownloadApp(
|
|
|
|
|
+ item.getFsUserId() != null && finalDownloadAppUserIds.contains(item.getFsUserId()) ? 1 : 0
|
|
|
|
|
+ );
|
|
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -186,6 +205,47 @@ public class QwExternalContactController extends BaseController
|
|
|
return input.substring(lastColonIndex + 1);
|
|
return input.substring(lastColonIndex + 1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 分批查询标签ID对应的标签名称,防止IN子句过长
|
|
|
|
|
+ */
|
|
|
|
|
+ private Map<String, String> batchQueryTagIdToName(List<String> tagIds) {
|
|
|
|
|
+ if (tagIds == null || tagIds.isEmpty()) {
|
|
|
|
|
+ return Collections.emptyMap();
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<String, String> result = new HashMap<>();
|
|
|
|
|
+ int batchSize = 500;
|
|
|
|
|
+ int total = tagIds.size();
|
|
|
|
|
+ for (int i = 0; i < total; i += batchSize) {
|
|
|
|
|
+ int end = Math.min(i + batchSize, total);
|
|
|
|
|
+ List<String> batch = tagIds.subList(i, end);
|
|
|
|
|
+ List<QwTag> tagList = iQwTagService.selectQwTagListByTagIds(batch);
|
|
|
|
|
+ tagList.forEach(tag -> result.putIfAbsent(tag.getTagId(), tag.getName()));
|
|
|
|
|
+ }
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 分批查询已下载APP的用户ID集合,防止IN子句过长
|
|
|
|
|
+ */
|
|
|
|
|
+ private Set<Long> batchQueryDownloadAppUserIds(Set<Long> userIds) {
|
|
|
|
|
+ if (userIds == null || userIds.isEmpty()) {
|
|
|
|
|
+ return Collections.emptySet();
|
|
|
|
|
+ }
|
|
|
|
|
+ List<Long> userIdList = new ArrayList<>(userIds);
|
|
|
|
|
+ Set<Long> result = new HashSet<>();
|
|
|
|
|
+ int batchSize = 500;
|
|
|
|
|
+ int total = userIdList.size();
|
|
|
|
|
+ for (int i = 0; i < total; i += batchSize) {
|
|
|
|
|
+ int end = Math.min(i + batchSize, total);
|
|
|
|
|
+ List<Long> batch = userIdList.subList(i, end);
|
|
|
|
|
+ List<FsUser> fsUsers = fsUserService.selectFsUserSourceByUserIds(batch);
|
|
|
|
|
+ fsUsers.stream()
|
|
|
|
|
+ .filter(u -> u.getSource() != null || u.getLoginDevice() != null)
|
|
|
|
|
+ .map(FsUser::getUserId)
|
|
|
|
|
+ .forEach(result::add);
|
|
|
|
|
+ }
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
@GetMapping("/test")
|
|
@GetMapping("/test")
|
|
|
public AjaxResult test()
|
|
public AjaxResult test()
|
|
@@ -240,10 +300,33 @@ public class QwExternalContactController extends BaseController
|
|
|
|
|
|
|
|
startPage();
|
|
startPage();
|
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
|
|
|
+
|
|
|
|
|
+ // 批量查询所有客户的标签名称,避免N+1查询
|
|
|
|
|
+ List<String> allTagIds = list.stream()
|
|
|
|
|
+ .map(QwExternalContactVO::getTagIds)
|
|
|
|
|
+ .filter(tagIds -> !Objects.equals(tagIds, "[]") && tagIds != null)
|
|
|
|
|
+ .flatMap(tagIds -> {
|
|
|
|
|
+ Gson gson = new Gson();
|
|
|
|
|
+ List<String> ids = gson.fromJson(tagIds, new TypeToken<List<String>>() {}.getType());
|
|
|
|
|
+ return ids.stream();
|
|
|
|
|
+ })
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, String> tagIdToName = batchQueryTagIdToName(allTagIds);
|
|
|
|
|
+
|
|
|
|
|
+ // 批量查询所有客户的下载APP状态,避免N+1查询
|
|
|
|
|
+ Set<Long> downloadAppUserIds = list.stream()
|
|
|
|
|
+ .map(QwExternalContactVO::getFsUserId)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
+
|
|
|
|
|
+ downloadAppUserIds = batchQueryDownloadAppUserIds(downloadAppUserIds);
|
|
|
|
|
+
|
|
|
|
|
+ Set<Long> finalDownloadAppUserIds = downloadAppUserIds;
|
|
|
list.forEach(item->{
|
|
list.forEach(item->{
|
|
|
|
|
|
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
|
- QwTagSearchParam param = new QwTagSearchParam();
|
|
|
|
|
Gson gson = new Gson();
|
|
Gson gson = new Gson();
|
|
|
List<String> tagIds = gson.fromJson(
|
|
List<String> tagIds = gson.fromJson(
|
|
|
item.getTagIds(),
|
|
item.getTagIds(),
|
|
@@ -251,25 +334,20 @@ public class QwExternalContactController extends BaseController
|
|
|
}.getType()
|
|
}.getType()
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- param.setTagIds(tagIds);
|
|
|
|
|
-
|
|
|
|
|
- item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
|
|
|
|
|
|
|
+ List<String> tagNames = tagIds.stream()
|
|
|
|
|
+ .filter(tagIdToName::containsKey)
|
|
|
|
|
+ .map(tagIdToName::get)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ item.setTagIdsName(tagNames);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|
|
|
item.setState(item.getState()+"-"+getContactWayNameStream(item.getState(), wayList));
|
|
item.setState(item.getState()+"-"+getContactWayNameStream(item.getState(), wayList));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (item.getFsUserId() != null) {
|
|
|
|
|
- FsUser fsUser = fsUserService.selectFsUserByUserId(item.getFsUserId());
|
|
|
|
|
- if (fsUser != null && (fsUser.getSource() != null || fsUser.getLoginDevice() != null)) {
|
|
|
|
|
- item.setIsDownloadApp(1);
|
|
|
|
|
- } else {
|
|
|
|
|
- item.setIsDownloadApp(0);
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- item.setIsDownloadApp(0);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ item.setIsDownloadApp(
|
|
|
|
|
+ item.getFsUserId() != null && finalDownloadAppUserIds.contains(item.getFsUserId()) ? 1 : 0
|
|
|
|
|
+ );
|
|
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -293,10 +371,35 @@ public class QwExternalContactController extends BaseController
|
|
|
startPage();
|
|
startPage();
|
|
|
qwExternalContact.setCompanyId(loginUser.getCompany().getCompanyId());
|
|
qwExternalContact.setCompanyId(loginUser.getCompany().getCompanyId());
|
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 批量查询所有客户的标签名称,避免N+1查询
|
|
|
|
|
+ List<String> allTagIds = list.stream()
|
|
|
|
|
+ .map(QwExternalContactVO::getTagIds)
|
|
|
|
|
+ .filter(tagIds -> !Objects.equals(tagIds, "[]") && tagIds != null)
|
|
|
|
|
+ .flatMap(tagIds -> {
|
|
|
|
|
+ Gson gson = new Gson();
|
|
|
|
|
+ List<String> ids = gson.fromJson(tagIds, new TypeToken<List<String>>() {}.getType());
|
|
|
|
|
+ return ids.stream();
|
|
|
|
|
+ })
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, String> tagIdToName = batchQueryTagIdToName(allTagIds);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 批量查询所有客户的下载APP状态,避免N+1查询
|
|
|
|
|
+ Set<Long> downloadAppUserIds = list.stream()
|
|
|
|
|
+ .map(QwExternalContactVO::getFsUserId)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
+
|
|
|
|
|
+ downloadAppUserIds = batchQueryDownloadAppUserIds(downloadAppUserIds);
|
|
|
|
|
+
|
|
|
|
|
+ Set<Long> finalDownloadAppUserIds = downloadAppUserIds;
|
|
|
list.forEach(item->{
|
|
list.forEach(item->{
|
|
|
|
|
|
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
|
- QwTagSearchParam param = new QwTagSearchParam();
|
|
|
|
|
Gson gson = new Gson();
|
|
Gson gson = new Gson();
|
|
|
List<String> tagIds = gson.fromJson(
|
|
List<String> tagIds = gson.fromJson(
|
|
|
item.getTagIds(),
|
|
item.getTagIds(),
|
|
@@ -304,14 +407,21 @@ public class QwExternalContactController extends BaseController
|
|
|
}.getType()
|
|
}.getType()
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- param.setTagIds(tagIds);
|
|
|
|
|
-
|
|
|
|
|
- item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
|
|
|
|
|
|
|
+ List<String> tagNames = tagIds.stream()
|
|
|
|
|
+ .filter(tagIdToName::containsKey)
|
|
|
|
|
+ .map(tagIdToName::get)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ item.setTagIdsName(tagNames);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|
|
|
item.setState(item.getState()+"-"+getContactWayNameStream(item.getState(), wayList));
|
|
item.setState(item.getState()+"-"+getContactWayNameStream(item.getState(), wayList));
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ item.setIsDownloadApp(
|
|
|
|
|
+ item.getFsUserId() != null && finalDownloadAppUserIds.contains(item.getFsUserId()) ? 1 : 0
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
//获取用户下单次数
|
|
//获取用户下单次数
|
|
|
try {
|
|
try {
|
|
|
fillOrderCount(item);
|
|
fillOrderCount(item);
|
|
@@ -386,10 +496,24 @@ public class QwExternalContactController extends BaseController
|
|
|
qwExternalContact.setStatusCondition(split);
|
|
qwExternalContact.setStatusCondition(split);
|
|
|
}
|
|
}
|
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
|
|
|
+
|
|
|
|
|
+ // 批量查询所有客户的标签名称,避免N+1查询
|
|
|
|
|
+ List<String> allTagIds = list.stream()
|
|
|
|
|
+ .map(QwExternalContactVO::getTagIds)
|
|
|
|
|
+ .filter(tagIds -> !Objects.equals(tagIds, "[]") && tagIds != null)
|
|
|
|
|
+ .flatMap(tagIds -> {
|
|
|
|
|
+ Gson gson = new Gson();
|
|
|
|
|
+ List<String> ids = gson.fromJson(tagIds, new TypeToken<List<String>>() {}.getType());
|
|
|
|
|
+ return ids.stream();
|
|
|
|
|
+ })
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, String> tagIdToName = batchQueryTagIdToName(allTagIds);
|
|
|
|
|
+
|
|
|
list.forEach(item->{
|
|
list.forEach(item->{
|
|
|
|
|
|
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
|
- QwTagSearchParam param = new QwTagSearchParam();
|
|
|
|
|
Gson gson = new Gson();
|
|
Gson gson = new Gson();
|
|
|
List<String> tagIds = gson.fromJson(
|
|
List<String> tagIds = gson.fromJson(
|
|
|
item.getTagIds(),
|
|
item.getTagIds(),
|
|
@@ -397,9 +521,11 @@ public class QwExternalContactController extends BaseController
|
|
|
}.getType()
|
|
}.getType()
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- param.setTagIds(tagIds);
|
|
|
|
|
-
|
|
|
|
|
- item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
|
|
|
|
|
|
|
+ List<String> tagNames = tagIds.stream()
|
|
|
|
|
+ .filter(tagIdToName::containsKey)
|
|
|
|
|
+ .map(tagIdToName::get)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ item.setTagIdsName(tagNames);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|
|
@@ -432,10 +558,23 @@ public class QwExternalContactController extends BaseController
|
|
|
|
|
|
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
|
|
|
|
|
|
|
|
|
|
+ // 批量查询所有客户的标签名称,避免N+1查询
|
|
|
|
|
+ List<String> allTagIds = list.stream()
|
|
|
|
|
+ .map(QwExternalContactVO::getTagIds)
|
|
|
|
|
+ .filter(tagIds -> !Objects.equals(tagIds, "[]") && tagIds != null)
|
|
|
|
|
+ .flatMap(tagIds -> {
|
|
|
|
|
+ Gson gson = new Gson();
|
|
|
|
|
+ List<String> ids = gson.fromJson(tagIds, new TypeToken<List<String>>() {}.getType());
|
|
|
|
|
+ return ids.stream();
|
|
|
|
|
+ })
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, String> tagIdToName = batchQueryTagIdToName(allTagIds);
|
|
|
|
|
+
|
|
|
list.forEach(item->{
|
|
list.forEach(item->{
|
|
|
|
|
|
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
|
|
|
- QwTagSearchParam param = new QwTagSearchParam();
|
|
|
|
|
Gson gson = new Gson();
|
|
Gson gson = new Gson();
|
|
|
List<String> tagIds = gson.fromJson(
|
|
List<String> tagIds = gson.fromJson(
|
|
|
item.getTagIds(),
|
|
item.getTagIds(),
|
|
@@ -443,9 +582,11 @@ public class QwExternalContactController extends BaseController
|
|
|
}.getType()
|
|
}.getType()
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- param.setTagIds(tagIds);
|
|
|
|
|
-
|
|
|
|
|
- item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
|
|
|
|
|
|
|
+ List<String> tagNames = tagIds.stream()
|
|
|
|
|
+ .filter(tagIdToName::containsKey)
|
|
|
|
|
+ .map(tagIdToName::get)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ item.setTagIdsName(tagNames);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|
|
if (!StringUtil.strIsNullOrEmpty(item.getState()) && !wayList.isEmpty()) {
|