feat:服务号通知

This commit is contained in:
苏竹红
2025-10-16 15:44:09 +08:00
parent 7be3958624
commit 1a416ce4b4
9 changed files with 153 additions and 64 deletions

View File

@@ -10,9 +10,12 @@ import com.cool.store.dto.notice.MessageTemplateCountDTO;
import com.cool.store.dto.notice.NoticeDTO;
import com.cool.store.dto.store.AuthStoreUserDTO;
import com.cool.store.dto.store.StoreAreaDTO;
import com.cool.store.dto.wechat.ServiceAccountOpenIdDTO;
import com.cool.store.entity.*;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.notice.*;
import com.cool.store.enums.wechat.WechatTemplateDetailEnum;
import com.cool.store.enums.wechat.WechatTemplateEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.StoreGroupMappingMapper;
import com.cool.store.mapper.StoreMapper;
@@ -20,12 +23,15 @@ import com.cool.store.request.notice.*;
import com.cool.store.response.bigdata.ApiResponse;
import com.cool.store.service.MessageTemplateService;
import com.cool.store.service.StoreService;
import com.cool.store.service.wechat.WechatTemplateService;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.RedisUtilPool;
import com.cool.store.utils.poi.DateUtils;
import com.cool.store.vo.PartnerUserInfoVO;
import com.cool.store.vo.notice.*;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -70,9 +76,13 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
@Resource
MatterConfigDAO matterConfigDAO;
@Resource
WechatTemplateService wechatTemplateService;
@Resource
RedisUtilPool redisUtilPool;
@Resource
TaskExecutor noticeThreadPool;
@Resource
HyPartnerUserInfoDAO hyPartnerUserInfoDAO;
@@ -207,6 +217,36 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
JSONObject.toJSONString(request.getStoreInfoList()),
JSONObject.toJSONString(request.getUserInfoList()),
userId);
//发送通知
Set<String> userIds = authUser.values().stream().flatMap(Collection::stream).collect(Collectors.toSet());
//分批 查询用户信息
List<String> openIdList = new ArrayList<>();
Lists.partition(new ArrayList<>(userIds), 100).forEach(x->{
List<EnterpriseUserDO> userInfoByUserIds = enterpriseUserDAO.getUserInfoByUserIds(x);
//取出用户的手机号,过滤掉空的手机号
List<String> mobileList = userInfoByUserIds.stream().filter(user -> StringUtils.isNotBlank(user.getMobile())).map(EnterpriseUserDO::getMobile).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(mobileList)){
List<ServiceAccountOpenIdDTO> serviceAccountOpenIdDTOS = hyPartnerUserInfoDAO.selectLastBindRecord(mobileList);
if (CollectionUtils.isNotEmpty(serviceAccountOpenIdDTOS)){
//服务号ID
openIdList.addAll(serviceAccountOpenIdDTOS.stream().map(ServiceAccountOpenIdDTO::getServiceAccountOpenId).collect(Collectors.toList()));
}
}
});
MessageTemplateDO messageTemplateDO = list.get(0);
Map<String, Object> data = new HashMap<>();
data.put(WechatTemplateDetailEnum.CHARACTER_STRING2.getCode(), "ceshi002");
data.put(WechatTemplateDetailEnum.THING10.getCode(), messageTemplateDO.getMessageTitle());
data.put(WechatTemplateDetailEnum.TIME14.getCode(), DateUtils.parseDateToStr(DateUtils.SPECIAL_DATE_START_1, messageTemplateDO.getDeadline()));
data.put(WechatTemplateDetailEnum.THING25.getCode(), "正新管理有限公司");
data.put(WechatTemplateDetailEnum.THING60.getCode(), "上海市-松江区");
openIdList.forEach(x->{
wechatTemplateService.sendMiniAppTemplate(x, WechatTemplateEnum.QUESTION_NOTICE,data,null);
});
} catch (Exception e) {
log.info("发布流程异常,已取消发布");
} finally {

View File

@@ -127,58 +127,4 @@ public class WechatTemplateService {
return false;
}
}
public void sendTemplateMessageAsync(WechatTemplateMessageDTO messageDTO, WechatCallback callback) {
String accessToken = getAccessToken();
if (accessToken == null) {
log.error("获取access_token失败无法发送模板消息");
callback.onFailure(new IOException("获取access_token失败"));
return;
}
String url = String.format("%s?access_token=%s",
wechatMpProperties.getSendTemplateMessageUrl(), accessToken);
okHttpUtil.doPostAsync(url, messageDTO, new okhttp3.Callback() {
@Override
public void onResponse(okhttp3.Call call, okhttp3.Response response) throws IOException {
try {
String result = response.body() != null ? response.body().string() : null;
log.info("异步发送模板消息响应: {}", result);
if (response.isSuccessful() && result != null) {
callback.onSuccess(Boolean.TRUE);
} else {
callback.onFailure(new IOException("请求失败,状态码: " + response.code()));
}
} catch (Exception e) {
callback.onFailure(e);
}
}
@Override
public void onFailure(okhttp3.Call call, IOException e) {
log.error("异步发送模板消息失败", e);
callback.onFailure(e);
}
});
}
public void sendNormalTemplateAsync(String openId, WechatTemplateEnum template,
Map<String, Object> data, WechatCallback callback) {
WechatTemplateMessageDTO messageDTO = templateMessageBuilder.buildNormalTemplate(openId, template, data);
sendTemplateMessageAsync(messageDTO, callback);
}
public void sendMiniAppTemplateAsync(String openId, WechatTemplateEnum template,
Map<String, Object> data, String miniAppPagePath, WechatCallback callback) {
WechatTemplateMessageDTO messageDTO = templateMessageBuilder.buildMiniappTemplate(
openId, template, data, miniAppPagePath);
sendTemplateMessageAsync(messageDTO, callback);
}
public interface WechatCallback {
void onSuccess(Boolean successFlag);
void onFailure(Exception e);
}
}