152 Star 369 Fork 51

架构-小哥 / zscat-小程序

forked from mallplus / webappchat 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
小程序后台批量推送 11.55 KB
一键复制 编辑 原始数据 按行查看 历史
架构-小哥 提交于 2018-09-22 07:44 . 新建 小程序后台批量推送
一,创建需要的表
表名:t_push_task(推送任务表)
表格信息
字段 类型 注释 键 能否为空 默认值 其他
id int(11)
PRI NO 无 auto_increment
template_id varchar(64) 小程序模版ID
YES 无
task_name varchar(64) 模版名称
YES 无
task_topic varchar(64) 活动主题
YES 无
task_caption varchar(200) 活动说明
YES 无
task_tips varchar(64) 温馨提示
YES 无
task_type varchar(64) 任务类型
YES 无
status int(1) 任务是否已经发送 1 未发送[默认] 2 已发送
YES 无
goods_id int(11) 商品ID
YES 无
goods_name varchar(64) 商品标题
YES 无
goods_online_status int(2) 商品前台状态 1 上架 0 下架
YES 无
price decimal(10,2) 商品金额(需要的海贝数)
YES 无
is_upload int(1)
YES 无
file_name varchar(64)
YES 无
create_time datetime 创建时间
YES 无
update_time datetime 更新时间 MUL NO 无
表名:t_push_task_user(推送流水表)
注释:
返回目录
表格信息
字段 类型 注释 键 能否为空 默认值 其他
id int(11)
PRI NO 无 auto_increment
task_id int(11) 推送ID MUL YES 无
user_id int(11) 用户ID
YES 无
form_id varchar(50) 小程序推送formId
YES 无
status int(2) 推送状态 1 已推送 2 未推送
YES 无
create_time datetime 创建时间
YES 无
update_time datetime 更新时间
YES 无
note varchar(255) 备注
YES 无
表名:t_push_user_from_id_record(收集formid表)
表格信息
字段 类型 注释 键 能否为空 默认值 其他
id bigint(11)
PRI NO 无 auto_increment
user_id bigint(11) 用户id MUL YES 无
form_id varchar(100) 小程序推送formId
YES 无
source smallint(2) 来源 source 1,步数兑换海贝按钮;2,首页邀请按钮;3,步数拦截弹窗邀请按钮;4,兑换商品按钮;5,海贝不够邀请按钮;6,引导关注蒙层按钮;7,健康体验领取按钮
YES 无
status smallint(2) 使用状态 1 未使用[默认] 2 已使用
YES 无
create_time datetime 创建时间
YES 无
update_time datetime 修改时间
YES 无
二.小程序需要推送的必须字段 为 formId和用户的openid
小程序推送任务配置 新建任务
序号 任务创建时间 模板ID 模板名称 关联商品编码 关联商品标题 关联商品前台状态 推送用户量 任务类型 操作
98 2018-09-20 895CZeh4-ISI3cpl1yyS-o_i6EtMfrC8bzgaipHauF0 活动加入成功提醒 1989 健康助利测试商品1 上架 638 指定用户发送 查看 发送完成
97 2018-09-20 895CZeh4-ISI3cpl1yyS-o_i6EtMfrC8bzgaipHauF0 活动加入成功提醒 1989 健康助利测试商品1 上架 638 指定用户发送 查看 发送完成
96 2018-09-20 895CZeh4-ISI3cpl1yyS-o_i6EtMfrC8bzgaipHauF0 活动加入成功提醒 1989 健康助利测试商品1 上架 637 指定用户发送 查看 发送完成
95 2018-09-20 895CZeh4-ISI3cpl1yyS-o_i6EtMfrC8bzgaipHauF0 活动加入成功提醒 1989 健康助利测试商品1 上架 637 指定用户发送 查看 发送完成
新增任务(可以配置需要推送的任何商品)
模板ID: 895CZeh4-ISI3cpl1yyS-o_i6EtMfrC8bzgaipHauF0
模板名称: 活动加入成功提醒
活动主题:  限10个字,小程序模板消息的活动主题
活动说明:  限30个字,小程序模板消息的活动说明
温馨提示:  限30个字,小程序模板消息的温馨提示
模板关联前台商品编码:  更新 限1个上架商品编码,小程序模板商品标题及金额
商品标题: 健康助利测试商品1
商品金额: 250
商品前台状态: 上架
然后再列表可以点击 发送按钮;
发送代码
/**
* 小程序任务推送
* @param id
* @return
*/
public ResultInfoObject pushMsg(Integer id,String userName) {
ResultInfoObject resultInfo = new ResultInfoObject();
//针对于售后服务重复数据进行redis加锁,处理并发问题
String key = "health_cache_push_" + id;
if(JedisUtil.keyExists(key)) {
resultInfo.setRetcode(CommonConstant.PARAM_ERROR_CODE);
resultInfo.setRetdesc("操作过于频繁,请稍后再试!");
return resultInfo;
}
JedisUtil.setex(key, 300, "1");
log.info("[pushMsg] add redis lock key : {}", key);
HealthPushTask healthPushTask = healthPushTaskDao.selectByPrimaryKey(id);
if (healthPushTask.getStatus()==2){ //已发送
log.info("此任务已发送id="+healthPushTask.getId());
resultInfo.setRetcode(CommonConstant.PARAM_ERROR_CODE);
resultInfo.setObject("此任务已发送id="+healthPushTask.getId());
return resultInfo ;
}
healthPushTask.setStatus(2);
healthPushTask.setUpdateTime(new Date());
healthPushTaskDao.updateByPrimaryKeySelective(healthPushTask);
List<HealthPushTaskUser> healthPushTaskUserList = healthPushTaskUserDao.selectListByTaskId(id);
if (healthPushTaskUserList== null|| healthPushTaskUserList.size()<1){
log.info("还没有上传用户ID");
resultInfo.setRetcode(CommonConstant.PARAM_ERROR_CODE);
resultInfo.setObject("还没有上传用户ID");
return resultInfo ;
}
List<HealthPushUserFromIdRecord> healthPushUserFromIdRecordList = healthPushUserFromIdRecordDao.selectAvialFormId();
if (healthPushUserFromIdRecordList== null|| healthPushUserFromIdRecordList.size()<1){
log.info("没有formid");
resultInfo.setRetcode(CommonConstant.PARAM_ERROR_CODE);
resultInfo.setObject("没有formid");
return resultInfo ;
}
Map<String, HealthPushUserFromIdRecord> formIdMap = new HashMap();
AtomicInteger successCount = new AtomicInteger(0);
for (HealthPushUserFromIdRecord s : healthPushUserFromIdRecordList) {
formIdMap.put(s.getUserId() + "", s);
}
int totalCount = healthPushTaskUserList.size();
//多线程分发
final int size = 100;
int threadCount = (totalCount + size - 1) / size;
final CountDownLatch countDownLatch = new CountDownLatch(threadCount);
for(int i=0;i<threadCount;i++) {
final int beginIndex = i * size;
final int endIndex = (threadCount - i) ==1 ? totalCount : (beginIndex + size);
ThreadPoolUtils.addProcess(new Runnable() {
@Override
public void run() {
List<HealthPushTaskUser> subList = new ArrayList<>(healthPushTaskUserList.subList(beginIndex,endIndex));
log.info("小程序推送子list范围: {}-{}",beginIndex , endIndex);
for (HealthPushTaskUser healthPushTaskUser : subList) {
HealthUser healthUser = healthUserDao.selectByPrimaryKey(Long.valueOf(healthPushTaskUser.getUserId()));
if (healthUser != null && healthUser.getOpenid() != null) {
HealthPushUserFromIdRecord healthPushUserFromIdRecord =formIdMap.get(healthUser.getUserId() + "");
try {
if (healthPushUserFromIdRecord== null){
log.info(healthUser.getUserId()+"没有formid");
healthPushTaskUser.setUpdateTime(new Date());
healthPushTaskUser.setStatus(3);
healthPushTaskUser.setNote("没有formid");
healthPushTaskUserDao.updateByPrimaryKeySelective(healthPushTaskUser);
continue;
}
String page ="pages/goods/detail/detail";
String accessToken = wechatApiService.getAccessToken("health_applet");
String templateId = healthPushTask.getTemplateId();
Map<String, TemplateData> param = new HashMap<String, TemplateData>();
param.put("keyword1", new TemplateData(healthPushTask.getTaskTopic(), "#EE0000"));
param.put("keyword2", new TemplateData(healthPushTask.getTaskCaption(), "#EE0000"));
param.put("keyword3", new TemplateData(healthPushTask.getGoodsName(), "#EE0000"));
param.put("keyword4", new TemplateData( Validator.doubleTrans(Validator.rountTwo(healthPushTask.getPrice().doubleValue()))+"海贝", "#EE0000"));
param.put("keyword5", new TemplateData( healthPushTask.getTaskTips(), "#EE0000"));
com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSONString(param));
// //调用发送微信消息给用户的接口 ********这里写自己在微信公众平台拿到的模板ID
JSONObject resultJson = WX_TemplateMsgUtil.sendWechatMsgToUser(healthUser.getOpenid(), templateId, page + "?backToHome=1&&goodsId=" + healthPushTask.getGoodsId(),
healthPushUserFromIdRecord.getFormId(), jsonObject, accessToken);
String errmsg = "error";
if (resultJson!=null){
errmsg = (String) resultJson.get("errmsg");
}
if ("ok".equals(errmsg)){
healthPushTaskUser.setStatus(1);
successCount.incrementAndGet();
}else {
healthPushTaskUser.setStatus(3);
// errorCount++;
}
healthPushUserFromIdRecord.setStatus(2);
healthPushUserFromIdRecord.setUpdateTime(new Date());
healthPushUserFromIdRecordDao.updateByPrimaryKeySelective(healthPushUserFromIdRecord);
healthPushTaskUser.setUpdateTime(new Date());
healthPushTaskUser.setNote(errmsg);
healthPushTaskUser.setFormId(healthPushUserFromIdRecord.getFormId());
healthPushTaskUserDao.updateByPrimaryKeySelective(healthPushTaskUser);
} catch (Exception e) {
resultInfo.setRetdesc("发送失败");
resultInfo.setRetcode(CommonConstant.PARAM_ERROR_CODE);
log.error("APPPUSH:"+e.getMessage());
}
} else {
healthPushTaskUser.setUpdateTime(new Date());
healthPushTaskUser.setStatus(3);
healthPushTaskUser.setNote("用户不存在或者openid不存在");
healthPushTaskUserDao.updateByPrimaryKeySelective(healthPushTaskUser);
log.info("APPPUSH:用户不存在或者openid不存在=" + healthPushTaskUser.getUserId());
}
}
countDownLatch.countDown();
}
});
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
log.error("小程序推送线程中断,错误:{}", e.getMessage());
}
String obj = "总发送数量="+totalCount+",发送成功数量="+successCount.get()+",发送失败数量="+(totalCount-successCount.get());
log.info(obj);
resultInfo.setObject(obj);
resultInfo.setRetcode(CommonConstant.RET_SUCCESS);
return resultInfo;
}
首先通过redis 锁 锁住任务,防止任务重复发送,
发送速度通过多线程的方式,每个线程发送100个推送,通过截取list的方式,选择推送范围
qq 群 621692258
git 地址 https://gitee.com/JiaGou-XiaoGe/webappchat/
Java
1
https://gitee.com/JiaGou-XiaoGe/webappchat.git
git@gitee.com:JiaGou-XiaoGe/webappchat.git
JiaGou-XiaoGe
webappchat
zscat-小程序
master

搜索帮助