Переглянути джерело

fix 定时发送营销短信

zoujiajian 3 роки тому
батько
коміт
9bd1997ffc

+ 8 - 1
netflix-common/src/main/java/com/cyksj/common/util/SmsUtil.java

@@ -3,6 +3,7 @@ package com.cyksj.common.util;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.Method;
+import cn.hutool.json.JSONObject;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 import com.tencentcloudapi.common.profile.ClientProfile;
@@ -66,13 +67,19 @@ public class SmsUtil {
         System.out.println(execute.body());
     }
 
-    public static void batchSendLuoKey2Msg(List<String> mobile, String msg) {
+    public static Boolean batchSendLuoKey2Msg(List<String> mobile, String msg) throws Exception {
         HttpRequest request = new HttpRequest(BATCH_URL);
         request.setMethod(Method.POST);
         request.basicAuth("api", LVSINCO_PASSWORD);
         request.form("mobile_list", mobile.stream().collect(Collectors.joining(",")));
         request.form("message", msg);
         HttpResponse execute = request.execute();
+        JSONObject re = Jsons.parseObject(execute.body(), JSONObject.class);
+        if (re.getInt("error") == 0) {
+            return true;
+        }
+        log.error(execute.body());
+        return false;
     }
 
     public static void sendTencent(String mobile, String msg) {

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/market/task/UserBindDetailMapper.java

@@ -3,6 +3,8 @@ package com.cyksj.mapper.market.task;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.UserBindDetail;
 
+import java.util.List;
+
 /*
  *项目名: netflix
  *文件名: UserBindDetailMapper
@@ -10,4 +12,5 @@ import com.cyksj.model.entity.UserBindDetail;
  *创建时间:2022/12/29 13:54
  */
 public interface UserBindDetailMapper extends BaseMapper<UserBindDetail> {
+	List<String> selectPhones(Integer filter);
 }

+ 20 - 0
netflix-dao/src/main/resources/mapper/UserBindDetailMapper.xml

@@ -0,0 +1,20 @@
+<?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.cyksj.mapper.market.task.UserBindDetailMapper">
+
+    <select id="selectPhones" resultType="java.lang.String">
+        select s.phone
+        from (select id as user_id, login_phone as phone
+              from `user`
+              where login_phone != ''
+              union all
+              select user_id, phone
+              from `user_bind_detail`
+              where phone != '') s
+                 left join order_don od on od.user_id = s.user_id and od.status not in ('close', 'noPayment', 'refund')
+            and od.relation_id = 0 and od.created_time > '2023-06-06 00:00:00'
+        where od.id is null
+        order by s.user_id
+            limit #{filter}, 10000
+    </select>
+</mapper>

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -608,6 +608,7 @@ public class RedisService {
         CPS_AUTH_SUCCESS_KEY("cps_auth_success_key:%s", "cps后台微信授权", 60 * 10),
         QUESTION_RESPONSE_KEY("question_response_key:%s", "问卷回答key", 60 * 60 * 24L),
         IMPORT_ACCOUNT_CACHE_KEY("import_account_cache_key:%s", "导入缓存key", 60 * 10L),
+        MAKERTING_MSG_KEY("makerting_msg_key", "营销短信", 60 * 60 * 24 * 30),
         ;
 
         private String name;

+ 37 - 0
netflix-service/src/main/java/com/cyksj/task/Scheduler.java

@@ -16,6 +16,7 @@ import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
 import com.cyksj.mapper.manage.sys.WorkOrderMapper;
+import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.manage.views.GroupsRelationView;
@@ -101,6 +102,8 @@ public class Scheduler {
 
 	    private final SchedulerService schedulerService;
 
+	    private final UserBindDetailMapper userBindDetailMapper;
+
 	    private final static List<Long> filter_skuIds = List.of(177l);
 
     /**
@@ -502,5 +505,39 @@ public class Scheduler {
 			}
 		});
 	}
+
+	/**
+	 * 1w条短信 每小时
+	 */
+	@Scheduled(cron = "0 0 12,15,17,18 * * ?")
+	public void marketingMsg() {
+		//获取最大条件
+		String key = RedisService.key.MAKERTING_MSG_KEY.getName();
+		Object value = redisService.get(key);
+		Integer max_filter = 0;
+		if (value != null) {
+			max_filter = Integer.parseInt(value.toString());
+			log.info("过滤条数:{}", max_filter);
+		}
+		//获取手机号 每次获取3000次
+		List<String> phones = userBindDetailMapper.selectPhones(max_filter);
+		if (phones.isEmpty()) {
+			log.info("营销短信已发完");
+			return;
+		}
+		log.info("营销短信手机号数量大小:{}", phones.size());
+		try {
+			Boolean isSuccess = SmsUtil.batchSendLuoKey2Msg(phones, "618大促流媒体、Ai会员全场9折!续费可用!电视看奈飞方案最多立减100元!登录https://nf.video/立即下单【银河录像局】");
+			if (isSuccess) {
+				if (value != null) {
+					redisService.incr(key, 10000l);
+					return;
+				}
+				redisService.set(key, 10000, RedisService.key.MAKERTING_MSG_KEY.getTimeout());
+			}
+		} catch (Exception e) {
+
+		}
+	}
 }