浏览代码

规则引擎功能开发初版2

zhaoxian 4 年之前
父节点
当前提交
90eba2a5ab
共有 24 个文件被更改,包括 674 次插入116 次删除
  1. 1 1
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/db/DataSourceCachePool.java
  2. 5 0
      module-alarm/pom.xml
  3. 36 13
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmEventRuleController.java
  4. 2 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventMetric.java
  5. 24 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventRule.java
  6. 4 2
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventSend.java
  7. 2 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmEventMetricMapper.java
  8. 7 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmEventRuleMapper.java
  9. 6 1
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/AlarmEventMetricMapper.xml
  10. 45 1
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/AlarmEventRuleMapper.xml
  11. 9 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IAlarmEventRuleService.java
  12. 263 5
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmEventRuleServiceImpl.java
  13. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IMessageTemplate.java
  14. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MessageTemplateImpl.java
  15. 6 0
      module-job-kuaishou/pom.xml
  16. 27 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouAlarmRuleHourlyCheckJob.java
  17. 27 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouAlarmRuleMinuteCheckJob.java
  18. 26 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouCostGroupJob.java
  19. 91 60
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouCostGroup.java
  20. 4 3
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouCostGroupMapper.java
  21. 23 22
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouCostGroupMapper.xml
  22. 1 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/IKuaishouCostGroupService.java
  23. 43 5
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouCostGroupServiceImpl.java
  24. 0 1
      module-oa/src/main/java/cn/com/ctop/oa/modules/controller/WechatNoListController.java

+ 1 - 1
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/db/DataSourceCachePool.java

