Commit bf15a15c by 田超

Merge branch 'feature/1006444' into 'master'

feat:[1006444]平台端上书查询增加CRM企微群上书查询

See merge request rays/pcloud-book!1499
parents 3f3334da 313dcbb7
......@@ -9,23 +9,18 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.pcloud.book.advertising.entity.AdvertisingLinkClick;
import com.pcloud.book.applet.biz.AppletThirdResourcesBiz;
import com.pcloud.book.applet.dto.AppletThirdResourcesDTO;
import com.pcloud.book.applet.entity.AppletThirdResources;
import com.pcloud.book.applet.entity.AppletThirdResourcesClick;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.group.dto.ResourceOnBookDTO;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.SessionUtil;
import com.pcloud.common.utils.cookie.Cookie;
import com.pcloud.readercenter.wechat.exception.WechatUserException;
import com.pcloud.settlementcenter.account.enums.IsSystem;
import java.util.Map;
......@@ -47,7 +42,7 @@ public class AppletThirdResourcesFacade {
Long wechatUserId = Cookie.getId(userInfo, Cookie._WECHAT_USER_ID);
Long officialAccountsId = Cookie.getId(userInfo, Cookie._OFFICIAL_ACCOUNTS_ID);
if (null == thirdResourcesClick || null == thirdResourcesClick.getThirdResourcesId() ) {
throw new WechatUserException(WechatUserException.FIELD_IS_NULL, "缺失参数");
throw new BookBizException(BookBizException.PARAM_IS_NULL, "缺失参数");
}
thirdResourcesClick.setWechatUserId(wechatUserId);
thirdResourcesClick.setOfficialAccountsId(officialAccountsId);
......
......@@ -3,7 +3,9 @@ package com.pcloud.book.book.biz;
import com.pcloud.book.book.vo.request.BookQrcodeWxworkRequestVO;
import com.pcloud.book.book.vo.response.BookQrcodeWxworkResponseVO;
import com.pcloud.book.group.dto.BookGroupServeCountDTO;
import com.pcloud.book.group.dto.ResourceOnBookDTO;
import com.pcloud.book.group.dto.WxworkQrcodeDTO;
import com.pcloud.common.page.PageBeanNew;
import java.util.List;
import java.util.Map;
......@@ -78,4 +80,20 @@ public interface BookQrcodeWxworkBiz {
* @Date 16:39 2021/12/10
**/
List<WxworkQrcodeDTO> getWxworkQrcodesBySceneId4Official(Long sceneId);
/**
* 企微群码上书列表
* @author:zhuyajie
* @date:2022/1/10
* * @param null
*/
PageBeanNew<ResourceOnBookDTO> listWxworkGroupOnBook(Integer currentPage, Integer numPerPage, Long groupId);
/**
* @Description 导出-企微群码上书列表
* @Author zhuyajie
* @Date 19:42 2021/12/14
**/
void exportWxworkGroupOnBook(Long groupId,Long partyId);
}
package com.pcloud.book.book.biz.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import io.swagger.models.auth.In;
import com.alibaba.fastjson.JSONObject;
import com.pcloud.book.applet.biz.AppletGroupSearchRecordBiz;
import com.pcloud.book.applet.dto.AppletGroupStatementDTO;
import com.pcloud.book.applet.dto.PvuvDTO;
import com.pcloud.book.applet.entity.AppletThirdResources;
import com.pcloud.book.applet.enums.DataRecordTypeEnum;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.book.biz.BookBiz;
import com.pcloud.book.book.biz.BookQrcodeWxworkBiz;
import com.pcloud.book.book.dao.BookQrcodeWxworkDao;
import com.pcloud.book.book.dto.BookDto;
import com.pcloud.book.book.entity.BookQrcodeWxwork;
import com.pcloud.book.book.enums.BookQrcodeType;
import com.pcloud.book.book.enums.WxworkQrcodeType;
import com.pcloud.book.book.vo.request.BookQrcodeWxworkRequestVO;
import com.pcloud.book.book.vo.response.BookQrcodeWxworkResponseVO;
import com.pcloud.book.consumer.channel.QrcodeSceneConsr;
import com.pcloud.book.consumer.common.ExportConsr;
import com.pcloud.book.consumer.data.DataConsr;
import com.pcloud.book.consumer.erp.ErpConsr;
import com.pcloud.book.consumer.message.MessageConsr;
import com.pcloud.book.consumer.user.AdviserConsr;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.constant.ResourcePageConstants;
import com.pcloud.book.group.dao.BookGroupDao;
import com.pcloud.book.group.dao.ResourcePageItemDao;
import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.BookGroupServeCountDTO;
import com.pcloud.book.group.dto.ResourceOnBookDTO;
import com.pcloud.book.group.dto.WxworkQrcodeDTO;
import com.pcloud.book.group.vo.CrmContactQrcodeVO;
import com.pcloud.book.util.common.ThreadPoolUtils;
import com.pcloud.channelcenter.qrcode.dto.QrcodeSceneDto;
import com.pcloud.common.core.constant.SystemCode;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.page.PageParam;
import com.pcloud.common.utils.DateUtils;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.data.domain.vo.CalQrcodeTargetVO;
import com.pcloud.usercenter.party.adviser.dto.AdviserBaseInfoDto;
import com.pcloud.wechatgroup.wxwork.dto.WxworkGroupQrcodeBaseDTO;
import com.pcloud.wechatgroup.wxwork.dto.WxworkQrcodeBaseDTO;
......@@ -30,6 +54,7 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -57,6 +82,18 @@ public class BookQrcodeWxworkBizImpl implements BookQrcodeWxworkBiz {
private AppletGroupSearchRecordBiz appletGroupSearchRecordBiz;
@Autowired
private ErpConsr erpConsr;
@Autowired
private BookBiz bookBiz;
@Autowired
private AdviserConsr adviserConsr;
@Autowired
private DataConsr dataConsr;
@Autowired
private ResourcePageItemDao resourcePageItemDao;
@Autowired
private ExportConsr exportConsr;
@Autowired
private MessageConsr messageConsr;
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -334,4 +371,135 @@ public class BookQrcodeWxworkBizImpl implements BookQrcodeWxworkBiz {
}
return wxworkQrcodeDTOS;
}
@Override
public PageBeanNew<ResourceOnBookDTO> listWxworkGroupOnBook(Integer currentPage, Integer numPerPage, Long groupId) {
if (null == currentPage || null == numPerPage || null == groupId) {
throw new BookBizException(BookBizException.PARAM_IS_NULL,"缺少参数");
}
List<ResourceOnBookDTO> list = this.getGroupOnBookList(groupId);
if (ListUtils.isEmpty(list)) {
return new PageBeanNew<>(currentPage,numPerPage,list.size(),new ArrayList<>());
}
List<ResourceOnBookDTO> recordList = list.stream().skip(currentPage*numPerPage).limit(numPerPage).collect(Collectors.toList());
this.fillInfo4OnBook(recordList);
PageBeanNew pageBeanNew = new PageBeanNew(currentPage,numPerPage,list.size(),recordList);
return pageBeanNew;
}
private List<ResourceOnBookDTO> getGroupOnBookList(Long groupId) {
List<ResourceOnBookDTO> list = new ArrayList<>();
if (null == groupId) {
return list;
}
//RAYS码配置的群
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("serveId", groupId);
paramMap.put("serveType", ResourcePageConstants.ServeTypeEnum.WXWORK_GROUP.getValue());
List<ResourceOnBookDTO> pageList = resourcePageItemDao.listResourceOnBook(paramMap);
if (!ListUtils.isEmpty(pageList)) {
list.addAll(pageList);
}
//公众号码配置
List<ResourceOnBookDTO> officialList = bookQrcodeWxworkDao.listGroupOnBook(groupId);
if (!ListUtils.isEmpty(officialList)) {
list.addAll(officialList);
}
return list;
}
private void fillInfo4OnBook(List<ResourceOnBookDTO> list) {
if (ListUtils.isEmpty(list)) {
return;
}
List<Long> bookIds = new ArrayList<>();
List<Long> channelIds = new ArrayList<>();
List<Long> sceneIds = new ArrayList<>();
List<Long> adviserIds = new ArrayList<>();
for (ResourceOnBookDTO vo:list) {
sceneIds.add(vo.getSceneId());
if (null != vo.getBookId() && !bookIds.contains(vo.getBookId())) {
bookIds.add(vo.getBookId());
}
if (null != vo.getAdviserId() && !adviserIds.contains(vo.getAdviserId())) {
adviserIds.add(vo.getAdviserId());
}
if (null != vo.getChannelId() && !channelIds.contains(vo.getChannelId())) {
channelIds.add(vo.getChannelId());
}
}
//二维码信息
Map<Long, QrcodeSceneDto> qrcodeSceneDtoMap = qrcodeSceneConsr.listBaseInfoByIds(sceneIds);
//书刊信息
Map<Long, BookDto> bookDtoMap = bookBiz.listBaseByIds(bookIds);
//编辑信息
Map<Long, AdviserBaseInfoDto> adviserDtoMap = adviserConsr.getAdviserId2AdviserInfoDtoMap(adviserIds);
//二维码扫码人数浏览人数
Map<String, CalQrcodeTargetVO> qrcodeStatisMap = dataConsr.mapQrcodeStatisByBookIds(bookIds, adviserIds, channelIds, sceneIds);
for (ResourceOnBookDTO vo:list) {
if (!MapUtils.isEmpty(qrcodeSceneDtoMap) && qrcodeSceneDtoMap.containsKey(vo.getSceneId())) {
QrcodeSceneDto qrcodeSceneDto = qrcodeSceneDtoMap.get(vo.getSceneId());
vo.setSceneName(qrcodeSceneDto.getSceneName());
}
if (!MapUtils.isEmpty(bookDtoMap) && null != vo.getBookId() && bookDtoMap.containsKey(vo.getBookId())) {
BookDto bookDto = bookDtoMap.get(vo.getBookId());
vo.setBookName(bookDto.getBookName());
vo.setIsbn(bookDto.getIsbn());
}
if (!MapUtils.isEmpty(adviserDtoMap) && null != vo.getAdviserId() && adviserDtoMap.containsKey(vo.getAdviserId())) {
AdviserBaseInfoDto adviserBaseInfoDto = adviserDtoMap.get(vo.getAdviserId());
vo.setAdviserName(adviserBaseInfoDto.getPartyName());
vo.setAgentName(adviserBaseInfoDto.getAgentName());
}
String qrcodeKey = StrUtil.join("-", vo.getBookId(), vo.getAdviserId(), vo.getChannelId(), vo.getSceneId());
if (!MapUtils.isEmpty(qrcodeStatisMap) && qrcodeStatisMap.containsKey(qrcodeKey)) {
CalQrcodeTargetVO statisDTO = qrcodeStatisMap.get(qrcodeKey);
vo.setScanNum(statisDTO.getSca());
vo.setBrowseNum(statisDTO.getPva());
vo.setReaderNum(statisDTO.getUa());
}
}
}
@Override
public void exportWxworkGroupOnBook(Long groupId, Long partyId) {
if (null == groupId) {
throw new BookBizException(BookBizException.PARAM_IS_NULL,"缺少参数");
}
ThreadPoolUtils.EXPORT_THREAD_POOL.execute(()->{
WxworkGroupQrcodeBaseDTO groupQrcodeBaseDTO = wechatGroupConsr.getWxworkGroupQrcodeBaseById(groupId);
List<ResourceOnBookDTO> list = this.getGroupOnBookList(groupId);
if (ListUtils.isEmpty(list)) {
return;
}
this.fillInfo4OnBook(list);
List<Object[]> excelDatas = new ArrayList<>();
String[] rowsName = {"二维码ID","二维码名称", "书刊ID", "书刊名称", "isbn", "编辑名称", "出版社名称", "二维码扫码量", "二维码读者量","二维码浏览量"};
for (ResourceOnBookDTO vo : list) {
Object[] objs = new Object[rowsName.length];
objs[0] = vo.getSceneId();
objs[1] = vo.getSceneName();
objs[2] = vo.getBookId();
objs[3] = vo.getBookName();
objs[4] = vo.getIsbn();
objs[5] = vo.getAdviserName();
objs[6] = vo.getAgentName();
objs[7] = vo.getScanNum();
objs[8] = vo.getReaderNum();
objs[9] = vo.getBrowseNum();
excelDatas.add(objs);
}
String title = groupQrcodeBaseDTO.getGroupQrcodeName()+"-企微群上书明细";
String fileUrl = exportConsr.exportExcel(title, rowsName, excelDatas);
if (!StringUtil.isEmpty(fileUrl)) {
String letterType = "qrcode_download";
String fileName = title + DateUtils.today();
JSONObject content = new JSONObject();
content.put("commitTime", DateUtils.formatDate(new Date()));
content.put("type",title);
messageConsr.sendLetter(0L, partyId, content.toJSONString(), SystemCode.pcloud.code, letterType, fileUrl, fileName);
}
});
}
}
......@@ -2,6 +2,7 @@ package com.pcloud.book.book.dao;
import com.pcloud.book.book.entity.BookQrcodeWxwork;
import com.pcloud.book.group.dto.BookGroupServeCountDTO;
import com.pcloud.book.group.dto.ResourceOnBookDTO;
import com.pcloud.common.core.dao.BaseDao;
import java.util.List;
......@@ -68,4 +69,11 @@ public interface BookQrcodeWxworkDao extends BaseDao<BookQrcodeWxwork>{
* @Date 16:44 2021/12/10
**/
List<BookQrcodeWxwork> getByQrcodeId(Long bookQrcodeId, Integer bookQrcodeType);
/**
* @Description 书刊上书情况
* @Author zhuyajie
* @Date 13:06 2022/1/11
**/
List<ResourceOnBookDTO> listGroupOnBook(Long groupId);
}
......@@ -3,6 +3,7 @@ package com.pcloud.book.book.dao.impl;
import com.pcloud.book.book.dao.BookQrcodeWxworkDao;
import com.pcloud.book.book.entity.BookQrcodeWxwork;
import com.pcloud.book.group.dto.BookGroupServeCountDTO;
import com.pcloud.book.group.dto.ResourceOnBookDTO;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
......@@ -90,4 +91,9 @@ public class BookQrcodeWxworkDaoImpl extends BaseDaoImpl<BookQrcodeWxwork> imple
map.put("bookQrcodeType", bookQrcodeType);
return getSessionTemplate().selectList(getStatement("getByQrcodeId"), map);
}
@Override
public List<ResourceOnBookDTO> listGroupOnBook(Long groupId) {
return getSessionTemplate().selectList(getStatement("listGroupOnBook"), groupId);
}
}
......@@ -56,4 +56,23 @@ public class BookWxworkFacade {
@RequestParam(value = "wxworkQrcodeType", required = false) Integer wxworkQrcodeType) {
return new ResponseDto<>(bookQrcodeWxworkBiz.getWxworkQrcodeInfoByBook4Rays(bookId, channelId, adviserId, wxworkQrcodeType));
}
@ApiOperation("企微群码上书列表")
@GetMapping("listWxworkGroupOnBook")
public ResponseDto<?> listWxworkGroupOnBook(@RequestHeader("token") String token,
@RequestParam("currentPage") Integer currentPage,
@RequestParam("numPerPage") Integer numPerPage,
@RequestParam("groupId") Long groupId) {
Long partyId = (Long) SessionUtil.getVlaue(token, SessionUtil.PARTY_ID);
return new ResponseDto<>(bookQrcodeWxworkBiz.listWxworkGroupOnBook(currentPage, numPerPage, groupId));
}
@ApiOperation("导出-企微群码上书列表")
@GetMapping("exportWxworkGroupOnBook")
public ResponseDto<?> exportWxworkGroupOnBook(@RequestHeader("token") String token,
@RequestParam("groupId")Long groupId) {
Long partyId = (Long) SessionUtil.getVlaue(token, SessionUtil.PARTY_ID);
bookQrcodeWxworkBiz.exportWxworkGroupOnBook(groupId,partyId);
return new ResponseDto<>();
}
}
......@@ -174,4 +174,21 @@
and book_qrcode_id = #{bookQrcodeId}
</select>
<select id="listGroupOnBook" parameterType="long" resultType="com.pcloud.book.group.dto.ResourceOnBookDTO">
SELECT
wxwork_qrcode_id serveId,
book_qrcode_id sceneId,
book_id bookId,
adviser_id adviserId,
channel_id channelId
FROM
book_qrcode_wxwork
WHERE
wxwork_qrcode_id = #{groupId}
AND book_qrcode_type = 1
AND wxwork_qrcode_type = 2
GROUP BY
book_qrcode_id
</select>
</mapper>
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