Commit ad9bea68 by 朱亚洁

feat:[1006809]书码流程

parent f11bbe78
...@@ -1055,11 +1055,13 @@ public class BookBizImpl implements BookBiz { ...@@ -1055,11 +1055,13 @@ public class BookBizImpl implements BookBiz {
// 设置二维码相关信息 // 设置二维码相关信息
bookSet.setQrInfo(pageBean.getRecordList()); bookSet.setQrInfo(pageBean.getRecordList());
//社群书相关信息 //社群书相关信息
bookSet.setBookGroupInfo(pageBean.getRecordList()); // bookSet.setBookGroupInfo(pageBean.getRecordList());
//设置书刊资源目录按钮展示 //设置书刊资源目录按钮展示
bookSet.setBookCatalogInfo(pageBean.getRecordList(), adviserId); bookSet.setBookCatalogInfo(pageBean.getRecordList(), adviserId);
//设置书刊是否是小睿书(开启小睿流程) //设置书刊是否是小睿书(开启小睿流程)
bookSet.setOpenRobotProcess(pageBean.getRecordList()); bookSet.setOpenRobotProcess(pageBean.getRecordList());
//设置Rays码资源数量
bookSet.setQrcodeMessage(pageBean.getRecordList());
return pageBean; return pageBean;
} }
......
...@@ -61,8 +61,10 @@ import com.pcloud.book.group.biz.ResourcePageBiz; ...@@ -61,8 +61,10 @@ import com.pcloud.book.group.biz.ResourcePageBiz;
import com.pcloud.book.group.dao.BookGroupClassifyDao; import com.pcloud.book.group.dao.BookGroupClassifyDao;
import com.pcloud.book.group.dao.BookGroupDao; import com.pcloud.book.group.dao.BookGroupDao;
import com.pcloud.book.group.dto.BookGroupDTO; import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.BookGroupServeCountDTO;
import com.pcloud.book.group.dto.BookGroupStatisticDTO; import com.pcloud.book.group.dto.BookGroupStatisticDTO;
import com.pcloud.book.util.common.ThreadPoolUtils; import com.pcloud.book.util.common.ThreadPoolUtils;
import com.pcloud.channelcenter.base.constants.ChannelConstants;
import com.pcloud.channelcenter.base.constants.MessageFromTypeEnum; import com.pcloud.channelcenter.base.constants.MessageFromTypeEnum;
import com.pcloud.channelcenter.qrcode.dto.Book4CatalogDTO; import com.pcloud.channelcenter.qrcode.dto.Book4CatalogDTO;
import com.pcloud.channelcenter.qrcode.dto.BookSceneIdListDTO; import com.pcloud.channelcenter.qrcode.dto.BookSceneIdListDTO;
...@@ -2138,4 +2140,25 @@ public class BookSet { ...@@ -2138,4 +2140,25 @@ public class BookSet {
} }
this.setProDepPurLabelNames(bookDtos); this.setProDepPurLabelNames(bookDtos);
} }
public void setQrcodeMessage(List<Object> recordList) {
if (ListUtils.isEmpty(recordList)) {
return;
}
List<Long> sceneIds = new ArrayList<>();
for (Object obj : recordList) {
BookDto bookDto = (BookDto) obj;
if (null != bookDto.getSceneId() && ChannelConstants.QrCodeType.OWN.getName().equalsIgnoreCase(bookDto.getQrcodeType())) {
sceneIds.add(bookDto.getSceneId());
}
}
Map<Long, BookGroupServeCountDTO> serveCountDTOMap=resourcePageBiz.mapQrServeCount(sceneIds);
for (Object obj : recordList) {
BookDto bookDto = (BookDto) obj;
if (!MapUtils.isEmpty(serveCountDTOMap) &&null != bookDto.getSceneId() && serveCountDTOMap.containsKey(bookDto.getSceneId())) {
BookGroupServeCountDTO dto = serveCountDTOMap.get(bookDto.getSceneId());
bookDto.setMessageCount(dto.getServeCount());
}
}
}
} }
...@@ -95,4 +95,23 @@ public class ResourceConsr { ...@@ -95,4 +95,23 @@ public class ResourceConsr {
} }
return list; return list;
} }
/**
* 获取资源基本信息
*/
public Map<Long,ResourceDTO> mapResourceByIds(List<Long> resourceIds,boolean isFileInfo, boolean isPdfImage) throws BizException {
LOGGER.info("获取资源基本信息[resourceService.mapByIds],参数列表[resourceIds]:" + resourceIds);
Map<Long, ResourceDTO> resourceDtos = new HashMap<>();
if (ListUtils.isEmpty(resourceIds)) {
return resourceDtos;
}
try {
resourceDtos = ResponseHandleUtil.parseMapResponse(resourceService.mapByIds(resourceIds, isFileInfo, isPdfImage), Long.class, ResourceDTO.class);
LOGGER.info("获取资源基本信息【END】");
} catch (Exception e) {
LOGGER.error("获取资源基本信息[resourceService.mapByIds]:" + e.getMessage(), e);
throw new BookBizException(BookBizException.INVOKE_CONTENT_ERROR, "获取资源基本信息失败~!");
}
return resourceDtos;
}
} }
...@@ -7,11 +7,8 @@ import com.pcloud.book.base.exception.BookBizException; ...@@ -7,11 +7,8 @@ import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.util.common.ThreadPoolUtils; import com.pcloud.book.util.common.ThreadPoolUtils;
import com.pcloud.channelcenter.base.exceptions.ChannelBizException; import com.pcloud.channelcenter.base.exceptions.ChannelBizException;
import com.pcloud.common.exceptions.BizException; import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.utils.BeanUtils;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.ResponseHandleUtil; import com.pcloud.common.utils.ResponseHandleUtil;
import com.pcloud.common.utils.ThreadUtil;
import com.pcloud.resourcecenter.product.dto.ProDto; import com.pcloud.resourcecenter.product.dto.ProDto;
import com.pcloud.resourcecenter.product.dto.Product4BookDTO; import com.pcloud.resourcecenter.product.dto.Product4BookDTO;
import com.pcloud.resourcecenter.product.dto.ProductDto; import com.pcloud.resourcecenter.product.dto.ProductDto;
...@@ -21,6 +18,8 @@ import com.pcloud.resourcecenter.product.dto.UpdateAppProductParamDTO; ...@@ -21,6 +18,8 @@ import com.pcloud.resourcecenter.product.dto.UpdateAppProductParamDTO;
import com.pcloud.resourcecenter.product.entity.Article; import com.pcloud.resourcecenter.product.entity.Article;
import com.pcloud.resourcecenter.product.entity.Product; import com.pcloud.resourcecenter.product.entity.Product;
import com.pcloud.resourcecenter.product.service.ProductService; import com.pcloud.resourcecenter.product.service.ProductService;
import com.pcloud.resourcecenter.store.dto.SinglePageInfoDTO;
import com.pcloud.resourcecenter.store.service.StoreService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -54,6 +53,8 @@ public class ProductConsr { ...@@ -54,6 +53,8 @@ public class ProductConsr {
@Autowired @Autowired
private ProductService productService; private ProductService productService;
@Autowired
private StoreService storeService;
/** /**
* 微信端,资源中心拉取商品信息 * 微信端,资源中心拉取商品信息
...@@ -526,4 +527,21 @@ public class ProductConsr { ...@@ -526,4 +527,21 @@ public class ProductConsr {
} }
return result; return result;
} }
/**
* @Description 运营商城单页面信息
* @Author zhuyajie
* @Date 17:21 2022/3/14
**/
public Map<Long, SinglePageInfoDTO> mapSinglePageByIds(List<Long> singlePageIds) {
if (ListUtils.isEmpty(singlePageIds)) {
return new HashMap<>();
}
try {
return ResponseHandleUtil.parseMapResponse(storeService.mapSinglePageByIds(singlePageIds),Long.class,SinglePageInfoDTO.class);
} catch (Exception e) {
LOGGER.error("调用storeService.mapSinglePageByIds失败"+e.getMessage(),e);
}
return new HashMap<>();
}
} }
...@@ -17,6 +17,7 @@ import com.pcloud.book.group.entity.ResourcePageTool; ...@@ -17,6 +17,7 @@ import com.pcloud.book.group.entity.ResourcePageTool;
import com.pcloud.book.group.entity.ResourceRecomManage; import com.pcloud.book.group.entity.ResourceRecomManage;
import com.pcloud.book.group.vo.RecommendServeVO; import com.pcloud.book.group.vo.RecommendServeVO;
import com.pcloud.book.group.vo.ResourceColumnAndServeVO; import com.pcloud.book.group.vo.ResourceColumnAndServeVO;
import com.pcloud.book.group.vo.ResourcePageItemResourceVO;
import com.pcloud.book.group.vo.ResourcePageItemVO; import com.pcloud.book.group.vo.ResourcePageItemVO;
import com.pcloud.book.group.vo.ResourcePageOneServe; import com.pcloud.book.group.vo.ResourcePageOneServe;
import com.pcloud.book.group.vo.ResourcePageShareParam; import com.pcloud.book.group.vo.ResourcePageShareParam;
...@@ -184,7 +185,7 @@ public interface ResourcePageBiz { ...@@ -184,7 +185,7 @@ public interface ResourcePageBiz {
* @date:2021/4/21 15:09 * @date:2021/4/21 15:09
* * @param null * * @param null
*/ */
ResourcePageOneServe hasOneResource(Long bookGroupId, Long sceneId, Long wechatUserId); ResourcePageOneServe hasOneResource(Long bookGroupId, Long sceneId, Long wechatUserId, Boolean ignoreRays);
/** /**
* 自有码配置的资源列表 * 自有码配置的资源列表
...@@ -572,4 +573,12 @@ public interface ResourcePageBiz { ...@@ -572,4 +573,12 @@ public interface ResourcePageBiz {
* @return * @return
*/ */
List<ResourcePageItemVO> getServerList4Wechat(Long wechatUserId, Long sceneId); List<ResourcePageItemVO> getServerList4Wechat(Long wechatUserId, Long sceneId);
/**
* @Description 一码一资源,素材列表
* @Author zhuyajie
* @Date 13:39 2022/3/16
**/
List<ResourcePageItemResourceVO> listQrOneResourceByBook(Long sceneId, Long wechatUserId);
Map<Long, BookGroupServeCountDTO> mapQrServeCount(List<Long> sceneIds);
} }
...@@ -35,6 +35,7 @@ import com.pcloud.book.consumer.analysisengine.BrowseRecordConsr; ...@@ -35,6 +35,7 @@ import com.pcloud.book.consumer.analysisengine.BrowseRecordConsr;
import com.pcloud.book.consumer.app.AppConsr; import com.pcloud.book.consumer.app.AppConsr;
import com.pcloud.book.consumer.channel.QrcodeSceneConsr; import com.pcloud.book.consumer.channel.QrcodeSceneConsr;
import com.pcloud.book.consumer.combinedmarketing.MemberActivityConsr; import com.pcloud.book.consumer.combinedmarketing.MemberActivityConsr;
import com.pcloud.book.consumer.content.ResourceConsr;
import com.pcloud.book.consumer.erp.ErpConsr; import com.pcloud.book.consumer.erp.ErpConsr;
import com.pcloud.book.consumer.function.FunctionConsr; import com.pcloud.book.consumer.function.FunctionConsr;
import com.pcloud.book.consumer.raystask.AdviserTaskConsr; import com.pcloud.book.consumer.raystask.AdviserTaskConsr;
...@@ -104,6 +105,7 @@ import com.pcloud.book.group.vo.CrmContactQrcodeVO; ...@@ -104,6 +105,7 @@ import com.pcloud.book.group.vo.CrmContactQrcodeVO;
import com.pcloud.book.group.vo.RecommendServeVO; import com.pcloud.book.group.vo.RecommendServeVO;
import com.pcloud.book.group.vo.ResourceColumnAndServeVO; import com.pcloud.book.group.vo.ResourceColumnAndServeVO;
import com.pcloud.book.group.vo.ResourcePageBookstoreVO; import com.pcloud.book.group.vo.ResourcePageBookstoreVO;
import com.pcloud.book.group.vo.ResourcePageItemResourceVO;
import com.pcloud.book.group.vo.ResourcePageItemVO; import com.pcloud.book.group.vo.ResourcePageItemVO;
import com.pcloud.book.group.vo.ResourcePageOneServe; import com.pcloud.book.group.vo.ResourcePageOneServe;
import com.pcloud.book.group.vo.ResourcePageShareParam; import com.pcloud.book.group.vo.ResourcePageShareParam;
...@@ -148,6 +150,7 @@ import com.pcloud.common.utils.UUIDUitl; ...@@ -148,6 +150,7 @@ import com.pcloud.common.utils.UUIDUitl;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils; import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.pcloud.common.utils.json.JSONUtils; import com.pcloud.common.utils.json.JSONUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.contentcenter.resource.dto.ResourceDTO;
import com.pcloud.facade.shareimage.dto.HtmlDto; import com.pcloud.facade.shareimage.dto.HtmlDto;
import com.pcloud.facade.wxwork.contact.vo.WxContactWayVO; import com.pcloud.facade.wxwork.contact.vo.WxContactWayVO;
import com.pcloud.function.douluo.dto.AppTaskDTO; import com.pcloud.function.douluo.dto.AppTaskDTO;
...@@ -156,6 +159,7 @@ import com.pcloud.readercenter.common.enums.YesOrNoNumEnum; ...@@ -156,6 +159,7 @@ import com.pcloud.readercenter.common.enums.YesOrNoNumEnum;
import com.pcloud.readercenter.userlabel.dto.UserGradeLabelIdDTO; import com.pcloud.readercenter.userlabel.dto.UserGradeLabelIdDTO;
import com.pcloud.resourcecenter.product.dto.ProductDto; import com.pcloud.resourcecenter.product.dto.ProductDto;
import com.pcloud.resourcecenter.product.dto.ProductLabelDto; import com.pcloud.resourcecenter.product.dto.ProductLabelDto;
import com.pcloud.resourcecenter.store.dto.SinglePageInfoDTO;
import com.pcloud.usercenter.party.adviser.dto.AdviserBaseInfoDto; import com.pcloud.usercenter.party.adviser.dto.AdviserBaseInfoDto;
import com.pcloud.wechatgroup.wxwork.dto.WxworkGroupQrcodeBaseDTO; import com.pcloud.wechatgroup.wxwork.dto.WxworkGroupQrcodeBaseDTO;
...@@ -302,6 +306,8 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -302,6 +306,8 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
private FunctionConsr functionConsr; private FunctionConsr functionConsr;
@Autowired @Autowired
private ResourcePageModelDao resourcePageModelDao; private ResourcePageModelDao resourcePageModelDao;
@Autowired
private ResourceConsr resourceConsr;
@Value("${book.share.defaultTitle}") @Value("${book.share.defaultTitle}")
...@@ -1126,26 +1132,9 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -1126,26 +1132,9 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
itemVOList.addAll(itemAppAndProductVOList); itemVOList.addAll(itemAppAndProductVOList);
} }
itemVOList.sort(Comparator.comparing(ResourcePageItemVO::getId)); itemVOList.sort(Comparator.comparing(ResourcePageItemVO::getId));
Map<Long, List<ResourcePageItemVO>> columnMap = itemVOList.stream().collect(Collectors.groupingBy(ResourcePageItemVO::getResourcePageColumnId));
List<ResourceColumnAndServeVO> removeColumns = new ArrayList<>(); List<ResourceColumnAndServeVO> removeColumns = setPageColumnOther(serveVOS, itemVOList);
for (ResourceColumnAndServeVO columnAndServeVO : serveVOS) {
List<ResourcePageItemVO> itemVOS = columnMap.get(columnAndServeVO.getResourcePageColumnId());
if (ListUtils.isEmpty(itemVOS)) {
removeColumns.add(columnAndServeVO);
continue;
}
columnAndServeVO.setItemVOList(itemVOS);
String serveType = itemVOS.get(0).getServeType();
if (ResourcePageConstants.ServeTypeEnum.APP.getValue().equals(serveType) ||
(ResourcePageConstants.ServeTypeEnum.PRODUCT.getValue().equals(serveType))) {
serveType = "APP/PRODUCT";
}
columnAndServeVO.setServeType(serveType);
//图片位
if (ResourcePageConstants.ColumnTypeEnum.PICTURE.getCode().equals(columnAndServeVO.getColumnType())) {
columnAndServeVO.setLogoUrl(itemVOS.get(0).getLogoUrl());
}
}
if (!ListUtils.isEmpty(removeColumns)) { if (!ListUtils.isEmpty(removeColumns)) {
serveVOS.removeAll(removeColumns); serveVOS.removeAll(removeColumns);
} }
...@@ -1257,6 +1246,96 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -1257,6 +1246,96 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
fillWxworkGroup(itemVOS); fillWxworkGroup(itemVOS);
} else if (ResourcePageConstants.ServeTypeEnum.MEMBER_ACTIVITY.getValue().equals(serveType)) { } else if (ResourcePageConstants.ServeTypeEnum.MEMBER_ACTIVITY.getValue().equals(serveType)) {
fillMemberActivity(itemVOS); fillMemberActivity(itemVOS);
} else if (ServeTypeEnum.SHOP.getValue().equals(serveType)) {
fillChannelShop(itemVOS);
} else if (ServeTypeEnum.RESOURCE.getValue().equals(serveType)) {
fillFileResource(itemVOS, wechatUserId);
}
}
@ParamLog("填充文件素材")
private void fillFileResource(List<ResourcePageItemVO> itemVOS, Long wechatUserId) {
log.info("填充文件素材");
if (ListUtils.isEmpty(itemVOS)) {
return;
}
List<Long> serveIds = itemVOS.stream().filter(s->ServeTypeEnum.RESOURCE.getValue().equals(s.getServeType())).map(ResourcePageItemVO::getServeId).distinct().collect(Collectors.toList());
Map<Long, ResourceDTO> resourceDTOMap = resourceConsr.mapResourceByIds(serveIds, false, false);
if (MapUtils.isEmpty(resourceDTOMap)) {
return;
}
Long channelId = null;
if (null != itemVOS.get(0).getResourcePageId()) {
ResourcePage resourcePage = resourcePageDao.getById(itemVOS.get(0).getResourcePageId());
channelId = resourcePage.getChannelId();
}
if (null == channelId) {
channelId = getChannelIdFromUrl(itemVOS.get(0).getLinkUrl());
}
if (null == channelId){
channelId = adviserConsr.getDefaultChannel(itemVOS.get(0).getCreateUser());
}
AccountSettingDto accountSettingDto = new AccountSettingDto();
if (null != wechatUserId) {
accountSettingDto = qrcodeSceneConsr.getWechatInfo(channelId);
}
for (ResourcePageItemVO itemVO : itemVOS) {
if (!ServeTypeEnum.RESOURCE.getValue().equals(itemVO.getServeType())) {
continue;
}
ResourceDTO resourceDTO = resourceDTOMap.get(itemVO.getServeId());
itemVO.setTypeName("素材");
if (null != resourceDTO) {
itemVO.setServeName(resourceDTO.getResourceName());
}
itemVO.setChannelId(channelId);
setFileResourceDefaultPic(itemVO);
if (null != wechatUserId) {
String resultLinkUrl = itemVO.getLinkUrl();
if (!itemVO.getLinkUrl().startsWith("http")) {
resultLinkUrl = SendWeixinRequestTools.splitUrl(accountSettingDto, itemVO.getLinkUrl());
}
itemVO.setResultUrl(resultLinkUrl);
}
}
}
private void setFileResourceDefaultPic(ResourcePageItemVO itemVO) {
if (null == itemVO || null == itemVO.getTypeCode()) {
return;
}
if ("AUDIO".equals(itemVO.getTypeCode())) {
itemVO.setServePic("https://oss.5rs.me/oss/uploadfe/png/bf415da05f8ba18c15fb750bea77e307.png");
itemVO.setTransverseImg("https://oss.5rs.me/oss/uploadfe/png/db6407cdb660b9f082da8155ae2e0599.png");
} else if ("VIDEO".equals(itemVO.getTypeCode())) {
itemVO.setServePic("https://oss.5rs.me/oss/uploadfe/png/b957f4c0b3901fff7a698a8b9af7793d.png");
itemVO.setTransverseImg("https://oss.5rs.me/oss/uploadfe/png/5e05173b3e0605d225f0b2b7482143d4.png");
} else {
itemVO.setServePic("https://oss.5rs.me/oss/uploadfe/png/b4cf9c2aadf4b851bc96db5a30e85b13.png");
itemVO.setTransverseImg("https://oss.5rs.me/oss/uploadfe/png/bab7de5ca544b0dede6c8b3ea150e97b.png");
}
}
@ParamLog("填充运营商城")
private void fillChannelShop(List<ResourcePageItemVO> itemVOS) {
log.info("填充运营商城");
if (ListUtils.isEmpty(itemVOS)) {
return;
}
List<Long> serveIds = itemVOS.stream().map(ResourcePageItemVO::getServeId).distinct().collect(Collectors.toList());
Map<Long, SinglePageInfoDTO> singlePageDTOMap = productConsr.mapSinglePageByIds(serveIds);
if (MapUtils.isEmpty(singlePageDTOMap)) {
return;
}
for (ResourcePageItemVO itemVO : itemVOS) {
SinglePageInfoDTO singlePageDTO = singlePageDTOMap.get(itemVO.getServeId());
itemVO.setTypeName("运营商城");
if (null != singlePageDTO) {
itemVO.setServeName(singlePageDTO.getSinglePageName());
itemVO.setServePic(singlePageDTO.getHeadUrl());
itemVO.setTransverseImg(singlePageDTO.getImgUrl());
}
itemVO.setResultUrl(itemVO.getLinkUrl());
} }
} }
...@@ -2362,7 +2441,7 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -2362,7 +2441,7 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
} }
@Override @Override
public ResourcePageOneServe hasOneResource(Long bookGroupId, Long sceneId, Long wechatUserId) { public ResourcePageOneServe hasOneResource(Long bookGroupId, Long sceneId, Long wechatUserId, Boolean ignoreRays) {
ResourcePageOneServe pageOneServe = new ResourcePageOneServe(); ResourcePageOneServe pageOneServe = new ResourcePageOneServe();
pageOneServe.setBookGroupId(bookGroupId); pageOneServe.setBookGroupId(bookGroupId);
pageOneServe.setSceneId(sceneId); pageOneServe.setSceneId(sceneId);
...@@ -2383,10 +2462,14 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -2383,10 +2462,14 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
pageOneServe.setResourcePageId(resourcePageId); pageOneServe.setResourcePageId(resourcePageId);
pageOneServe.setAdviserId(resourcePage.getCreateUser()); pageOneServe.setAdviserId(resourcePage.getCreateUser());
//只配置了1个应用作品,且不开启小睿 //只配置了1个应用作品,且不开启小睿
ResourcePageItemVO itemVO = resourcePageItemDao.checkOneServeItemByPageId(resourcePageId); ResourcePageItemVO itemVO = resourcePageItemDao.checkOneServeItemByPageId(resourcePageId, ignoreRays);
if (null != itemVO) { if (null != itemVO) {
pageOneServe.setOneServe(true); pageOneServe.setOneServe(true);
if (itemVO.getServeType().equals(ServeTypeEnum.RESOURCE.getValue())) {
fillFileResource(Arrays.asList(itemVO), wechatUserId);
} else {
fillAppProductServe(Arrays.asList(itemVO), wechatUserId); fillAppProductServe(Arrays.asList(itemVO), wechatUserId);
}
pageOneServe.setServeId(itemVO.getServeId()); pageOneServe.setServeId(itemVO.getServeId());
pageOneServe.setServeType(itemVO.getServeType()); pageOneServe.setServeType(itemVO.getServeType());
pageOneServe.setLinkUrl(itemVO.getLinkUrl()); pageOneServe.setLinkUrl(itemVO.getLinkUrl());
...@@ -2419,9 +2502,11 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -2419,9 +2502,11 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
itemVO.setLinkUrl(s.getServeUrl()); itemVO.setLinkUrl(s.getServeUrl());
itemVO.setTypeCode(s.getTypeCode()); itemVO.setTypeCode(s.getTypeCode());
itemVO.setSceneId(s.getSceneId()); itemVO.setSceneId(s.getSceneId());
itemVO.setResourcePageId(s.getResourcePageId());
itemVOS.add(itemVO); itemVOS.add(itemVO);
}); });
fillAppProductServe(itemVOS, null); fillAppProductServe(itemVOS, null);
fillFileResource(itemVOS,null);
List<BookGroupServeDTO> serveDTOS = new ArrayList<>(); List<BookGroupServeDTO> serveDTOS = new ArrayList<>();
for (ResourcePageItemVO itemVO: itemVOS) { for (ResourcePageItemVO itemVO: itemVOS) {
BookGroupServeDTO serveDTO = new BookGroupServeDTO(); BookGroupServeDTO serveDTO = new BookGroupServeDTO();
...@@ -3950,26 +4035,9 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -3950,26 +4035,9 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
itemVOList.addAll(itemAppAndProductVOList); itemVOList.addAll(itemAppAndProductVOList);
} }
itemVOList.sort(Comparator.comparing(ResourcePageItemVO::getId)); itemVOList.sort(Comparator.comparing(ResourcePageItemVO::getId));
Map<Long, List<ResourcePageItemVO>> columnMap = itemVOList.stream().collect(Collectors.groupingBy(ResourcePageItemVO::getResourcePageColumnId));
List<ResourceColumnAndServeVO> removeColumns = new ArrayList<>(); List<ResourceColumnAndServeVO> removeColumns = setPageColumnOther(serveVOS, itemVOList);
for (ResourceColumnAndServeVO columnAndServeVO : serveVOS) {
List<ResourcePageItemVO> itemVOS = columnMap.get(columnAndServeVO.getResourcePageColumnId());
if (ListUtils.isEmpty(itemVOS)) {
removeColumns.add(columnAndServeVO);
continue;
}
columnAndServeVO.setItemVOList(itemVOS);
String serveType = itemVOS.get(0).getServeType();
if (ResourcePageConstants.ServeTypeEnum.APP.getValue().equals(serveType) ||
(ResourcePageConstants.ServeTypeEnum.PRODUCT.getValue().equals(serveType))) {
serveType = "APP/PRODUCT";
}
columnAndServeVO.setServeType(serveType);
//图片位
if (ResourcePageConstants.ColumnTypeEnum.PICTURE.getCode().equals(columnAndServeVO.getColumnType())) {
columnAndServeVO.setLogoUrl(itemVOS.get(0).getLogoUrl());
}
}
if (!ListUtils.isEmpty(removeColumns)) { if (!ListUtils.isEmpty(removeColumns)) {
serveVOS.removeAll(removeColumns); serveVOS.removeAll(removeColumns);
} }
...@@ -4000,6 +4068,37 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -4000,6 +4068,37 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
return serveVOS; return serveVOS;
} }
/**
* @Description 设置栏目其他信息
* @Author zhuyajie
* @Date 13:13 2022/3/17
**/
private List<ResourceColumnAndServeVO> setPageColumnOther(List<ResourceColumnAndServeVO> serveVOS,List<ResourcePageItemVO> itemVOList) {
List<ResourceColumnAndServeVO> removeColumns = new ArrayList<>();
Map<Long, List<ResourcePageItemVO>> columnMap = itemVOList.stream().collect(Collectors.groupingBy(ResourcePageItemVO::getResourcePageColumnId));
for (ResourceColumnAndServeVO columnAndServeVO : serveVOS) {
List<ResourcePageItemVO> itemVOS = columnMap.get(columnAndServeVO.getResourcePageColumnId());
//去掉没内容的栏目
if (ListUtils.isEmpty(itemVOS)) {
removeColumns.add(columnAndServeVO);
continue;
}
columnAndServeVO.setItemVOList(itemVOS);
String serveType = itemVOS.get(0).getServeType();
if (ResourcePageConstants.ServeTypeEnum.APP.getValue().equals(serveType) ||
ResourcePageConstants.ServeTypeEnum.PRODUCT.getValue().equals(serveType) ||
ServeTypeEnum.RESOURCE.getValue().equals(serveType)) {
serveType = "APP/PRODUCT";
}
columnAndServeVO.setServeType(serveType);
//图片位
if (ResourcePageConstants.ColumnTypeEnum.PICTURE.getCode().equals(columnAndServeVO.getColumnType())) {
columnAndServeVO.setLogoUrl(itemVOS.get(0).getLogoUrl());
}
}
return removeColumns;
}
@Override @Override
public Integer saveShareConfig(ResourcePageShareParam param) { public Integer saveShareConfig(ResourcePageShareParam param) {
checkShareParam(param); checkShareParam(param);
...@@ -4135,4 +4234,52 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -4135,4 +4234,52 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
}); });
} }
@Override
public List<ResourcePageItemResourceVO> listQrOneResourceByBook(Long sceneId, Long wechatUserId) {
if (null == sceneId) {
throw new BookBizException(BookBizException.PARAM_IS_NULL,"参数缺失");
}
ResourcePage resourcePage = resourcePageDao.getBySceneId(sceneId);
if (null == resourcePage || null == resourcePage.getBookId() || null == resourcePage.getCreateUser()) {
return new ArrayList<>();
}
List<ResourcePageItemResourceVO> list = resourcePageItemDao.listQrOneResourceByBook(resourcePage.getBookId(), resourcePage.getCreateUser());
if (ListUtils.isEmpty(list)) {
return new ArrayList<>();
}
List<Long> resourceIds = list.stream().map(ResourcePageItemResourceVO::getServeId).distinct().collect(Collectors.toList());
Map<Long, ResourceDTO> resourceDTOMap = resourceConsr.mapResourceByIds(resourceIds, true, true);
if (MapUtils.isEmpty(resourceDTOMap)) {
return new ArrayList<>();
}
List<ResourcePageItemResourceVO> resourceVOS = new ArrayList<>();
for (ResourcePageItemResourceVO vo:list) {
ResourceDTO dto = resourceDTOMap.get(vo.getServeId());
if (null == dto) {
continue;
}
vo.setTypeName(dto.getTypeName());
vo.setResourceName(dto.getResourceName());
vo.setFileId(dto.getFileId());
vo.setFileCategory(dto.getFileCategory());
vo.setDuration(dto.getDuration());
vo.setFileSize(dto.getFileSize());
vo.setFileType(dto.getFileType());
vo.setFileUrl(dto.getFileUrl());
vo.setConvertState(dto.getConvertState());
vo.setResourceOfficeItemDTOs(dto.getResourceOfficeItemDTOs());
vo.setResourcePdfItems(dto.getResourcePdfItems());
resourceVOS.add(vo);
}
return resourceVOS;
}
@Override
public Map<Long, BookGroupServeCountDTO> mapQrServeCount(List<Long> sceneIds) {
if (ListUtils.isEmpty(sceneIds)) {
return new HashMap<>();
}
return resourcePageItemDao.mapQrServeCount(sceneIds);
}
} }
...@@ -23,7 +23,8 @@ public class ResourcePageConstants { ...@@ -23,7 +23,8 @@ public class ResourcePageConstants {
*/ */
public enum ColumnTypeEnum { public enum ColumnTypeEnum {
APP_PRODUCT(1, "应用作品", new String[]{ServeTypeEnum.APP.getValue(), ServeTypeEnum.PRODUCT.getValue()}), APP_PRODUCT(1, "应用作品", new String[]{ServeTypeEnum.APP.getValue(), ServeTypeEnum.PRODUCT.getValue(),
ServeTypeEnum.RESOURCE.getValue()}),
OFFICIAL_ACCOUNT(2, "公众号", new String[]{ServeTypeEnum.OFFICIAL_ACCOUNT.getValue()}), OFFICIAL_ACCOUNT(2, "公众号", new String[]{ServeTypeEnum.OFFICIAL_ACCOUNT.getValue()}),
BOOKLIST(3, "书单", new String[]{ServeTypeEnum.BOOKLIST.getValue(),ServeTypeEnum.ADVISER_BOOK.getValue()}), BOOKLIST(3, "书单", new String[]{ServeTypeEnum.BOOKLIST.getValue(),ServeTypeEnum.ADVISER_BOOK.getValue()}),
GROUP(4, "社群", new String[]{ServeTypeEnum.GROUP_ACTIVITY.getValue(), ServeTypeEnum.WXWORK_GROUP.getValue()}), GROUP(4, "社群", new String[]{ServeTypeEnum.GROUP_ACTIVITY.getValue(), ServeTypeEnum.WXWORK_GROUP.getValue()}),
...@@ -31,7 +32,8 @@ public class ResourcePageConstants { ...@@ -31,7 +32,8 @@ public class ResourcePageConstants {
PICTURE(6, "图片位", new String[]{ServeTypeEnum.APP.getValue(), ServeTypeEnum.PRODUCT.getValue(), PICTURE(6, "图片位", new String[]{ServeTypeEnum.APP.getValue(), ServeTypeEnum.PRODUCT.getValue(),
ServeTypeEnum.GROUP_ACTIVITY.getValue(), ServeTypeEnum.THIRD_RESOURCE.getValue(), ServeTypeEnum.NO_SERVE.value}), ServeTypeEnum.GROUP_ACTIVITY.getValue(), ServeTypeEnum.THIRD_RESOURCE.getValue(), ServeTypeEnum.NO_SERVE.value}),
RAYS_TOOL(7,"RAYS工具",new String[]{ServeTypeEnum.APP.getValue()}), RAYS_TOOL(7,"RAYS工具",new String[]{ServeTypeEnum.APP.getValue()}),
MEMBER_ACTIVITY(8,"平台会员活动", new String[]{ServeTypeEnum.MEMBER_ACTIVITY.getValue()}); MEMBER_ACTIVITY(8,"平台会员活动", new String[]{ServeTypeEnum.MEMBER_ACTIVITY.getValue()}),
CHANNEL_SHOP(9,"运营商城", new String[]{ServeTypeEnum.SHOP.getValue()});
private Integer code; private Integer code;
private String name; private String name;
...@@ -85,7 +87,9 @@ public class ResourcePageConstants { ...@@ -85,7 +87,9 @@ public class ResourcePageConstants {
THIRD_RESOURCE("THIRD_RESOURCE", "第三方资源"), THIRD_RESOURCE("THIRD_RESOURCE", "第三方资源"),
WXWORK_GROUP("WXWORK_GROUP","企业微信群"), WXWORK_GROUP("WXWORK_GROUP","企业微信群"),
MEMBER_ACTIVITY("MEMBER_ACTIVITY","平台会员活动"), MEMBER_ACTIVITY("MEMBER_ACTIVITY","平台会员活动"),
NO_SERVE("NO_SERVE","无服务"); NO_SERVE("NO_SERVE","无服务"),
SHOP("SHOP","运营商城"),
RESOURCE("RESOURCE","素材");
private String value; private String value;
......
...@@ -6,6 +6,7 @@ import com.pcloud.book.group.dto.BookServeDTO; ...@@ -6,6 +6,7 @@ import com.pcloud.book.group.dto.BookServeDTO;
import com.pcloud.book.group.dto.ResourcePageUrlDTO; import com.pcloud.book.group.dto.ResourcePageUrlDTO;
import com.pcloud.book.group.entity.BookGroupServe; import com.pcloud.book.group.entity.BookGroupServe;
import com.pcloud.book.group.entity.ResourcePageItem; import com.pcloud.book.group.entity.ResourcePageItem;
import com.pcloud.book.group.vo.ResourcePageItemResourceVO;
import com.pcloud.book.group.vo.ResourcePageItemVO; import com.pcloud.book.group.vo.ResourcePageItemVO;
import com.pcloud.common.core.dao.BaseDao; import com.pcloud.common.core.dao.BaseDao;
import com.pcloud.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
...@@ -80,7 +81,7 @@ public interface ResourcePageItemDao extends BaseDao<ResourcePageItem>{ ...@@ -80,7 +81,7 @@ public interface ResourcePageItemDao extends BaseDao<ResourcePageItem>{
* @date:2021/4/21 15:29 * @date:2021/4/21 15:29
* * @param null * * @param null
*/ */
ResourcePageItemVO checkOneServeItemByPageId(Long resourcePageId); ResourcePageItemVO checkOneServeItemByPageId(Long resourcePageId, Boolean ignoreRays);
void deleteByServeId(Long resourceId); void deleteByServeId(Long resourceId);
...@@ -158,4 +159,6 @@ public interface ResourcePageItemDao extends BaseDao<ResourcePageItem>{ ...@@ -158,4 +159,6 @@ public interface ResourcePageItemDao extends BaseDao<ResourcePageItem>{
List<ResourceOnBookDTO> listResourceOnBook(Map<String,Object> paramMap); List<ResourceOnBookDTO> listResourceOnBook(Map<String,Object> paramMap);
List<BookGroupServe> getResourcePageList4Erp(List<Long> sceneIds); List<BookGroupServe> getResourcePageList4Erp(List<Long> sceneIds);
List<ResourcePageItemResourceVO> listQrOneResourceByBook(Long bookId, Long adviserId);
} }
...@@ -7,6 +7,7 @@ import com.pcloud.book.group.dto.ResourcePageUrlDTO; ...@@ -7,6 +7,7 @@ import com.pcloud.book.group.dto.ResourcePageUrlDTO;
import com.pcloud.book.group.dto.BookGroupServeCountDTO; import com.pcloud.book.group.dto.BookGroupServeCountDTO;
import com.pcloud.book.group.entity.BookGroupServe; import com.pcloud.book.group.entity.BookGroupServe;
import com.pcloud.book.group.entity.ResourcePageItem; import com.pcloud.book.group.entity.ResourcePageItem;
import com.pcloud.book.group.vo.ResourcePageItemResourceVO;
import com.pcloud.book.group.vo.ResourcePageItemVO; import com.pcloud.book.group.vo.ResourcePageItemVO;
import com.pcloud.common.core.dao.BaseDaoImpl; import com.pcloud.common.core.dao.BaseDaoImpl;
...@@ -81,8 +82,11 @@ public class ResourcePageItemDaoImpl extends BaseDaoImpl<ResourcePageItem> imple ...@@ -81,8 +82,11 @@ public class ResourcePageItemDaoImpl extends BaseDaoImpl<ResourcePageItem> imple
} }
@Override @Override
public ResourcePageItemVO checkOneServeItemByPageId(Long resourcePageId) { public ResourcePageItemVO checkOneServeItemByPageId(Long resourcePageId, Boolean ignoreRays) {
return getSessionTemplate().selectOne(getStatement("checkOneServeItemByPageId"), resourcePageId); Map<String,Object> map = new HashMap<>();
map.put("ignoreRays", ignoreRays);
map.put("resourcePageId", resourcePageId);
return getSessionTemplate().selectOne(getStatement("checkOneServeItemByPageId"), map);
} }
@Override @Override
...@@ -157,4 +161,12 @@ public class ResourcePageItemDaoImpl extends BaseDaoImpl<ResourcePageItem> imple ...@@ -157,4 +161,12 @@ public class ResourcePageItemDaoImpl extends BaseDaoImpl<ResourcePageItem> imple
public List<BookGroupServe> getResourcePageList4Erp(List<Long> sceneIds) { public List<BookGroupServe> getResourcePageList4Erp(List<Long> sceneIds) {
return getSessionTemplate().selectList(getStatement("getResourcePageList4Erp"), sceneIds); return getSessionTemplate().selectList(getStatement("getResourcePageList4Erp"), sceneIds);
} }
@Override
public List<ResourcePageItemResourceVO> listQrOneResourceByBook(Long bookId, Long adviserId) {
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("bookId", bookId);
paramMap.put("adviserId", adviserId);
return getSessionTemplate().selectList(getStatement("listQrOneResourceByBook"), paramMap);
}
} }
...@@ -73,4 +73,7 @@ public class BookGroupServe extends BaseEntity { ...@@ -73,4 +73,7 @@ public class BookGroupServe extends BaseEntity {
private Long merchantId; private Long merchantId;
private Long sceneId; private Long sceneId;
private Long resourcePageId;
} }
...@@ -215,9 +215,10 @@ public class ResourcePageFacade { ...@@ -215,9 +215,10 @@ public class ResourcePageFacade {
@GetMapping("hasOneResource") @GetMapping("hasOneResource")
public ResponseDto<?> hasOneResource(@CookieValue("userInfo") String userInfo, public ResponseDto<?> hasOneResource(@CookieValue("userInfo") String userInfo,
@RequestParam(value = "bookGroupId", required = false) Long bookGroupId, @RequestParam(value = "bookGroupId", required = false) Long bookGroupId,
@RequestParam(value = "sceneId", required = false) Long sceneId) { @RequestParam(value = "sceneId", required = false) Long sceneId,
@RequestParam(value = "ignoreRays",required = false) Boolean ignoreRays) {
Long wechatUserId = Cookie.getId(userInfo,Cookie._WECHAT_USER_ID); Long wechatUserId = Cookie.getId(userInfo,Cookie._WECHAT_USER_ID);
return new ResponseDto<>(resourcePageBiz.hasOneResource(bookGroupId, sceneId, wechatUserId)); return new ResponseDto<>(resourcePageBiz.hasOneResource(bookGroupId, sceneId, wechatUserId,ignoreRays));
} }
@ApiOperation("添加收藏记录") @ApiOperation("添加收藏记录")
...@@ -477,4 +478,12 @@ public class ResourcePageFacade { ...@@ -477,4 +478,12 @@ public class ResourcePageFacade {
} }
@ApiOperation("一码一资源,素材列表")
@GetMapping("listQrOneResourceByBook")
public ResponseDto<?> listQrOneResourceByBook(@CookieValue("userInfo") String userInfo,
@RequestParam("sceneId") Long sceneId) {
Long wechatUserId = Cookie.getId(userInfo,Cookie._WECHAT_USER_ID);
return new ResponseDto<>(resourcePageBiz.listQrOneResourceByBook(sceneId,wechatUserId));
}
} }
package com.pcloud.book.group.vo;
import com.pcloud.common.dto.BaseDto;
import com.pcloud.contentcenter.resource.dto.ResourceOfficeItemDTO;
import com.pcloud.contentcenter.resource.dto.ResourcePdfItemDTO;
import java.math.BigDecimal;
import java.util.List;
import lombok.Data;
/**
* @ClassName com.pcloud.book.group.vo.ResourcePageItemResourceVO
* @Author zhuyajie
* @Description
* @Date 2022/3/16 13:33
**/
@Data
public class ResourcePageItemResourceVO extends BaseDto {
private Long id;
private Long resourcePageId;
private Long resourcePageColumnId;
/**
* 资源id
*/
private Long serveId;
/**
* 资源类型
*/
private String serveType;
/**
* 链接url
*/
private String linkUrl;
/**
* 资源类型
*/
private String typeCode;
private String typeName;
private String resourceName;
private String fileUrl;
private Long fileSize;
private String fileType;
private String fileCategory;
private String fileId;
private BigDecimal duration;
private Integer convertState;
private List<ResourcePdfItemDTO> resourcePdfItems;
private List<ResourceOfficeItemDTO> resourceOfficeItemDTOs;
}
...@@ -141,7 +141,8 @@ ...@@ -141,7 +141,8 @@
account_setting_id accountSettingId, account_setting_id accountSettingId,
self_big_pic selfBigPic, self_big_pic selfBigPic,
self_small_pic selfSmallPic, self_small_pic selfSmallPic,
self_serve_name selfServeName self_serve_name selfServeName,
resource_page_id resourcePageId
FROM FROM
resource_page_item resource_page_item
WHERE WHERE
...@@ -247,7 +248,8 @@ ...@@ -247,7 +248,8 @@
i.link_url serveUrl, i.link_url serveUrl,
p.create_user createUser, p.create_user createUser,
i.type_code typeCode, i.type_code typeCode,
p.scene_id sceneId p.scene_id sceneId,
i.resource_page_id resourcePageId
FROM FROM
resource_page_item i resource_page_item i
LEFT JOIN resource_page p ON i.resource_page_id = p.id LEFT JOIN resource_page p ON i.resource_page_id = p.id
...@@ -258,7 +260,7 @@ ...@@ -258,7 +260,7 @@
<foreach collection="list" index="index" separator="," open="(" close=")" item="item"> <foreach collection="list" index="index" separator="," open="(" close=")" item="item">
#{item} #{item}
</foreach> </foreach>
AND i.serve_type IN ('APP', 'PRODUCT') AND i.serve_type IN ('APP', 'PRODUCT','RESOURCE')
ORDER BY ORDER BY
n.navigation_seq ASC, c.column_seq ASC, i.seq_num ASC, i.id ASC n.navigation_seq ASC, c.column_seq ASC, i.seq_num ASC, i.id ASC
</select> </select>
...@@ -270,16 +272,19 @@ ...@@ -270,16 +272,19 @@
i.serve_type serveType, i.serve_type serveType,
i.link_url linkUrl, i.link_url linkUrl,
i.type_code typeCode, i.type_code typeCode,
i.create_user createUser i.create_user createUser,
i.resource_page_id resourcePageId
FROM FROM
resource_page p resource_page p
LEFT JOIN resource_page_item i ON i.resource_page_id = p.id LEFT JOIN resource_page_item i ON i.resource_page_id = p.id
WHERE WHERE
resource_page_id = #{resourcePageId} resource_page_id = #{resourcePageId}
<if test="ignoreRays == null or ignoreRays == false">
AND p.open_rays = 0 AND p.open_rays = 0
</if>
HAVING HAVING
COUNT(i.id) = 1 COUNT(i.id) = 1
AND i.serve_type IN ("APP", "PRODUCT") AND i.serve_type IN ("APP", "PRODUCT", "RESOURCE")
</select> </select>
<delete id="deleteByServeId" parameterType="long"> <delete id="deleteByServeId" parameterType="long">
...@@ -438,7 +443,7 @@ ...@@ -438,7 +443,7 @@
LEFT JOIN resource_page_navigation n ON c.navigation_id = n.id LEFT JOIN resource_page_navigation n ON c.navigation_id = n.id
WHERE WHERE
p.scene_id = #{sceneId} p.scene_id = #{sceneId}
AND i.serve_type IN ('APP', 'PRODUCT','MEMBER_ACTIVITY') AND i.serve_type IN ('APP', 'PRODUCT','MEMBER_ACTIVITY','RESOURCE')
GROUP BY i.serve_id GROUP BY i.serve_id
ORDER BY ORDER BY
n.navigation_seq ASC, c.column_seq ASC, i.id ASC n.navigation_seq ASC, c.column_seq ASC, i.id ASC
...@@ -483,4 +488,30 @@ ...@@ -483,4 +488,30 @@
</foreach> </foreach>
AND i.serve_type IN ('APP', 'PRODUCT') AND i.serve_type IN ('APP', 'PRODUCT')
</select> </select>
<!--一码一素材,素材列表-->
<select id="listQrOneResourceByBook" resultType="com.pcloud.book.group.vo.ResourcePageItemResourceVO" parameterType="map">
SELECT
i.id,
i.resource_page_id resourcePageId,
i.resource_page_column_id resourcePageColumnId,
i.serve_id serveId,
i.serve_type serveType,
i.link_url linkUrl,
i.type_code typeCode
FROM
resource_page_item i
LEFT JOIN resource_page p ON i.resource_page_id = p.id
WHERE
p.book_id = #{bookId}
AND p.create_user = #{adviserId}
GROUP BY
i.resource_page_id
HAVING
COUNT(i.id) = 1
AND i.serve_type = 'RESOURCE'
ORDER BY
i.create_time desc,i.resource_page_id desc
</select>
</mapper> </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