@@ -19,7 +19,7 @@ public class DataSourceCachePool {
     private static Map<String, DruidDataSource> dbSources = new HashMap<>();
     private static Map<String, DruidDataSource> dbSources = new HashMap<>();
     private static RedisTemplate<String, Object> redisTemplate;
     private static RedisTemplate<String, Object> redisTemplate;
 
 
-    private static RedisTemplate<String, Object> getRedisTemplate() {
+    public static RedisTemplate<String, Object> getRedisTemplate() {
         if (redisTemplate == null) {
         if (redisTemplate == null) {
             redisTemplate = (RedisTemplate<String, Object>) SpringContextUtils.getBean("redisTemplate");
             redisTemplate = (RedisTemplate<String, Object>) SpringContextUtils.getBean("redisTemplate");
         }
         }

+ 5 - 0
module-alarm/pom.xml

@@ -24,6 +24,11 @@
             <artifactId>module-common</artifactId>
             <artifactId>module-common</artifactId>
             <version>2.0.2</version>
             <version>2.0.2</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>module-kuaishou</artifactId>
+            <version>2.0.2</version>
+        </dependency>
 
 
     </dependencies>
     </dependencies>
 
 

+ 36 - 13
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmEventRuleController.java

@@ -6,8 +6,8 @@ import cn.com.ctop.common.module.annotation.AutoLog;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -68,14 +68,37 @@ public class AlarmEventRuleController {
     @AutoLog(value = "预警事件规则表-分页列表查询")
     @AutoLog(value = "预警事件规则表-分页列表查询")
     @ApiOperation(value = "预警事件规则表-分页列表查询", notes = "预警事件规则表-分页列表查询")
     @ApiOperation(value = "预警事件规则表-分页列表查询", notes = "预警事件规则表-分页列表查询")
     @GetMapping(value = "/list")
     @GetMapping(value = "/list")
-    public Result<IPage<AlarmEventRule>> queryPageList(AlarmEventRule alarmEventRule,
-                                                       @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
-                                                       @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
-                                                       HttpServletRequest req) {
-        Result<IPage<AlarmEventRule>> result = new Result<>();
-        QueryWrapper<AlarmEventRule> queryWrapper = QueryGenerator.initQueryWrapper(alarmEventRule, req.getParameterMap());
-        Page<AlarmEventRule> page = new Page<AlarmEventRule>(pageNo, pageSize);
-        IPage<AlarmEventRule> pageList = alarmEventRuleService.page(page, queryWrapper);
+    public Result<PageInfo<AlarmEventRule>> queryPageList(AlarmEventRule alarmEventRule,
+                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                          HttpServletRequest req) {
+        Result<PageInfo<AlarmEventRule>> result = new Result<>();
+        PageHelper.startPage(pageNo, pageSize);
+        PageInfo<AlarmEventRule> pageList = alarmEventRuleService.selectListPage(alarmEventRule);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 分页列表查询
+     *
+     * @param alarmEventRule
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "获取规则运行记录数据-分页列表查询")
+    @ApiOperation(value = "获取规则运行记录数据-分页列表查询", notes = "获取规则运行记录数据-分页列表查询")
+    @GetMapping(value = "/getRunningRecords")
+    public Result<PageInfo<AlarmEventRule>> getRunningRecord(AlarmEventRule alarmEventRule,
+                                                             @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                             @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                             HttpServletRequest req) {
+        Result<PageInfo<AlarmEventRule>> result = new Result<>();
+        PageHelper.startPage(pageNo, pageSize);
+        PageInfo<AlarmEventRule> pageList = alarmEventRuleService.queryRunningRecordPage(alarmEventRule);
         result.setSuccess(true);
         result.setSuccess(true);
         result.setResult(pageList);
         result.setResult(pageList);
         return result;
         return result;
@@ -131,10 +154,10 @@ public class AlarmEventRuleController {
      */
      */
     @AutoLog(value = "预警事件规则表-通过id删除")
     @AutoLog(value = "预警事件规则表-通过id删除")
     @ApiOperation(value = "预警事件规则表-通过id删除", notes = "预警事件规则表-通过id删除")
     @ApiOperation(value = "预警事件规则表-通过id删除", notes = "预警事件规则表-通过id删除")
-    @DeleteMapping(value = "/delete")
-    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+    @GetMapping(value = "/delete")
+    public Result<?> delete(String id) {
         try {
         try {
-            alarmEventRuleService.removeById(id);
+            alarmEventRuleService.deleteById(id);
         } catch (Exception e) {
         } catch (Exception e) {
             log.error("删除失败", e.getMessage());
             log.error("删除失败", e.getMessage());
             return Result.error("删除失败!");
             return Result.error("删除失败!");

+ 2 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventMetric.java

@@ -46,6 +46,8 @@ public class AlarmEventMetric {
     @Excel(name = "指标标识", width = 15)
     @Excel(name = "指标标识", width = 15)
     @ApiModelProperty(value = "指标标识")
     @ApiModelProperty(value = "指标标识")
     private String metricValueCode;
     private String metricValueCode;
+
+    private String metricValueName;
     /**
     /**
      * 判断方式 > >= < <= =
      * 判断方式 > >= < <= =
      */
      */

+ 24 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventRule.java

@@ -98,4 +98,28 @@ public class AlarmEventRule {
     @TableField(exist = false)
     @TableField(exist = false)
     private List<AlarmEventMetric> alarmEventMetrics;
     private List<AlarmEventMetric> alarmEventMetrics;
 
 
+    private String createrId;
+
+    @TableField(exist = false)
+    private String createrName;
+
+    @TableField(exist = false)
+    private String userId;
+
+    @TableField(exist = false)
+    private String accountName;
+
+    @TableField(exist = false)
+    private String UserName;
+
+    @TableField(exist = false)
+    private Date runningTime;
+
+    @TableField(exist = false)
+    private String alarmCondition;
+
+    private String metricValueCode;
+
+    private String metricValueName;
+
 }
 }

+ 4 - 2
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventSend.java

@@ -33,13 +33,13 @@ public class AlarmEventSend {
      */
      */
     @TableId(type = IdType.AUTO)
     @TableId(type = IdType.AUTO)
     @ApiModelProperty(value = "主键id")
     @ApiModelProperty(value = "主键id")
-    private Integer alarmSendId;
+    private Long alarmSendId;
     /**
     /**
      * 规则id
      * 规则id
      */
      */
     @Excel(name = "规则id", width = 15)
     @Excel(name = "规则id", width = 15)
     @ApiModelProperty(value = "规则id")
     @ApiModelProperty(value = "规则id")
-    private Integer eventRuleId;
+    private Long eventRuleId;
     /**
     /**
      * 预警指标
      * 预警指标
      */
      */
@@ -58,6 +58,8 @@ public class AlarmEventSend {
     @Excel(name = "预警发送状态 0未发送,1已发送", width = 15)
     @Excel(name = "预警发送状态 0未发送,1已发送", width = 15)
     @ApiModelProperty(value = "预警发送状态 0未发送,1已发送")
     @ApiModelProperty(value = "预警发送状态 0未发送,1已发送")
     private String alarmStatus;
     private String alarmStatus;
+
+    private String alarmCondition;
     /**
     /**
      * createTime
      * createTime
      */
      */

+ 2 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmEventMetricMapper.java

@@ -15,4 +15,6 @@ import java.util.List;
 public interface AlarmEventMetricMapper extends BaseMapper<AlarmEventMetric> {
 public interface AlarmEventMetricMapper extends BaseMapper<AlarmEventMetric> {
 
 
     List<AlarmEventMetric> selectByEventRuleId(String id);
     List<AlarmEventMetric> selectByEventRuleId(String id);
+
+    void deleteByRuleId(String id);
 }
 }

+ 7 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmEventRuleMapper.java

@@ -3,6 +3,8 @@ package cn.com.ctop.alarm.modules.mapper;
 import cn.com.ctop.alarm.modules.entity.AlarmEventRule;
 import cn.com.ctop.alarm.modules.entity.AlarmEventRule;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 
+import java.util.List;
+
 /**
 /**
  * 预警事件规则表
  * 预警事件规则表
  *
  *
@@ -12,4 +14,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
  */
 public interface AlarmEventRuleMapper extends BaseMapper<AlarmEventRule> {
 public interface AlarmEventRuleMapper extends BaseMapper<AlarmEventRule> {
 
 
+    List<AlarmEventRule> selectListPage(AlarmEventRule alarmEventRule);
+
+    AlarmEventRule queryById(String id);
+
+    List<AlarmEventRule> queryRunningRecordPage(AlarmEventRule alarmEventRule);
 }
 }

+ 6 - 1
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/AlarmEventMetricMapper.xml

@@ -5,6 +5,11 @@
     <select id="selectByEventRuleId" resultType="cn.com.ctop.alarm.modules.entity.AlarmEventMetric">
     <select id="selectByEventRuleId" resultType="cn.com.ctop.alarm.modules.entity.AlarmEventMetric">
         SELECT *
         SELECT *
         FROM ctop_alarm_event_metric
         FROM ctop_alarm_event_metric
-        WHERE event_metric_id = #{id}
+        WHERE event_rule_id = #{id}
     </select>
     </select>
+
+    <delete id="deleteByRuleId">
+        delete from ctop_alarm_event_metric
+        where event_rule_id = #{id}
+    </delete>
 </mapper>
 </mapper>

+ 45 - 1
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/AlarmEventRuleMapper.xml

@@ -1,5 +1,49 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?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">
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="cn.com.ctop.AlarmEventRule.mapper.AlarmEventRuleMapper">
+<mapper namespace="cn.com.ctop.alarm.modules.mapper.AlarmEventRuleMapper">
 
 
+    <select id="selectListPage" parameterType="cn.com.ctop.alarm.modules.entity.AlarmEventRule"
+            resultType="cn.com.ctop.alarm.modules.entity.AlarmEventRule">
+        SELECT DISTINCT
+        t1.*,t3.realname AS 'createrName',t2.user_id,t2.user_name,t2.auth_name AS 'accountName' FROM
+        ctop_alarm_event_rule t1
+        LEFT JOIN ctop_user_allocation t2 ON t1.account_id = t2.account_id
+        LEFT JOIN sys_user t3 ON t1.creater_id = t3.id
+        <where>
+            <if test="eventRuleStatus != null and eventRuleStatus !='' ">
+                AND t1.event_rule_status = #{eventRuleStatus}
+            </if>
+            <if test="checkFrequency != null and checkFrequency !='' ">
+                AND t1.check_frequency = #{checkFrequency}
+            </if>
+        </where>
+        order by t1.create_time desc
+    </select>
+    <select id="queryRunningRecordPage" parameterType="cn.com.ctop.alarm.modules.entity.AlarmEventRule"
+            resultType="cn.com.ctop.alarm.modules.entity.AlarmEventRule">
+        SELECT t1.*,
+        t3.user_id,t2.create_time AS 'runningTime',
+        t3.auth_name AS 'accountName',
+        t2.alarm_condition AS 'alarmCondition',
+        t3.user_name AS 'userName',t4.realname AS 'createrName'
+        FROM ctop_alarm_event_rule t1
+        INNER JOIN ctop_alarm_event_send t2 ON t1.event_rule_id = t2.event_rule_id
+        LEFT JOIN ctop_user_allocation t3 ON t1.account_id = t3.account_id
+        LEFT JOIN sys_user t4 ON t1.creater_id = t4.id
+        WHERE t1.event_rule_status = '1'
+        <if test="eventRuleId!=null">
+            AND t1.event_rule_id = #{eventRuleId}
+        </if>
+        <if test="eventRuleName!=null">
+            AND t1.event_rule_name LIKE CONCAT('%',#{eventRuleName},'%')
+        </if>
+        ORDER BY t2.create_time DESC
+    </select>
+    <select id="queryById" resultType="cn.com.ctop.alarm.modules.entity.AlarmEventRule">
+       SELECT DISTINCT t1.*,t3.realname AS 'createrName',t2.user_id,t2.user_name,t2.auth_name AS accountName FROM
+        ctop_alarm_event_rule t1
+        LEFT JOIN ctop_user_allocation t2 ON t1.account_id = t2.account_id
+         LEFT JOIN sys_user t3 ON t1.creater_id = t3.id
+        WHERE t1.event_rule_id = #{id}
+    </select>
 </mapper>
 </mapper>

+ 9 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IAlarmEventRuleService.java

@@ -3,6 +3,7 @@ package cn.com.ctop.alarm.modules.service;
 import cn.com.ctop.alarm.modules.entity.AlarmEventRule;
 import cn.com.ctop.alarm.modules.entity.AlarmEventRule;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.pagehelper.PageInfo;
 
 
 /**
 /**
  * @Description: 预警事件规则表
  * @Description: 预警事件规则表
@@ -17,4 +18,12 @@ public interface IAlarmEventRuleService extends IService<AlarmEventRule> {
     void editAlarmEventRule(JSONObject obj);
     void editAlarmEventRule(JSONObject obj);
 
 
     AlarmEventRule selectById(String id);
     AlarmEventRule selectById(String id);
+
+    void matchAlarmRules(String checkType);
+
+    PageInfo<AlarmEventRule> selectListPage(AlarmEventRule alarmEventRule);
+
+    void deleteById(String id);
+
+    PageInfo<AlarmEventRule> queryRunningRecordPage(AlarmEventRule alarmEventRule);
 }
 }

+ 263 - 5
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmEventRuleServiceImpl.java

@@ -2,17 +2,29 @@ package cn.com.ctop.alarm.modules.service.impl;
 
 
 import cn.com.ctop.alarm.modules.entity.AlarmEventMetric;
 import cn.com.ctop.alarm.modules.entity.AlarmEventMetric;
 import cn.com.ctop.alarm.modules.entity.AlarmEventRule;
 import cn.com.ctop.alarm.modules.entity.AlarmEventRule;
+import cn.com.ctop.alarm.modules.entity.AlarmEventSend;
 import cn.com.ctop.alarm.modules.mapper.AlarmEventMetricMapper;
 import cn.com.ctop.alarm.modules.mapper.AlarmEventMetricMapper;
 import cn.com.ctop.alarm.modules.mapper.AlarmEventRuleMapper;
 import cn.com.ctop.alarm.modules.mapper.AlarmEventRuleMapper;
+import cn.com.ctop.alarm.modules.mapper.AlarmEventSendMapper;
 import cn.com.ctop.alarm.modules.service.IAlarmEventRuleService;
 import cn.com.ctop.alarm.modules.service.IAlarmEventRuleService;
+import cn.com.ctop.common.module.service.IMessageTemplate;
+import cn.com.ctop.common.module.service.ISendMessageService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.Check;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageInfo;
+import com.xxl.job.core.enums.NoEn;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.db.DataSourceCachePool;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.HashOperations;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.transaction.Transactional;
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -24,6 +36,7 @@ import java.util.List;
  * @version V1.0
  * @version V1.0
  * @date 2020-10-29
  * @date 2020-10-29
  */
  */
+@Transactional
 @Service
 @Service
 public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper, AlarmEventRule> implements IAlarmEventRuleService {
 public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper, AlarmEventRule> implements IAlarmEventRuleService {
 
 
@@ -33,6 +46,31 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
     @Autowired
     @Autowired
     private AlarmEventMetricMapper alarmEventMetricMapper;
     private AlarmEventMetricMapper alarmEventMetricMapper;
 
 
+    @Autowired
+    private AlarmEventSendMapper alarmEventSendMapper;
+
+    @Autowired
+    private IMessageTemplate messageTemplate;
+
+    @Autowired
+    private ISendMessageService sendMessageService;
+
+    @Override
+    public PageInfo<AlarmEventRule> selectListPage(AlarmEventRule alarmEventRule) {
+        return new PageInfo<AlarmEventRule>(alarmEventRuleMapper.selectListPage(alarmEventRule));
+    }
+
+    @Override
+    public void deleteById(String id) {
+        alarmEventRuleMapper.deleteById(id);
+        alarmEventMetricMapper.deleteByRuleId(id);
+    }
+
+    @Override
+    public PageInfo<AlarmEventRule> queryRunningRecordPage(AlarmEventRule alarmEventRule) {
+        return new PageInfo<AlarmEventRule>(alarmEventRuleMapper.queryRunningRecordPage(alarmEventRule));
+    }
+
     @Override
     @Override
     public void addAlarmEventRule(JSONObject obj) {
     public void addAlarmEventRule(JSONObject obj) {
         AlarmEventRule rule = new AlarmEventRule();
         AlarmEventRule rule = new AlarmEventRule();
@@ -42,7 +80,15 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
         rule.setEventRuleLevel(obj.getString("eventRuleLevel"));
         rule.setEventRuleLevel(obj.getString("eventRuleLevel"));
         rule.setCheckFrequency(obj.getString("checkFrequency"));
         rule.setCheckFrequency(obj.getString("checkFrequency"));
         rule.setProcessMethod(obj.getString("processMethod"));
         rule.setProcessMethod(obj.getString("processMethod"));
-        rule.setEventRuleStatus(obj.getString("eventRuleStatus"));
+        rule.setEventRuleStatus(NoEn.NO1.valueStr());
+        rule.setMetricValueCode(obj.getString("metricValueCode"));
+        rule.setMetricValueName(obj.getString("metricValueName"));
+        rule.setCreaterId(obj.getString("createrId"));
+
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (!Check.isNull(sysUser)) {
+            rule.setCreaterId(sysUser.getId());
+        }
         alarmEventRuleMapper.insert(rule);
         alarmEventRuleMapper.insert(rule);
         JSONArray metrics = obj.getJSONArray("alarmEventMetric");
         JSONArray metrics = obj.getJSONArray("alarmEventMetric");
         for (int i = 0; i < metrics.size(); i++) {
         for (int i = 0; i < metrics.size(); i++) {
@@ -55,6 +101,8 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
             metric.setThreshold(mo.getString("threshold"));
             metric.setThreshold(mo.getString("threshold"));
             metric.setMinThreshold(mo.getString("minThreshold"));
             metric.setMinThreshold(mo.getString("minThreshold"));
             metric.setDataRange(mo.getString("dataRange"));
             metric.setDataRange(mo.getString("dataRange"));
+            metric.setMetricValueCode(mo.getString("metricValueCode"));
+            metric.setMetricValueName(mo.getString("metricValueName"));
             alarmEventMetricMapper.insert(metric);
             alarmEventMetricMapper.insert(metric);
         }
         }
     }
     }
@@ -82,6 +130,14 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
         if (!Check.isNull(checkFrequency)) {
         if (!Check.isNull(checkFrequency)) {
             rule.setCheckFrequency(checkFrequency);
             rule.setCheckFrequency(checkFrequency);
         }
         }
+        String metricValueCode = obj.getString("metricValueCode");
+        if (!Check.isNull(metricValueCode)) {
+            rule.setMetricValueCode(metricValueCode);
+        }
+        String metricValueName = obj.getString("metricValueName");
+        if (!Check.isNull(metricValueName)) {
+            rule.setMetricValueCode(metricValueName);
+        }
         String processMethod = obj.getString("processMethod");
         String processMethod = obj.getString("processMethod");
         if (!Check.isNull(processMethod)) {
         if (!Check.isNull(processMethod)) {
             rule.setProcessMethod(processMethod);
             rule.setProcessMethod(processMethod);
@@ -91,10 +147,17 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
         if (!Check.isNull(eventRuleStatus)) {
         if (!Check.isNull(eventRuleStatus)) {
             rule.setEventRuleStatus(eventRuleStatus);
             rule.setEventRuleStatus(eventRuleStatus);
         }
         }
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (!Check.isNull(sysUser)) {
+            rule.setCreaterId(sysUser.getId());
+        }
         QueryWrapper<AlarmEventRule> ruleWrapper = new QueryWrapper<>();
         QueryWrapper<AlarmEventRule> ruleWrapper = new QueryWrapper<>();
         ruleWrapper.eq("event_rule_id", obj.getLong("eventRuleId"));
         ruleWrapper.eq("event_rule_id", obj.getLong("eventRuleId"));
         alarmEventRuleMapper.update(rule, ruleWrapper);
         alarmEventRuleMapper.update(rule, ruleWrapper);
         JSONArray metrics = obj.getJSONArray("alarmEventMetric");
         JSONArray metrics = obj.getJSONArray("alarmEventMetric");
+        if (Check.isNull(metrics)) {
+            return;
+        }
         for (int i = 0; i < metrics.size(); i++) {
         for (int i = 0; i < metrics.size(); i++) {
             JSONObject mo = metrics.getJSONObject(i);
             JSONObject mo = metrics.getJSONObject(i);
             AlarmEventMetric metric = new AlarmEventMetric();
             AlarmEventMetric metric = new AlarmEventMetric();
@@ -102,9 +165,13 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
             if (!Check.isNull(eventRuleId)) {
             if (!Check.isNull(eventRuleId)) {
                 metric.setEventRuleId(eventRuleId);
                 metric.setEventRuleId(eventRuleId);
             }
             }
-            String metricValueCode = mo.getString("metricValueCode");
-            if (!Check.isNull(metricValueCode)) {
-                metric.setMetricValueCode(metricValueCode);
+            String valueCode = mo.getString("metricValueCode");
+            if (!Check.isNull(valueCode)) {
+                metric.setMetricValueCode(valueCode);
+            }
+            String valueName = mo.getString("metricValueName");
+            if (!Check.isNull(valueName)) {
+                metric.setMetricValueName(valueName);
             }
             }
             String judgeType = mo.getString("judgeType");
             String judgeType = mo.getString("judgeType");
             if (!Check.isNull(judgeType)) {
             if (!Check.isNull(judgeType)) {
@@ -135,9 +202,200 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
 
 
     @Override
     @Override
     public AlarmEventRule selectById(String id) {
     public AlarmEventRule selectById(String id) {
-        AlarmEventRule alarmEventRule = alarmEventRuleMapper.selectById(id);
+        AlarmEventRule alarmEventRule = alarmEventRuleMapper.queryById(id);
         List<AlarmEventMetric> alarmEventMetricList = alarmEventMetricMapper.selectByEventRuleId(id);
         List<AlarmEventMetric> alarmEventMetricList = alarmEventMetricMapper.selectByEventRuleId(id);
         return alarmEventRule.setAlarmEventMetrics(alarmEventMetricList);
         return alarmEventRule.setAlarmEventMetrics(alarmEventMetricList);
+    }
 
 
+    @Override
+    public void matchAlarmRules(String checkType) {
+        List<AlarmEventRule> allRules = getAllAlarmRules(checkType);
+        List<JSONObject> accountCosts = getCostInfo("account");
+        if (Check.isNull(allRules) || Check.isNull(accountCosts)) {
+            return;
+        }
+        for (JSONObject cost : accountCosts) {
+            for (AlarmEventRule rule : allRules) {
+                if (cost.getLong("accountId") - rule.getAccountId() == 0) {
+                    matchRules(rule, cost);
+                }
+            }
+        }
     }
     }
+
+    private void matchRules(AlarmEventRule rule, JSONObject cost) {
+        String rulesMetric = rule.getMetricValueCode();
+        //目标成本
+        BigDecimal value = cost.getBigDecimal(rulesMetric);
+        if (Check.isNull(value)) {
+            log.warn("规则中指标不匹配");
+            return;
+        }
+        //总消耗
+        BigDecimal totalCost = cost.getBigDecimal("totalCost");
+        List<AlarmEventMetric> metrics = rule.getAlarmEventMetrics();
+        if (Check.isNull(metrics)) {
+            return;
+        }
+        boolean flag = true;
+        StringBuffer depletionStr = new StringBuffer();
+        StringBuffer valueStr = new StringBuffer();
+        StringBuffer roiStr = new StringBuffer();
+        if (metrics.size() > 1) {
+            depletionStr.append("消耗");
+            valueStr.append("并且成本");
+            roiStr.append("并且ROI");
+        } else {
+            valueStr.append(metrics.get(0).getMetricValueName());
+        }
+        for (AlarmEventMetric metric : metrics) {
+            if (flag) {
+                //阈值
+                BigDecimal threshold = new BigDecimal(metric.getThreshold());
+                String judgeMethod = metric.getJudgeMethod();
+                String metricValue = metric.getMetricValueCode();
+                String sub = metricValue.substring(metricValue.lastIndexOf("_") + 1);
+                //大于等于
+                if ("GT_EQ".equals(judgeMethod)) {
+                    //判断阈值类型(cost-成本;depletion-消耗;roi)
+                    if ("depletion".equals(sub)) {
+                        flag = totalCost.compareTo(threshold) >= 0;
+                        depletionStr.append("高于").append("账户设置的消耗值:").append(threshold).append("元");
+                        continue;
+                    } else if ("roi".equals(sub)) {
+                        roiStr.append("高于").append("账户设置的ROI:").append(threshold.multiply(new BigDecimal(100)).setScale(2)).append("%");
+                        flag = value.compareTo(threshold) >= 0;
+                        continue;
+                    } else {
+                        valueStr.append("高于").append("账户设置的成本价格:").append(threshold).append("元");
+                        flag = value.compareTo(threshold) >= 0;
+                        continue;
+                    }
+                    //小于等于
+                } else if ("LT_EQ".equals(judgeMethod)) {
+                    if ("depletion".equals(sub)) {
+                        depletionStr.append("低于").append("账户设置的消耗值:").append(threshold).append("元");
+                        flag = totalCost.compareTo(threshold) <= 0;
+                        continue;
+                    } else if ("roi".equals(sub)) {
+                        roiStr.append("低于").append("账户设置的ROI:").append(threshold.multiply(new BigDecimal(100)).setScale(2)).append("%");
+                        flag = value.compareTo(threshold) <= 0;
+                        continue;
+                    } else {
+                        valueStr.append("低于").append("账户设置的成本价格:").append(threshold).append("元");
+                        flag = value.compareTo(threshold) <= 0;
+                        continue;
+                    }
+                    //介于
+                } else if ("BETWEEN".equals(judgeMethod)) {
+                    BigDecimal minThreshold = new BigDecimal(metric.getMinThreshold());
+                    if ("depletion".equals(sub)) {
+                        flag = (totalCost.compareTo(threshold) > 0) || (totalCost.compareTo(minThreshold) < 0);
+                        if (totalCost.compareTo(threshold) > 0) {
+                            depletionStr.append("高于");
+                        }
+                        if (totalCost.compareTo(minThreshold) < 0) {
+                            depletionStr.append("低于");
+                        }
+                        depletionStr.append("账户设置的消耗区间:").append(minThreshold).append("元-").append(threshold).append("元");
+                        continue;
+                    } else if ("roi".equals(sub)) {
+                        flag = (value.compareTo(threshold) > 0) || (value.compareTo(minThreshold) < 0);
+                        if (value.compareTo(threshold) > 0) {
+                            roiStr.append("高于");
+                        }
+                        if (value.compareTo(minThreshold) < 0) {
+                            roiStr.append("低于");
+                        }
+                        roiStr.append("账户设置的").append(rule.getMetricValueName()).append("区间:").append(minThreshold.multiply(new BigDecimal(100)).setScale(2)).append("%-").append(threshold.multiply(new BigDecimal(100)).setScale(2)).append("%");
+                        continue;
+                    } else {
+                        flag = (value.compareTo(threshold) > 0) || (value.compareTo(minThreshold) < 0);
+                        if (value.compareTo(threshold) > 0) {
+                            valueStr.append("高于");
+                        }
+                        if (value.compareTo(minThreshold) < 0) {
+                            valueStr.append("低于");
+                        }
+                        valueStr.append("账户设置的成本区间:").append(minThreshold).append("元-").append(threshold).append("元");
+                        continue;
+                    }
+                } else {
+                    log.warn("缺失判断条件");
+                }
+            } else {
+                break;
+            }
+        }
+        //规则满足,产生预警
+        if (flag) {
+            cost.put("accountName", rule.getAccountName());
+            cost.put("name", rule.getMetricValueName());
+            if (metrics.size() > 1) {
+                if (rule.getMetricValueCode().toLowerCase().contains("roi")) {
+                    cost.put("depletion", depletionStr.append("<br/>").append(roiStr).toString());
+                } else {
+                    cost.put("depletion", depletionStr.append("<br/>").append(valueStr).toString());
+                }
+            } else {
+                cost.put("depletion", valueStr.toString());
+            }
+            String msg = null;
+            if ("SEND".equals(rule.getProcessMethod())) {
+                cost.put("end", "请您及时查看并调整!");
+                msg = messageTemplate.getAlarmCostMessage(cost);
+            } else {
+                cost.put("end", "现已被关停,请您及时查看并调整!");
+                msg = messageTemplate.getAlarmCostMessage(cost);
+            }
+            if (!Check.isNull(msg)) {
+                sendMessageService.sendMessage(rule.getUserId(), msg);
+
+                AlarmEventSend send = new AlarmEventSend();
+                send.setAlarmDetail(msg);
+                send.setAlarmStatus(NoEn.NO1.valueStr());
+                send.setMetricValueCode(rule.getMetricValueCode());
+                send.setEventRuleId(rule.getEventRuleId());
+                send.setAlarmCondition(rule.getMetricValueName() + "预警:" + cost.getString("depletion"));
+                alarmEventSendMapper.insert(send);
+            }
+        }
+    }
+
+    /**
+     * 获取成本数据。
+     *
+     * @param code : unit 组级数据,account 账户级数据
+     * @return java.util.List<cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup>
+     * @throws
+     * @author ZHAOXA
+     */
+    private List<JSONObject> getCostInfo(String code) {
+        HashOperations<String, Object, Object> hahs = DataSourceCachePool.getRedisTemplate().opsForHash();
+        return (List<JSONObject>) hahs.get("KS_COST", code);
+    }
+
+    /**
+     * 获取告警规则集合
+     *
+     * @param
+     * @return java.util.List<cn.com.ctop.alarm.modules.entity.AlarmEventRules>
+     * @throws
+     * @author ZHAOXA
+     */
+    private List<AlarmEventRule> getAllAlarmRules(String checkType) {
+        AlarmEventRule alarmEventRule = new AlarmEventRule();
+        alarmEventRule.setEventRuleStatus(NoEn.NO1.valueStr());
+        alarmEventRule.setCheckFrequency(checkType);
+        List<AlarmEventRule> ruleList = alarmEventRuleMapper.selectListPage(alarmEventRule);
+        if (!Check.isNull(ruleList)) {
+            for (AlarmEventRule rule : ruleList) {
+                QueryWrapper<AlarmEventMetric> metricWrapper = new QueryWrapper<>();
+                metricWrapper.eq("event_rule_id", rule.getEventRuleId());
+                rule.setAlarmEventMetrics(alarmEventMetricMapper.selectList(metricWrapper));
+            }
+        }
+        return ruleList;
+    }
+
 }
 }

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IMessageTemplate.java

@@ -47,4 +47,15 @@ public interface IMessageTemplate {
      * @author ZHAOXA
      * @author ZHAOXA
      */
      */
     String getZombieCreativeShutDownTemplate(JSONObject obj);
     String getZombieCreativeShutDownTemplate(JSONObject obj);
+
+    /**
+     * 成本预警消息模板
+     *
+     * @param
+     * @return java.lang.String
+     * @throws
+     * @author ZHAOXA
+     */
+    String getAlarmCostMessage(JSONObject cost);
+
 }
 }

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MessageTemplateImpl.java

@@ -145,4 +145,15 @@ public class MessageTemplateImpl implements IMessageTemplate {
                 .append("请您及时查看!");
                 .append("请您及时查看!");
         return text.toString();
         return text.toString();
     }
     }
+
+    @Override
+    public String getAlarmCostMessage(JSONObject obj) {
+        StringBuilder text = new StringBuilder();
+        text.append(obj.getString("name")).append("预警").append("<br/>")
+                .append("您的账户:").append(obj.getString("accountId"))
+                .append(",授权名称为:").append(obj.getString("accountName")).append("<br/>")
+                .append(obj.getString("depletion")).append("<br/>")
+                .append(obj.getString("end"));
+        return text.toString();
+    }
 }
 }

+ 6 - 0
module-job-kuaishou/pom.xml

@@ -64,6 +64,12 @@
 
 
         <dependency>
         <dependency>
             <groupId>cn.com.ctop</groupId>
             <groupId>cn.com.ctop</groupId>
+            <artifactId>module-alarm</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
             <artifactId>module-common</artifactId>
             <artifactId>module-common</artifactId>
             <version>2.0.2</version>
             <version>2.0.2</version>
         </dependency>
         </dependency>

+ 27 - 0
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouAlarmRuleHourlyCheckJob.java

@@ -0,0 +1,27 @@
+package cn.com.ctop.job.kuaishou.handler;
+
+import cn.com.ctop.alarm.modules.service.IAlarmEventRuleService;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class KuaiShouAlarmRuleHourlyCheckJob {
+    @Autowired
+    private IAlarmEventRuleService alarmEventRuleService;
+
+    /**
+     * 定时获取成本数据
+     *
+     * @throws JobExecutionException
+     */
+    @XxlJob("kuaiShouAlarmRuleHourlyCheckJob")
+    public ReturnT<String> execute(String param) throws Exception {
+        //检查频率 HOUR - 每小时;HALF_HOUR-每半小时
+        alarmEventRuleService.matchAlarmRules("HOUR");
+        return ReturnT.SUCCESS;
+    }
+}
+

+ 27 - 0
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouAlarmRuleMinuteCheckJob.java

@@ -0,0 +1,27 @@
+package cn.com.ctop.job.kuaishou.handler;
+
+import cn.com.ctop.alarm.modules.service.IAlarmEventRuleService;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class KuaiShouAlarmRuleMinuteCheckJob {
+    @Autowired
+    private IAlarmEventRuleService alarmEventRuleService;
+
+    /**
+     * 定时获取成本数据
+     *
+     * @throws JobExecutionException
+     */
+    @XxlJob("kuaiShouAlarmRuleMinuteCheckJob")
+    public ReturnT<String> execute(String param) throws Exception {
+        //检查频率 HOUR - 每小时;HALF_HOUR-每半小时
+        alarmEventRuleService.matchAlarmRules("HALF_HOUR");
+        return ReturnT.SUCCESS;
+    }
+}
+

+ 26 - 0
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouCostGroupJob.java

@@ -0,0 +1,26 @@
+package cn.com.ctop.job.kuaishou.handler;
+
+import cn.com.ctop.kuaishou.modules.report.service.IKuaishouCostGroupService;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class KuaiShouCostGroupJob {
+    @Autowired
+    private IKuaishouCostGroupService kuaishouCostGroupService;
+
+    /**
+     * 定时获取成本数据
+     *
+     * @throws JobExecutionException
+     */
+    @XxlJob("kuaiShouCostGroupJob")
+    public ReturnT<String> execute(String param) throws Exception {
+        kuaishouCostGroupService.saveInfo();
+        return ReturnT.SUCCESS;
+    }
+}
+

+ 91 - 60
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouCostGroup.java

@@ -1,98 +1,129 @@
 package cn.com.ctop.kuaishou.modules.report.entity;
 package cn.com.ctop.kuaishou.modules.report.entity;
 
 
-import java.io.Serializable;
-import java.util.Date;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import org.springframework.format.annotation.DateTimeFormat;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 
 /**
 /**
  * 快手组级时报统计
  * 快手组级时报统计
+ *
  * @author jeecg-boot
  * @author jeecg-boot
- * @date   2020-10-30
  * @version V1.0
  * @version V1.0
+ * @date 2020-10-30
  */
  */
 @Data
 @Data
 @TableName("ctop_kuaishou_cost_group")
 @TableName("ctop_kuaishou_cost_group")
 @EqualsAndHashCode(callSuper = false)
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 @Accessors(chain = true)
-@ApiModel(value="ctop_kuaishou_cost_group对象", description="快手组级时报统计")
+@ApiModel(value = "ctop_kuaishou_cost_group对象", description = "快手组级时报统计")
 public class KuaishouCostGroup {
 public class KuaishouCostGroup {
-    
-	/**id*/
-	@TableId(type = IdType.INPUT)
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.INPUT)
     @ApiModelProperty(value = "id")
     @ApiModelProperty(value = "id")
-	private Long id;
-	/**账户ID*/
-	@Excel(name = "账户ID", width = 15)
+    private Long id;
+    /**
+     * 账户ID
+     */
+    @Excel(name = "账户ID", width = 15)
     @ApiModelProperty(value = "账户ID")
     @ApiModelProperty(value = "账户ID")
-	private Long accountId;
-	/**广告组ID*/
-	@Excel(name = "广告组ID", width = 15)
+    private Long accountId;
+    /**
+     * 广告组ID
+     */
+    @Excel(name = "广告组ID", width = 15)
     @ApiModelProperty(value = "广告组ID")
     @ApiModelProperty(value = "广告组ID")
-	private Long unitId;
-	/**统计日期*/
-	@Excel(name = "统计日期", width = 15, format = "yyyy-MM-dd")
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern="yyyy-MM-dd")
+    private Long unitId;
+    /**
+     * 统计日期
+     */
+    @Excel(name = "统计日期", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "统计日期")
     @ApiModelProperty(value = "统计日期")
-	private Date statDate;
-	/**行为成本*/
-	@Excel(name = "行为成本", width = 15)
+    private Date statDate;
+    /**
+     * 行为成本
+     */
+    @Excel(name = "行为成本", width = 15)
     @ApiModelProperty(value = "行为成本")
     @ApiModelProperty(value = "行为成本")
-	private java.math.BigDecimal actionCost;
-	/**激活成本*/
-	@Excel(name = "激活成本", width = 15)
+    private java.math.BigDecimal actionCost;
+    /**
+     * 激活成本
+     */
+    @Excel(name = "激活成本", width = 15)
     @ApiModelProperty(value = "激活成本")
     @ApiModelProperty(value = "激活成本")
-	private java.math.BigDecimal activationCost;
-	/**注册成本*/
-	@Excel(name = "注册成本", width = 15)
+    private java.math.BigDecimal activationCost;
+    /**
+     * 注册成本
+     */
+    @Excel(name = "注册成本", width = 15)
     @ApiModelProperty(value = "注册成本")
     @ApiModelProperty(value = "注册成本")
-	private java.math.BigDecimal registerCost;
-	/**付费成本*/
-	@Excel(name = "付费成本", width = 15)
+    private java.math.BigDecimal registerCost;
+    /**
+     * 付费成本
+     */
+    @Excel(name = "付费成本", width = 15)
     @ApiModelProperty(value = "付费成本")
     @ApiModelProperty(value = "付费成本")
-	private java.math.BigDecimal payCost;
-	/**表单提交成本*/
-	@Excel(name = "表单提交成本", width = 15)
+    private java.math.BigDecimal payCost;
+    /**
+     * 表单提交成本
+     */
+    @Excel(name = "表单提交成本", width = 15)
     @ApiModelProperty(value = "表单提交成本")
     @ApiModelProperty(value = "表单提交成本")
-	private java.math.BigDecimal formCost;
-	/**完件成本*/
-	@Excel(name = "完件成本", width = 15)
+    private java.math.BigDecimal formCost;
+    /**
+     * 完件成本
+     */
+    @Excel(name = "完件成本", width = 15)
     @ApiModelProperty(value = "完件成本")
     @ApiModelProperty(value = "完件成本")
-	private java.math.BigDecimal finishedCost;
-	/**授信成本*/
-	@Excel(name = "授信成本", width = 15)
+    private java.math.BigDecimal finishedCost;
+    private java.math.BigDecimal totalCost;
+    /**
+     * 授信成本
+     */
+    @Excel(name = "授信成本", width = 15)
     @ApiModelProperty(value = "授信成本")
     @ApiModelProperty(value = "授信成本")
-	private java.math.BigDecimal approvalCost;
-	/**首日ROI*/
-	@Excel(name = "首日ROI", width = 15)
+    private java.math.BigDecimal approvalCost;
+    /**
+     * 首日ROI
+     */
+    @Excel(name = "首日ROI", width = 15)
     @ApiModelProperty(value = "首日ROI")
     @ApiModelProperty(value = "首日ROI")
-	private Double firstDayRoi;
-	/**ROI*/
-	@Excel(name = "ROI", width = 15)
+    private Double firstDayRoi;
+    /**
+     * ROI
+     */
+    @Excel(name = "ROI", width = 15)
     @ApiModelProperty(value = "ROI")
     @ApiModelProperty(value = "ROI")
-	private Double roi;
-	/**createTime*/
-	@Excel(name = "createTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Double roi;
+    /**
+     * createTime
+     */
+    @Excel(name = "createTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "createTime")
     @ApiModelProperty(value = "createTime")
-	private Date createTime;
-	/**updateTime*/
-	@Excel(name = "updateTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @Excel(name = "updateTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "updateTime")
     @ApiModelProperty(value = "updateTime")
-	private Date updateTime;
-	private String type;
+    private Date updateTime;
+    private String type;
 }
 }

+ 4 - 3
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouCostGroupMapper.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.kuaishou.modules.report.mapper;
 package cn.com.ctop.kuaishou.modules.report.mapper;
 
 
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup;
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 
 import java.util.List;
 import java.util.List;
@@ -14,9 +15,9 @@ import java.util.List;
  */
  */
 public interface KuaishouCostGroupMapper extends BaseMapper<KuaishouCostGroup> {
 public interface KuaishouCostGroupMapper extends BaseMapper<KuaishouCostGroup> {
 
 
-    List<KuaishouCostGroup> queryGroupCostInfo(String date);
+    List<JSONObject> queryGroupCostInfo(String date);
 
 
-    int bulkInsert(List<KuaishouCostGroup> list);
+    int bulkInsert(List<JSONObject> list);
 
 
-    List<KuaishouCostGroup> queryAccountCostInfo(String nowDate);
+    List<JSONObject> queryAccountCostInfo(String nowDate);
 }
 }

+ 23 - 22
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouCostGroupMapper.xml

@@ -1,22 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?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">
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.kuaishou.modules.report.mapper.KuaishouCostGroupMapper">
 <mapper namespace="cn.com.ctop.kuaishou.modules.report.mapper.KuaishouCostGroupMapper">
-    <select id="queryGroupCostInfo" resultType="cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup">
-        SELECT stat_date,account_id,unit_id,
+    <select id="queryGroupCostInfo" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT stat_date AS statDate,account_id AS accountId,unit_id AS unitId,ROUND(SUM(charge),3) AS totalCost,
         CASE WHEN SUM(bclick) != 0 THEN
         CASE WHEN SUM(bclick) != 0 THEN
-        ROUND(SUM(charge)/SUM(bclick),4) ELSE 0 END AS 'actionCost',
+        ROUND(SUM(charge)/SUM(bclick),3) ELSE 0 END AS 'actionCost',
         CASE WHEN SUM(activation) != 0 THEN
         CASE WHEN SUM(activation) != 0 THEN
-        ROUND(SUM(charge)/SUM(activation),4) ELSE 0 END AS activationCost,
+        ROUND(SUM(charge)/SUM(activation),3) ELSE 0 END AS activationCost,
         CASE WHEN SUM(event_register) != 0 THEN
         CASE WHEN SUM(event_register) != 0 THEN
-        ROUND(SUM(charge)/SUM(event_register),4)  ELSE 0 END AS  registerCost,
+        ROUND(SUM(charge)/SUM(event_register),3)  ELSE 0 END AS  registerCost,
         CASE WHEN SUM(event_pay) != 0 THEN
         CASE WHEN SUM(event_pay) != 0 THEN
-         ROUND(SUM(charge) / SUM(event_pay), 4) ELSE 0 END AS  payCost,
+         ROUND(SUM(charge) / SUM(event_pay), 3) ELSE 0 END AS  payCost,
         CASE WHEN SUM(form_count) != 0 THEN
         CASE WHEN SUM(form_count) != 0 THEN
-         ROUND(SUM(charge) / SUM(form_count),4) ELSE 0 END AS  formCost,
+         ROUND(SUM(charge) / SUM(form_count),3) ELSE 0 END AS  formCost,
         CASE WHEN SUM(event_jin_jian_app) != 0 THEN
         CASE WHEN SUM(event_jin_jian_app) != 0 THEN
-        ROUND(SUM(charge)/SUM(event_jin_jian_app) ,4) ELSE 0 END AS finishedCost,
+        ROUND(SUM(charge)/SUM(event_jin_jian_app) ,3) ELSE 0 END AS finishedCost,
         CASE WHEN SUM(event_credit_grant_app) != 0 THEN
         CASE WHEN SUM(event_credit_grant_app) != 0 THEN
-        ROUND(SUM(charge)/SUM(event_credit_grant_app) ,4)ELSE 0 END AS approvalCost,
+        ROUND(SUM(charge)/SUM(event_credit_grant_app) ,3)ELSE 0 END AS approvalCost,
         CASE WHEN SUM(charge) != 0 THEN
         CASE WHEN SUM(charge) != 0 THEN
         ROUND(SUM(event_pay_purchase_amount_first_day)/SUM(charge) ,4) ELSE 0 END AS firstDayRoi,
         ROUND(SUM(event_pay_purchase_amount_first_day)/SUM(charge) ,4) ELSE 0 END AS firstDayRoi,
         CASE WHEN SUM(charge) != 0 THEN
         CASE WHEN SUM(charge) != 0 THEN
@@ -27,36 +27,36 @@
         WHERE stat_date = #{date}
         WHERE stat_date = #{date}
         GROUP BY unit_id
         GROUP BY unit_id
     </select>
     </select>
-    <select id="queryAccountCostInfo" resultType="cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup">
-        SELECT stat_date,account_id,
+    <select id="queryAccountCostInfo" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT stat_date AS statDate,account_id AS accountId,ROUND(SUM(charge),3) AS totalCost,
         CASE WHEN SUM(bclick) != 0 THEN
         CASE WHEN SUM(bclick) != 0 THEN
-        ROUND(SUM(charge)/SUM(bclick),4) ELSE 0 END AS 'actionCost',
+        ROUND(SUM(charge)/SUM(bclick),3) ELSE 0 END AS 'actionCost',
         CASE WHEN SUM(activation) != 0 THEN
         CASE WHEN SUM(activation) != 0 THEN
-        ROUND(SUM(charge)/SUM(activation),4) ELSE 0 END AS activationCost,
+        ROUND(SUM(charge)/SUM(activation),3) ELSE 0 END AS activationCost,
         CASE WHEN SUM(event_register) != 0 THEN
         CASE WHEN SUM(event_register) != 0 THEN
-        ROUND(SUM(charge)/SUM(event_register),4)  ELSE 0 END AS  registerCost,
+        ROUND(SUM(charge)/SUM(event_register),3)  ELSE 0 END AS  registerCost,
         CASE WHEN SUM(event_pay) != 0 THEN
         CASE WHEN SUM(event_pay) != 0 THEN
-         ROUND(SUM(charge) / SUM(event_pay), 4) ELSE 0 END AS  payCost,
+         ROUND(SUM(charge) / SUM(event_pay), 3) ELSE 0 END AS  payCost,
         CASE WHEN SUM(form_count) != 0 THEN
         CASE WHEN SUM(form_count) != 0 THEN
-         ROUND(SUM(charge) / SUM(form_count),4) ELSE 0 END AS  formCost,
+         ROUND(SUM(charge) / SUM(form_count),3) ELSE 0 END AS  formCost,
         CASE WHEN SUM(event_jin_jian_app) != 0 THEN
         CASE WHEN SUM(event_jin_jian_app) != 0 THEN
-        ROUND(SUM(charge)/SUM(event_jin_jian_app) ,4) ELSE 0 END AS finishedCost,
+        ROUND(SUM(charge)/SUM(event_jin_jian_app) ,3) ELSE 0 END AS finishedCost,
         CASE WHEN SUM(event_credit_grant_app) != 0 THEN
         CASE WHEN SUM(event_credit_grant_app) != 0 THEN
-        ROUND(SUM(charge)/SUM(event_credit_grant_app) ,4)ELSE 0 END AS approvalCost,
+        ROUND(SUM(charge)/SUM(event_credit_grant_app) ,3)ELSE 0 END AS approvalCost,
         CASE WHEN SUM(charge) != 0 THEN
         CASE WHEN SUM(charge) != 0 THEN
         ROUND(SUM(event_pay_purchase_amount_first_day)/SUM(charge) ,4) ELSE 0 END AS firstDayRoi,
         ROUND(SUM(event_pay_purchase_amount_first_day)/SUM(charge) ,4) ELSE 0 END AS firstDayRoi,
         CASE WHEN SUM(charge) != 0 THEN
         CASE WHEN SUM(charge) != 0 THEN
         ROUND(SUM(event_pay_purchase_amount)/SUM(charge) ,4) ELSE 0 END AS roi,
         ROUND(SUM(event_pay_purchase_amount)/SUM(charge) ,4) ELSE 0 END AS roi,
         "account" AS type,
         "account" AS type,
         sysdate() AS createTime
         sysdate() AS createTime
-         FROM ctop_kuaishou_report_hourly_group
+         FROM ctop_kuaishou_report_hourly_account
         WHERE stat_date = #{date}
         WHERE stat_date = #{date}
         GROUP BY account_id
         GROUP BY account_id
     </select>
     </select>
 
 
-    <insert id="bulkInsert" parameterType="cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup">
+    <insert id="bulkInsert" parameterType="com.alibaba.fastjson.JSONObject">
         insert into ctop_kuaishou_cost_group (
         insert into ctop_kuaishou_cost_group (
-        account_id, unit_id, type,stat_date, action_cost, activation_cost,
+        account_id, unit_id, total_cost, total_balance, type,stat_date, action_cost, activation_cost,
         register_cost, pay_cost, form_cost,finished_cost,approval_cost,first_day_roi,roi,create_time
         register_cost, pay_cost, form_cost,finished_cost,approval_cost,first_day_roi,roi,create_time
         )
         )
         values
         values
@@ -64,6 +64,8 @@
             (
             (
             #{it.accountId},
             #{it.accountId},
             #{it.unitId},
             #{it.unitId},
+            #{it.totalCost},
+            #{it.totalBalance},
             #{it.type},
             #{it.type},
             #{it.statDate},
             #{it.statDate},
             #{it.actionCost},
             #{it.actionCost},
@@ -80,5 +82,4 @@
         </foreach>
         </foreach>
     </insert>
     </insert>
 
 
-
 </mapper>
 </mapper>

+ 1 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/IKuaishouCostGroupService.java

@@ -6,12 +6,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
 /**
 /**
  * @Description: 快手组级时报统计
  * @Description: 快手组级时报统计
  * @Author: jeecg-boot
  * @Author: jeecg-boot
- * @Date:   2020-10-30
+ * @Date: 2020-10-30
  * @Version: V1.0
  * @Version: V1.0
  */
  */
 public interface IKuaishouCostGroupService extends IService<KuaishouCostGroup> {
 public interface IKuaishouCostGroupService extends IService<KuaishouCostGroup> {
 
 
-
     void saveInfo();
     void saveInfo();
 
 
 }
 }

+ 43 - 5
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouCostGroupServiceImpl.java

@@ -1,16 +1,24 @@
 package cn.com.ctop.kuaishou.modules.report.service.impl;
 package cn.com.ctop.kuaishou.modules.report.service.impl;
 
 
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup;
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouCostGroupMapper;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouCostGroupMapper;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportHourlyGroupMapper;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportHourlyGroupMapper;
 import cn.com.ctop.kuaishou.modules.report.service.IKuaishouCostGroupService;
 import cn.com.ctop.kuaishou.modules.report.service.IKuaishouCostGroupService;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.DateUtils;
+import org.jeecg.common.util.db.DataSourceCachePool;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.HashOperations;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * 快手组级时报统计
  * 快手组级时报统计
@@ -28,15 +36,45 @@ public class KuaishouCostGroupServiceImpl extends ServiceImpl<KuaishouCostGroupM
     @Autowired
     @Autowired
     private KuaishouReportHourlyGroupMapper kuaishouReportHourlyGroupMapper;
     private KuaishouReportHourlyGroupMapper kuaishouReportHourlyGroupMapper;
 
 
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
+    @Autowired
+    private IKuaishouInterfaceService iKuaishouInterfaceService;
+
     @Override
     @Override
     public void saveInfo() {
     public void saveInfo() {
-        List<KuaishouCostGroup> grouplist = kuaishouCostGroupMapper.queryGroupCostInfo(DateUtils.getNowDate(DateUtils.WEB_FORMAT));
-        if (!Check.isNull(grouplist)) {
-            kuaishouCostGroupMapper.bulkInsert(grouplist);
-        }
-        List<KuaishouCostGroup> accountList = kuaishouCostGroupMapper.queryAccountCostInfo(DateUtils.getNowDate(DateUtils.WEB_FORMAT));
+        String date = DateUtils.getNowDate(DateUtils.WEB_FORMAT);
+        Map<String, Object> deleteMap = new HashMap<>();
+        deleteMap.put("stat_date", date);
+        kuaishouCostGroupMapper.deleteByMap(deleteMap);
+        //组级的数据统计
+//        List<JSONObject> grouplist = kuaishouCostGroupMapper.queryGroupCostInfo(date);
+//        if (!Check.isNull(grouplist)) {
+//            kuaishouCostGroupMapper.bulkInsert(grouplist);
+//        }
+        List<JSONObject> accountList = kuaishouCostGroupMapper.queryAccountCostInfo(date);
         if (!Check.isNull(accountList)) {
         if (!Check.isNull(accountList)) {
+            getTotalBalance(accountList);
             kuaishouCostGroupMapper.bulkInsert(accountList);
             kuaishouCostGroupMapper.bulkInsert(accountList);
         }
         }
+        Map<String, List<JSONObject>> map = new HashMap<>();
+//        map.put("unit", grouplist);
+        map.put("account", accountList);
+        HashOperations<String, Object, Object> hash = DataSourceCachePool.getRedisTemplate().opsForHash();
+        hash.putAll("KS_COST", map);
+    }
+
+    private void getTotalBalance(List<JSONObject> accountList) {
+        for (JSONObject obj : accountList) {
+            CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(obj.getLong("accountId"));
+            if (Check.isNull(oauthToken)) {
+                log.warn("未获取到账户信息");
+                continue;
+            }
+            JSONObject fundJson = iKuaishouInterfaceService.fundGet(oauthToken);
+            if (!Check.isNull(fundJson)) {
+                obj.put("totalBalance", fundJson.getBigDecimal("balance")); // 余额
+            }
+        }
     }
     }
 }
 }

+ 0 - 1
module-oa/src/main/java/cn/com/ctop/oa/modules/controller/WechatNoListController.java

@@ -269,7 +269,6 @@ public class WechatNoListController {
      */
      */
     @PostMapping("/excel")
     @PostMapping("/excel")
     public void getExcelReport(HttpServletResponse response, @RequestBody Map<String, Object> paramsMap) {
     public void getExcelReport(HttpServletResponse response, @RequestBody Map<String, Object> paramsMap) {
-
         List<WechatAttendance> excelData = wechatNoListService.queryAttendanceData(paramsMap);
         List<WechatAttendance> excelData = wechatNoListService.queryAttendanceData(paramsMap);
         List<WechatAttendance> overtimeData = wechatNoListService.queryOverTimeData(paramsMap);
         List<WechatAttendance> overtimeData = wechatNoListService.queryOverTimeData(paramsMap);
         try {
         try {