Commit 77c27dcc by 田超

Merge branch 'feature/1003262' into 'master'

feat: [1003262] 微信群筛选方案

See merge request rays/pcloud-book!818
parents b9e22633 cba8d09b
package com.pcloud.book.es.biz; package com.pcloud.book.es.biz;
import com.pcloud.book.es.dto.ESBookGroupQrcodeDTO; import com.pcloud.book.es.dto.ESBookGroupQrcodeDTO;
import com.pcloud.book.es.dto.GroupQrcodeSearchDTO;
import com.pcloud.book.es.entity.ESBookGroupQrcode; import com.pcloud.book.es.entity.ESBookGroupQrcode;
import com.pcloud.common.page.PageBeanNew;
import java.util.List; import java.util.List;
...@@ -26,5 +28,5 @@ public interface ESBookGroupQrcodeBiz { ...@@ -26,5 +28,5 @@ public interface ESBookGroupQrcodeBiz {
*/ */
void save(List<ESBookGroupQrcodeDTO> dtos); void save(List<ESBookGroupQrcodeDTO> dtos);
List<ESBookGroupQrcode> search(String text, Integer pageSize, Integer pageNum); PageBeanNew<GroupQrcodeSearchDTO> search(String text, Integer pageSize, Integer pageNum);
} }
...@@ -8,15 +8,20 @@ import com.alibaba.fastjson.JSONObject; ...@@ -8,15 +8,20 @@ import com.alibaba.fastjson.JSONObject;
import com.pcloud.book.book.constant.BookConstant; import com.pcloud.book.book.constant.BookConstant;
import com.pcloud.book.consumer.reader.ReaderConsr; import com.pcloud.book.consumer.reader.ReaderConsr;
import com.pcloud.book.consumer.trade.TradeConsr; import com.pcloud.book.consumer.trade.TradeConsr;
import com.pcloud.book.consumer.user.AdviserConsr;
import com.pcloud.book.consumer.user.AgentConsr;
import com.pcloud.book.consumer.wechat.WechatConsr; import com.pcloud.book.consumer.wechat.WechatConsr;
import com.pcloud.book.es.biz.ESBookGroupQrcodeBiz; import com.pcloud.book.es.biz.ESBookGroupQrcodeBiz;
import com.pcloud.book.es.dto.BookAdviserInfo; import com.pcloud.book.es.dto.BookAdviserInfo;
import com.pcloud.book.es.dto.BookTagDTO; import com.pcloud.book.es.dto.BookTagDTO;
import com.pcloud.book.es.dto.ESBookGroupQrcodeDTO; import com.pcloud.book.es.dto.ESBookGroupQrcodeDTO;
import com.pcloud.book.es.dto.GroupQrcodeSearchDTO;
import com.pcloud.book.es.entity.ESBookGroupQrcode; import com.pcloud.book.es.entity.ESBookGroupQrcode;
import com.pcloud.book.es.repository.BookGroupQrcodeRepository; import com.pcloud.book.es.repository.BookGroupQrcodeRepository;
import com.pcloud.book.group.dao.BookGroupClassifyDao; import com.pcloud.book.group.dao.BookGroupClassifyDao;
import com.pcloud.book.group.dao.GroupQrcodeDao; import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils; import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.pcloud.facade.tradecenter.dto.OrderGroupFormDto; import com.pcloud.facade.tradecenter.dto.OrderGroupFormDto;
import com.pcloud.usercenter.party.agent.dto.AgentCity; import com.pcloud.usercenter.party.agent.dto.AgentCity;
...@@ -25,15 +30,15 @@ import lombok.extern.slf4j.Slf4j; ...@@ -25,15 +30,15 @@ import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.admin.indices.analyze.AnalyzeAction; import org.elasticsearch.action.admin.indices.analyze.AnalyzeAction;
import org.elasticsearch.action.admin.indices.analyze.AnalyzeRequestBuilder; import org.elasticsearch.action.admin.indices.analyze.AnalyzeRequestBuilder;
import org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse; import org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -67,6 +72,10 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz { ...@@ -67,6 +72,10 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz {
private WechatConsr wechatConsr; private WechatConsr wechatConsr;
@Autowired @Autowired
private TradeConsr tradeConsr; private TradeConsr tradeConsr;
@Autowired
private AdviserConsr adviserConsr;
@Autowired
private AgentConsr agentConsr;
@Override @Override
public void initData() { public void initData() {
...@@ -121,6 +130,22 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz { ...@@ -121,6 +130,22 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz {
List<Long> collect = qrcodes.stream().map(ESBookGroupQrcode::getWeixinQrcodeId).distinct().filter(Objects::nonNull).collect(Collectors.toList()); List<Long> collect = qrcodes.stream().map(ESBookGroupQrcode::getWeixinQrcodeId).distinct().filter(Objects::nonNull).collect(Collectors.toList());
Map<Long, OrderGroupFormDto> orderGroupForm4ES = tradeConsr.getOrderGroupForm4ES(collect); Map<Long, OrderGroupFormDto> orderGroupForm4ES = tradeConsr.getOrderGroupForm4ES(collect);
// 查询编辑姓名列表
Map<Long, String> adviserNames = CollUtil.newHashMap(0);
if (CollUtil.isNotEmpty(advisers)){
adviserNames = adviserConsr.getNames(advisers);
}
// 查询出版社名称列表
Map<Long, String> agentNames = CollUtil.newHashMap(0);
if (CollUtil.isNotEmpty(agentCityMap)){
List<Long> agentIds = agentCityMap.values().stream().filter(Objects::nonNull).map(AgentCity::getAgentId).distinct().collect(Collectors.toList());
if (CollUtil.isNotEmpty(agentIds)){
agentNames = agentConsr.getNames(agentIds);
}
}
for (ESBookGroupQrcode qrcode : qrcodes) { for (ESBookGroupQrcode qrcode : qrcodes) {
if (qrcode == null) { if (qrcode == null) {
continue; continue;
...@@ -137,6 +162,9 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz { ...@@ -137,6 +162,9 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz {
// 根据书名获取分词标签 // 根据书名获取分词标签
List<String> bookNameTags = qrcode.getBookNameTags() == null ? new ArrayList<>() : qrcode.getBookNameTags(); List<String> bookNameTags = qrcode.getBookNameTags() == null ? new ArrayList<>() : qrcode.getBookNameTags();
List<String> newBookNameTags = new ArrayList<>(); List<String> newBookNameTags = new ArrayList<>();
if (!CollUtil.isEmpty(classifyBookMap) && classifyBookMap.get(qrcode.getClassifyId()) != null){
qrcode.setIsbn(classifyBookMap.get(qrcode.getClassifyId()).getIsbn());
}
if (JedisClusterUtils.hexists(BookConstant.BOOK_NAME_TAGS_CACHE, String.valueOf(qrcode.getClassifyId()))) { if (JedisClusterUtils.hexists(BookConstant.BOOK_NAME_TAGS_CACHE, String.valueOf(qrcode.getClassifyId()))) {
BookTagDTO bookTagDTO = JedisClusterUtils.hgetJson2Class(BookConstant.BOOK_NAME_TAGS_CACHE, String.valueOf(qrcode.getClassifyId()), BookTagDTO.class); BookTagDTO bookTagDTO = JedisClusterUtils.hgetJson2Class(BookConstant.BOOK_NAME_TAGS_CACHE, String.valueOf(qrcode.getClassifyId()), BookTagDTO.class);
newBookNameTags = bookTagDTO.getBookTags(); newBookNameTags = bookTagDTO.getBookTags();
...@@ -154,13 +182,19 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz { ...@@ -154,13 +182,19 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz {
qrcode.setBookNameTags(bookNameTags.stream().distinct().collect(Collectors.toList())); qrcode.setBookNameTags(bookNameTags.stream().distinct().collect(Collectors.toList()));
} }
// 获取书对应的出版社,并将出版社的地理位置作为群的地理标签 // 获取书对应的出版社,并将出版社的地理位置作为群的地理标签,并补充出版社和编辑名称
if (qrcode.getCreateUser()!=null&agentCityMap.get(qrcode.getCreateUser())!=null){ if (qrcode.getCreateUser() != null) {
List<String> strings = CollUtil.toList(agentCityMap.get(qrcode.getCreateUser()).getCity()); qrcode.setAdviserName(adviserNames.get(qrcode.getCreateUser()));
strings = strings == null ? new ArrayList<>() : strings; AgentCity agentCity = agentCityMap.get(qrcode.getCreateUser());
qrcode.setPressTags(CollUtil.removeEmpty(strings)); if (agentCity != null) {
qrcode.setAgentName(agentNames.get(agentCity.getAgentId()));
List<String> strings = CollUtil.toList(agentCity.getCity());
strings = strings == null ? new ArrayList<>() : strings;
qrcode.setPressTags(CollUtil.removeEmpty(strings));
}
} }
// 补充城市及性别信息 // 补充城市及性别信息
if (!CollUtil.isEmpty(qrcodeDTOMap)) { if (!CollUtil.isEmpty(qrcodeDTOMap)) {
ESGroupBookQrcodeDTO qrcodeDTO = qrcodeDTOMap.get(qrcode.getWeixinGroupId()); ESGroupBookQrcodeDTO qrcodeDTO = qrcodeDTOMap.get(qrcode.getWeixinGroupId());
...@@ -227,14 +261,49 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz { ...@@ -227,14 +261,49 @@ public class ESBookGroupQrcodeBizImpl implements ESBookGroupQrcodeBiz {
} }
@Override @Override
public List<ESBookGroupQrcode> search(String text, Integer pageSize, Integer pageNum) { public PageBeanNew<GroupQrcodeSearchDTO> search(String text, Integer pageSize, Integer pageNum) {
QueryBuilder queryBuilder; QueryBuilder queryBuilder;
if (StrUtil.isEmpty(text)) { if (StrUtil.isEmpty(text)) {
queryBuilder = QueryBuilders.boolQuery(); queryBuilder = QueryBuilders.boolQuery();
} else { } else {
queryBuilder = QueryBuilders.multiMatchQuery(text, "pressTags", "cityTags", "groupNameTags", "pressTags", "bookNameTags", "groupName", "qrcodeBookName"); queryBuilder = QueryBuilders.multiMatchQuery(text, "pressTags", "cityTags", "groupNameTags", "pressTags", "bookNameTags", "groupName", "qrcodeBookName");
} }
Iterable<ESBookGroupQrcode> result = bookGroupQrcodeRepository.search(queryBuilder, new PageRequest(pageNum, pageSize)); Page<ESBookGroupQrcode> page = bookGroupQrcodeRepository.search(queryBuilder, new PageRequest(pageNum, pageSize));
return IterUtil.toList(result);
List<GroupQrcodeSearchDTO> list = convert(page.getContent());
if (CollUtil.isEmpty(list)){
return new PageBeanNew<>(pageNum,pageSize,null);
}
return new PageBeanNew<>(pageNum,pageSize,(int)page.getTotalElements(),list);
}
private List<GroupQrcodeSearchDTO> convert(List<ESBookGroupQrcode> content) {
if (CollUtil.isEmpty(content)){
return new ArrayList<>();
}
List<GroupQrcodeSearchDTO> list = new ArrayList<>(content.size());
for (ESBookGroupQrcode esBookGroupQrcode : content) {
GroupQrcodeSearchDTO groupQrcodeSearchDTO = new GroupQrcodeSearchDTO();
if (CollUtil.isNotEmpty(content)){
BeanUtil.copyProperties(esBookGroupQrcode,groupQrcodeSearchDTO);
int male = esBookGroupQrcode.getMaleCount()==null?0: esBookGroupQrcode.getMaleCount();
int female = esBookGroupQrcode.getFemaleCount()==null?0: esBookGroupQrcode.getFemaleCount();
int unknown = esBookGroupQrcode.getUnknownCount()==null?0: esBookGroupQrcode.getUnknownCount();
groupQrcodeSearchDTO.setGroupMemberCount(male+female+unknown);
groupQrcodeSearchDTO.setPayMemberCount(esBookGroupQrcode.getFemaleCount());
if (StrUtil.isEmpty(esBookGroupQrcode.getPurchaseAmount())){
groupQrcodeSearchDTO.setPurchaseAmount(BigDecimal.ZERO);
}else {
groupQrcodeSearchDTO.setPurchaseAmount(new BigDecimal(esBookGroupQrcode.getPurchaseAmount()));
}
GroupQrcode qrcode = groupQrcodeDao.getById(esBookGroupQrcode.getId());
if (qrcode!=null&&qrcode.getQrcodeUrl()!=null){
groupQrcodeSearchDTO.setQrcodeUrl(qrcode.getQrcodeUrl());
}
}
list.add(groupQrcodeSearchDTO);
}
return list;
} }
} }
...@@ -18,4 +18,6 @@ public class BookAdviserInfo { ...@@ -18,4 +18,6 @@ public class BookAdviserInfo {
private Long adviserId; private Long adviserId;
private String isbn;
} }
package com.pcloud.book.es.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 群二维码搜索结果封装
*
* @author guiq
* @version 1.0
* @since 2020年7月16日
*/
@Data
@ApiModel("群二维码搜索结果封装")
public class GroupQrcodeSearchDTO {
@ApiModelProperty("book_group_qrcode.id")
private Long id;
@ApiModelProperty("群名称")
private String groupName;
@ApiModelProperty("群成员人数")
private Integer groupMemberCount;
@ApiModelProperty("群付费人数")
private Integer payMemberCount;
@ApiModelProperty("付费总额")
private BigDecimal purchaseAmount;
@ApiModelProperty("订单总量")
private Integer purchaseVolume;
@ApiModelProperty("书名")
private String qrcodeBookName;
@ApiModelProperty("ISBN")
private String isbn;
@ApiModelProperty("编辑")
private String adviserName;
@ApiModelProperty("出版社")
private String agentName;
@ApiModelProperty("男性人数")
private Integer maleCount;
@ApiModelProperty("女性人数")
private Integer femaleCount;
@ApiModelProperty("未知性别人数")
private Integer unknownCount;
@ApiModelProperty("成员城市标签")
private List<String> cityTags;
@ApiModelProperty("群名称标签")
private List<String> groupNameTags;
@ApiModelProperty("书名标签")
private List<String> bookNameTags;
@ApiModelProperty("出版社城市")
private List<String> pressTags;
@ApiModelProperty("群二维码")
private String qrcodeUrl;
}
...@@ -157,5 +157,23 @@ public class ESBookGroupQrcode { ...@@ -157,5 +157,23 @@ public class ESBookGroupQrcode {
*/ */
private Long amountActuallyPaid; private Long amountActuallyPaid;
/**
* 编辑名称
*/
@Field(type = FieldType.String,index = FieldIndex.not_analyzed)
private String adviserName;
/**
* 出版社名称
*/
@Field(type = FieldType.String,index = FieldIndex.analyzed,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
private String agentName;
/**
* 图书ISBN
*/
@Field(type = FieldType.String,index = FieldIndex.not_analyzed)
private String isbn;
} }
package com.pcloud.book.es.facade.impl; package com.pcloud.book.es.facade.impl;
import com.pcloud.book.es.biz.ESBookGroupQrcodeBiz; import com.pcloud.book.es.biz.ESBookGroupQrcodeBiz;
import com.pcloud.book.es.entity.ESBookGroupQrcode; import com.pcloud.book.es.dto.GroupQrcodeSearchDTO;
import com.pcloud.common.dto.ResponseDto; import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.page.PageBeanNew;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -11,8 +12,6 @@ import org.springframework.web.bind.annotation.RequestMethod; ...@@ -11,8 +12,6 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController("esBookGroupQrcodeFacade") @RestController("esBookGroupQrcodeFacade")
@RequestMapping("esBookGroupQrcode") @RequestMapping("esBookGroupQrcode")
@Api(description = "book_group_qrcode ES 外部接口") @Api(description = "book_group_qrcode ES 外部接口")
...@@ -28,13 +27,13 @@ public class ESBookGroupQrcodeFacadeImpl { ...@@ -28,13 +27,13 @@ public class ESBookGroupQrcodeFacadeImpl {
return new ResponseDto<>(); return new ResponseDto<>();
} }
@ApiOperation(value = "搜索群 标签/群名称",httpMethod = "GET") @ApiOperation(value = "搜索群 标签/群名称", httpMethod = "GET")
@RequestMapping(value = "/search",method = RequestMethod.GET) @RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseDto<List<ESBookGroupQrcode>> search(@RequestParam(value = "text",required = false)String text, public ResponseDto<PageBeanNew<GroupQrcodeSearchDTO>> search(@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam("pageSize") Integer pageSize, @RequestParam("numPerPage") Integer numPerPage,
@RequestParam("pageNum") Integer pageNum){ @RequestParam("currentPage") Integer currentPage) {
return new ResponseDto<>(esBookGroupQrcodeBiz.search(text, pageSize, pageNum)); return new ResponseDto<>(esBookGroupQrcodeBiz.search(keyword, numPerPage, currentPage));
} }
} }
...@@ -1224,7 +1224,8 @@ ...@@ -1224,7 +1224,8 @@
SELECT SELECT
a.id AS classifyId, a.id AS classifyId,
a.create_user AS adviserId, a.create_user AS adviserId,
b.BOOK_NAME AS bookName b.BOOK_NAME AS bookName,
b.ISBN AS isbn
FROM FROM
book_group_classify a book_group_classify a
LEFT JOIN book b ON a.book_id = b.BOOK_ID LEFT JOIN book b ON a.book_id = b.BOOK_ID
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment