|
@@ -0,0 +1,191 @@
|
|
|
|
+package com.zanxiang.game.data.serve.service.impl;
|
|
|
|
+
|
|
|
|
+import com.zanxiang.game.data.serve.pojo.properties.SmsProperties;
|
|
|
|
+import com.zanxiang.game.data.serve.service.IOrderCostMonitorAlarmService;
|
|
|
|
+import com.zanxiang.game.data.serve.utils.RedisUtil;
|
|
|
|
+import com.zanxiang.module.sms.pojo.SendResult;
|
|
|
|
+import com.zanxiang.module.sms.service.impl.AliSmsService;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.nutz.dao.Cnd;
|
|
|
|
+import org.nutz.dao.Dao;
|
|
|
|
+import org.nutz.dao.Sqls;
|
|
|
|
+import org.nutz.dao.sql.Criteria;
|
|
|
|
+import org.nutz.dao.sql.Sql;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
+import java.util.*;
|
|
|
|
+
|
|
|
|
+@Service
|
|
|
|
+@Slf4j
|
|
|
|
+public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorAlarmService {
|
|
|
|
+
|
|
|
|
+ @Resource
|
|
|
|
+ private Dao dao;
|
|
|
|
+
|
|
|
|
+ @Resource
|
|
|
|
+ private RedisUtil<String> redisUtil;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private AliSmsService aliSmsService;
|
|
|
|
+
|
|
|
|
+ @Resource
|
|
|
|
+ private SmsProperties smsProperties;
|
|
|
|
+
|
|
|
|
+ private final String modelName = "game_data_serve";
|
|
|
|
+
|
|
|
|
+ private final String HEADLINE_COST_COUNT = modelName + ":" + "headline_cost_count";
|
|
|
|
+
|
|
|
|
+ private final String TENCENT_COST_COUNT = modelName + ":" + "tencent_cost_count";
|
|
|
|
+
|
|
|
|
+ @Value("${phoneNumber}")
|
|
|
|
+ private String phoneNumber;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 10分钟扫一次,每次扫当前时间-半小时
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public void monitorDataStatus() {
|
|
|
|
+ //获取当前时间前半小时的时间
|
|
|
|
+ LocalDateTime date = LocalDateTime.now().minusMinutes(30);
|
|
|
|
+ //查询订单表
|
|
|
|
+ Sql orderSql = getSql(getOrderCountSql(date));
|
|
|
|
+ Integer count = orderSql.getInt(0);
|
|
|
|
+ //如果为0直接告警
|
|
|
|
+ if (count == 0) {
|
|
|
|
+ String msg = "前半小时订单表数据为空,请检查";
|
|
|
|
+ log.info(msg);
|
|
|
|
+ if(!sendSms(msg)){
|
|
|
|
+ throw new RuntimeException("短信发送失败");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void monitorHeadCostStatus() {
|
|
|
|
+ //获取当前时间前半小时的时间
|
|
|
|
+ LocalDateTime date = LocalDateTime.now().minusMinutes(30);
|
|
|
|
+ //查询头条广告表
|
|
|
|
+ Sql headCostSql = getSql(getheadCostCountSql(date));
|
|
|
|
+ Integer newHeadCostCount = headCostSql.getInt(0);
|
|
|
|
+ //从redis中取旧的消耗值
|
|
|
|
+ String oldHeadCostCount = redisUtil.getCache(HEADLINE_COST_COUNT);
|
|
|
|
+ if(StringUtils.isNotBlank(oldHeadCostCount)){
|
|
|
|
+ //如果不为空,则比较
|
|
|
|
+ if (newHeadCostCount - Integer.parseInt(oldHeadCostCount) == 0) {
|
|
|
|
+ //如果没期间没消耗就告警
|
|
|
|
+ String msg = "前半小时头条广告数据为空,请检查";
|
|
|
|
+ log.info(msg);
|
|
|
|
+ if(!sendSms(msg)){
|
|
|
|
+ throw new RuntimeException("短信发送失败");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //将新数据存入redis
|
|
|
|
+ redisUtil.setCache(HEADLINE_COST_COUNT, newHeadCostCount.toString(), 60 * 30);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void monitorTencentCostStatus() {
|
|
|
|
+ //获取当前时间前半小时的时间
|
|
|
|
+ LocalDateTime date = LocalDateTime.now().minusMinutes(30);
|
|
|
|
+ //查询腾讯广告表
|
|
|
|
+ Sql tencentCostSql = getSql(getTencentCostSqlSql(date));
|
|
|
|
+ Integer newTencentCostCount = tencentCostSql.getInt(0);
|
|
|
|
+ //从redis中取旧的消耗值
|
|
|
|
+ String oldTencentCostCount = redisUtil.getCache(TENCENT_COST_COUNT);
|
|
|
|
+ if(StringUtils.isNotBlank(oldTencentCostCount)){
|
|
|
|
+ if (newTencentCostCount - Integer.parseInt(oldTencentCostCount) == 0) {
|
|
|
|
+ String msg = "前半小时腾讯广告数据为空,请检查";
|
|
|
|
+ log.info(msg);
|
|
|
|
+ if(!sendSms(msg)){
|
|
|
|
+ throw new RuntimeException("短信发送失败");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //将新数据存入redis
|
|
|
|
+ redisUtil.setCache(TENCENT_COST_COUNT, newTencentCostCount.toString(), 60 * 30);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 发送短信
|
|
|
|
+ * @param content
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private Boolean sendSms(String content) {
|
|
|
|
+ Date date = new Date();
|
|
|
|
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ Map<String, String> params = new HashMap<>();
|
|
|
|
+ params.put("msg", content);
|
|
|
|
+ params.put("time",formatter.format(date));
|
|
|
|
+ //存储在配置文件
|
|
|
|
+ Set<String> numberList = new HashSet<>(Arrays.asList(phoneNumber.split(",")));
|
|
|
|
+
|
|
|
|
+ Map<String, SendResult> resultMap = aliSmsService.send(smsProperties.getDefaultSignName(), smsProperties.getDefaultStstemErrorTemplate(), params, numberList);
|
|
|
|
+ for (SendResult next : resultMap.values()) {
|
|
|
|
+ if (!next.isSuccess()) {
|
|
|
|
+ log.error("短信发送失败,失败原因:{}", next.getMsg());
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public boolean testSendSms(String content) {
|
|
|
|
+ System.out.println(phoneNumber);
|
|
|
|
+ return false;
|
|
|
|
+// return sendSms(content);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private Sql getSql(String sqlStr) {
|
|
|
|
+ Sql sql = Sqls.create(sqlStr);
|
|
|
|
+ sql.setCallback(Sqls.callback.integer());
|
|
|
|
+ dao.execute(sql);
|
|
|
|
+ return sql;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String getTencentCostSqlSql(LocalDateTime date) {
|
|
|
|
+ Criteria cri = Cnd.cri();
|
|
|
|
+ cri.where().and("day", ">=", date.toLocalDate());
|
|
|
|
+ cri.where().and("hour", "=", date.getHour());
|
|
|
|
+ String sql = """
|
|
|
|
+ select sum(cost) from ods_ad_tencent_data_game.t_gdt_adgroups_data_hour
|
|
|
|
+ """ + cri;
|
|
|
|
+ return sql;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String getheadCostCountSql(LocalDateTime date) {
|
|
|
|
+ Criteria cri = Cnd.cri();
|
|
|
|
+ cri.where().and("day", ">=", date.toLocalDate());
|
|
|
|
+ cri.where().and("hour", "=", date.getHour());
|
|
|
|
+ String sql = """
|
|
|
|
+ select sum(cost) from ods_ad_byte_data_game.t_ad_data_hour
|
|
|
|
+ """ + cri;
|
|
|
|
+ return sql;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String getOrderCountSql(LocalDateTime localDateTime) {
|
|
|
|
+ Criteria criteria = Cnd.cri();
|
|
|
|
+ criteria.where().and("create_time", ">=", localDateTime);
|
|
|
|
+ criteria.where().and("source_system", "=", "ZX_ONE");
|
|
|
|
+ String sql = """
|
|
|
|
+ select count(*) from dm_game_order.t_game_order
|
|
|
|
+ """ + criteria;
|
|
|
|
+ return sql;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|