Commit e5cccf71 by 田超

Merge branch 'feature/1003282' into 'master'

feat: [1003283] 小睿入群流程优化-webview公众号长按识别直接入群方案 新增多公众号支持

See merge request rays/pcloud-book!841
parents 4803f485 74072d31
...@@ -55,6 +55,7 @@ import com.pcloud.book.group.vo.TotalRescourceDataVO; ...@@ -55,6 +55,7 @@ import com.pcloud.book.group.vo.TotalRescourceDataVO;
import com.pcloud.book.group.vo.UserBookInfoVO; import com.pcloud.book.group.vo.UserBookInfoVO;
import com.pcloud.book.group.vo.WxGroupStatisticVO; import com.pcloud.book.group.vo.WxGroupStatisticVO;
import com.pcloud.book.keywords.vo.ListKeywordVO; import com.pcloud.book.keywords.vo.ListKeywordVO;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.dto.StoreFlowInfoDto; import com.pcloud.common.dto.StoreFlowInfoDto;
import com.pcloud.common.exceptions.BizException; import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.page.PageBean; import com.pcloud.common.page.PageBean;
...@@ -917,4 +918,5 @@ public interface BookGroupBiz { ...@@ -917,4 +918,5 @@ public interface BookGroupBiz {
*/ */
Map<String, BookGroupServeCountDTO> mapBookGroupQrcodeServeCount(List<Long> adviserIds, List<Long> bookIds, List<Long> channelIds, Integer groupType); Map<String, BookGroupServeCountDTO> mapBookGroupQrcodeServeCount(List<Long> adviserIds, List<Long> bookIds, List<Long> channelIds, Integer groupType);
String getGroupNewsMaterialById(Long bookGroupQrcodeId, Long classifyId);
} }
package com.pcloud.book.group.biz;
import com.pcloud.book.group.entity.GroupMaterialAccount;
/**
* @author guiq
* @version 1.0
* @since 2020年7月23日
*/
public interface GroupMaterialAccountBiz {
/**
* 获取一个新增/更新永久图文素材未达限制的公众号
*/
GroupMaterialAccount getActiveAccount();
}
package com.pcloud.book.group.biz.impl; package com.pcloud.book.group.biz.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.ZipUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.alibaba.fastjson.JSONObject;
import com.pcloud.analysisengine.browse.dto.GroupBrowseStatisticVO; import com.pcloud.analysisengine.browse.dto.GroupBrowseStatisticVO;
import com.pcloud.appcenter.app.dto.AppDto; import com.pcloud.appcenter.app.dto.AppDto;
import com.pcloud.appcenter.base.dto.AppPriceCacheDTO; import com.pcloud.appcenter.base.dto.AppPriceCacheDTO;
...@@ -43,6 +44,7 @@ import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr; ...@@ -43,6 +44,7 @@ import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.biz.BookGroupAppBiz; import com.pcloud.book.group.biz.BookGroupAppBiz;
import com.pcloud.book.group.biz.BookGroupBiz; import com.pcloud.book.group.biz.BookGroupBiz;
import com.pcloud.book.group.biz.BookGroupClassifyBiz; import com.pcloud.book.group.biz.BookGroupClassifyBiz;
import com.pcloud.book.group.biz.GroupMaterialAccountBiz;
import com.pcloud.book.group.biz.GroupQrcodeBiz; import com.pcloud.book.group.biz.GroupQrcodeBiz;
import com.pcloud.book.group.constant.BookBusinessConstants; import com.pcloud.book.group.constant.BookBusinessConstants;
import com.pcloud.book.group.dao.AppClickRecordDao; import com.pcloud.book.group.dao.AppClickRecordDao;
...@@ -114,6 +116,7 @@ import com.pcloud.book.group.entity.BookGroupAgentRecord; ...@@ -114,6 +116,7 @@ import com.pcloud.book.group.entity.BookGroupAgentRecord;
import com.pcloud.book.group.entity.BookGroupCipherUser; import com.pcloud.book.group.entity.BookGroupCipherUser;
import com.pcloud.book.group.entity.BookGroupFriendGuide; import com.pcloud.book.group.entity.BookGroupFriendGuide;
import com.pcloud.book.group.entity.BookGroupServe; import com.pcloud.book.group.entity.BookGroupServe;
import com.pcloud.book.group.entity.GroupMaterialAccount;
import com.pcloud.book.group.entity.GroupQrcode; import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.book.group.entity.JoinGroupCipher; import com.pcloud.book.group.entity.JoinGroupCipher;
import com.pcloud.book.group.entity.PushBookGroupUpdate; import com.pcloud.book.group.entity.PushBookGroupUpdate;
...@@ -127,6 +130,7 @@ import com.pcloud.book.group.enums.ChangeOriginTypeEnum; ...@@ -127,6 +130,7 @@ import com.pcloud.book.group.enums.ChangeOriginTypeEnum;
import com.pcloud.book.group.enums.CipherTypeEnum; import com.pcloud.book.group.enums.CipherTypeEnum;
import com.pcloud.book.group.enums.JoinGroupTypeEnum; import com.pcloud.book.group.enums.JoinGroupTypeEnum;
import com.pcloud.book.group.enums.LargeTempletEnum; import com.pcloud.book.group.enums.LargeTempletEnum;
import com.pcloud.book.group.mapper.GroupMaterialAccountMapper;
import com.pcloud.book.group.set.GroupSet; import com.pcloud.book.group.set.GroupSet;
import com.pcloud.book.group.tools.BookExcelReader; import com.pcloud.book.group.tools.BookExcelReader;
import com.pcloud.book.group.tools.SendWeixinRequestTools; import com.pcloud.book.group.tools.SendWeixinRequestTools;
...@@ -138,6 +142,7 @@ import com.pcloud.book.group.vo.ClassifyQrcodeVO; ...@@ -138,6 +142,7 @@ import com.pcloud.book.group.vo.ClassifyQrcodeVO;
import com.pcloud.book.group.vo.ExcelDataVO; import com.pcloud.book.group.vo.ExcelDataVO;
import com.pcloud.book.group.vo.FriendsVO; import com.pcloud.book.group.vo.FriendsVO;
import com.pcloud.book.group.vo.GroupIncomeStaticParamVO; import com.pcloud.book.group.vo.GroupIncomeStaticParamVO;
import com.pcloud.book.group.vo.GroupQrcodeBaseInfoVO;
import com.pcloud.book.group.vo.GroupScanTrendParamVO; import com.pcloud.book.group.vo.GroupScanTrendParamVO;
import com.pcloud.book.group.vo.GroupScanTrendVO; import com.pcloud.book.group.vo.GroupScanTrendVO;
import com.pcloud.book.group.vo.GroupStatisticVO; import com.pcloud.book.group.vo.GroupStatisticVO;
...@@ -208,6 +213,8 @@ import com.pcloud.facade.tradecenter.dto.GroupMoneyDto; ...@@ -208,6 +213,8 @@ import com.pcloud.facade.tradecenter.dto.GroupMoneyDto;
import com.pcloud.facade.tradecenter.dto.ProductSaleDetailDto; import com.pcloud.facade.tradecenter.dto.ProductSaleDetailDto;
import com.pcloud.facade.tradecenter.dto.SpeWechatGroupDto; import com.pcloud.facade.tradecenter.dto.SpeWechatGroupDto;
import com.pcloud.facade.tradecenter.dto.WechatGroupDto; import com.pcloud.facade.tradecenter.dto.WechatGroupDto;
import com.pcloud.facade.wechat.material.dto.GroupNewsMaterialAddDTO;
import com.pcloud.facade.wechat.material.service.MaterialService;
import com.pcloud.labelcenter.label.service.LabelService; import com.pcloud.labelcenter.label.service.LabelService;
import com.pcloud.liveapp.live.dto.ProductIdSearchDto; import com.pcloud.liveapp.live.dto.ProductIdSearchDto;
import com.pcloud.liveapp.live.service.TimeTableService; import com.pcloud.liveapp.live.service.TimeTableService;
...@@ -241,7 +248,7 @@ import com.pcloud.wechatgroup.selfrobot.dto.SelfRobotDTO; ...@@ -241,7 +248,7 @@ import com.pcloud.wechatgroup.selfrobot.dto.SelfRobotDTO;
import com.pcloud.wechatgroup.selfrobot.dto.UserRobotDTO; import com.pcloud.wechatgroup.selfrobot.dto.UserRobotDTO;
import com.pcloud.wechatgroup.selfrobot.enums.SelfRobotTypeEnum; import com.pcloud.wechatgroup.selfrobot.enums.SelfRobotTypeEnum;
import com.sdk.wxgroup.SendMessageTypeEnum; import com.sdk.wxgroup.SendMessageTypeEnum;
import lombok.SneakyThrows;
import org.apache.commons.collections.MapUtils; import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -272,9 +279,6 @@ import java.util.concurrent.ThreadPoolExecutor; ...@@ -272,9 +279,6 @@ import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import cn.hutool.core.util.ZipUtil;
import lombok.SneakyThrows;
/** /**
* Description 社群书群二维码业务逻辑层接口实现类 Created by PENG on 2019/4/17. * Description 社群书群二维码业务逻辑层接口实现类 Created by PENG on 2019/4/17.
*/ */
...@@ -409,6 +413,14 @@ public class BookGroupBizImpl implements BookGroupBiz { ...@@ -409,6 +413,14 @@ public class BookGroupBizImpl implements BookGroupBiz {
private AppletGroupSearchRecordBiz appletGroupSearchRecordBiz; private AppletGroupSearchRecordBiz appletGroupSearchRecordBiz;
@Autowired @Autowired
private BookBrowseRecordBiz bookBrowseRecordBiz; private BookBrowseRecordBiz bookBrowseRecordBiz;
@Value("${system.env}")
private String envStr;
@Autowired
private MaterialService materialService;
@Autowired
private GroupMaterialAccountBiz groupMaterialAccountBiz;
@Autowired
private GroupMaterialAccountMapper groupMaterialAccountMapper;
private static final ThreadPoolExecutor PLATFORM_STATISTICS_EXPORT_THREAD = new ThreadPoolExecutor(2, 2, private static final ThreadPoolExecutor PLATFORM_STATISTICS_EXPORT_THREAD = new ThreadPoolExecutor(2, 2,
0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),
...@@ -5266,4 +5278,45 @@ public class BookGroupBizImpl implements BookGroupBiz { ...@@ -5266,4 +5278,45 @@ public class BookGroupBizImpl implements BookGroupBiz {
} }
return bookGroupServeDao.mapBookGroupQrcodeServeCount(adviserIds, bookIds, channelIds, joinGroupType); return bookGroupServeDao.mapBookGroupQrcodeServeCount(adviserIds, bookIds, channelIds, joinGroupType);
} }
@Override
public String getGroupNewsMaterialById(Long bookGroupQrcodeId, Long classifyId) {
if (bookGroupQrcodeId == null) {
// 切群,获取新切群的群二维码
String groupQrCode = groupQrcodeBiz.getChangeGroupQrCode(classifyId);
// 通过群二维码反查 bookGroupQrcodeId
ClassifyQrcodeVO groupQrcodeInfo = groupQrcodeBiz.getGroupQrcodeInfo(groupQrCode, classifyId);
if (Objects.isNull(groupQrcodeInfo)) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "未查询到分类下群二维码");
}
bookGroupQrcodeId = groupQrcodeInfo.getId();
}
GroupQrcodeBaseInfoVO groupInfo = groupQrcodeDao.getBaseById(bookGroupQrcodeId);
GroupMaterialAccount activeAccount = groupMaterialAccountBiz.getActiveAccount();
String mediaId = updateMediaId(groupInfo, activeAccount, bookGroupQrcodeId);
if (StrUtil.isBlank(mediaId)) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "未获取到图文素材链接");
}
return ResponseHandleUtil.parseResponse(materialService.getGroupNewsMaterialByMediaId(mediaId), String.class);
}
private String updateMediaId(GroupQrcodeBaseInfoVO groupInfo, GroupMaterialAccount account, Long bookGroupQrcodeId) {
if (groupInfo != null && account != null) {
String mediaId = groupQrcodeDao.getMediaId(bookGroupQrcodeId);
if (StrUtil.isBlank(mediaId)) {
GroupNewsMaterialAddDTO groupNewsMaterialAddDTO = new GroupNewsMaterialAddDTO();
groupNewsMaterialAddDTO.setAccountId(account.getAccountId());
groupNewsMaterialAddDTO.setCoverMediaId(account.getCoverMediaId());
groupNewsMaterialAddDTO.setGroupHeadImg(account.getHeadMediaId());
groupNewsMaterialAddDTO.setGroupName(groupInfo.getGroupName());
groupNewsMaterialAddDTO.setQrcodeUrl(groupInfo.getQrcodeUrl());
groupNewsMaterialAddDTO.setMediaId(mediaId);
mediaId = ResponseHandleUtil.parseResponse(materialService.getGroupNewsMaterial(groupNewsMaterialAddDTO), String.class);
groupQrcodeDao.updateMediaId(bookGroupQrcodeId, mediaId, new Date());
}
return mediaId;
}
return null;
}
} }
package com.pcloud.book.group.biz.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.pcloud.book.group.biz.GroupMaterialAccountBiz;
import com.pcloud.book.group.entity.GroupMaterialAccount;
import com.pcloud.book.group.mapper.GroupMaterialAccountMapper;
import com.pcloud.common.utils.ResponseHandleUtil;
import com.pcloud.facade.wechat.exceptions.WechatSeviceException;
import com.pcloud.facade.wechat.material.service.MaterialService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* GroupMaterialAccountBiz实现
*
* @author guiq
* @version 1.0
* @since 2020年7月23日
*/
@Slf4j
@Component("groupMaterialAccountBiz")
public class GroupMaterialAccountBizImpl implements GroupMaterialAccountBiz {
/**
* 永久图文素材群头像
*/
private static final String GROUP_HEAD_IMAGE = "https://file.raysgo.com/oss/uploadfe/png/5ac51d7a8ad9c6ac9d32355ecbd64898.png";
/**
* 永久图文素材封面
*/
private static final String COVER_IMAGE = "https://file.raysgo.com/oss/uploadfe/png/2b5d5797fc09d240c64de18fee3261d4.png";
@Autowired
private GroupMaterialAccountMapper groupMaterialAccountMapper;
@Autowired
private MaterialService materialService;
@Override
public GroupMaterialAccount getActiveAccount() {
// 查询未达到限制或者已达到限制但已经超过24小时的
Date yesterday = DateUtil.offsetDay(new Date(),-1).toJdkDate();
List<GroupMaterialAccount> activeAccount = groupMaterialAccountMapper.getActiveAccount(yesterday);
return checkLimit(activeAccount);
}
/**
* 筛选一个可用的公众号
*/
private GroupMaterialAccount checkLimit(List<GroupMaterialAccount> accounts) {
if (CollUtil.isEmpty(accounts)) {
return null;
}
for (GroupMaterialAccount account : accounts) {
if (Objects.nonNull(account)) {
// 补充群头像 - 图文消息内的图片
if (StrUtil.isBlank(account.getCoverMediaId()) || StrUtil.isBlank(account.getHeadMediaId())) {
try {
if (StrUtil.isBlank(account.getHeadMediaId())){
String url = ResponseHandleUtil.parseResponse(materialService.uploadImg(account.getAccountId(), GROUP_HEAD_IMAGE), String.class);
account.setHeadMediaId(url);
}
if (StrUtil.isBlank(account.getCoverMediaId())){
String mediaId = ResponseHandleUtil.parseResponse(materialService.addImgMaterial(account.getAccountId(), COVER_IMAGE), String.class);
account.setCoverMediaId(mediaId);
}
} catch (WechatSeviceException e) {
// 接口调用超过限制,继续循环,获取下一个公众号
if (45009 == e.getCode()) {
// 更新状态为达到限制
if (account.getStatus() == 1) {
account.setStatus(0);
account.setUpdateTime(new Date());
groupMaterialAccountMapper.update(account);
}
}
continue;
}
}
// 更新状态为可用
if (account.getStatus() == 0 || account.getUpdateTime()==null) {
account.setStatus(1);
account.setUpdateTime(new Date());
groupMaterialAccountMapper.update(account);
}
return account;
}
}
return null;
}
}
package com.pcloud.book.group.biz.impl; package com.pcloud.book.group.biz.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.pcloud.book.base.exception.BookBizException; import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.consumer.promotion.PromotionConsr; import com.pcloud.book.consumer.promotion.PromotionConsr;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr; import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.biz.GroupMaterialAccountBiz;
import com.pcloud.book.group.biz.WeixinQrcodeBiz; import com.pcloud.book.group.biz.WeixinQrcodeBiz;
import com.pcloud.book.group.dao.GroupQrcodeDao; import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.dao.WeixinQrcodeDao; import com.pcloud.book.group.dao.WeixinQrcodeDao;
...@@ -15,33 +15,35 @@ import com.pcloud.book.group.dto.SyncWeixinGroupIdRequestDTO; ...@@ -15,33 +15,35 @@ import com.pcloud.book.group.dto.SyncWeixinGroupIdRequestDTO;
import com.pcloud.book.group.dto.UpdateQrDTO; import com.pcloud.book.group.dto.UpdateQrDTO;
import com.pcloud.book.group.dto.WeixinQrcodeCountDTO; import com.pcloud.book.group.dto.WeixinQrcodeCountDTO;
import com.pcloud.book.group.dto.WeixinQrcodeDTO; import com.pcloud.book.group.dto.WeixinQrcodeDTO;
import com.pcloud.book.group.entity.GroupMaterialAccount;
import com.pcloud.book.group.entity.GroupQrcode; import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.book.group.entity.WeixinQrcode; import com.pcloud.book.group.entity.WeixinQrcode;
import com.pcloud.book.group.entity.WeixinQrcodeGeneration; import com.pcloud.book.group.entity.WeixinQrcodeGeneration;
import com.pcloud.book.group.enums.JoinGroupTypeEnum; import com.pcloud.book.group.enums.JoinGroupTypeEnum;
import com.pcloud.book.group.enums.UpdateStatusEnum; import com.pcloud.book.group.enums.UpdateStatusEnum;
import com.pcloud.book.group.mapper.GroupMaterialAccountMapper;
import com.pcloud.book.group.tools.Kit; import com.pcloud.book.group.tools.Kit;
import com.pcloud.book.group.tools.QrcodeTools; import com.pcloud.book.group.tools.QrcodeTools;
import com.pcloud.book.group.tools.SendWeixinRequestTools; import com.pcloud.book.group.tools.SendWeixinRequestTools;
import com.pcloud.book.group.vo.GroupQrcodeBaseInfoVO;
import com.pcloud.book.group.vo.QrStatisticsVO; import com.pcloud.book.group.vo.QrStatisticsVO;
import com.pcloud.book.group.vo.WeixinQrcodeVO; import com.pcloud.book.group.vo.WeixinQrcodeVO;
import com.pcloud.book.util.common.ThreadPoolUtils; import com.pcloud.book.util.common.ThreadPoolUtils;
import com.pcloud.common.core.aspect.ParamLog; import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.core.biz.MessageBiz; import com.pcloud.common.core.biz.MessageBiz;
import com.pcloud.common.core.dto.SendEmailDto; import com.pcloud.common.core.dto.SendEmailDto;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.QrcodeUtils; import com.pcloud.common.utils.QrcodeUtils;
import com.pcloud.common.utils.ResponseHandleUtil; import com.pcloud.common.utils.ResponseHandleUtil;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils; import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.facade.wechat.exceptions.WechatSeviceException;
import com.pcloud.facade.wechat.material.dto.GroupNewsMaterialAddDTO; import com.pcloud.facade.wechat.material.dto.GroupNewsMaterialAddDTO;
import com.pcloud.facade.wechat.material.service.MaterialService; import com.pcloud.facade.wechat.material.service.MaterialService;
import com.pcloud.wechatgroup.group.dto.GroupRobotDTO; import com.pcloud.wechatgroup.group.dto.GroupRobotDTO;
import com.sdk.wxgroup.AddToGroupVO; import com.sdk.wxgroup.AddToGroupVO;
import com.sdk.wxgroup.QrcodeVO; import com.sdk.wxgroup.QrcodeVO;
import com.sdk.wxgroup.WxGroupSDK; import com.sdk.wxgroup.WxGroupSDK;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
...@@ -54,6 +56,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -54,6 +56,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -88,6 +91,10 @@ public class WeixinQrcodeBizImpl implements WeixinQrcodeBiz { ...@@ -88,6 +91,10 @@ public class WeixinQrcodeBizImpl implements WeixinQrcodeBiz {
private String envStr; private String envStr;
@Autowired @Autowired
private MaterialService materialService; private MaterialService materialService;
@Autowired
private GroupMaterialAccountBiz groupMaterialAccountBiz;
@Autowired
private GroupMaterialAccountMapper groupMaterialAccountMapper;
@Override @Override
...@@ -205,30 +212,41 @@ public class WeixinQrcodeBizImpl implements WeixinQrcodeBiz { ...@@ -205,30 +212,41 @@ public class WeixinQrcodeBizImpl implements WeixinQrcodeBiz {
BeanUtils.copyProperties(updateQrDTO, updateQr); BeanUtils.copyProperties(updateQrDTO, updateQr);
promotionConsr.updateQrUrl(updateQr); promotionConsr.updateQrUrl(updateQr);
// 更新群的同时需要更新永久素材 // 更新群的同时需要更新永久素材
if ("pro".equals(envStr)){ GroupMaterialAccount activeAccount = groupMaterialAccountBiz.getActiveAccount();
updateMediaId(updateQrDTO,66057L,"L6BtF7zqCqBhtLlyVcDtm7_owz_L9ZR9ZAwzxzCZaXw"); if (Objects.nonNull(activeAccount)) {
}else if ("test".equals(envStr)){ updateMediaId(updateQrDTO, activeAccount);
updateMediaId(updateQrDTO,50674L,"0VyyKa3G6YER2UJs_GAVV4dow0gLZ2QBeQwuAe1PpP0");
} }
} }
} }
private void updateMediaId(UpdateQrDTO updateQrDTO,Long accountId,String coverMediaId) { private void updateMediaId(UpdateQrDTO updateQrDTO, GroupMaterialAccount activeAccount) {
WeixinQrcode qrcode = weixinQrcodeDao.getById(updateQrDTO.getId()); WeixinQrcode qrcode = weixinQrcodeDao.getById(updateQrDTO.getId());
// 未使用的群暂时不做处理 // 未使用的群暂时不做处理
GroupQrcode baseById = groupQrcodeDao.getByWxGroupId(qrcode.getWeixinGroupId()); GroupQrcode baseById = groupQrcodeDao.getByWxGroupId(qrcode.getWeixinGroupId());
if (baseById!=null&&baseById.getId()!=null){ if (baseById != null && baseById.getId() != null) {
String mediaId = groupQrcodeDao.getMediaId(baseById.getId()); String mediaId = groupQrcodeDao.getMediaId(baseById.getId());
GroupNewsMaterialAddDTO groupNewsMaterialAddDTO = new GroupNewsMaterialAddDTO(); GroupNewsMaterialAddDTO groupNewsMaterialAddDTO = new GroupNewsMaterialAddDTO();
groupNewsMaterialAddDTO.setAccountId(accountId); groupNewsMaterialAddDTO.setAccountId(activeAccount.getAccountId());
groupNewsMaterialAddDTO.setCoverMediaId(coverMediaId); groupNewsMaterialAddDTO.setCoverMediaId(activeAccount.getHeadMediaId());
groupNewsMaterialAddDTO.setCoverMediaId(activeAccount.getCoverMediaId());
groupNewsMaterialAddDTO.setGroupName(baseById.getGroupName()); groupNewsMaterialAddDTO.setGroupName(baseById.getGroupName());
groupNewsMaterialAddDTO.setQrcodeUrl(updateQrDTO.getUrl()); groupNewsMaterialAddDTO.setQrcodeUrl(updateQrDTO.getUrl());
groupNewsMaterialAddDTO.setMediaId(mediaId); groupNewsMaterialAddDTO.setMediaId(mediaId);
String mId = ResponseHandleUtil.parseResponse(materialService.getGroupNewsMaterial(groupNewsMaterialAddDTO), String.class); try {
if (StrUtil.isBlank(mediaId)){ mediaId = ResponseHandleUtil.parseResponse(materialService.getGroupNewsMaterial(groupNewsMaterialAddDTO), String.class);
mediaId = mId; // 增加素材更新时间字段,方便查询更新失败的群信息
groupQrcodeDao.updateMediaId(baseById.getId(),mediaId); groupQrcodeDao.updateMediaId(baseById.getId(), mediaId, new Date());
} catch (WechatSeviceException e) {
// 接口调用超过限制,继续循环,获取下一个公众号
if (45009 == e.getCode()) {
// 更新状态为达到限制
if (activeAccount.getStatus() == 1) {
activeAccount.setStatus(0);
activeAccount.setUpdateTime(new Date());
groupMaterialAccountMapper.update(activeAccount);
}
}
throw new BizException(WechatSeviceException.MATERIAL_ADD_ERROR, "更新二维码永久图文素材失败!");
} }
} }
} }
......
...@@ -17,6 +17,7 @@ import com.pcloud.book.group.vo.GroupQrcodeBaseInfoVO; ...@@ -17,6 +17,7 @@ import com.pcloud.book.group.vo.GroupQrcodeBaseInfoVO;
import com.pcloud.book.group.vo.ListGroupQrcodeResponseVO; import com.pcloud.book.group.vo.ListGroupQrcodeResponseVO;
import com.pcloud.common.core.dao.BaseDao; import com.pcloud.common.core.dao.BaseDao;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -334,5 +335,5 @@ public interface GroupQrcodeDao extends BaseDao<GroupQrcode> { ...@@ -334,5 +335,5 @@ public interface GroupQrcodeDao extends BaseDao<GroupQrcode> {
String getMediaId(Long id); String getMediaId(Long id);
void updateMediaId(Long id, String mediaId); void updateMediaId(Long id, String mediaId, Date date);
} }
...@@ -23,6 +23,7 @@ import com.pcloud.common.core.dao.BaseDaoImpl; ...@@ -23,6 +23,7 @@ import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -346,10 +347,11 @@ public class GroupQrcodeDaoImpl extends BaseDaoImpl<GroupQrcode> implements Grou ...@@ -346,10 +347,11 @@ public class GroupQrcodeDaoImpl extends BaseDaoImpl<GroupQrcode> implements Grou
} }
@Override @Override
public void updateMediaId(Long id, String mediaId) { public void updateMediaId(Long id, String mediaId, Date date) {
HashMap<String, Object> map = CollUtil.newHashMap(2); HashMap<String, Object> map = CollUtil.newHashMap(2);
map.put("id",id); map.put("id",id);
map.put("mediaId",mediaId); map.put("mediaId",mediaId);
map.put("date",date);
getSqlSession().update(getStatement("updateMediaId"),map); getSqlSession().update(getStatement("updateMediaId"),map);
} }
......
package com.pcloud.book.group.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 群二维码永久素材与公众号关系表(GroupMaterialAccount)实体类
*
* @author guiq
* @since 2020-07-23
*/
@Data
public class GroupMaterialAccount implements Serializable {
private static final long serialVersionUID = 760026119257184103L;
/**
* 群二维码获取永久图文素材专用公众号列表
*/
private Long id;
/**
* 公众号ID
*/
private Long accountId;
/**
* 该公众号下的一个永久图片素材,用于作为图文素材的封面
*/
private String coverMediaId;
/**
* 群头像素材mediaId
*/
private String headMediaId;
/**
* 接口调用是否达到限制 ,默认0 【0:否 1:是】
*/
private Integer status;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}
\ No newline at end of file
package com.pcloud.book.group.facade; package com.pcloud.book.group.facade;
import com.pcloud.book.group.dto.*; import com.pcloud.book.group.dto.BookAppletSceneDTO;
import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.ChangeQrCodeTypeDto;
import com.pcloud.book.group.dto.SelfBookGroupStParamDTO;
import com.pcloud.book.group.dto.UserSelectParamDTO;
import com.pcloud.book.group.entity.BookGroup; import com.pcloud.book.group.entity.BookGroup;
import com.pcloud.book.group.entity.BookGroupClassify; import com.pcloud.book.group.entity.BookGroupClassify;
import com.pcloud.book.group.entity.BookGroupServe; import com.pcloud.book.group.entity.BookGroupServe;
...@@ -21,8 +25,11 @@ import com.pcloud.common.exceptions.BizException; ...@@ -21,8 +25,11 @@ import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.page.PageBean; import com.pcloud.common.page.PageBean;
import com.pcloud.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.permission.PermissionException; import com.pcloud.common.permission.PermissionException;
import io.swagger.annotations.Api;
import javax.servlet.http.HttpServletRequest; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.JsonParseException;
import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.CookieValue;
...@@ -34,14 +41,9 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -34,14 +41,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.List;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
/** /**
* Description 社群书群二维码接口 * Description 社群书群二维码接口
...@@ -763,4 +765,12 @@ public interface BookGroupFacade { ...@@ -763,4 +765,12 @@ public interface BookGroupFacade {
@ApiOperation("资源服务类型旧数据处理") @ApiOperation("资源服务类型旧数据处理")
@GetMapping("updateBookServeTypeCode") @GetMapping("updateBookServeTypeCode")
ResponseDto<?>updateBookServeTypeCode(); ResponseDto<?>updateBookServeTypeCode();
@ApiOperation(value = "通过 bookGroupQrcodeId 或者 classifyId 获取群二维码永久图文素材", httpMethod = "GET")
@RequestMapping(value = "/getGroupNewsMaterialById", method = RequestMethod.GET)
ResponseDto<?> getGroupNewsMaterialById(@CookieValue("userInfo") String userInfo,
@RequestParam(value = "bookGroupQrcodeId", required = false) Long bookGroupQrcodeId,
@RequestParam(value = "classifyId", required = false) Long classifyId) throws PermissionException;
} }
...@@ -45,8 +45,10 @@ import com.pcloud.common.utils.nginx.NginxUtils; ...@@ -45,8 +45,10 @@ import com.pcloud.common.utils.nginx.NginxUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.wechatgroup.base.exception.WechatGroupBizException; import com.pcloud.wechatgroup.base.exception.WechatGroupBizException;
import com.pcloud.wechatgroup.message.enums.IsSystem; import com.pcloud.wechatgroup.message.enums.IsSystem;
import io.swagger.annotations.ApiOperation;
import javax.servlet.http.HttpServletRequest; import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.JsonParseException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -61,16 +63,12 @@ import org.springframework.web.bind.annotation.RequestParam; ...@@ -61,16 +63,12 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
/** /**
* Description 社群书群二维码接口实现类 Created by PENG on 2019/4/17. * Description 社群书群二维码接口实现类 Created by PENG on 2019/4/17.
*/ */
...@@ -1247,4 +1245,18 @@ public class BookGroupFacadeImpl implements BookGroupFacade { ...@@ -1247,4 +1245,18 @@ public class BookGroupFacadeImpl implements BookGroupFacade {
return new ResponseDto<>(); return new ResponseDto<>();
} }
@Override
@RequestMapping(value = "/getGroupNewsMaterialById", method = RequestMethod.GET)
public ResponseDto<?> getGroupNewsMaterialById(@CookieValue("userInfo") String userInfo,
@RequestParam(value = "bookGroupQrcodeId", required = false) Long bookGroupQrcodeId,
@RequestParam(value = "classifyId", required = false) Long classifyId) throws PermissionException {
Cookie.getUserInfo(userInfo);
if (bookGroupQrcodeId == null && classifyId == null) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "classifyId 和 bookGroupQrcodeId 不可同时为空!");
}
Map<String,Object> map = new HashMap<>(1);
map.put("url",bookGroupBiz.getGroupNewsMaterialById(bookGroupQrcodeId,classifyId));
return new ResponseDto<>(map);
}
} }
package com.pcloud.book.group.mapper;
import com.pcloud.book.group.entity.GroupMaterialAccount;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
* 群二维码永久素材与公众号关系表(GroupMaterialAccount)表数据库访问层
*
* @author guiq
* @since 2020-07-23
*/
@Mapper
@Component
public interface GroupMaterialAccountMapper {
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
GroupMaterialAccount queryById(Long id);
/**
* 查询指定行数据
*
* @param offset 查询起始位置
* @param limit 查询条数
* @return 对象列表
*/
List<GroupMaterialAccount> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit);
/**
* 通过实体作为筛选条件查询
*
* @param groupMaterialAccount 实例对象
* @return 对象列表
*/
List<GroupMaterialAccount> queryAll(GroupMaterialAccount groupMaterialAccount);
/**
* 新增数据
*
* @param groupMaterialAccount 实例对象
* @return 影响行数
*/
int insert(GroupMaterialAccount groupMaterialAccount);
/**
* 修改数据
*
* @param groupMaterialAccount 实例对象
* @return 影响行数
*/
int update(GroupMaterialAccount groupMaterialAccount);
/**
* 通过主键删除数据
*
* @param id 主键
* @return 影响行数
*/
int deleteById(Long id);
/**
* 获取一个新增/更新永久图文素材未达限制的公众号
* @param date
*/
List<GroupMaterialAccount> getActiveAccount(@Param("date") Date date);
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pcloud.book.group.mapper.GroupMaterialAccountMapper">
<resultMap type="com.pcloud.book.group.entity.GroupMaterialAccount" id="GroupMaterialAccountMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="accountId" column="account_id" jdbcType="INTEGER"/>
<result property="coverMediaId" column="cover_media_id" jdbcType="VARCHAR"/>
<result property="headMediaId" column="head_media_id" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="INTEGER"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>
<!--查询单个-->
<select id="queryById" resultMap="GroupMaterialAccountMap">
select id,
account_id,
cover_media_id,
head_media_id,
status,
create_time,
update_time
from book.group_material_account
where id = #{id}
</select>
<!--查询指定行数据-->
<select id="queryAllByLimit" resultMap="GroupMaterialAccountMap">
select id,
account_id,
cover_media_id,
head_media_id,
status,
create_time,
update_time
from book.group_material_account
limit #{offset}, #{limit}
</select>
<!--通过实体作为筛选条件查询-->
<select id="queryAll" resultMap="GroupMaterialAccountMap">
select
id, account_id, cover_media_id, head_media_id, status, create_time, update_time
from book.group_material_account
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="accountId != null">
and account_id = #{accountId}
</if>
<if test="coverMediaId != null and coverMediaId != ''">
and cover_media_id = #{coverMediaId}
</if>
<if test="headMediaId != null and headMediaId != ''">
and head_media_id = #{headMediaId}
</if>
<if test="status != null">
and status = #{status}
</if>
<if test="createTime != null">
and create_time = #{createTime}
</if>
<if test="updateTime != null">
and update_time = #{updateTime}
</if>
</where>
</select>
<select id="getActiveAccount" resultMap="GroupMaterialAccountMap">
select id,
account_id,
cover_media_id,
head_media_id,
status,
create_time,
update_time
from book.group_material_account
where status = 1 or (status = 0 and update_time <![CDATA[ < ]]> #{date})
</select>
<!--新增所有列-->
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
insert into book.group_material_account(account_id, cover_media_id, head_media_id, status, create_time,
update_time)
values (#{accountId}, #{coverMediaId}, #{headMediaId}, #{status}, #{createTime}, #{updateTime})
</insert>
<!--通过主键修改数据-->
<update id="update">
update book.group_material_account
<set>
<if test="accountId != null">
account_id = #{accountId},
</if>
<if test="coverMediaId != null and coverMediaId != ''">
cover_media_id = #{coverMediaId},
</if>
<if test="headMediaId != null and headMediaId != ''">
head_media_id = #{headMediaId},
</if>
<if test="status != null">
status = #{status},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
</set>
where id = #{id}
</update>
<!--通过主键删除-->
<delete id="deleteById">
delete
from book.group_material_account
where id = #{id}
</delete>
</mapper>
\ No newline at end of file
...@@ -984,7 +984,7 @@ ...@@ -984,7 +984,7 @@
</select> </select>
<update id="updateMediaId" parameterType="map"> <update id="updateMediaId" parameterType="map">
UPDATE book_group_qrcode SET media_id = #{mediaId} UPDATE book_group_qrcode SET media_id = #{mediaId},update_material_time = #{date}
WHERE id = #{id} WHERE id = #{id}
</update> </update>
</mapper> </mapper>
\ No newline at end of file
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