Authored by 王涛

监控项目初始化 20210929

Showing 24 changed files with 3985 additions and 2 deletions

Too many changes to show.

To preserve performance only 24 of 24+ files are displayed.

  1 +HELP.md
  2 +target/
  3 +!.mvn/wrapper/maven-wrapper.jar
  4 +!**/src/main/**/target/
  5 +!**/src/test/**/target/
  6 +
  7 +### STS ###
  8 +.apt_generated
  9 +.classpath
  10 +.factorypath
  11 +.project
  12 +.settings
  13 +.springBeans
  14 +.sts4-cache
  15 +
  16 +### IntelliJ IDEA ###
  17 +.idea
  18 +*.iws
  19 +*.iml
  20 +*.ipr
  21 +
  22 +### NetBeans ###
  23 +/nbproject/private/
  24 +/nbbuild/
  25 +/dist/
  26 +/nbdist/
  27 +/.nb-gradle/
  28 +build/
  29 +!**/src/main/**/build/
  30 +!**/src/test/**/build/
  31 +
  32 +### VS Code ###
  33 +.vscode/
1 -hg-monitor-web-base 基于天津现有功能作为基类  
2 -hg-monitor-web-new 最新开发版本 1 +>>hg-monitor-web-base 基于天津现有功能作为基类
  2 +>>hg-monitor-web-new 最新开发版本
3 hg-monitor-web-tj 天津10月后的个性化开发 3 hg-monitor-web-tj 天津10月后的个性化开发
4 注意事项 版本开发,天津版本的开发可在base中修改,然后将代码复制到hg-monitor-web-tj代码中 4 注意事项 版本开发,天津版本的开发可在base中修改,然后将代码复制到hg-monitor-web-tj代码中
  5 +W
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4 + <modelVersion>4.0.0</modelVersion>
  5 + <parent>
  6 + <groupId>com.honggroup</groupId>
  7 + <artifactId>hg-monitor-web</artifactId>
  8 + <version>0.0.1-SNAPSHOT</version>
  9 + <relativePath/> <!-- lookup parent from repository -->
  10 + </parent>
  11 + <groupId>com.honggroup</groupId>
  12 + <artifactId>hg-monitor-web-base</artifactId>
  13 + <version>0.0.1-SNAPSHOT</version>
  14 + <name>hg-monitor-web-base</name>
  15 + <description>hg-monitor-web-base</description>
  16 + <properties>
  17 + <java.version>1.8</java.version>
  18 + </properties>
  19 + <dependencies>
  20 + <dependency>
  21 + <groupId>org.springframework.boot</groupId>
  22 + <artifactId>spring-boot-starter</artifactId>
  23 + </dependency>
  24 +
  25 + <dependency>
  26 + <groupId>org.springframework.boot</groupId>
  27 + <artifactId>spring-boot-starter-test</artifactId>
  28 + <scope>test</scope>
  29 + </dependency>
  30 + </dependencies>
  31 +
  32 + <build>
  33 + <plugins>
  34 + <plugin>
  35 + <groupId>org.springframework.boot</groupId>
  36 + <artifactId>spring-boot-maven-plugin</artifactId>
  37 + </plugin>
  38 + </plugins>
  39 + </build>
  40 +
  41 +</project>
  1 +package com.web.config;
  2 +
  3 +import org.springframework.context.annotation.Configuration;
  4 +import org.springframework.core.Ordered;
  5 +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
  6 +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  7 +
  8 +@Configuration
  9 +public class IndexConfig implements WebMvcConfigurer {
  10 + @Override
  11 + public void addViewControllers(ViewControllerRegistry registry) {
  12 + registry.addViewController("/").setViewName("forward:/start/index.html");
  13 + registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
  14 + }
  15 +}
  1 +package com.web.controller;
  2 +
  3 +import org.springframework.beans.factory.annotation.Autowired;
  4 +import org.springframework.core.env.AbstractEnvironment;
  5 +import org.springframework.core.env.EnumerablePropertySource;
  6 +import org.springframework.core.env.Environment;
  7 +import org.springframework.core.env.PropertySource;
  8 +import org.springframework.http.ResponseEntity;
  9 +import org.springframework.web.bind.annotation.RequestMapping;
  10 +import org.springframework.web.bind.annotation.RestController;
  11 +
  12 +import java.util.HashMap;
  13 +import java.util.LinkedList;
  14 +import java.util.List;
  15 +import java.util.Map;
  16 +import java.util.regex.Pattern;
  17 +
  18 +@RestController
  19 +@RequestMapping("/config")
  20 +public class ConfigController {
  21 +
  22 + @Autowired
  23 + Environment env;
  24 +
  25 + @RequestMapping("/getConfig")
  26 + public ResponseEntity getConfig(String configName) {
  27 + Map<String, Object> configMap = new HashMap<>();
  28 + for (PropertySource<?> source : ((AbstractEnvironment) env).getPropertySources()) {
  29 + // 遍历每个配置来源中的配置项
  30 + if (source instanceof EnumerablePropertySource) {
  31 + for (String name : ((EnumerablePropertySource) source).getPropertyNames()) {
  32 + if (name.startsWith(configName)) {
  33 + String itemName = name.substring(configName.length() + 1);
  34 + configToMap(configMap, name, itemName);
  35 + }
  36 + }
  37 + }
  38 + }
  39 + return ResponseEntity.ok(configMap);
  40 + }
  41 +
  42 + private void configToMap(Map<String, Object> configMap, String configName, String itemName) {
  43 + if (itemName.contains(".")) {
  44 + Map<String, Object> currMap = configMap;
  45 + String[] split = itemName.split("\\.");
  46 + currMap = (Map) currMap.computeIfAbsent(split[0], map -> new HashMap<>());
  47 + String childName = itemName.substring(split[0].length() + 1);
  48 + configToMap(currMap, configName, childName);
  49 + } else if (Pattern.compile("\\[\\d+]").matcher(itemName).find()) {
  50 + List l = (List) configMap.computeIfAbsent(itemName.replaceAll("\\[\\d+]", ""), map -> new LinkedList<>());
  51 + l.add(env.getProperty(configName, Object.class));
  52 + } else {
  53 + configMap.put(itemName, env.getProperty(configName, Object.class));
  54 + }
  55 + }
  56 +}
  1 +node_modules
  2 +.idea
  3 +debug.log
  4 +dist
  5 +.vscode
  6 +demo
  1 +phantomjs_cdnurl=http://cnpmjs.org/downloads
  2 +sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
  3 +registry=https://registry.npm.taobao.org
  1 +# 开发帮助
  2 +
  3 +```cmd
  4 +# 安装依赖
  5 +npm i
  6 +# 启动
  7 +npm run sw
  8 +```
  1 +var express = require('express');
  2 +var app = express();
  3 +app.use(express.static(__dirname + '/'));
  4 +
  5 +app.use(express.static(__dirname + '/start/'));
  6 +
  7 +app.use(express.static(__dirname + '/demo/start/'));
  8 +
  9 +app.listen(3333);
  10 +
  11 +var c = require('child_process');
  12 +c.exec('start http://localhost:3333/start/index.html#/');
  13 +c.exec('start http://localhost:3333/demo/start/index.html');
  1 +## commit message
  2 +
  3 +格式约定:`<type>(<scope>): <subject>` (注意冒号后面有空格)
  4 +
  5 +**scope 可选,写不写都可**
  6 +
  7 +### type
  8 +
  9 +`type` 用于说明 commit 的类别
  10 +
  11 +- **feat / feature**:新增功能
  12 +- **fix / fixes / fixed / hotfix**:(热)修复 Bug(s)
  13 +- **docs**:修改文档
  14 +- **style**:仅仅修改了代码样式(空格、缩进)等,不改变代码逻辑
  15 +- **refactor**:代码重构,未新增任何功能和修复任何 Bug
  16 +- **perf**: 改善性能和用户体验
  17 +- **resolve / resolves / resolved**: 修复代码合并冲突
  18 +- **test**:测试用例的修改
  19 +- **chore**:构建过程或辅助工具的变动(新增依赖库、工具配置等)
  20 +- **revert**: 回滚版本
  21 +- **ci**: 自动化流程配置修改
  22 +- **release**: 版本发布
  23 +- **close / closes / closed**: 关闭 issue(s)
  24 +
  25 +如果 `type` 为 `feat` 和 `fix`,则该 commit 将肯定出现在 Change log 之中。
  26 +
  27 +### scope(可选)
  28 +
  29 +`scope` 用于说明本次提交所影响的功能模块,视项目的不同而不同。
  30 +
  31 +必须将内容包含在 `()` 里,里面的模块以 `,` 隔开,最后一项没有逗号。
  32 +
  33 +### subject
  34 +
  35 +`subject` 是 commit 目的的简短描述,不超过50个字符。
  36 +
  37 +- 以动词开头,使用第一人称现在时,比如 change,而不是 changed 或 changes
  38 +- 第一个字母小写
  39 +- 结尾不加句号(.)
  40 +
  41 +### 示例
  42 +
  43 +``` bash
  44 +~ git commit -m "feat: add a new feature"
  45 +```
  46 +``` bash
  47 +~ git commit -m "fix(nav): 更正参数拼写错误"
  48 +```
  49 +``` bash
  50 +~ git commit -m "docs: update README.md"
  51 +```
  1 +/**
  2 + layuiAdmin pro 构建
  3 +*/
  4 +
  5 +var pkg = require('./package.json');
  6 +var inds = pkg.independents;
  7 +
  8 +var gulp = require('gulp');
  9 +var uglify = require('gulp-uglify');
  10 +var minify = require('gulp-minify-css');
  11 +var concat = require('gulp-concat');
  12 +var rename = require('gulp-rename');
  13 +var replace = require('gulp-replace');
  14 +var header = require('gulp-header');
  15 +var del = require('del');
  16 +var gulpif = require('gulp-if');
  17 +var minimist = require('minimist');
  18 +var sass = require('gulp-sass');
  19 +var autoPreFixer = require('gulp-autoprefixer');
  20 +sass.compiler = require('node-sass');
  21 +var px2rem = require('gulp-px2rem');
  22 +
  23 +//获取参数
  24 +var argv = require('minimist')(process.argv.slice(2), {
  25 + default: {
  26 + ver: 'all'
  27 + }
  28 +})
  29 +
  30 + //注释
  31 + , note = [
  32 + '/** <%= pkg.name %>-v<%= pkg.version %> <%= pkg.license %> License By <%= pkg.homepage %> */\n <%= js %>'
  33 + , { pkg: pkg, js: ';' }
  34 + ]
  35 +
  36 + , destDir = './dist' //构建的目标目录
  37 + , releaseDir = '../pack/layuiAdmin.pack/' + pkg.name + '-v' + pkg.version //发行版本目录
  38 +
  39 + //任务
  40 + , task = {
  41 + //压缩 JS
  42 + minjs: function () {
  43 + var src = [
  44 + './src/**/*.js'
  45 + , '!./src/config.js'
  46 + , '!./src/lib/extend/echarts.js'
  47 + ];
  48 +
  49 + return gulp.src(src).pipe(uglify())
  50 + .pipe(header.apply(null, note))
  51 + .pipe(gulp.dest(destDir));
  52 + }
  53 +
  54 + //压缩 CSS
  55 + , mincss: function () {
  56 + var src = [
  57 + './src/**/*.css'
  58 + ]
  59 + , noteNew = JSON.parse(JSON.stringify(note));
  60 +
  61 +
  62 + noteNew[1].js = '';
  63 +
  64 + return gulp.src(src).pipe(minify({
  65 + compatibility: 'ie7'
  66 + })).pipe(header.apply(null, noteNew))
  67 + .pipe(gulp.dest(destDir));
  68 + }
  69 +
  70 + //复制文件夹
  71 + , mv: function () {
  72 + gulp.src('./src/config.js')
  73 + .pipe(gulp.dest(destDir));
  74 +
  75 + gulp.src('./src/lib/extend/echarts.js')
  76 + .pipe(gulp.dest(destDir + '/lib/extend'));
  77 +
  78 + gulp.src([
  79 + './src/style/**/*',
  80 + '!./src/style/css/**/*',
  81 + ])
  82 + .pipe(gulp.dest(destDir + '/style'));
  83 +
  84 + return gulp.src('./src/views/**/*')
  85 + .pipe(gulp.dest(destDir + '/views'));
  86 + }
  87 + };
  88 +
  89 +
  90 +//清理
  91 +gulp.task('clear', function (cb) {
  92 + return del(['./dist/*'], cb);
  93 +});
  94 +gulp.task('clearRelease', function (cb) {
  95 + return del(['./json/*', releaseDir], cb);
  96 +});
  97 +
  98 +gulp.task('minjs', task.minjs);
  99 +gulp.task('mincss', task.mincss);
  100 +gulp.task('mv', task.mv);
  101 +
  102 +gulp.task('src', function () { //命令:gulp src
  103 + return gulp.src('./dev-pro/**/*')
  104 + .pipe(gulp.dest('./src'));
  105 +});
  106 +
  107 +//构建核心源文件
  108 +gulp.task('default', ['clear', 'src'], function () { //命令:gulp
  109 + for (var key in task) {
  110 + task[key]();
  111 + }
  112 +});
  113 +
  114 +//发行 - layuiAdmin 官方使用
  115 +gulp.task('release', function () { //命令:gulp && gulp release
  116 +
  117 + //复制核心文件
  118 + gulp.src('./dist/**/*')
  119 + .pipe(gulp.dest(releaseDir + '/dist'));
  120 +
  121 + gulp.src('./src/**/*')
  122 + .pipe(gulp.dest(releaseDir + '/src'));
  123 +
  124 + //复制 json
  125 + gulp.src('./dev/json/**/*')
  126 + .pipe(gulp.dest('./json'))
  127 + .pipe(gulp.dest('./start/json'))
  128 + .pipe(gulp.dest(releaseDir + '/start/json'));
  129 +
  130 + //复制并转义宿主页面
  131 + gulp.src('./dev/index.html')
  132 + .pipe(replace(/\<\!-- clear s --\>([\s\S]*?)\<\!-- clear e --\>/, ''))
  133 + .pipe(replace('//local.res.layui.com/layui/src', 'layui'))
  134 + .pipe(replace("base: '../dev-pro/'", "base: '../dist/'"))
  135 + .pipe(replace('@@version@@', pkg.version))
  136 + .pipe(gulp.dest('./start'))
  137 + .pipe(gulp.dest(releaseDir + '/start'));
  138 +
  139 + //复制帮助文件
  140 + gulp.src([
  141 + './帮助/*'
  142 + , '!./帮助/说明.txt'
  143 + ]).pipe(gulp.dest(releaseDir + '/帮助'));
  144 +
  145 + gulp.src([
  146 + './帮助/说明.txt'
  147 + ]).pipe(gulp.dest(releaseDir));
  148 +
  149 +
  150 + //复制 gulpfile
  151 + gulp.src([
  152 + 'gulpfile.js'
  153 + , 'package.json'
  154 + ]).pipe(gulp.dest(releaseDir));
  155 +
  156 + //说明
  157 + gulp.src('../pack/说明.txt')
  158 + .pipe(gulp.dest('../pack/layuiAdmin.pack'));
  159 +
  160 + //复制 layui
  161 + return gulp.src('../../../../res/layui/rc/**/*')
  162 + .pipe(gulp.dest('./start/layui'))
  163 + .pipe(gulp.dest(releaseDir + '/start/layui'))
  164 +});
  165 +
  166 +// 编译sass zx
  167 +gulp.task('base', function () {
  168 + gulp.src('src/style/css/scss/**/*.scss')
  169 + .pipe(sass().on('error', sass.logError))
  170 + .pipe(replace('../../../font', '../font'))
  171 + .pipe(replace('../../../img', '../img'))
  172 + .pipe(replace('../../img', '../img'))
  173 + .pipe(autoPreFixer({
  174 + overrideBrowserslist: [
  175 + 'last 2 versions', 'not ie <= 8', 'iOS >= 9', 'Android >= 4.0', 'since 2013'
  176 + ],
  177 + grid: true
  178 + }))
  179 + // .pipe(px2rem({
  180 + // replace: true,
  181 + // rootValue: 37.5
  182 + // }))
  183 + .pipe(concat('main.css'))
  184 + .pipe(gulp.dest('src/style/css'));
  185 +});
  186 +
  187 +gulp.task('w', function () {
  188 + gulp.watch('src/style/css/scss/**/*.scss', ['base']);
  189 +});
This diff could not be displayed because it is too large.
  1 +{
  2 + "name": "layuiAdmin.pro",
  3 + "version": "1.2.1",
  4 + "description": "通用后台管理模板系统",
  5 + "license": "LPPL",
  6 + "author": [
  7 + "xianxin <xianxin@layui-inc.com>"
  8 + ],
  9 + "scripts": {
  10 + "w": "gulp w",
  11 + "s": "node app.js",
  12 + "sw": "concurrently \"npm run w\" \"npm run s\""
  13 + },
  14 + "homepage": "http://www.layui.com/admin/",
  15 + "devDependencies": {
  16 + "chai": "^4.1.1",
  17 + "concurrently": "^4.0.1",
  18 + "del": "^2.2.2",
  19 + "express": "^4.16.3",
  20 + "gulp": "^3.9.1",
  21 + "gulp-autoprefixer": "^6.0.0",
  22 + "gulp-concat": "^2.6.0 ",
  23 + "gulp-header": "^1.8.8",
  24 + "gulp-if": "^2.0.1",
  25 + "gulp-less": "^4.0.1",
  26 + "gulp-minify-css": "^1.2.4",
  27 + "gulp-px2rem": "^1.1.1",
  28 + "gulp-rename": "^1.2.2",
  29 + "gulp-replace": "^0.6.1",
  30 + "gulp-sass": "^4.0.2",
  31 + "gulp-uglify": "^1.5.4",
  32 + "minimist": "^1.2.0",
  33 + "mocha": "^3.2.0",
  34 + "node-sass": "^4.12.0",
  35 + "sinon": "^3.2.1",
  36 + "sinon-chai": "^2.13.0"
  37 + }
  38 +}
  1 +/*!
  2 +Math.uuid.js (v1.4)
  3 +http://www.broofa.com
  4 +mailto:robert@broofa.com
  5 +
  6 +Copyright (c) 2010 Robert Kieffer
  7 +Dual licensed under the MIT and GPL licenses.
  8 +*/
  9 +
  10 +/*
  11 + * Generate a random uuid.
  12 + *
  13 + * USAGE: Math.uuid(length, radix)
  14 + * length - the desired number of characters
  15 + * radix - the number of allowable values for each character.
  16 + *
  17 + * EXAMPLES:
  18 + * // No arguments - returns RFC4122, version 4 ID
  19 + * >>> Math.uuid()
  20 + * "92329D39-6F5C-4520-ABFC-AAB64544E172"
  21 + *
  22 + * // One argument - returns ID of the specified length
  23 + * >>> Math.uuid(15) // 15 character ID (default base=62)
  24 + * "VcydxgltxrVZSTV"
  25 + *
  26 + * // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
  27 + * >>> Math.uuid(8, 2) // 8 character ID (base=2)
  28 + * "01001010"
  29 + * >>> Math.uuid(8, 10) // 8 character ID (base=10)
  30 + * "47473046"
  31 + * >>> Math.uuid(8, 16) // 8 character ID (base=16)
  32 + * "098F4D35"
  33 + */
  34 +(function() {
  35 + // Private array of chars to use
  36 + var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
  37 +
  38 + Math.uuid = function (len, radix) {
  39 + var chars = CHARS, uuid = [], i;
  40 + radix = radix || chars.length;
  41 + if (len) {
  42 + // Compact form
  43 + for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
  44 + } else {
  45 + // rfc4122, version 4 form
  46 + var r;
  47 +
  48 + // rfc4122 requires these characters
  49 + uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
  50 + uuid[14] = '4';
  51 +
  52 + // Fill in random data. At i==19 set the high bits of clock sequence as
  53 + // per rfc4122, sec. 4.1.5
  54 + for (i = 0; i < 36; i++) {
  55 + if (!uuid[i]) {
  56 + r = 0 | Math.random()*16;
  57 + uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
  58 + }
  59 + }
  60 + }
  61 + return uuid.join('');
  62 + };
  63 +})();
  1 +/**
  2 +
  3 + @Name:全局配置
  4 + @Author:贤心
  5 + @Site:http://www.layui.com/admin/
  6 + @License:LPPL(layui付费产品协议)
  7 +
  8 + */
  9 +
  10 +layui.define(['laytpl', 'layer', 'element', 'util'], function(exports){
  11 + exports('setter', {
  12 + container: 'LAY_app' //容器ID
  13 + ,base: layui.cache.base //记录layuiAdmin文件夹所在路径
  14 + ,views: layui.cache.base + 'views/' //视图所在目录
  15 + ,entry: 'index' //默认视图文件名
  16 + ,engine: '.html' //视图文件后缀名
  17 + ,pageTabs: true //是否开启页面选项卡功能。单页版不推荐开启
  18 +
  19 + ,name: ' '
  20 + ,tableName: 'layuiAdmin' //本地存储表名
  21 + ,MOD_NAME: 'admin' //模块事件名
  22 +
  23 + ,debug: true //是否开启调试模式。如开启,接口异常时会抛出异常 URL 等信息
  24 +
  25 + ,interceptor: true //是否开启未登入拦截
  26 +
  27 + //自定义请求字段
  28 + ,request: {
  29 + tokenName: 'access_token' //自动携带 token 的字段名。可设置 false 不携带。
  30 + }
  31 +
  32 + //自定义响应字段
  33 + ,response: {
  34 + statusName: 'code' //数据状态的字段名称
  35 + ,statusCode: {
  36 + ok: 0 //数据状态一切正常的状态码
  37 + ,logout: 1001 //登录状态失效的状态码
  38 + }
  39 + ,msgName: 'msg' //状态信息的字段名称
  40 + ,dataName: 'data' //数据详情的字段名称
  41 + }
  42 +
  43 + //独立页面路由,可随意添加(无需写参数)
  44 + ,indPage: [
  45 + '/user/login', //登入页
  46 + '/page/forward' // 听云访问系统页面
  47 + ]
  48 +
  49 + //扩展的第三方模块
  50 + ,extend: [
  51 + 'lay',
  52 + 'swiper',
  53 + 'jtopo',
  54 + 'echarts',
  55 + 'treeTable',
  56 + 'xmSelect',
  57 + 'formSelects',
  58 + 'codemirror',
  59 + 'matchbrackets',
  60 + 'sockjs',
  61 + 'stomp',
  62 + 'inputTags',
  63 + 'mxClient',
  64 + 'soulTable',
  65 + 'tableFilter',
  66 + 'tableChild',
  67 + 'tableMerge',
  68 + 'excel',
  69 + 'tableEdit',
  70 + 'tableTree',
  71 + 'setStep',
  72 + 'msgTips',
  73 + 'cron',
  74 + 'dropMenu',
  75 + 'shell',
  76 + 'cascader',
  77 + 'md5'
  78 + ]
  79 +
  80 + //主题配置
  81 + ,theme: {
  82 + //内置主题配色方案
  83 + color: [{
  84 + main: '#20222A' //主题色
  85 + ,selected: '#009688' //选中色
  86 + ,alias: 'default' //默认别名
  87 + },{
  88 + main: '#03152A'
  89 + ,selected: '#3B91FF'
  90 + ,alias: 'dark-blue' //藏蓝
  91 + },{
  92 + main: '#2E241B'
  93 + ,selected: '#A48566'
  94 + ,alias: 'coffee' //咖啡
  95 + },{
  96 + main: '#50314F'
  97 + ,selected: '#7A4D7B'
  98 + ,alias: 'purple-red' //紫红
  99 + },{
  100 + main: '#344058'
  101 + ,logo: '#1E9FFF'
  102 + ,selected: '#1E9FFF'
  103 + ,alias: 'ocean' //海洋
  104 + },{
  105 + main: '#3A3D49'
  106 + ,logo: '#2F9688'
  107 + ,selected: '#5FB878'
  108 + ,alias: 'green' //墨绿
  109 + },{
  110 + main: '#20222A'
  111 + ,logo: '#F78400'
  112 + ,selected: '#F78400'
  113 + ,alias: 'red' //橙色
  114 + },{
  115 + main: '#28333E'
  116 + ,logo: '#AA3130'
  117 + ,selected: '#AA3130'
  118 + ,alias: 'fashion-red' //时尚红
  119 + },{
  120 + main: '#24262F'
  121 + ,logo: '#3A3D49'
  122 + ,selected: '#009688'
  123 + ,alias: 'classic-black' //经典黑
  124 + },{
  125 + logo: '#226A62'
  126 + ,header: '#2F9688'
  127 + ,alias: 'green-header' //墨绿头
  128 + },{
  129 + main: '#344058'
  130 + ,logo: '#0085E8'
  131 + ,selected: '#1E9FFF'
  132 + ,header: '#1E9FFF'
  133 + ,alias: 'ocean-header' //海洋头
  134 + },{
  135 + header: '#393D49'
  136 + ,alias: 'classic-black-header' //经典黑
  137 + },{
  138 + main: '#50314F'
  139 + ,logo: '#50314F'
  140 + ,selected: '#7A4D7B'
  141 + ,header: '#50314F'
  142 + ,alias: 'purple-red-header' //紫红头
  143 + },{
  144 + main: '#28333E'
  145 + ,logo: '#28333E'
  146 + ,selected: '#AA3130'
  147 + ,header: '#AA3130'
  148 + ,alias: 'fashion-red-header' //时尚红头
  149 + },{
  150 + main: '#28333E'
  151 + ,logo: '#009688'
  152 + ,selected: '#009688'
  153 + ,header: '#009688'
  154 + ,alias: 'green-header' //墨绿头
  155 + }]
  156 +
  157 + //初始的颜色索引,对应上面的配色方案数组索引
  158 + //如果本地已经有主题色记录,则以本地记录为优先,除非请求本地数据(localStorage)
  159 + ,initColorIndex: 1
  160 + }
  161 + });
  162 +});
  1 +/**
  2 + * @desc 共享存储
  3 + * @author yh
  4 + * @date 2021/4/23 14:03
  5 + **/
  6 +layui.define(['commonDetail','common'], function (exports) {
  7 + var commonDetail = layui.commonDetail;
  8 + var common = layui.common;
  9 + //对外暴露的接口
  10 + exports('a_cloud_physicshost', function (data) {
  11 + var resId = '';
  12 + var resType = '';
  13 + var showFlag = common.getUrlParam("show");
  14 + if(showFlag && showFlag == '0'){
  15 + resId = common.getUrlParam("resId");
  16 + resType = common.getUrlParam("resType");
  17 + }else{
  18 + resId = data.resId;
  19 + resType = data.resType;
  20 + }
  21 +
  22 + //基本信息
  23 + var jbxxKpi = "KPIE13DD9A3,KPI72E7FB4B,KPIF74D9D2B,KPI1635BB9B";
  24 + //文件系统信息
  25 + var filesystemkpi = "KPI7AC1664E,KPI449F5365,KPIA91F44E7,KPI98306224,KPIE25925F7";
  26 + //网络接口信息
  27 + var interfacekpi = "KPIFABFD741,KPI73C0F7E7,KPIFA92AF2D";
  28 + //存储信息
  29 + var storagekpi = "KPIFB844B8B,KPI5E148DBE,KPIE55684DF,KPIDBFA1EE2";
  30 +
  31 + reload();
  32 +
  33 + //渲染页面
  34 + function reload() {
  35 + commonDetail.renderText("a_cloud_physicshost_baseinfo",resId,jbxxKpi);
  36 + //cpu使用率
  37 + // commonDetail.renderGauge("a_cloud_physicshost_cpurate",resId,"KPI7054BC34",true);
  38 + commonDetail.renderLineCharat("a_cloud_physicshost_cpurate",resId,"KPI7054BC34","CPU使用率","cpu");
  39 + //内存使用率
  40 + // commonDetail.renderGauge("a_cloud_physicshost_memeryrate",resId,"KPI31CB8D97",true);
  41 + commonDetail.renderLineCharat("a_cloud_physicshost_memeryrate",resId,"KPI31CB8D97","内存使用率","mem");
  42 + //文件系统信息
  43 + commonDetail.renderTable("a_cloud_physicshost_filesystem",false,resId,filesystemkpi,'文件系统信息','filesystem-');
  44 + //网络接口信息
  45 + commonDetail.renderTable("a_cloud_physicshost_interface",false,resId,interfacekpi,'网络接口信息','interface-');
  46 + //存储信息
  47 + commonDetail.renderTable("a_cloud_physicshost_storage",false,resId,storagekpi,'设备主机信息','storage-');
  48 + //活动告警
  49 + commonDetail.renderActiveAlarms("a_cloud_physicshost_alarms",resId);
  50 + }
  51 +
  52 + //定时任务
  53 + var timer = setInterval(function () {
  54 + reload()
  55 + },commonDetail.timerTime);
  56 + commonDetail.detailTimer.push(timer);
  57 +
  58 + });
  59 +});
  1 +/** 关于系统*/
  2 +layui.define([ 'table', 'form', 'admin', 'common','sessions','upload'], function (exports) {
  3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var tree = layui.tree;
  6 + var table = layui.table;
  7 + var admin = layui.admin;
  8 + var common = layui.common;
  9 + var upload = layui.upload;
  10 + //对外暴露的接口
  11 + exports('aboutSystemIndex', function () {
  12 + var sessions = layui.sessions;
  13 + var accessToken = sessions.getToken().access_token;
  14 + form.render(null, 'aboutSystem-form');
  15 +
  16 + var documentTable = '';
  17 + var nodeId = 'id_gf_sysc';
  18 + //加载文档表格数据
  19 + renderDocumentTable();
  20 + //检索事件
  21 + serachEvent();
  22 + //上传操作
  23 + $("#doc_upload").on("click",function () {
  24 + var $content = $("#doc-upload-form");
  25 + //打开选择文件弹框
  26 + layer.open({
  27 + type: 1
  28 + ,title: "选择文件" //不显示标题栏
  29 + ,closeBtn: false
  30 + ,area: ['500px', '300px']
  31 + ,shade: 0.8
  32 + ,id: 'doc-upload-form-id' //设定一个id,防止重复弹出
  33 + ,btn: ['上传', '取消']
  34 + ,content: $content.html()
  35 + ,yes: function(index, layero){
  36 + if($("#doc-display-file-name").val()){
  37 + //点击上传按钮
  38 + $("#doc-upload-actionbtn").trigger("click");
  39 + }else{
  40 + layer.msg('请选择要上传的文件!', {
  41 + icon: 7,time:3000
  42 + });
  43 + }
  44 + return false;
  45 + }
  46 + });
  47 +
  48 + var param = {"category":nodeId,"access_token":localStorage.getItem("access_token")};
  49 + //上传
  50 + var uploadFile = upload.render({
  51 + elem: '#doc-display-file-name'
  52 + , url: common.domainName+'/api-web/inspection/document/upload'
  53 + , auto: false
  54 + , accept: 'file'
  55 + , data:param
  56 + , exts: 'xls|doc|pdf|rar|zip|docx|xlsx|txt|jpg|log'
  57 + ,choose: function(obj){
  58 + var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
  59 + //读取本地文件
  60 + obj.preview(function(index, file, result){
  61 + // 验证文件是否合规
  62 + admin.req({
  63 + url: common.domainName+'/api-web/inspection/document/check?fileName='+file.name,
  64 + async: false
  65 + }).done(function (res) {
  66 + // 10 文件不符合规则 20 文件不存在 21 文件已存在
  67 + if(res.data == 20){
  68 + $("#doc-display-file-name").val(file.name);
  69 + }else{
  70 + if(res.data == 10){
  71 + layer.msg('文件名不符合规则!', {
  72 + icon: 7,time:3000
  73 + });
  74 + delete files[index];
  75 + }else{
  76 + $("#doc-display-file-name").val(file.name);
  77 + layer.msg('检测到该文件已存在,执行上传操作文件将被覆盖!', {
  78 + icon: 7,time:3000
  79 + });
  80 + }
  81 + }
  82 + });
  83 + });
  84 + }
  85 + ,done: function(res){
  86 + // 上传成功
  87 + if(res && res["status"] == 1){
  88 + delete res["createTime"];
  89 + // 获取用户信息
  90 + // res["authUser"] = param["authUser"];
  91 + res["access_token"] = accessToken;
  92 + res["docType"] ="doc";
  93 + // 发起保存操作
  94 + admin.req({
  95 + url: common.domainName + '/api-web/inspection/document/save',
  96 + async: false,
  97 + type: "post",
  98 + data : res
  99 + }).done(function (res) {
  100 + if(res.data){
  101 + layer.msg('文档上传成功!', {
  102 + icon: 1,time:2000
  103 + },function () {
  104 + layer.closeAll();
  105 + reloadDocTable(nodeId);
  106 + });
  107 + }else{
  108 + layer.msg('文档上传失败!', {
  109 + icon: 7,time:2000
  110 + });
  111 + }
  112 + });
  113 + }
  114 + }
  115 + ,error: function(index, upload){
  116 + // 上传失败
  117 + layer.msg('文件上传时发生故障,请稍后再试!', {
  118 + icon: 7,time:3000
  119 + });
  120 + }
  121 + });
  122 + //上传请求操作
  123 + $("#doc-upload-actionbtn").on("click",function(){
  124 + uploadFile.upload();
  125 + })
  126 + });
  127 + //下载文档
  128 + $('#doc_download').click(function () {
  129 + var ids = [];
  130 + var data = table.checkStatus('aboutSystem_table').data;
  131 + if (data.length == 0) {
  132 + layer.msg('请选择要下载的文件!', { icon: 7,time:3000 });
  133 + return false;
  134 + }
  135 + //将选中的报表ID放到集合中
  136 + $.each(data, function (i, obj) {
  137 + ids.push(obj.id);
  138 + });
  139 + ids = ids.toString();
  140 + var path = common.domainName + '/api-web/inspection/document/download?access_token='+accessToken+"&ids="+ids;
  141 + window.open(path);
  142 +
  143 + });
  144 +
  145 + //关键字检索
  146 + $('#doc_keyword').keydown(function (e) {
  147 + if (e.keyCode === 13) {
  148 + reloadDocTable();
  149 + }
  150 + });
  151 +
  152 + //检索事件
  153 + function serachEvent() {
  154 + //关键字检索
  155 + $('#doc_keyword').keydown(function (e) {
  156 + if (e.keyCode === 13) {
  157 + reloadDocTable();
  158 + }
  159 + });
  160 + //文档编号
  161 + $('#doc_code').keydown(function (e) {
  162 + if (e.keyCode === 13) {
  163 + reloadDocTable();
  164 + }
  165 + });
  166 + }
  167 +
  168 + //表格数据
  169 + function renderDocumentTable() {
  170 + documentTable = table.render({
  171 + elem: '#aboutSystem_table'
  172 + , url: common.domainName + '/api-web/inspection/document/list'
  173 + , where: {
  174 + access_token: accessToken,
  175 + name:$("#doc_keyword").val(),
  176 + docNo:$("#doc_code").val(),
  177 + category:nodeId,
  178 + createUser:'',
  179 + flag: 'true',
  180 + docType:"doc"
  181 + }
  182 + , height: 'full'
  183 + , page: {
  184 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
  185 + ,theme: '#1E9FFF'
  186 + }
  187 + ,limit: common.limit
  188 + ,limits: common.limits
  189 + , even: true
  190 + , cols: [[
  191 + {type: 'checkbox',width:50}
  192 + , {field: 'docNo', title: '文档编号', align: 'center',width:150}
  193 + , {field: 'name', title: '文档名称', align: 'left',
  194 + templet: '<div><span data-id="{{d.id}}" data-path="{{d.localPath}}" class="layui-table-link preview-btn">{{d.name}}</span></div>' }
  195 + , {field: 'categoryName', title: '文档类型', align: 'center',width:200}
  196 + , {field: 'createUserName', title: '提交人', align: 'center',width:150}
  197 + , {field: 'createTime', title: '提交时间', align: 'center',width:170
  198 + ,templet:'<div>{{ layui.util.toDateString(d.createTime, "yyyy-MM-dd HH:mm:ss") }}</div>'}
  199 + , {
  200 + field: 'path', title: '下载', align: 'center',width:100,
  201 + templet:function (v) {
  202 + var url = common.domainName + '/api-web/inspection/document/download?access_token='+accessToken+"&ids="+v.id;
  203 + return '<a class=" layui-table-link" href="'+url+'">下载</a>';
  204 + }
  205 + }
  206 + ]],done:function () {
  207 + $('.preview-btn').on('click', function () {
  208 + var id = $(this).data('id')
  209 + var localPath = $(this).data('path')
  210 + common.openReport(id,'','','','',1)
  211 + })
  212 + }
  213 + });
  214 + }
  215 + //刷新表格
  216 + function reloadDocTable() {
  217 + documentTable.reload({
  218 + where: {
  219 + access_token: accessToken,
  220 + name:$("#doc_keyword").val(),
  221 + docNo:$("#doc_code").val(),
  222 + createUser:'',
  223 + category:nodeId,
  224 + flag: 'true',
  225 + docType:"doc"
  226 + }
  227 + })
  228 + }
  229 + });
  230 +});
  1 +//活动告警
  2 +layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', 'sessions','commonDetail','soulTable', 'treeTable'], function (exports) {
  3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var layer = layui.layer;
  6 + var admin = layui.admin;
  7 + var table = layui.table;
  8 + var laydate = layui.laydate;
  9 + var laytpl = layui.laytpl;
  10 + var treeTable = layui.treeTable;
  11 + var common = layui.common;
  12 + var commonDetail=layui.commonDetail;
  13 + var domainName = common.domainName;
  14 + var todayStr = '';
  15 + //对外暴露的接口
  16 + exports('activewarning', function () {
  17 + var sessions = layui.sessions;
  18 + var accessToken = sessions.getToken()['access_token'];
  19 + var router = layui.router();
  20 + var alarmLevel = router.search.level; //告警级别
  21 + var checkList = common.checkPermission(accessToken);
  22 + var resId = router.search.resId;//资源Id
  23 + var kpiId = router.search.kpiId;//指标Id
  24 + var bizId = router.search.bizId;//业务Id
  25 + var alarmNo = router.search.alarmNo;//告警编号
  26 + var busIdSelect;
  27 + var busTypeList = [];
  28 + if(!bizId){
  29 + bizId='';
  30 + }
  31 + if (resId) {
  32 + resId = decodeURIComponent(resId);
  33 + }
  34 + if (alarmNo) {
  35 + $("#activewarningkw").val(alarmNo);
  36 + }
  37 + var netFlag = router.search.netFlag;//网络标识
  38 + var resType = router.search.restype ? router.search.restype : '';//资源类型
  39 + var soulTable = layui.soulTable;
  40 +
  41 + var sortKey = '';
  42 +
  43 + if ($("#alarmLevelSearchBox").val()) {
  44 + alarmLevel = $("#alarmLevelSearchBox").val()
  45 + }
  46 + //回显告警级别
  47 + $("#alarmLevelSearchBox").val(alarmLevel);
  48 + form.render("select");
  49 +
  50 + function initDate() {
  51 + //开始时间
  52 + var start = laydate.render({
  53 + elem: '#activewarningStartdate'
  54 + , trigger: 'click'
  55 + , done: function (value, date) {
  56 + date.month--;
  57 + end.config.min = date;
  58 + var endDate = $("#activewarningEnddate").val();
  59 + if (endDate != null && endDate != "") {
  60 + reloadTable();
  61 + }
  62 + }
  63 + });
  64 + //结束时间
  65 + var end = laydate.render({
  66 + elem: '#activewarningEnddate'
  67 + , trigger: 'click'
  68 + , done: function (value, date) {
  69 + date.month--;
  70 + start.config.max = date;
  71 + var benginDate = $("#activewarningStartdate").val();
  72 + if (benginDate != null && benginDate != "") {
  73 + reloadTable();
  74 + }
  75 + }
  76 + });
  77 + //绑定业务下拉选择数据
  78 + admin.req({
  79 + url: domainName + '/api-web/home/business/findAllBusType',
  80 + success: function (response) {
  81 + if (response && response.success) {
  82 + busTypeList = response.data;
  83 + var bizList = response.data.map(item => {
  84 + return {
  85 + name: item.busTypeName,
  86 + value: item.busId,
  87 + parentId: item.parentId
  88 + }
  89 + });
  90 + var bizTree=common.pidToChildren(bizList, 'value', 'parentId');
  91 +
  92 + // 影响业务下拉框
  93 + busIdSelect = xmSelect.render({
  94 + el: '#bisTypeSearchBox',
  95 + name: 'bizId',
  96 + tips: '=所属业务=',
  97 + //开启搜索
  98 + filterable: true,
  99 + clickClose: true,
  100 + initValue: [bizId.split(',')[0]],
  101 + toolbar: {
  102 + show: true,
  103 + list: ['ALL', 'REVERSE', 'CLEAR']
  104 + },
  105 + height: 'auto',
  106 + tree: {
  107 + show: true,
  108 + showFolderIcon: true,
  109 + showLine: true,
  110 + strict: true,
  111 + //间距
  112 + indent: 20,
  113 + },
  114 + model: {
  115 + label: {
  116 + type: 'text'
  117 + }
  118 + },
  119 + data: bizTree,
  120 + on: function (data) {
  121 + if (data.arr.length != 0) {
  122 + var str='';
  123 + $.each(data.arr,function (i,v) {
  124 + str+=v.value+',';
  125 + })
  126 + bizId = str.substring(0,str.length-1);
  127 + } else {
  128 + bizId = '';
  129 + }
  130 + form.render();
  131 + reloadTable();
  132 + }
  133 + });
  134 + if(busIdSelect){
  135 + //追加样式
  136 + $('#bisTypeSearchBox').find('.xm-body').eq(0).css("width","230px");
  137 + }
  138 + } else {
  139 + layer.msg('获取业务失败', {icon: 2});
  140 + }
  141 + },
  142 + error: function () {
  143 + layer.msg('获取业务失败', {icon: 2});
  144 + }
  145 + });
  146 +
  147 + $.ajax({
  148 + url: common.domainName + '/api-web/manage/kpi/findKpiInAlarm?access_token='+accessToken+'&tableName=b_alarm',
  149 + type: "get",
  150 + success:function (res) {
  151 + var kpis = res.data;
  152 + var html = '<option value="">=指标名称=</option>'
  153 + $.each(kpis,function (i,e) {
  154 + html+='<option value="'+e.kpiId+'">'+e.kpiName+'</option>'
  155 + })
  156 + $("#alarmKpiSearchBox").html('');
  157 + $("#alarmKpiSearchBox").append(html);
  158 + form.render();
  159 + }
  160 + })
  161 + $.ajax({
  162 + url: `${common.domainName}/api-web/manage/restype/list?access_token=${accessToken}`,
  163 + method: 'GET',
  164 + success: function (res) {
  165 + // 资源类型下拉框
  166 + var resTypeList = res.data.map(item => {
  167 + return {
  168 + name: item.resTypeName,
  169 + value: item.resTypeCode,
  170 + parentId: item.parentId
  171 + }
  172 + });
  173 + var resTypeTree = treeTable.pidToChildren(resTypeList, "value", "parentId");
  174 + xmSelect.render({
  175 + el: '#resTypeSearchBox',
  176 + name: "resType",
  177 + tips: '=资源类型=',
  178 + filterable: true,
  179 + radio: true,
  180 + clickClose: true,
  181 + initValue: [resType],
  182 + toolbar: {
  183 + show: true,
  184 + list: ['CLEAR']
  185 + },
  186 + tree: {
  187 + show: true,
  188 + showFolderIcon: true,
  189 + showLine: true,
  190 + strict: false,
  191 + indent: 20
  192 + },
  193 + model: {
  194 + label: {
  195 + type: 'text'
  196 + }
  197 + },
  198 + height: 'auto',
  199 + data: resTypeTree,
  200 + on: function (data) {
  201 + if(data.isAdd){
  202 + if (data.arr.length != 0) {
  203 + resType = data.arr[0].value;
  204 + } else {
  205 + resType = '';
  206 + }
  207 + reloadTable();
  208 + }
  209 + }
  210 + });
  211 + }
  212 + });
  213 + }
  214 +
  215 + //回车搜索
  216 + $('#activewarningkw, input[name="durationVal"]').keydown(function (e) {
  217 + if (e.keyCode === 13) {
  218 + reloadTable();
  219 + }
  220 + });
  221 + //选择框搜索事件
  222 + bindSelectEvent();
  223 + initDate();
  224 +
  225 + function initToolBarClickEvent() {
  226 + //告警消除
  227 + $("#clearBtn").unbind('click').on('click', function () {
  228 + if ($.inArray('app:alarm:clear', checkList) == -1) {
  229 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  230 + return;
  231 + }
  232 + var ids = [];
  233 + var data = table.checkStatus('activewarningTable').data;
  234 + if (data.length == 0) {
  235 + layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
  236 + return;
  237 + }
  238 + //选中的告警ID放到集合中
  239 + $.each(data, function (i, obj) {
  240 + ids.push(obj.id)
  241 + });
  242 + //获取以往告警消除意见
  243 + admin.req({
  244 + url: common.domainName + '/api-web/home/alarm/clear/reason',
  245 + type: "get",
  246 + data:{
  247 + alarmId: ids.toString()
  248 + },
  249 + done:function (data) {
  250 + var clearReson = "暂无参考处理方案,请输入处理方案";
  251 + var hisReason = "";
  252 + var reasonlist = data.reason;
  253 + if(reasonlist && reasonlist.length > 0){
  254 + hisReason = "参考方案:\n";
  255 + $.each(reasonlist,function (i,v) {
  256 + var idx = i + 1;
  257 + hisReason += idx +":"+v +"\n";
  258 + });
  259 + }
  260 +
  261 + layer.prompt({id: "alarms_clear_id", title: '告警消除', area: ['400px'], formType: 2,value: hisReason}, function (text, index) {
  262 + admin.req({
  263 + url: common.domainName + '/api-web/home/alarm/clear'
  264 + , type: "post"
  265 + , data: {
  266 + ids: ids.toString(),
  267 + reason: text,
  268 + access_token: accessToken,
  269 + noticeFlag: $('input[name="noticeFlag"]:checked').val()
  270 + }
  271 + , done: function (res) {
  272 + //如果消除成功,关闭弹出框然后重新加载页面
  273 + if (res.success) {
  274 + layer.close(index);
  275 + layer.msg('告警已消除!', {icon: 1, time: 2000});
  276 + reloadTable();
  277 + } else {
  278 + layer.msg('告警消除失败,请与管理员联系!', {icon: 7, time: 3000});
  279 + }
  280 + }
  281 + });
  282 + });
  283 +
  284 + $("#alarms_clear_id").find('textarea.layui-layer-input').attr("placeholder", clearReson);
  285 + $("#alarms_clear_id").append('<div style="padding-top: 15px;"><span>是否通知:</span> ' +
  286 + '<input type="radio" name="noticeFlag" value="true" title="是" >&nbsp;是' +
  287 + '<input type="radio" name="noticeFlag" value="false" title="否" checked="" style="margin-left: 20px;">&nbsp;否</div> ');
  288 + }
  289 + });
  290 + });
  291 + //告警关闭
  292 + $("#closeBtn").unbind('click').on("click", function () {
  293 + if ($.inArray('app:alarm:close', checkList) == -1) {
  294 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  295 + return;
  296 + }
  297 + var ids = [];
  298 + var data = table.checkStatus('activewarningTable').data;
  299 + var alarmStatus = true;
  300 + if (data.length == 0) {
  301 + layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
  302 + return;
  303 + }
  304 + //选中的告警ID放到集合中
  305 + $.each(data, function (i, obj) {
  306 + var status = JSON.stringify(obj.alarmStatus);
  307 + if (status && status == '1') {
  308 + alarmStatus = false;
  309 + }
  310 + ids.push(obj.id)
  311 + });
  312 + if (!alarmStatus) {
  313 + layer.msg('已关闭的告警不可重复关闭!', {icon: 7, time: 3000});
  314 + return;
  315 + }
  316 + layer.prompt({
  317 + id: "alarms_cloes_id",
  318 + formType: 2,
  319 + title: '告警关闭',
  320 + area: ['400px']
  321 + },
  322 + function (value, index) {
  323 + if (value === "") {
  324 + layer.msg('请填写关闭意见', {icon: 7, time: 3000});
  325 + }
  326 + if ($('#closeDuration').val() === "") {
  327 + layer.msg('请填写关闭时长', {icon: 7, time: 3000});
  328 + return;
  329 + }
  330 + admin.req({
  331 + url: common.domainName + '/api-web/home/alarm/close'
  332 + , type: "post"
  333 + , data: {
  334 + ids: ids.toString(),
  335 + reason: value,
  336 + duration: $('#closeDuration').val() * 60,
  337 + closeType: $('input[name="closeType"]:checked').val(),
  338 + noticeFlag: $('input[name="noticeFlag"]:checked').val(),
  339 + kpiAllFlag: $('input[name="kpiAllFlag"]:checked').val(),
  340 + access_token: accessToken
  341 + }
  342 + , done: function (res) {
  343 + if (res.success) {
  344 + layer.close(index);
  345 + layer.msg('关闭成功', {icon: 1, time: 2000}, function () {
  346 + reloadTable();
  347 + });
  348 + } else {
  349 + layer.msg('告警关闭失败,请与管理员联系!', {icon: 7, time: 3000});
  350 + }
  351 + }
  352 + });
  353 + });
  354 + $("#alarms_cloes_id").find('textarea.layui-layer-input').attr("placeholder", "请输入关闭意见(必填)");// /[^(\d||/.)]/g,''
  355 + $("#alarms_cloes_id").append('<br/>' +
  356 + '<input type="number" id="closeDuration" class="layui-input" min="0" oninput="if(value.length>5)value=value.slice(0,5)" onkeyup="value=value.replace(/(\\d*\\.\\d).*/,\'$1\')" placeholder="输入关闭时长,单位小时(必填)"/>');
  357 +
  358 + $("#alarms_cloes_id").append('<br/><div style="line-height: 38px;"><span>关闭类型:</span> ' +
  359 + '<input type="radio" name="closeType" value="0" title="关闭告警" checked="">&nbsp;关闭告警' +
  360 + '<input type="radio" name="closeType" value="1" title="关闭通知" style="margin-left: 20px;">&nbsp;关闭通知</div> ');
  361 +
  362 + $("#alarms_cloes_id").append('<div style="line-height: 38px;"><span>是否关闭该指标所有告警/通知:</span> ' +
  363 + '<input type="radio" name="kpiAllFlag" value="true" title="是">&nbsp;是' +
  364 + '<input type="radio" name="kpiAllFlag" value="false" title="否" checked="" style="margin-left: 20px;">&nbsp;否</div> ');
  365 +
  366 + $("#alarms_cloes_id").append('<div style="line-height: 38px;"><span>是否通知:</span> ' +
  367 + '<input type="radio" name="noticeFlag" value="true" title="是">&nbsp;是' +
  368 + '<input type="radio" name="noticeFlag" value="false" title="否" checked="" style="margin-left: 20px;">&nbsp;否</div> ');
  369 + });
  370 + //告警确认
  371 + $("#confirmBtn").unbind('click').on("click", function () {
  372 + if ($.inArray('app:alarm:confirm', checkList) == -1) {
  373 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  374 + return;
  375 + }
  376 + var ids = [];
  377 + var data = table.checkStatus('activewarningTable').data;
  378 + if (data.length == 0) {
  379 + layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
  380 + return;
  381 + }
  382 + $.each(data, function (i, obj) {
  383 + ids.push(obj.id)
  384 + });
  385 + layer.prompt({
  386 + id: "alarms_confirm_id",
  387 + formType: 2,
  388 + title: '告警确认',
  389 + area: ['400px']
  390 + },
  391 + function (value, index) {
  392 + if (value === "") {
  393 + layer.msg('请填确认意见', {icon: 7, time: 3000});
  394 + }
  395 + admin.req({
  396 + url: common.domainName + '/api-web/home/alarm/confirm'
  397 + , type: "post"
  398 + , data: {
  399 + ids: ids.toString(),
  400 + reason: value,
  401 + level: $('input[name="confrimlevel"]:checked').val(),
  402 + access_token: accessToken
  403 + }
  404 + , done: function (res) {
  405 + if (res.success) {
  406 + layer.close(index);
  407 + layer.msg('告警确认成功', {icon: 1, time: 2000}, function () {
  408 + reloadTable();
  409 + });
  410 + } else {
  411 + layer.msg('告警确认失败,请与管理员联系!', {icon: 7, time: 3000});
  412 + }
  413 + }
  414 + });
  415 + });
  416 + $("#alarms_confirm_id").find('textarea.layui-layer-input').attr("placeholder", "请输入意见(必填)");
  417 + $("#alarms_confirm_id").append('<br/> ' +
  418 + '<input type="radio" name="confrimlevel" value="0" title="紧急" checked="">&nbsp;紧急' +
  419 + '<input type="radio" name="confrimlevel" value="1" title="非常紧急" style="margin-left: 20px;">&nbsp;非常紧急' +
  420 + '<input type="radio" name="confrimlevel" value="2" title="不紧急" style="margin-left: 20px;">&nbsp;不紧急');
  421 + });
  422 + //告警恢复
  423 + $("#resumeBtn").unbind('click').on("click", function () {
  424 + if ($.inArray('app:alarm:resume', checkList) == -1) {
  425 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  426 + return;
  427 + }
  428 + var ids = [];
  429 + var closeIds = [];
  430 + var data = table.checkStatus('activewarningTable').data;
  431 + var resumeStatus = true;
  432 + if (data.length == 0) {
  433 + layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
  434 + return;
  435 + }
  436 + var msg = "";
  437 + //选中的告警ID放到集合中
  438 + $.each(data, function (i, obj) {
  439 + var alarmStatus = JSON.stringify(obj.alarmStatus);
  440 + //已关闭的告警才可以恢复,告警状态,0告警,1关闭
  441 + if (alarmStatus && alarmStatus == '0') {
  442 + resumeStatus = false;
  443 + msg = '只能恢复已关闭状态的告警,请重新选择!';
  444 + }
  445 + ids.push(obj.id);
  446 + closeIds.push(obj.closeId);
  447 + });
  448 + if (!resumeStatus) {
  449 + layer.msg(msg, {icon: 7, time: 3000});
  450 + return;
  451 + }
  452 + layer.prompt({title: '恢复说明(必填)', formType: 2}, function (text, index) {
  453 + admin.req({
  454 + url: common.domainName + '/api-web/home/alarm/resume'
  455 + , type: "post"
  456 + , data: {
  457 + ids: ids.toString(),
  458 + reason: text,
  459 + closeId: closeIds.toString(),
  460 + resumeType: '0',//0告警关闭,1历史告警
  461 + access_token: accessToken
  462 + }
  463 + , done: function (res) {
  464 + //如果消除成功,关闭弹出框然后重新加载页面
  465 + if (res.success) {
  466 + layer.close(index);
  467 + layer.msg('告警已恢复!', {icon: 1, time: 3000}, function () {
  468 + reloadTable();
  469 + });
  470 + } else {
  471 + layer.msg('告警恢复失败,请与管理员联系!', {icon: 7, time: 3000});
  472 + }
  473 + }
  474 + });
  475 + })
  476 + });
  477 + //导出
  478 + $("#exportAarmBtn").unbind('click').on("click", function () {
  479 + if ($.inArray('app:alarm:export', checkList) == -1) {
  480 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  481 + return;
  482 + }
  483 + var data = table.checkStatus('activewarningTable').data;
  484 + if (data.length == 0) {
  485 + //确认提示框
  486 + layer.confirm('当前没选择告警,将全量导出数据,请确认', {
  487 + btn: ['确定', '取消'] //按钮
  488 + }, function () {
  489 + var url = common.domainName + '/api-web/home/alarm/exportExcel?access_token=' + accessToken;
  490 + window.open(url);
  491 + layer.closeAll();
  492 + });
  493 + } else {
  494 + var ids = [];
  495 + //讲选中的告警ID放到集合中
  496 + $.each(data, function (i, obj) {
  497 + ids.push(obj.id);
  498 + });
  499 + ids = ids.toString();
  500 + var url = common.domainName + '/api-web/home/alarm/exportExcel?alarmIds=' + ids + "&access_token=" + accessToken;
  501 + window.open(url)
  502 + }
  503 + });
  504 + //发送通知
  505 + $("#sendNoticeBtn").unbind('click').on("click", function () {
  506 + if ($.inArray('app:alarm:sendnotice', checkList) == -1) {
  507 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  508 + return;
  509 + }
  510 + var ids = [];
  511 + var resIds = [];
  512 + var data = table.checkStatus('activewarningTable').data;
  513 + if (data.length == 0) {
  514 + layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
  515 + return;
  516 + }
  517 + if (data.length > 1) {
  518 + layer.msg('请最多选择一项数据', {icon: 7, time: 2000});
  519 + return;
  520 + }
  521 + //将选中的告警ID放到集合中
  522 + $.each(data, function (i, obj) {
  523 + ids.push(obj.id);
  524 + resIds.push(obj.resId);
  525 + });
  526 + admin.req({
  527 + url: common.domainName + '/api-web/home/alarm/subscribe/user/' + resIds.toString()
  528 + , done: function (res) {
  529 + if (res.data && res.data.length > 0) {
  530 + var username = '';
  531 + var begin = '<div style="padding: 0 5px 0 5px;"><table class="layui-table"><thead>' +
  532 + '<tr><th></th><th>名称</th><th>电话</th><th>邮箱</th></tr></thead><tbody>';
  533 + var end = '</tbody></table></div>';
  534 + $.each(res.data, function (i, v) {
  535 + username += '<tr><td><input class="userName" type="checkbox" data-name="' + v.username + '" checked></td><td>' + v.nickname + '</td><td>' + v.phone + '</td><td>' + v.email + '</td></tr>';
  536 + });
  537 + //获取告警通知接收人
  538 + var reciveUsers = begin + username + end;
  539 + layer.open({
  540 + type: 1
  541 + , title: "通知接收人"
  542 + , shade: 0.8
  543 + , area: ['600px', '390px']
  544 + , id: 'lay_users' //设定一个id,防止重复弹出
  545 + , content: reciveUsers
  546 + , btn: ['发送', '关闭']
  547 + , yes: function () {
  548 + var names = [];
  549 + $("input[class='userName']:checked").each(function(i){
  550 + names.push($(this).attr("data-name"));
  551 + });
  552 + if(names.length<1){
  553 + layer.msg('请最少选择一个用户', {icon: 7, time: 2000});
  554 + return;
  555 + }
  556 + admin.req({
  557 + url: common.domainName + '/api-web/home/alarm/sendnotice'
  558 + , type: "post"
  559 + , data: {
  560 + ids: ids.toString(),
  561 + names:names.toString(),
  562 + access_token: accessToken
  563 + }
  564 + , done: function (res) {
  565 + layer.closeAll();
  566 + if (res.success) {
  567 + layer.msg('发送成功', {icon: 1, time: 2000});
  568 + } else {
  569 + layer.msg('发送失败,稍后再试', {icon: 7, time: 2000});
  570 + }
  571 + }
  572 + });
  573 + }
  574 + });
  575 + } else {
  576 + layer.msg('未获取到接收所选通知的用户!', {icon: 7, time: 2000});
  577 + }
  578 + }
  579 + });
  580 + });
  581 + }
  582 +
  583 + //告警处理及时率
  584 + getAlarmCount();
  585 +
  586 + var activeAlarmTable;
  587 + //获取配置的列
  588 + common.getTableCols({
  589 + domId: 'activewarningTable',
  590 + moduleId: 'activewarning',
  591 + resType: ''
  592 + },function (retCols) {
  593 + var cols = [
  594 + {type: 'checkbox', fixed: 'left'}
  595 + , {
  596 + field: 'alarmLevel', title: '级别', align: 'center', width: 120, sort: true,
  597 + templet: `
  598 + <div>
  599 + {{# if (d.alarmLevel == 3) {
  600 + }} <span class="layui-table-warn" style="width: 100%;">严重</span> {{#
  601 + } else if (d.alarmLevel == 2) {
  602 + }} <span class="layui-table-close" style="width: 100%;">重要</span> {{#
  603 + } else if (d.alarmLevel == 1) {
  604 + }} <span class="layui-table-normal" style="width: 100%;">一般</span> {{#
  605 + } }}
  606 + </div>
  607 + `
  608 + }
  609 + , {
  610 + field: 'alarmNo', title: '告警编号', align: 'center', width: 140, sort: true,
  611 + }
  612 + , {
  613 + field: 'resName', title: '资源名称', width: 230, sort: true,
  614 + templet:`
  615 + <div>
  616 + {{# if (d.confirmStatus == 0 || d.confirmStatus == null) { }}
  617 + <i lay-tips="新的告警未确认,告警确认后消失!" class="shake iconfont" style="color: red;font-size: 28px;">&#xe68b;</i>
  618 + {{# } }}
  619 + <span data-resid="{{d.resId}}" data-restype="{{d.resType}}" data-warn-zymc="{{d.id}}" data-ip="{{d.ip}}"
  620 + data-resname="{{d.resName}}" data-pingenable="{{d.pingEnable}}" class="layui-table-link">{{d.resName}}</span>
  621 + <a class="layui-icon layui-icon-picture reslist-view-topo hide" data-resid="{{d.resId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" lay-tips="查看资源拓扑"></a>
  622 + </div>
  623 + `
  624 + }
  625 + , {
  626 + field: 'kpiName', title: '指标名称', align: 'center', width: 120, sort: true,
  627 + templet: `
  628 + <div>
  629 + {{#
  630 + var kpiName = d.kpiName == 'TYPE'?'ERRPT':d.kpiName;
  631 + if (d.kpiIdent != 1) {
  632 + if(d.isWarning != 1) {
  633 + }} <div>{{kpiName}}</div> {{#
  634 + } else { }}
  635 + <div><span data-ident="{{d.kpiIdent}}" data-trend="{{d.isTrend}}" data-warning="{{d.isWarning}}" data-resid="{{d.resId}}" data-flag="{{d.flag}}" data-kpi="{{d.kpiId}}" data-warn-zbmc="{{d.id}}" data-name="{{kpiName}}" class="layui-table-link">{{kpiName}}</span></div>
  636 + {{# }
  637 + } else { }}
  638 + <div><span data-ident="{{d.kpiIdent}}" data-trend="{{d.isTrend}}" data-warning="{{d.isWarning}}" data-resid="{{d.resId}}" data-flag="{{d.flag}}" data-kpi="{{d.kpiId}}" data-warn-zbmc="{{d.id}}" data-name="{{kpiName}}" class="layui-table-link">{{kpiName}}</span></div>
  639 + {{# }
  640 + }}
  641 + </div>`
  642 + }
  643 + , {field: 'alarmContent', title: '告警内容', align: 'center', width: 500}
  644 + , {
  645 + field: 'alarmResource', title: '告警来源', align: 'center', minWidth: 120, templet: `<div>
  646 + {{# if (d.alarmResource == 1) { }}
  647 + <div>华为告警</div>
  648 + {{# } else { }}
  649 + <div>监控系统</div>
  650 + {{# } }}
  651 + </div>`
  652 + }
  653 + , {field: 'updateTime', title: '告警时间', align: 'center', minWidth: 180, sort: true}
  654 + , {field: 'alarmTime', title: '首次告警时间', align: 'center', minWidth: 180, sort: true}
  655 + , {field: 'durationStr', title: '持续时间', align: 'center', width: 190}
  656 + , {field: 'alarmRepeatCnt', title: '告警次数', align: 'center', width: 180}
  657 + , {field: 'nickName', title: '通知人', align: 'center', width: 180}
  658 + , {field: 'adminName', title: '负责人', align: 'center', width: 180}
  659 + , {field: 'noticeTime', title: '通知时间', align: 'center', width: 180, hide: true}
  660 + , {
  661 + title: '操作', align: 'center', minWidth: 100,
  662 + templet: '<div><span data-warn-view="{{d.id}}" class="layui-table-link">查看</span> <span data-warn-path="{{d.id}}" class="layui-table-link">轨迹</span></div>'
  663 + }
  664 + ];
  665 +
  666 + if (retCols) {
  667 + cols = retCols;
  668 + }
  669 +
  670 + //渲染表格
  671 + activeAlarmTable = table.render({
  672 + elem: '#activewarningTable'
  673 + , url: domainName + '/api-web/home/alarm/alarmListPage'
  674 + , id: 'activewarningTable'
  675 + , toolbar: '#activeAlarmtoolbar' //开启头部工具栏,并为其绑定左侧模板
  676 + , defaultToolbar: ['filter']
  677 + , where: {
  678 + access_token: accessToken,
  679 + kpiName: $("#activewarningkw").val(),
  680 + busId: bizId,
  681 + resId: resId,
  682 + kpiId: kpiId,
  683 + alarmStatus: $("#alarmStatusSearchBox").val(),
  684 + alarmLevel: alarmLevel,
  685 + confirmStatus: $("#alarmConfirmSearchBox").val(),
  686 + beginTime: $("#activewarningStartdate").val(),
  687 + endTime: $("#activewarningEnddate").val(),
  688 + sortKey: sortKey,
  689 + alarmKpi: $("#alarmKpiSearchBox").val(),
  690 + durationVal: $('#inline-condition-duration input[name="durationVal"]').val(),
  691 + durationUnit: $('#inline-condition-duration select[name="durationUnit"]').val(),
  692 + netFlag: netFlag,
  693 + resType:resType
  694 + }
  695 + , height: 'full-245'
  696 + , cellMinWidth: 80
  697 + , page: {
  698 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
  699 + , theme: '#1E9FFF'
  700 + }
  701 + , even: true
  702 + , drag: {toolbar: false}
  703 + , cols: [cols],
  704 + done: function (res, curr, count) {
  705 + soulTable.render(this)
  706 + var groupurl = domainName + '/api-web/home/alarm/countAlarmNumByAlarmLevel?alarmTimeDay=' + todayStr + '&access_token=' + accessToken;
  707 + $.ajax({
  708 + url: groupurl,
  709 + type: 'get',
  710 + data: {
  711 + access_token: accessToken,
  712 + kpiName: $("#activewarningkw").val(),
  713 + busId: bizId,
  714 + resId: resId,
  715 + kpiId: kpiId,
  716 + alarmStatus: $("#alarmStatusSearchBox").val(),
  717 + alarmLevel: alarmLevel,
  718 + confirmStatus: $("#alarmConfirmSearchBox").val(),
  719 + beginTime: $("#activewarningStartdate").val(),
  720 + endTime: $("#activewarningEnddate").val(),
  721 + sortKey: sortKey,
  722 + alarmKpi: $("#alarmKpiSearchBox").val(),
  723 + durationVal: $('#inline-condition-duration input[name="durationVal"]').val(),
  724 + durationUnit: $('#inline-condition-duration select[name="durationUnit"]').val(),
  725 + netFlag: netFlag,
  726 + resType:resType
  727 + },
  728 + success: function (res) {
  729 + var map = res.map;
  730 + if (map) {
  731 + layui.use('laytpl', function () {
  732 + var laytpl = layui.laytpl;
  733 + var getTpl = document.getElementById("alarm-count-id-tpl").innerHTML;
  734 + laytpl(getTpl).render(map, function (html) {
  735 + $('#alarm-count-id').html(html);
  736 + });
  737 + //告警升级量 悬浮提示
  738 + var alarmUpRate, alarmDealRate;
  739 + $("#alarm_level_up_area_id").hover(function () {
  740 + alarmUpRate = layer.tips("活动告警中升级的告警总量及占比",
  741 + '#alarm_level_up_area_id', {tips: [1]});
  742 + }, function () {
  743 + layer.close(alarmUpRate);
  744 + });
  745 + //告警处理及时率
  746 + $("#alarm_deal_rate_area_id").hover(function () {
  747 + alarmDealRate = layer.tips("活动告警中及时处理的告警量占比",
  748 + '#alarm_deal_rate_area_id', {tips: [1]});
  749 + }, function () {
  750 + layer.close(alarmDealRate);
  751 + });
  752 +
  753 + $('[data-warn-zymc]').unbind('click').on('click', function () {
  754 + //先去查找资源有没有权限
  755 +
  756 + var resId = $(this).data("resid");
  757 + var resType = $(this).data("restype");
  758 + var ip = $(this).data("ip") ? $(this).data("ip") : "";
  759 + var resName = $(this).data("resname");
  760 + var pingEnable = $(this).data("pingenable"); //获取pingEnable的值 joke add 20200619
  761 + var resTypeName = '';
  762 + var adminName = '';
  763 + var manageIp = '';
  764 + var collProtocol = '';
  765 + var sign='false';
  766 + $.ajax({
  767 + url: common.domainName + "/api-web/home/resource/findById?resId="+resId + '&access_token='+ accessToken,
  768 + async: false,
  769 + type:'get',
  770 + success: function (res) {
  771 + sign=res.str;
  772 + var data = res.object;
  773 + resType = data.resType;
  774 + adminName = data.adminName;
  775 + manageIp = data.manageIp;
  776 + collProtocol = data.collProtocol;
  777 + resTypeName = data.resTypeName;
  778 + }
  779 + })
  780 + if(sign=='false'){
  781 + layer.msg('当前用户暂无此资源权限!', {icon: 7, time: 3000});
  782 + return false;
  783 + }
  784 + let title = resName;
  785 + if (title && title !== '') {
  786 + title += '|';
  787 + }
  788 + if (resTypeName && resType !== 'HOST_X86SERVER') {
  789 + title += resTypeName + '|';
  790 + }
  791 + if (ip) {
  792 + if (resType === 'HOST_X86SERVER') {
  793 + if (collProtocol && (collProtocol.split(",").length > 1 || collProtocol === 'SSH')) {
  794 + title += '应用IP-' + ip + '|';
  795 + }
  796 + } else {
  797 + title += ip + '|';
  798 + }
  799 + }
  800 + if (resType === 'HOST_X86SERVER' && collProtocol && collProtocol.indexOf('SNMP') !== -1 ) {
  801 + if (manageIp) {
  802 + title += '管理IP-' + manageIp + '|';
  803 + }
  804 + }
  805 + if (adminName) {
  806 + title += adminName + '|';
  807 + }
  808 + if (title.length > 0) {
  809 + title = title.substr(0, title.length - 1);
  810 + }
  811 + if (pingEnable == '2') { //如果pingEnable为2,则进入ping状态详情页面
  812 + commonDetail.openNewWin('template/detail/pingIndex', title, {'resId': resId}, false);
  813 + } else { //否则进入监控详情页面
  814 + commonDetail.openDetail(resId, resType, title);
  815 + }
  816 + });
  817 +
  818 + //指标名称点击事件
  819 + $('[data-warn-zbmc]').unbind("click").on('click', function () {
  820 + var name = $(this).data("name");
  821 + var params = {
  822 + resId: $(this).data("resid"),
  823 + kpiId: $(this).data("kpi"),
  824 + flag: $(this).data("flag"),
  825 + name: name,
  826 + warning: $(this).data("warning"),
  827 + ident: $(this).data("ident"),
  828 + trend: $(this).data("trend")
  829 + };
  830 + common.openLineChart(name, params);
  831 + });
  832 +
  833 + //告警操作日志
  834 + $('[data-warn-view]').unbind('click').on('click', function () {
  835 + admin.req({
  836 + url: common.domainName + '/api-web/home/alarm/info'
  837 + , data: {
  838 + alarmId: $(this).data('warn-view'),
  839 + access_token: accessToken
  840 + }
  841 + }).done(function (res) {
  842 + laytpl($('#warnViewWinTpl').html()).render(res.obj, function (html) {
  843 + layer.open({
  844 + area: '750px',
  845 + title: ['告警操作信息', 'font-size:18px;'],
  846 + type: 1,
  847 + content: html
  848 + });
  849 + });
  850 + });
  851 + });
  852 +
  853 + //告警轨迹
  854 + $('[data-warn-path]').unbind('click').on('click', function () {
  855 + var id = $(this).attr('data-warn-path');
  856 + var view = layui.view;
  857 + var params = {
  858 + "warnId": id
  859 + };
  860 + view('commonViewModel').render("template/detail/warn_gj").then(function (res) {
  861 + layer.open({
  862 + title: ['告警轨迹', 'font-size:18px;'],
  863 + type: 1,
  864 + area: ['900px', '650px'],
  865 + content: laytpl(res.body).render(JSON.stringify(params))
  866 + });
  867 + });
  868 + });
  869 +
  870 + });
  871 + //点击严重重要一般统计告警
  872 + $("#alarm-count-id").find(".warn-count-item").unbind('click').on("click", function () {
  873 + var alarmLevel = $(this).attr("alarm-level");
  874 + if (alarmLevel != '' && alarmLevel != null && alarmLevel != undefined) {
  875 + $("#alarmLevelSearchBox").val(alarmLevel)
  876 + layui.form.render('select');
  877 + reloadTable();
  878 + } else {
  879 + $("#alarmLevelSearchBox").val("");
  880 + layui.form.render('select');
  881 + if (alarmLevel === '') {
  882 + reloadTable();
  883 + }
  884 + }
  885 + });
  886 + initToolBarClickEvent();
  887 + //表格排序监听 joke add 20200408
  888 + table.on('sort(activewarningTable)', function (obj) {
  889 + //有些时候,你可能需要根据当前排序的字段,重新向服务端发送请求,从而实现服务端排序,如:
  890 + if (obj.type != null) {
  891 + sortKey = obj.field + ' ' + obj.type;
  892 + } else {
  893 + sortKey = '';
  894 + }
  895 + reloadTable('sort');
  896 + })
  897 + }
  898 + }
  899 + })
  900 +
  901 + //触发拖动列事件,参数为保存按钮的id
  902 + common.dragCols("activewarning_cols_save");
  903 +
  904 + //保存列顺序
  905 + $("#activewarning_cols_save").unbind("click").on("click", function () {
  906 + var params = {
  907 + domId: 'activewarningTable',
  908 + moduleId: 'activewarning',
  909 + resType: '',
  910 + cols: JSON.stringify(activeAlarmTable.config.cols)
  911 + }
  912 + common.saveTableCols(params);
  913 + });
  914 + resTopo();
  915 + }
  916 + });
  917 + });
  918 +
  919 + //绑定下拉搜索事件
  920 + function bindSelectEvent() {
  921 + //选择业务搜索
  922 + form.on('select(bisTypeSearch)', function (data) {
  923 + bizId = data.value;
  924 + reloadTable();
  925 + });
  926 + //选择业务搜索
  927 + form.on('select(alarmKpiSearch)', function (data) {
  928 + reloadTable();
  929 + });
  930 + // 告警状态
  931 + form.on('select(alarmStatusSearch)', function (data) {
  932 + reloadTable();
  933 + });
  934 + //告警级别
  935 + form.on('select(alarmLevelSearch)', function (data) {
  936 + reloadTable();
  937 + });
  938 + // 告警确认
  939 + form.on('select(alarmConfirmSearch)', function (data) {
  940 + reloadTable();
  941 + });
  942 + }
  943 +
  944 + $("#todayOrAllBtn").unbind().on("click",function () {
  945 + var $that = $(this);
  946 + var str = $(this).text();
  947 + if(str.indexOf("今日") > -1){
  948 + $that.text("全部告警")
  949 + todayStr = common.getToday('day');
  950 + }else{
  951 + todayStr = ''
  952 + $that.text("今日告警")
  953 + }
  954 + reloadTable();
  955 + })
  956 +
  957 +
  958 + //刷新表格
  959 + function reloadTable(type) {
  960 + if (type != 'sort'){
  961 + sortKey = '';
  962 + }
  963 + activeAlarmTable.reload({
  964 + page: {
  965 + curr: 1
  966 + }
  967 + ,where: {
  968 + access_token: accessToken,
  969 + kpiName: $("#activewarningkw").val(),
  970 + busId: bizId,
  971 + resId: resId,
  972 + kpiId: kpiId,
  973 + alarmStatus: $("#alarmStatusSearchBox").val(),
  974 + alarmLevel: $("#alarmLevelSearchBox").val(),
  975 + confirmStatus: $("#alarmConfirmSearchBox").val(),
  976 + beginTime: $("#activewarningStartdate").val(),
  977 + endTime: $("#activewarningEnddate").val(),
  978 + sortKey: sortKey,
  979 + alarmKpi: $("#alarmKpiSearchBox").val(),
  980 + durationVal: $('#inline-condition-duration input[name="durationVal"]').val(),
  981 + durationUnit: $('#inline-condition-duration select[name="durationUnit"]').val(),
  982 + alarmTimeDay:todayStr,
  983 + resType:resType
  984 + }
  985 + });
  986 + }
  987 +
  988 + //获取告警统计信息
  989 + function getAlarmCount() {
  990 + admin.req({
  991 + url: common.domainName + "/api-web/home/alarm/countByAlarmLevel"
  992 + , type: "get"
  993 + , done: function (data) {
  994 + var alarms = data.data;
  995 + if (data.code == 0) {
  996 + $.each(alarms, function (i, v) {
  997 + if (v.alarmLevel == 5) {//及时率
  998 + $("#alarm_dealRate").html(v.alarmNum + "%");
  999 + }
  1000 + });
  1001 + } else {
  1002 + console.error("接口请求失败")
  1003 + console.log(data.msg);
  1004 + }
  1005 + }
  1006 + })
  1007 + }
  1008 +
  1009 + form.render(null, 'activewarning-form');
  1010 + //60秒倒计时
  1011 + (function () {
  1012 + var autoBtn = $('#activewarningAutoFlush');
  1013 + var timer = null;
  1014 +
  1015 + function autoFlush(target) {
  1016 + var el = target.find('span');
  1017 + var checked = target.find('input').prop('checked');
  1018 + localStorage.setItem('alarm_auto__flush', checked);
  1019 + function fn() {
  1020 + var second = el.data('second');
  1021 + var checked = target.find('input').prop('checked');
  1022 + if (!checked) {
  1023 + return;
  1024 + }
  1025 + --second;
  1026 + el.data('second', second);
  1027 + el.html(second + '秒');
  1028 +
  1029 + timer = setTimeout(fn, 1000);
  1030 + if (second <= 0) {
  1031 + clearTimeout(timer);
  1032 + reloadTable()
  1033 + $(el).data('second', 60);
  1034 + $(el).text("60秒");
  1035 + fn();
  1036 + }
  1037 + }
  1038 + if (checked) {
  1039 + timer = setTimeout(fn, 1000);
  1040 + } else {
  1041 + clearTimeout(timer);
  1042 + }
  1043 + }
  1044 + form.on("checkbox(warnActiveAutoFlush)",function (data) {
  1045 + autoFlush(autoBtn);
  1046 + })
  1047 + /*autoBtn.change(function () {
  1048 + autoFlush(autoBtn);
  1049 + });*/
  1050 + var auto = localStorage.getItem('alarm_auto__flush')
  1051 + auto = auto ? auto : false;
  1052 + autoBtn.find('input').prop('checked', auto);
  1053 +
  1054 + autoFlush(autoBtn);
  1055 +
  1056 + admin.on('hash(*)', function (router) {
  1057 + if (router.href === '/activewarning') {
  1058 + autoFlush(autoBtn);
  1059 + } else {
  1060 + clearTimeout(timer);
  1061 + }
  1062 + });
  1063 + })();
  1064 +
  1065 + function resTopo() {
  1066 +
  1067 + //绑定鼠标移入移出事件
  1068 + $('table tr').hover(function (obj) {
  1069 + $(obj.currentTarget).find('.reslist-view-topo').removeClass('hide');
  1070 + }, function (obj) {
  1071 + $(obj.currentTarget).find('.reslist-view-topo').addClass('hide');
  1072 + })
  1073 +
  1074 + // 加入/移出收藏夹
  1075 + $('a.reslist-view-topo').unbind('click').on('click', function () {
  1076 + common.viewResTopo($(this).data('resid'));
  1077 + });
  1078 +
  1079 + }
  1080 + });
  1081 +});
  1 +//告警策略
  2 +layui.define(['form', 'admin', 'laydate', 'common','sessions','reskpilist'], function (exports) {
  3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var laydate = layui.laydate;
  6 + var admin = layui.admin;
  7 + var common = layui.common;
  8 + var domainName = common.domainName;
  9 +
  10 + //对外暴露的接口
  11 + exports('alarmpolicyAdd', function (data) {
  12 + var sessions = layui.sessions;
  13 + var accessToken = sessions.getToken()['access_token'];
  14 + console.log(data)
  15 + form.render(null, 'add-alarmpolicy-form');
  16 + //初始化日期组件
  17 + laydate.render({
  18 + elem: '#seriousTimes'
  19 + ,type: 'time'
  20 + ,range: true
  21 + });
  22 + laydate.render({
  23 + elem: '#importantTimes'
  24 + ,type: 'time'
  25 + ,range: true
  26 + });
  27 + laydate.render({
  28 + elem: '#commonlyTimes'
  29 + ,type: 'time'
  30 + ,range: true
  31 + });
  32 + var resType = localStorage.getItem("currentResType");
  33 + //编辑
  34 + if(data && data.id){
  35 + admin.req({
  36 + url:domainName + '/api-web/alarmPolicy/getbyId/'+data.id
  37 + ,done:function (res){
  38 + exprToChar(res.object, 'alarmContentExpr');
  39 + exprToChar(res.object, 'cleanPolicy');
  40 + exprToChar(res.object, 'commonlyExpr');
  41 + exprToChar(res.object, 'importantExpr');
  42 + exprToChar(res.object, 'seriousExpr');
  43 + form.val("add-alarmpolicy-form",res.object);
  44 + $("#alarm-policy-kpiName").val(res.object.kpiId +" "+ res.object.kpiName);
  45 + $("#seriousTimes").val(res.object.seriousTimes);
  46 + $("#importantTimes").val(res.object.importantTimes);
  47 + $("#commonlyTimes").val(res.object.commonlyTimes);
  48 + $("#alarmPolicyType").val(res.object.policyType);
  49 + }
  50 + });
  51 + }else{
  52 + $("#seriousTimes").val('00:00:00 - 23:59:59');
  53 + $("#importantTimes").val('00:00:00 - 23:59:59');
  54 + $("#commonlyTimes").val('00:00:00 - 23:59:59');
  55 + }
  56 + $('#btn-alarmpolicy-expr-add').unbind('click').on('click', function () {
  57 + editNoticeExpr();
  58 + return false;
  59 + });
  60 + //全天
  61 + $(".allday").on("click",function (){
  62 + var id = $(this).data("flag");
  63 + $("#"+id).val('00:00:00 - 23:59:59');
  64 + });
  65 + //工作时间
  66 + $(".worktime").on("click",function (){
  67 + var id = $(this).data("flag");
  68 + $("#"+id).val('08:00:00 - 19:59:59');
  69 + });
  70 + $('.noticeExpr').unbind('click').on('click', function () {
  71 + var id = $(this).prop('id');
  72 + var alarmTimes = '';
  73 + if (['seriousExpr', 'importantExpr', 'commonlyExpr'].includes(id)) {
  74 + id = id.substring(0, id.length - 4);
  75 + alarmTimes = $('#' + id + 'Times').val();
  76 + }
  77 + editNoticeExpr($(this).val(), alarmTimes, id);
  78 + });
  79 + //指标信息
  80 + if(data.kpiId){
  81 + $("#alarm-policy-kpiId").val(data.kpiId);
  82 + $("#alarm-policy-kpiName").val(data.kpiId + " " + data.name);
  83 + }
  84 +
  85 + //告警规则类型切换事件
  86 + form.on('radio(alarm-policy-rule-type)', function (data) {
  87 + var flag = $(data.elem).data("flag");
  88 + if(data.value == '1'){
  89 + $(`.${flag}-tab-item`).find("div.cont-base").show();
  90 + }else{
  91 + $(`.${flag}-tab-item`).find("div.cont-base").hide();
  92 + $(`#${flag}Policy`).val('');
  93 + }
  94 + });
  95 + //选择指标
  96 + $("#alarmpolicy-form-select-kpi, #alarm-policy-kpiName").unbind('click').on("click",function (){
  97 + common.openWin("template/res/reskpilist","选择指标", {resType:null},["选择","取消"], function () {
  98 + var data = layui.reskpilist().getData();
  99 + if(data && data.length != 1){
  100 + layer.msg('只能选择一个指标!', {icon: 7,time:3000});
  101 + return false;
  102 + }
  103 + if(data && data.length > 0){
  104 + $("#alarm-policy-kpiId").val(data[0].kpiId);
  105 + $("#alarm-policy-kpiName").val(data[0].kpiId + " " + data[0].kpiName);
  106 + $("#alarmPolicyName").val(data[0].kpiName + "告警策略");
  107 +
  108 + var arry = [ "base", "cpu", "mem"];
  109 + return true;
  110 + }
  111 + });
  112 + });
  113 +
  114 + //增加一行策略表达式输入框
  115 + $("i.policy-input-add").off("click").on("click",function (){
  116 + var id = $(this).data("id");
  117 + clonePolicyDoms(id);
  118 + });
  119 + //删除告警策略规则行
  120 + $("i.policy-input-del").on("click",function (){
  121 + var id = $(this).data("id");
  122 + $(`#${id}`).remove();
  123 + });
  124 +
  125 +
  126 + //生成策略
  127 + $("a.createpolicybtn").on("click",function (){
  128 + var kpiId = $("#alarm-policy-kpiId").val();
  129 + if(!kpiId){
  130 + layer.msg("请先选择指标!", {
  131 + icon: 7
  132 + , time: 3000
  133 + });
  134 + return false;
  135 + }
  136 + var policyFlag = $(this).data("flag");
  137 + var conOjb = {"0":">","1":"<","2":"=","3":">=","4":"<=","5":"equals","6":"contains","7":"startsWith","8":"endsWith"};
  138 + var doms = $(`[id^=${policyFlag}-policy-box]`);
  139 + var policyStr = '';
  140 + $(doms).each(function(i,v){
  141 + var domId = $(v).attr("id");
  142 + if(domId.indexOf("condition") != -1){//条件
  143 + var open = $(v).find('.layui-form-switch').hasClass("layui-form-onswitch");
  144 + if(open){ policyStr += "||" }else{ policyStr += "&&" }
  145 + }else{ //值
  146 + var conditon = $(v).find("."+policyFlag+"_condition").val();
  147 + var cls = policyFlag +"_value";
  148 + var conval = $(v).find('[flag="'+cls+'"]').val().trim();
  149 + if(conval){
  150 + if(conditon < 5){ //数字类的
  151 + policyStr += `Double.parseDouble([${kpiId},kpiValue])${conOjb[conditon]}${conval}`;
  152 + }else{ //字符串类的
  153 + policyStr += `[${kpiId},kpiValue].${conOjb[conditon]}("${conval}")`;
  154 + }
  155 + }
  156 + }
  157 + });
  158 + if(policyStr){
  159 + $(`#${policyFlag}Policy`).val(policyStr);
  160 + }else{
  161 + layer.msg("请先输入策略值!", {
  162 + icon: 7
  163 + , time: 3000
  164 + });
  165 + return false;
  166 + }
  167 + });
  168 +
  169 + //保存策略
  170 + $("#alarmpolicy-form-save-id").on("click",function (){
  171 + var data = form.val("add-alarmpolicy-form");
  172 + //移除非数进性的属性
  173 + delete data['serious-policy-type'];
  174 + delete data['important-policy-type'];
  175 + delete data['commonly-policy-type'];
  176 + delete data['filter-policy-type'];
  177 + delete data['commonly-policy-type'];
  178 + delete data['alarmcotent-policy-type'];
  179 + data.seriousTimes = $("#seriousTimes").val();
  180 + data.importantTimes = $("#importantTimes").val();
  181 + data.commonlyTimes = $("#commonlyTimes").val();
  182 +
  183 + charToExpr(data, 'alarmContentExpr');
  184 + charToExpr(data, 'cleanPolicy');
  185 + charToExpr(data, 'commonlyExpr');
  186 + charToExpr(data, 'importantExpr');
  187 + charToExpr(data, 'seriousExpr');
  188 +
  189 + form.on('submit(add-alarmpolicy-form)',function () {
  190 + admin.req({
  191 + url : domainName + '/api-web/alarmPolicy/save?access_token='+accessToken
  192 + ,data:JSON.stringify(data)
  193 + ,type:'post'
  194 + ,contentType: "application/json; charset=utf-8"
  195 + ,done:function (res){
  196 + if(res.success){
  197 + localStorage.setItem("detailPageOfcustomPolicyId",res.str)
  198 + layer.msg(res.msg, { offset: '15px' , icon: 1 , time: 1000 },function (){
  199 + localStorage.removeItem("currentResType");
  200 + if(layui.alarmpolicyIndex && layui.alarmpolicyIndex()){
  201 + layui.alarmpolicyIndex().reloadAlarmPolicy()
  202 + }
  203 + });
  204 + }else{
  205 + layer.msg(res.msg, { offset: '15px' , icon: 7 , time: 1000 });
  206 + }
  207 + }
  208 + });
  209 +
  210 + return false;//必须要写,解决禁用submit提交,ajax方法才能正确执行,且表单不会自动刷新
  211 + })
  212 + });
  213 +
  214 + //克隆告警策略元素
  215 + function clonePolicyDoms(id){
  216 + var times = new Date().getTime()
  217 + var cond = `<div class="layui-form-item cont-base" id="${id}-${times}-condition">
  218 + <input type="checkbox" checked="" lay-skin="switch" lay-text="或|且">
  219 + </div>`;
  220 + var clone = $(`#${id}`).clone();
  221 + clone.attr("id",id+"-"+times).find("i.policy-input-add").addClass("hide")
  222 + .parent().parent().find("i.policy-input-del").attr("data-id",id + "-"+times).removeClass("hide")
  223 + .parent().parent().find("input.layui-input").val("");
  224 + $(`#${id}`).after(clone).after(cond);
  225 +
  226 + form.render();
  227 + //渲染新增事件
  228 + $("i.policy-input-add").off("click").on("click",function (){
  229 + clonePolicyDoms($(this).data("id"));
  230 + });
  231 + //删除告警策略规则行
  232 + $("i.policy-input-del").off("click").on("click",function (){
  233 + var id = $(this).data("id");
  234 + $(`#${id}`).remove();
  235 + $(`#${id}-condition`).remove();
  236 + });
  237 + }
  238 +
  239 + function editNoticeExpr(noticeExpr, alarmTimes, noticeType) {
  240 + var title = `<a class="layui-icon layui-icon-edit win_title_icon"></a>编辑通知表达式`;
  241 + common.openWin('baseconfig/alarmpolicy/noticeExprEdit', title, {
  242 + noticeExpr,
  243 + alarmTimes,
  244 + noticeType
  245 + }, ['保存', '取消'], function (index) {
  246 + $("#btn-noticeExpr-submit").click();
  247 + }, null, ['70%', '80%'], function (layero, index) {
  248 + $("#btn-noticeExpr-submit").data('layerindex', index);
  249 + });
  250 + }
  251 +
  252 + function exprToChar(obj, varName) {
  253 + obj[varName] = obj[varName].replace(/\[\[br]]/g, '\n').replace(/\[\[tab]]/g, '\t');
  254 + }
  255 +
  256 + function charToExpr(obj, varName) {
  257 + obj[varName] = obj[varName].replace(/\n/g, '[[br]]').replace(/\t/g, '[[tab]]');
  258 + }
  259 +
  260 + //如果是详情页过来的,则不能改变指标和默认状态
  261 + if (data && data.from === 'detail') {
  262 + $("#alarmpolicy-form-select-kpi, #alarm-policy-kpiName").off('click');
  263 + $('#add-alarmpolicy-form').find('[name="policyType"]').attr("disabled","disabled");
  264 + }
  265 + });
  266 +});
  1 +//告警策略
  2 +layui.define(['form', 'admin', 'laydate', 'common', 'sessions', 'reskpilist', 'table'], function (exports) {
  3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var laydate = layui.laydate;
  6 + var admin = layui.admin;
  7 + var table = layui.table;
  8 + var common = layui.common;
  9 + var domainName = common.domainName;
  10 +
  11 + //对外暴露的接口
  12 + exports('alarmpolicyEdit', function (data) {
  13 + var sessions = layui.sessions;
  14 + var accessToken = sessions.getToken()['access_token'];
  15 +
  16 + var policyId = (data && data.id) ? data.id : '';
  17 + var policy = {
  18 + resType: '',
  19 + busId: ''
  20 + };
  21 +
  22 + var typeList = ['serious'];
  23 + var timeSlotList = []
  24 +
  25 + common.resTypeXmSelect({
  26 + el: '#slt-alarmpolicy-restype',
  27 + name: 'resType'
  28 + });
  29 +
  30 + common.busTreeSelect({
  31 + el: '#slt-alarmpolicy-bustype',
  32 + tips: '=业务类型=',
  33 + name: 'busId',
  34 + tree: {
  35 + strict: false
  36 + }
  37 + })
  38 +
  39 + var sltResType = xmSelect.get('#slt-alarmpolicy-restype')[0];
  40 + var sltBusType = xmSelect.get('#slt-alarmpolicy-bustype')[0];
  41 +
  42 + $('#btn-alarmpolicy-timeSlot').unbind('click').on('click', function () {
  43 + $(this).text('');
  44 + return false;
  45 + });
  46 +
  47 + laydate.render({
  48 + elem: '#btn-alarmpolicy-timeSlot',
  49 + type: 'time',
  50 + range: true,
  51 + ready: function (date) {
  52 + $('#btn-alarmpolicy-timeSlot').text('添加时间范围');
  53 + },
  54 + remove: function () {
  55 + $('#btn-alarmpolicy-timeSlot').text('');
  56 + setTimeout(function () {
  57 + $('#btn-alarmpolicy-timeSlot').text('添加时间范围');
  58 + }, 0);
  59 + },
  60 + done: function (value, date, endDate) {
  61 + var timeStr = '';
  62 + if (value) {
  63 + timeSlotList.push({
  64 + startTime: new Date(1, 1, 1, date.hours, date.minutes, date.seconds, 0),
  65 + endTime: new Date(1, 1, 1, endDate.hours, endDate.minutes, endDate.seconds, 0)
  66 + })
  67 + timeStr = checkTimeSlot()
  68 + } else {
  69 + timeStr = ''
  70 + }
  71 + $('#txt-alarmpolicy-timeSlot').val(timeStr)
  72 + setTimeout(function () {
  73 + $('#btn-alarmpolicy-timeSlot').text('添加时间范围');
  74 + }, 0);
  75 + }
  76 + });
  77 +
  78 + $("#alarmpolicy-form-select-kpi, #alarm-policy-kpiName").unbind('click').on("click", function () {
  79 + common.openWin("template/res/reskpilist", "选择指标", {resType: null}, ["选择", "取消"], function () {
  80 + var data = layui.reskpilist().getData();
  81 + if (data && data.length != 1) {
  82 + layer.msg('只能选择一个指标!', {icon: 7, time: 3000});
  83 + return false;
  84 + }
  85 + if (data && data.length > 0) {
  86 + var kpiId = data[0].kpiId;
  87 + var kpiName = data[0].kpiName;
  88 + form.val("add-alarmpolicy-form", {
  89 + kpiId: data[0].kpiId,
  90 + kpiName: kpiId + " " + kpiName,
  91 + name: kpiName + '的告警策略'
  92 + })
  93 + return true;
  94 + }
  95 + });
  96 + });
  97 +
  98 + $(".cont-item").on("click", 'button.policy-input-add', function () {
  99 + $(this).closest('.cont-item').append($('#html-condition-template').html());
  100 + form.render()
  101 + return false;
  102 + });
  103 +
  104 + $(".cont-item").on("click", 'button.policy-input-del', function () {
  105 + $(this).closest('.cont-base').remove();
  106 + return false;
  107 + });
  108 +
  109 + $('.layui-form .createpolicybtn').unbind('click').on('click', function () {
  110 + var kpiId = $("#alarm-policy-kpiId").val();
  111 + if (!kpiId) {
  112 + layer.msg("请先选择指标!", {icon: 0});
  113 + }
  114 + var conOjb = {
  115 + "0": ">",
  116 + "1": "<",
  117 + "2": "=",
  118 + "3": ">=",
  119 + "4": "<=",
  120 + "5": "equals",
  121 + "6": "contains",
  122 + "7": "startsWith",
  123 + "8": "endsWith"
  124 + };
  125 + var policyStr = '';
  126 + var $form = $(this).closest('.layui-form');
  127 + $form.find('.cont-item .cont-base').each(function (index, elem) {
  128 + var $elem = $(elem);
  129 + if (index) {
  130 + if ($elem.find('.layui-form-switch').hasClass('.layui-form-onswitch')) {
  131 + policyStr += '||'
  132 + } else {
  133 + policyStr += '&&'
  134 + }
  135 + }
  136 + var condition = $elem.find('.serious_condition').val();
  137 + var conval = $elem.find('.serious_value').val();
  138 + (conval) || (conval = '')
  139 + if (condition < 5) {
  140 + policyStr += `Double.parseDouble([${kpiId},kpiValue])${conOjb[condition]}${conval}`;
  141 + } else {
  142 + policyStr += `[${kpiId},kpiValue].${conOjb[condition]}("${conval}")`;
  143 + }
  144 + });
  145 + $form.find('textarea[name="policyExpression"]').val(policyStr);
  146 + return false;
  147 + });
  148 +
  149 + $('textarea[name="contentTemplate"], textarea[name="noticeTemplate"], textarea[name="cleanTemplate"]').unbind('click').on('click', function () {
  150 + var domStr = `#${$(this).closest('.fdt-alarmpolicy').attr('id')} textarea[name="${$(this).attr('name')}"]`;
  151 + editExpr($(this).val(), domStr)
  152 + });
  153 +
  154 + $('.btn-quote-template').unbind('click').on('click', function () {
  155 + var $card = $(this).closest('.layui-tab-card')
  156 + $card.find('.layui-tab-item.layui-show textarea').val($card.find('.layui-tab-item:not(.layui-show) textarea').val())
  157 + return false;
  158 + });
  159 +
  160 + form.on('checkbox(cbo-alarmpolicy-type)', function (data) {
  161 + var type = $(data.elem).data('type');
  162 + if (data.elem.checked) {
  163 + typeList.push(type);
  164 + } else {
  165 + typeList.splice(typeList.findIndex(item => item === type), 1);
  166 + }
  167 + refreshPolicy()
  168 + })
  169 +
  170 + form.on('radio(rdo-policyType)', function (data) {
  171 + if (data.value === '1') {
  172 + setDefault();
  173 + } else {
  174 + setUnDefault();
  175 + }
  176 + });
  177 +
  178 + form.on('switch(wth-policy-autoClean)', function (data) {
  179 + var $switch = $(data.elem);
  180 + if (data.elem.checked) {
  181 + $switch.parent().find('input[name="autoClear"]').attr('readonly', false).attr('lay-verify', 'required')
  182 + } else {
  183 + $switch.parent().find('input[name="autoClear"]').attr('readonly', true).removeAttr('lay-verify').val('')
  184 + }
  185 + });
  186 +
  187 + form.on('switch(wth-policy-autoUp)', function (data) {
  188 + var $switch = $(data.elem);
  189 + if (data.elem.checked) {
  190 + $switch.parent().find('input[name="autoUp"]').attr('readonly', false).attr('lay-verify', 'required')
  191 + } else {
  192 + $switch.parent().find('input[name="autoUp"]').attr('readonly', true).removeAttr('lay-verify').val('')
  193 + }
  194 + });
  195 +
  196 + form.on('switch(wth-policy-trigger)', function (data) {
  197 + var $switch = $(data.elem);
  198 + if (data.elem.checked) {
  199 + $switch.parent().find('input[name="triggerPolicy"]').attr('readonly', false)
  200 + } else {
  201 + $switch.parent().find('input[name="triggerPolicy"]').attr('readonly', true).val('0')
  202 + }
  203 + });
  204 +
  205 + form.on('submit(add-alarmpolicy-form)', function (data) {
  206 + if (!typeList.length) {
  207 + layer.msg('至少选择一个告警策略!', {icon: 0});
  208 + return false;
  209 + }
  210 + var policy = form.val("add-alarmpolicy-form");
  211 + policy.describe = $('#txt-policy-describe').val()
  212 +
  213 + policy.confList = [];
  214 + $('.fdt-alarmpolicy').not('.hide').each(function (index, elem) {
  215 + policy.confList.push(form.val($(elem).find('.layui-form').attr('lay-filter')))
  216 + });
  217 + layer.load(![] + !!{} + !'');
  218 +
  219 + admin.req({
  220 + url: domainName + '/api-web/policy/save?access_token=' + accessToken,
  221 + data: JSON.stringify(policy),
  222 + type: 'post',
  223 + contentType: "application/json; charset=utf-8",
  224 + success: function (res) {
  225 + layer.closeAll('loading');
  226 + if (res && res.success) {
  227 + layer.msg('保存成功!', {icon: 1});
  228 + layer.closeAll('page')
  229 + $('#alarmpolicyQueryListBtn').click();
  230 + } else {
  231 + layer.closeAll('loading');
  232 + layer.msg(res.msg, {icon: 2});
  233 + }
  234 + }
  235 + });
  236 +
  237 + return false;
  238 + })
  239 +
  240 + initExprSelect()
  241 +
  242 + if (policyId) {
  243 + layer.load(2);
  244 + admin.req({
  245 + url: domainName + '/api-web/policy/findById',
  246 + data: {
  247 + id: policyId
  248 + },
  249 + success(response) {
  250 + layer.closeAll('loading');
  251 + if (response && response.success) {
  252 + policy = response.object;
  253 + $('#txt-policy-describe').val(policy.describe)
  254 + delete policy.describe;
  255 + form.val('add-alarmpolicy-form', policy)
  256 +
  257 + if (policy.timeSlot) {
  258 + policy.timeSlot.split(',').forEach(time => {
  259 + var timeList = time.split('-');
  260 + var startTime = timeList[0].split(':')
  261 + var endTime = timeList[1].split(':')
  262 + timeSlotList.push({
  263 + startTime: new Date(1, 1, 1, startTime[0], startTime[1], startTime[2], 0),
  264 + endTime: new Date(1, 1, 1, endTime[0], endTime[1], endTime[2], 0)
  265 + })
  266 + })
  267 + }
  268 +
  269 + sltResType.setValue(policy.resType.split(','))
  270 + sltBusType.setValue(policy.busId.split(','))
  271 +
  272 + if (policy.policyType === '1') {
  273 + setDefault();
  274 + }
  275 +
  276 + typeList = [];
  277 + $('.layui-field-title input[lay-filter="cbo-alarmpolicy-type"]').attr('checked', false);
  278 + policy.confList.forEach(conf => {
  279 + typeList.push(conf.type)
  280 + $('.layui-field-title input[lay-filter="cbo-alarmpolicy-type"][data-type="' + conf.type + '"]').attr('checked', true)[0].checked = true;
  281 + form.val($('#fdt-alarmpolicy-' + conf.type).find('.layui-form').attr('lay-filter'), conf)
  282 + if (conf.autoClear || conf.autoClear === 0) {
  283 + $('#fdt-alarmpolicy-' + conf.type + ' input[lay-filter="wth-policy-autoClean"]')[0].checked = true;
  284 + $('#fdt-alarmpolicy-' + conf.type + ' input[name="autoClear"]').attr('readonly', false);
  285 + }
  286 + if (conf.autoUp || conf.autoUp === 0) {
  287 + $('#fdt-alarmpolicy-' + conf.type + ' input[lay-filter="wth-policy-autoUp"]')[0].checked = true;
  288 + $('#fdt-alarmpolicy-' + conf.type + ' input[name="autoUp"]').attr('readonly', false);
  289 + }
  290 + if (conf.triggerPolicy) {
  291 + $('#fdt-alarmpolicy-' + conf.type + ' input[lay-filter="wth-policy-trigger"]')[0].checked = true;
  292 + $('#fdt-alarmpolicy-' + conf.type + ' input[name="triggerPolicy"]').attr('readonly', false);
  293 + }
  294 + })
  295 + refreshPolicy();
  296 + form.render();
  297 + } else {
  298 + layer.msg('获取告警策略信息失败!', {icon: 2});
  299 + }
  300 + },
  301 + error() {
  302 + layer.closeAll('loading');
  303 + layer.msg('获取告警策略信息失败!', {icon: 2});
  304 + }
  305 + })
  306 + } else {
  307 + refreshPolicy();
  308 + form.render();
  309 + }
  310 +
  311 +
  312 + function refreshPolicy() {
  313 + $('.fdt-alarmpolicy').addClass('hide')
  314 + $('.fdt-alarmpolicy [lay-verify]').each(function (index, elem) {
  315 + var $elem = $(elem);
  316 + $elem.attr('lay-verify-ignore', $elem.attr('lay-verify'))
  317 + $elem.removeAttr('lay-verify');
  318 + });
  319 + typeList.forEach(type => {
  320 + $('#fdt-alarmpolicy-' + type).removeClass('hide')
  321 + $('#fdt-alarmpolicy-' + type + ' [lay-verify-ignore]').each(function (index, elem) {
  322 + var $elem = $(elem);
  323 + $elem.attr('lay-verify', $elem.attr('lay-verify-ignore'))
  324 + $elem.removeAttr('lay-verify-ignore');
  325 + });
  326 + })
  327 + }
  328 +
  329 + function checkTimeSlot() {
  330 + let lastTimeSlot = timeSlotList[timeSlotList.length - 1];
  331 + if (lastTimeSlot.startTime > lastTimeSlot.endTime) {
  332 + let temp = lastTimeSlot.startTime;
  333 + lastTimeSlot.startTime = lastTimeSlot.endTime;
  334 + lastTimeSlot.endTime = temp;
  335 + }
  336 + timeSlotList.sort((a, b) => {
  337 + return a.startTime - b.startTime
  338 + });
  339 +
  340 + for (let i = 1; i < timeSlotList.length;) {
  341 + if (timeSlotList[i].startTime <= timeSlotList[i - 1].endTime) {
  342 + timeSlotList[i - 1].endTime = timeSlotList[i].endTime;
  343 + timeSlotList.splice(i, 1);
  344 + } else {
  345 + i++;
  346 + }
  347 + }
  348 +
  349 + let timeStr = '';
  350 + timeSlotList.forEach(timeSlot => {
  351 + timeStr += timeSlot.startTime.format('HH:mm:ss')
  352 + timeStr += '-'
  353 + timeStr += timeSlot.endTime.format('HH:mm:ss')
  354 + timeStr += ','
  355 + });
  356 + (timeStr) && (timeStr = timeStr.substr(0, timeStr.length - 1))
  357 + return timeStr;
  358 + }
  359 +
  360 + function editExpr(expr, domStr) {
  361 + var title = `<a class="layui-icon layui-icon-edit win_title_icon"></a>编辑表达式`;
  362 + common.openWin('baseconfig/alarmpolicy/exprEdit', title, {expr, domStr}, ['保存', '取消'], function (index) {
  363 + $("#btn-expr-submit").click();
  364 + }, null, ['70%', '80%'], function (layero, index) {
  365 + $("#btn-expr-submit").data('layerindex', index);
  366 + });
  367 + }
  368 +
  369 + function initExprSelect() {
  370 + var options = '<option value="">=快速引用=</option>'
  371 + admin.req({
  372 + url: `${domainName}/api-web/manage/ddic/findSucDdics/alarm_expr?access_token=${accessToken}`,
  373 + method: 'POST',
  374 + success: function (res) {
  375 + if (res && res.data) {
  376 + var ddiclist = res.data;
  377 + $.each(ddiclist, function (i, v) {
  378 + options += '<option value="' + v.ddicDesc + '">' + v.ddicName + '</option>';
  379 + });
  380 + $('.slt-expr').html(options);
  381 + form.render('select');
  382 +
  383 + form.on('select(slt-expr)', function (data) {
  384 + $(data.elem).closest('.layui-tab-card').find('.layui-show textarea').val(data.value);
  385 + });
  386 + }
  387 + },
  388 + error(error) {
  389 + console.error(error);
  390 + }
  391 + });
  392 +
  393 + }
  394 +
  395 + function setDefault() {
  396 + form.val("add-alarmpolicy-form", {
  397 + dateSlot: '0',
  398 + timeSlot: '00:00:00-23:59:59'
  399 + })
  400 + $('#btn-alarmpolicy-timeSlot').addClass('hide')
  401 + $('select[name="dateSlot"]').attr('disabled', true);
  402 + sltResType.setValue([]).update({disabled: true});
  403 + sltBusType.setValue([]).update({disabled: true});
  404 + form.render('select')
  405 + }
  406 +
  407 + function setUnDefault() {
  408 + $('#btn-alarmpolicy-timeSlot').removeClass('hide')
  409 + $('select[name="dateSlot"]').attr('disabled', false);
  410 + sltResType.update({disabled: false});
  411 + sltBusType.update({disabled: false});
  412 + form.render('select')
  413 + }
  414 +
  415 +
  416 + });
  417 +});
  1 +//告警策略
  2 +layui.define(['table', 'form', 'admin', 'layer', 'common','sessions','xmSelect','treeTable'], function (exports) {
  3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var layer = layui.layer;
  6 + var admin = layui.admin;
  7 + var table = layui.table;
  8 + var common = layui.common;
  9 + var xmSelect = layui.xmSelect;
  10 + var treeTable = layui.treeTable;
  11 + var domainName = common.domainName;
  12 +
  13 + //对外暴露的接口
  14 + exports('alarmpolicyIndex', function (data) {
  15 + var sessions = layui.sessions;
  16 + var accessToken = sessions.getToken()['access_token'];
  17 + //获得权限列表
  18 + var checkList = common.checkPermission(accessToken);
  19 + var resName = '';
  20 +
  21 + if (data && data.type == 'alarmTemplate') {
  22 + $('#alarmpolicy_policyType').val('0');
  23 + $('#alarmpolicy_policyType').attr('disabled','disabled');
  24 + } else {
  25 + $('#alarmpolicy_policyType').val('1');
  26 + }
  27 +
  28 + //回车搜索
  29 + $('#alarmpolicykw').keydown(function (e) {
  30 + if (e.keyCode === 13) {
  31 + reloadAlarmPolicyTable();
  32 + }
  33 + });
  34 + //查询按钮点击事件 joke add 20210428
  35 + $('#alarmpolicyQueryBtn').on('click',function () {
  36 + reloadAlarmPolicyTable();
  37 + });
  38 +
  39 + //指标类型
  40 + form.on('select(alarmpolicy_kpitype)', function(){
  41 + reloadAlarmPolicyTable();
  42 + });
  43 +
  44 + //指标分类
  45 + form.on('select(alarmpolicy_category)', function(){
  46 + reloadAlarmPolicyTable();
  47 + });
  48 +
  49 + //策略类型分类
  50 + form.on('select(alarmpolicy_policyType)', function(){
  51 + reloadAlarmPolicyTable();
  52 + });
  53 +
  54 + form.render(null, 'alarmpolicy-form');
  55 + //新增
  56 + $("#alarmpolicy_create").unbind("click").on("click",function () {
  57 + if ($.inArray('back:alarmpolicy:save', checkList) == -1) {
  58 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  59 + return;
  60 + }
  61 + openPolicyForm();
  62 + });
  63 +
  64 + //同步
  65 + $("#alarmpolicy_sync").on("click",function (){
  66 + if ($.inArray('back:alarmpolicy:synchronization', checkList) == -1) {
  67 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  68 + return;
  69 + }
  70 + syncAlarmPolicy();
  71 + });
  72 + //删除
  73 + $("#alarmpolicy_delete").unbind("click").on("click",function () {
  74 + deleteAlarmPolicy();
  75 + });
  76 +
  77 + //渲染表格
  78 + var alarmpolicyTable = table.render({
  79 + elem: '#alarmpolicyTable'
  80 + , url: domainName + '/api-web/alarmPolicy/page'
  81 + , where:{
  82 + access_token:accessToken,
  83 + alarmPolicyName:$("#alarmpolicykw").val(),
  84 + kpiIdent:$('#alarmpolicy_category').val(),
  85 + resType:$('#alarmpolicy_kpitype').val(),
  86 + policyType:$('#alarmpolicy_policyType').val(),
  87 + resName: resName
  88 + }
  89 + , height: 'full-200'
  90 + , page: {
  91 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
  92 + ,theme: '#1E9FFF'//自定义分页主题颜色
  93 + }
  94 + , end: function(e){
  95 + form.render();
  96 + }
  97 + , even: true
  98 + , cols: [[
  99 + {type: 'checkbox'}
  100 + , {field: 'policyType', title: '策略类型', align: 'center', sort: true, width:120,
  101 + templet: function(d){
  102 + var checked = '';
  103 + if(d.policyType == '1'){ //默认
  104 + checked = "checked";
  105 + }
  106 + return `<input type="checkbox" id="${d.alarmPolicyId}" data-kpiid="${d.kpiId}" name="close" ${checked} lay-skin="switch" lay-filter="switchPolicyType" lay-text="默认|非默认">`;
  107 + }}
  108 + , {
  109 + field: 'alarmPolicyName', title: '策略名称', align: 'center', sort: true,
  110 + templet: '<div><span data-id="{{d.alarmPolicyId}}" class="layui-table-link view-alarmPolicy-name">{{d.alarmPolicyName}}</span></div>'
  111 + }
  112 + , {title: '资源类型', align: 'center',templet:function (d){
  113 + return `${d.resTypeName}`
  114 + }}
  115 + , {field: 'kpiName', title: '指标', align: 'center', width:240}
  116 + , {title: '策略内容', align: 'center',templet:function (d){
  117 + return `告警策略表达式:严重告警:【${d.seriousPolicy},<br>重要告警:【${d.importantPolicy},<br>一般告警:【${d.commonlyPolicy}】`;
  118 + }}
  119 + , {field: 'alarmTempTotal', title: '所属告警模板量', align: 'center', sort: true, width:180,
  120 + templet:function (d){
  121 + if(d.alarmTempTotal != '0'){
  122 + return `<div><span data-id="${d.alarmPolicyId}" class="layui-table-link view-alarm-template-total">${d.alarmTempTotal}</span></div>`;
  123 + }else{
  124 + return d.alarmTempTotal;
  125 + }
  126 + }}
  127 + // , {field: 'kpiTypes', title: '指标类型', align: 'center', sort: true,minWith:180}
  128 + , {field: 'kpiIdent', title: '指标类型', align: 'center', width:120, templet: function(d){
  129 + switch (d.kpiIdent){
  130 + case "0":
  131 + return "基本指标";
  132 + case "1":
  133 + return "性能指标";
  134 + case "2":
  135 + return "状态指标";
  136 + case "4":
  137 + return "告警指标";
  138 +
  139 + }
  140 + }}
  141 + , {field: 'syncFlag',title: '同步状态',align: 'center', sort: true,width:120,
  142 + templet: function(d){
  143 + if (d.policyType == '1') { //默认
  144 + if(d.syncFlag != 1){ //未同步
  145 + return `<input type="checkbox" id="${d.alarmPolicyId}" name="close" lay-skin="switch" lay-filter="switchSyncPolicy" lay-text="已同步|未同步">`;
  146 + }else{
  147 + return ' <button type="button" class="layui-btn layui-bg-green layui-btn-radius layui-btn-xs p-0-15">已同步</button>';
  148 + }
  149 + } else {
  150 + return ''
  151 + }
  152 + }
  153 + }
  154 + , {title: '操作', align: 'center',width:100, fixed: 'right',
  155 + templet: '<div>' +
  156 + '<button data-id="{{d.alarmPolicyId}}" lay-tips="删除" type="button" class="layui-btn layui-btn-xs layui-btn-normal delete-alarmPolicy-btn"><i class="layui-icon layui-icon-delete"></i></button>'+
  157 + '</div>'
  158 + }
  159 + ]],
  160 + done:function () {
  161 + //设置默认
  162 + form.on('switch(switchPolicyType)', function(obj){
  163 + var alarmPolicyId = obj.elem.id;
  164 + var alarmPolicyKpiId = $(obj.elem).data("kpiid");
  165 + var isChecked = obj.elem.checked?"1":"0";
  166 + admin.req({
  167 + url:common.domainName + '/api-web/alarmPolicy/default'
  168 + , type : 'post'
  169 + , data:{
  170 + id:alarmPolicyId,
  171 + type:isChecked,
  172 + kpiId:alarmPolicyKpiId
  173 + }
  174 + }).done(function (res) {
  175 + layer.msg(res.msg, { offset: '15px' , icon: 1, time: 2000},function (){
  176 + reloadAlarmPolicyTable();
  177 + });
  178 + });
  179 + });
  180 +
  181 + //点击名称编辑
  182 + $(".view-alarmPolicy-name").off("click").on("click",function () {
  183 + if ($.inArray('back:alarmpolicy:update', checkList) == -1) {
  184 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  185 + return;
  186 + }
  187 + openPolicyForm($(this).data("id"));
  188 + });
  189 +
  190 + //查看告警策略所属模板列表
  191 + $(".view-alarm-template-total").on("click",function (){
  192 + var id = $(this).data("id");
  193 + common.openWin('baseconfig/alarmtemplate/list',"告警模板",{policyId:id})
  194 + });
  195 +
  196 + //设置同步
  197 + form.on('switch(switchSyncPolicy)', function(obj){
  198 + var alarmPolicyId = obj.elem.id;
  199 + syncAlarmPolicy(alarmPolicyId);
  200 + });
  201 +
  202 + //删除
  203 + $(".delete-alarmPolicy-btn").on("click",function () {
  204 + var id = $(this).data("id");
  205 + deleteAlarmPolicy(id)
  206 + });
  207 + }
  208 + });
  209 +
  210 + //同步策略
  211 + function syncAlarmPolicy(alarmPolicyId){
  212 + if (typeof (alarmPolicyId) != "string") {
  213 + var ids = [];
  214 + var data = table.checkStatus('alarmpolicyTable').data;
  215 + var flag = true;
  216 + if(data && data.length > 0){
  217 + $.each(data,function (i,obj) {
  218 + if (obj.policyType == '0') {
  219 + flag = false
  220 + }
  221 + ids.push(obj.alarmPolicyId);
  222 + });
  223 + }
  224 + if (!flag) {
  225 + layer.msg('非默认策略类型禁止同步!',{icon: 7,time:2000})
  226 + return;
  227 + }
  228 + if (ids.length == 0) {
  229 + layer.msg('请选择要同步的数据',{icon: 7,time:2000});
  230 + return;
  231 + }
  232 + alarmPolicyId = ids.toString();
  233 + }
  234 +
  235 + var syncload = layer.load(2, {
  236 + content: '同步中...',
  237 + shade: [0.5, '#f2eeee'], //0.5透明度的灰色背景
  238 + success: function (layero) {
  239 + layero.find('.layui-layer-content').css({
  240 + 'padding-top': '9px',
  241 + 'width': '60px',
  242 + 'padding-left': '40px'
  243 + });
  244 + }
  245 + });
  246 +
  247 + admin.req({
  248 + url:common.domainName + '/api-web/alarmPolicy/sync'
  249 + , data:{
  250 + ids:alarmPolicyId
  251 + }
  252 + }).done(function (res) {
  253 + layer.close(syncload)
  254 + if(res.success){
  255 + layer.msg(res.msg, { offset: '15px' , icon: 1 , time: 1000 },function (){
  256 + reloadAlarmPolicyTable();
  257 + });
  258 + }else{
  259 + layer.msg(res.msg, { offset: '15px' , icon: 7 , time: 1000 });
  260 + }
  261 + }).error(function (){
  262 + layer.close(syncload)
  263 + });
  264 + }
  265 +
  266 + //刷新表格
  267 + function reloadAlarmPolicyTable() {
  268 + alarmpolicyTable.reload({
  269 + where:{
  270 + access_token:accessToken,
  271 + alarmPolicyName:$("#alarmpolicykw").val(),
  272 + kpiIdent:$('#alarmpolicy_category').val(),
  273 + resType:$('#alarmpolicy_kpitype').val(),
  274 + policyType:$('#alarmpolicy_policyType').val(),
  275 + resName: resName
  276 + }
  277 + });
  278 + }
  279 +
  280 + //删除数据
  281 + function deleteAlarmPolicy(id) {
  282 + if ($.inArray('back:alarmpolicy:delete', checkList) == -1) {
  283 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  284 + return;
  285 + }
  286 + if (typeof (id) != "string") {
  287 + var ids = [];
  288 + var data = table.checkStatus('alarmpolicyTable').data;
  289 + if(data && data.length > 0){
  290 + $.each(data,function (i,obj) {
  291 + ids.push(obj.alarmPolicyId);
  292 + });
  293 + }
  294 + if (ids.length == 0) {
  295 + layer.msg('请选择要删除的数据',{icon: 7,time:2000});
  296 + return;
  297 + }
  298 + id = ids.toString();
  299 + }
  300 + //确认提示框
  301 + layer.confirm('数据删除后将无法恢复,您确定要删除吗?', {
  302 + btn: ['确定', '取消'] //按钮
  303 + }, function () {
  304 + admin.req({
  305 + url: common.domainName + '/api-web/alarmPolicy/delete'
  306 + ,type:"delete"
  307 + ,data:{ids:id}
  308 + }).done(function (res) {
  309 + layer.msg('删除成功', {
  310 + offset: '15px'
  311 + , icon: 1
  312 + , time: 1000
  313 + }, function () {
  314 + reloadAlarmPolicyTable();
  315 + });
  316 + }).error(function (error) {
  317 + console.log(error);
  318 + });
  319 + });
  320 + }
  321 +
  322 + $.ajax({
  323 + url: `${common.domainName}/api-web/manage/restype/list?access_token=${accessToken}`,
  324 + method: 'GET',
  325 + success: function (res) {
  326 + // 资源类型下拉框
  327 + var resTypeList = res.data.map(item => {
  328 + return {
  329 + name: item.resTypeName,
  330 + value: item.resTypeCode,
  331 + parentId: item.parentId
  332 + }
  333 + });
  334 + var resTypeTree = treeTable.pidToChildren(resTypeList, "value", "parentId");
  335 + xmSelect.render({
  336 + el: '#alarmpolicy_kpi_resName',
  337 + name: "resName",
  338 + tips: '=资源类型=',
  339 + filterable: true,
  340 + radio: true,
  341 + clickClose: true,
  342 + toolbar: {
  343 + show: true,
  344 + list: ['CLEAR']
  345 + },
  346 + tree: {
  347 + show: true,
  348 + showFolderIcon: true,
  349 + showLine: true,
  350 + strict: false,
  351 + indent: 20
  352 + },
  353 + model: {
  354 + label: {
  355 + type: 'text'
  356 + }
  357 + },
  358 + prop: {
  359 + name: 'name',
  360 + value: 'name'
  361 + },
  362 + height: 'auto',
  363 + data: resTypeTree,
  364 + on: function (data) {
  365 + if(data.isAdd){
  366 + if (data.arr.length != 0) {
  367 + resName = data.arr[0].name;
  368 + } else {
  369 + resName = '';
  370 + }
  371 + reloadAlarmPolicyTable();
  372 + }
  373 + }
  374 + });
  375 + }
  376 + });
  377 +
  378 + //新增、编辑策略表单
  379 + function openPolicyForm(id){
  380 + var title = id?"编辑策略":"新增策略";
  381 + title = `<a class="layui-icon layui-icon-edit win_title_icon"></a>${title}`;
  382 + common.openWin('baseconfig/alarmpolicy/add',title, {id:id},['保存','取消'],function () {
  383 + $("#alarmpolicy-form-save-id").trigger("click");
  384 + return true;
  385 + },null,['90%','90%']);
  386 + }
  387 +
  388 + //获取选中的数据
  389 + function getCheckAlarmPolicyData() {
  390 + return table.checkStatus('alarmpolicyTable').data;
  391 + }
  392 +
  393 + return { getData: getCheckAlarmPolicyData,reloadAlarmPolicy:reloadAlarmPolicyTable()};
  394 + });
  395 +});
  1 +//告警策略
  2 +layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions'], function (exports) {
  3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var layer = layui.layer;
  6 + var admin = layui.admin;
  7 + var table = layui.table;
  8 + var common = layui.common;
  9 + var domainName = common.domainName;
  10 +
  11 + //对外暴露的接口
  12 + exports('alarmpolicyList', function (data) {
  13 + var sessions = layui.sessions;
  14 + var accessToken = sessions.getToken()['access_token'];
  15 + //获得权限列表
  16 + var checkList = common.checkPermission(accessToken);
  17 +
  18 + if (data && data.type == 'alarmTemplate') {
  19 + $('#alarmpolicy_list_policyType').val('0');
  20 + $('#alarmpolicy_list_policyType').attr('disabled', 'disabled');
  21 + } else {
  22 + $('#alarmpolicy_list_policyType').val('1');
  23 + }
  24 +
  25 + //回车搜索
  26 + $('#alarmpolicyListkw').keydown(function (e) {
  27 + if (e.keyCode === 13) {
  28 + reloadAlarmPolicyTable();
  29 + }
  30 + });
  31 + //查询按钮点击事件 joke add 20210428
  32 + $('#alarmpolicyQueryListBtn').on('click', function () {
  33 + reloadAlarmPolicyTable();
  34 + });
  35 +
  36 + //指标类型
  37 + form.on('select(alarmpolicy_list_kpitype)', function () {
  38 + reloadAlarmPolicyTable();
  39 + });
  40 +
  41 + //指标分类
  42 + form.on('select(alarmpolicy_list_category)', function () {
  43 + reloadAlarmPolicyTable();
  44 + });
  45 +
  46 + //策略类型分类
  47 + form.on('select(alarmpolicy_list_policyType)', function () {
  48 + reloadAlarmPolicyTable();
  49 + });
  50 +
  51 + form.render(null, 'alarmpolicy-form');
  52 + //新增
  53 + $("#alarmpolicy_list_create").unbind("click").on("click", function () {
  54 + if ($.inArray('back:alarmpolicy:save', checkList) == -1) {
  55 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  56 + return;
  57 + }
  58 + openPolicyForm();
  59 + });
  60 +
  61 + //同步
  62 + $("#alarmpolicy_list_sync").on("click", function () {
  63 + if ($.inArray('back:alarmpolicy:synchronization', checkList) == -1) {
  64 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  65 + return;
  66 + }
  67 + syncAlarmPolicy();
  68 + });
  69 + //删除
  70 + $("#alarmpolicy_list_delete").unbind("click").on("click", function () {
  71 + deleteAlarmPolicy();
  72 + });
  73 +
  74 + //渲染表格
  75 + var alarmpolicyTable = table.render({
  76 + elem: '#alarmpolicyListTable',
  77 + url: domainName + '/api-web/policy/page',
  78 + where: {
  79 + access_token: accessToken,
  80 + policyName: $("#alarmpolicyListkw").val(),
  81 + kpiIdent: $('#alarmpolicy_list_category').val(),
  82 + resType: $('#alarmpolicy_list_kpitype').val(),
  83 + policyType: $('#alarmpolicy_list_policyType').val()
  84 + }
  85 + , height: 'full-200'
  86 + , page: {
  87 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
  88 + , theme: '#1E9FFF'//自定义分页主题颜色
  89 + }
  90 + , end: function (e) {
  91 + form.render();
  92 + }
  93 + , even: true
  94 + , cols: [[{
  95 + type: 'checkbox'
  96 + }, {
  97 + field: 'policyType', title: '策略类型', align: 'center', sort: true, width: 120,
  98 + templet: function (d) {
  99 + var checked = '';
  100 + if (d.policyType == '1') { //默认
  101 + checked = "checked";
  102 + }
  103 + return `<input type="checkbox" id="${d.id}" data-kpiid="${d.kpiId}" name="close" ${checked} lay-skin="switch" lay-filter="switchPolicyType" lay-text="默认|非默认">`;
  104 + }
  105 + }, {
  106 + field: 'alarmPolicyName', title: '策略名称', align: 'center', sort: true,
  107 + templet: '<div><span data-id="{{d.id}}" class="layui-table-link view-alarmPolicy-name">{{d.name}}</span></div>'
  108 + }, {
  109 + title: '资源类型', align: 'center', templet: function (d) {
  110 + return `${d.resTypeName}`
  111 + }
  112 + }, {
  113 + field: 'kpiName', title: '指标', align: 'center', width: 240
  114 + }, {
  115 + title: '策略数量', align: 'center', field: "confTotal"
  116 + }, {
  117 + field: 'kpiIdent', title: '指标类型', align: 'center', width: 120, templet: function (d) {
  118 + switch (d.kpiIdent) {
  119 + case "0":
  120 + return "基本指标";
  121 + case "1":
  122 + return "性能指标";
  123 + case "2":
  124 + return "状态指标";
  125 + case "4":
  126 + return "告警指标";
  127 + }
  128 + }
  129 + }, {
  130 + field: 'syncFlag', title: '同步状态', align: 'center', sort: true, width: 120,
  131 + templet: function (d) {
  132 + if (d.policyType == '1') { //默认
  133 + if (d.syncFlag != 1) { //未同步
  134 + return `<input type="checkbox" id="${d.id}" name="close" lay-skin="switch" lay-filter="switchSyncListPolicy" lay-text="已同步|未同步">`;
  135 + } else {
  136 + return ' <button type="button" class="layui-btn layui-bg-green layui-btn-radius layui-btn-xs p-0-15">已同步</button>';
  137 + }
  138 + } else {
  139 + return ''
  140 + }
  141 + }
  142 + }, {
  143 + title: '操作', align: 'center', width: 100, fixed: 'right',
  144 + templet: '<div>' +
  145 + '<button data-id="{{d.id}}" lay-tips="删除" type="button" class="layui-btn layui-btn-xs layui-btn-normal delete-alarmPolicy-btn"><i class="layui-icon layui-icon-delete"></i></button>' +
  146 + '</div>'
  147 + }]],
  148 + done: function () {
  149 + //设置默认
  150 + form.on('switch(switchPolicyType)', function (obj) {
  151 + var alarmPolicyId = obj.elem.id;
  152 + var alarmPolicyKpiId = $(obj.elem).data("kpiid");
  153 + var isChecked = obj.elem.checked ? "1" : "0";
  154 + layer.load(2);
  155 + admin.req({
  156 + url: common.domainName + '/api-web/policy/changeType',
  157 + type: 'post',
  158 + data: {
  159 + id: alarmPolicyId,
  160 + policyType: isChecked,
  161 + kpiId: alarmPolicyKpiId
  162 + },
  163 + success(res) {
  164 + layer.closeAll('loading');
  165 + if (res && res.success) {
  166 + layer.msg('设置成功!', {icon: 1});
  167 + reloadAlarmPolicyTable();
  168 + } else {
  169 + layer.msg('设置失败!', {icon: 2});
  170 + }
  171 + },
  172 + error() {
  173 + layer.closeAll('loading');
  174 + }
  175 + });
  176 + });
  177 +
  178 + //点击名称编辑
  179 + $(".view-alarmPolicy-name").off("click").on("click", function () {
  180 + if ($.inArray('back:alarmpolicy:update', checkList) == -1) {
  181 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  182 + return;
  183 + }
  184 + openPolicyForm($(this).data("id"));
  185 + });
  186 +
  187 + //查看告警策略所属模板列表
  188 + $(".view-alarm-template-total").on("click", function () {
  189 + var id = $(this).data("id");
  190 + common.openWin('baseconfig/alarmtemplate/list', "告警模板", {policyId: id})
  191 + });
  192 +
  193 + //设置同步
  194 + form.on('switch(switchSyncListPolicy)', function (obj) {
  195 + var alarmPolicyId = obj.elem.id;
  196 + syncAlarmPolicy(alarmPolicyId);
  197 + });
  198 +
  199 + //删除
  200 + $(".delete-alarmPolicy-btn").on("click", function () {
  201 + var id = $(this).data("id");
  202 + deleteAlarmPolicy(id)
  203 + });
  204 + }
  205 + });
  206 +
  207 + //同步策略
  208 + function syncAlarmPolicy(alarmPolicyId) {
  209 + if (typeof (alarmPolicyId) != "string") {
  210 + var ids = [];
  211 + var data = table.checkStatus('alarmpolicyListTable').data;
  212 + var flag = true;
  213 + if (data && data.length > 0) {
  214 + $.each(data, function (i, obj) {
  215 + if (obj.policyType == '0') {
  216 + flag = false
  217 + }
  218 + ids.push(obj.id);
  219 + });
  220 + }
  221 + if (!flag) {
  222 + layer.msg('非默认策略类型禁止同步!', {icon: 7, time: 2000})
  223 + return;
  224 + }
  225 + if (ids.length == 0) {
  226 + layer.msg('请选择要同步的数据', {icon: 7, time: 2000});
  227 + return;
  228 + }
  229 + alarmPolicyId = ids.toString();
  230 + }
  231 +
  232 + var syncload = layer.load(2);
  233 +
  234 + admin.req({
  235 + url: common.domainName + '/api-web/policy/sync'
  236 + , data: {
  237 + ids: alarmPolicyId
  238 + }
  239 + }).done(function (res) {
  240 + layer.close(syncload)
  241 + if (res.success) {
  242 + layer.msg('同步成功!', {icon: 1});
  243 + reloadAlarmPolicyTable();
  244 + } else {
  245 + layer.msg('同步失败!', {icon: 2});
  246 + }
  247 + }).error(function () {
  248 + layer.close(syncload)
  249 + });
  250 + }
  251 +
  252 + //刷新表格
  253 + function reloadAlarmPolicyTable() {
  254 + alarmpolicyTable.reload({
  255 + where: {
  256 + access_token: accessToken,
  257 + alarmPolicyName: $("#alarmpolicykw").val(),
  258 + kpiIdent: $('#alarmpolicy_list_category').val(),
  259 + resType: $('#alarmpolicy_list_kpitype').val(),
  260 + policyType: $('#alarmpolicy_list_policyType').val()
  261 + }
  262 + });
  263 + }
  264 +
  265 + //删除数据
  266 + function deleteAlarmPolicy(id) {
  267 + if ($.inArray('back:alarmpolicy:delete', checkList) == -1) {
  268 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  269 + return;
  270 + }
  271 + if (typeof (id) != "string") {
  272 + var ids = [];
  273 + var data = table.checkStatus('alarmpolicyListTable').data;
  274 + if (data && data.length > 0) {
  275 + $.each(data, function (i, obj) {
  276 + ids.push(obj.id);
  277 + });
  278 + }
  279 + if (ids.length == 0) {
  280 + layer.msg('请选择要删除的数据', {icon: 7, time: 2000});
  281 + return;
  282 + }
  283 + id = ids.toString();
  284 + }
  285 + //确认提示框
  286 + layer.confirm('数据删除后将无法恢复,您确定要删除吗?', {
  287 + btn: ['确定', '取消'] //按钮
  288 + }, function () {
  289 + layer.load(2);
  290 + admin.req({
  291 + url: common.domainName + '/api-web/policy/delete'
  292 + , type: "delete"
  293 + , data: {ids: id}
  294 + }).done(function (res) {
  295 + layer.closeAll('loading');
  296 + if (res && res.success) {
  297 + layer.msg('删除成功!', {icon: 1});
  298 + reloadAlarmPolicyTable()
  299 + } else {
  300 + layer.msg('删除失败!', {icon: 2});
  301 + }
  302 + }).error(function (error) {
  303 + layer.closeAll('loading');
  304 + console.log(error);
  305 + layer.msg('删除失败!', {icon: 2});
  306 + });
  307 + });
  308 + }
  309 +
  310 + //新增、编辑策略表单
  311 + function openPolicyForm(id) {
  312 + var title = id ? "编辑策略" : "新增策略";
  313 + title = `<a class="layui-icon layui-icon-edit win_title_icon"></a>${title}`;
  314 + common.openWin('baseconfig/alarmpolicy/edit', title, {id: id}, ['保存', '取消'], function () {
  315 + $("#alarmpolicy-form-save-id").trigger("click");
  316 + }, null, ['90%', '90%']);
  317 + }
  318 +
  319 + //获取选中的数据
  320 + function getCheckAlarmPolicyData() {
  321 + return table.checkStatus('alarmpolicyListTable').data;
  322 + }
  323 +
  324 + return {getData: getCheckAlarmPolicyData, reloadAlarmPolicy: reloadAlarmPolicyTable()};
  325 + });
  326 +});
  1 +//告警订阅表单
  2 +layui.define(['form', 'admin', 'laydate', 'table', 'common','sessions','cron','orgusergroup'], function (exports) {
  3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var laydate = layui.laydate;
  6 + var table = layui.table;
  7 + var admin = layui.admin;
  8 + var common = layui.common;
  9 + var domainName = common.domainName;
  10 + var cron = layui.cron;
  11 + var view = layui.view;
  12 + var orgusergroup = layui.orgusergroup;
  13 +
  14 + //对外暴露的接口
  15 + exports('alarmsubscribeAdd', function (data) {
  16 + var sessions = layui.sessions;
  17 + var accessToken = sessions.getToken()['access_token'];
  18 + var receiveUser = ""
  19 + var userMap = new Map();
  20 + var receiveUserInfos = [];//接收人数组
  21 + var receiveOrgInfos = []; //接收部门
  22 + var receiveGroupInfoS = []; //接收组
  23 + form.render(null, 'add-alarmsubscribe-form');
  24 + //初始化日期组件
  25 + laydate.render({
  26 + elem: '.alarm_subscribe_times'
  27 + ,type: 'time'
  28 + ,range: true
  29 + });
  30 +
  31 + if(data && data.id){
  32 + admin.req({
  33 + url:domainName + '/api-web/alarmsubscribe/getbyId/'+data.id
  34 + ,async:false
  35 + ,done:function (res){
  36 + //处理时间段回显
  37 + if(res.object.times){
  38 + var times=res.object.times.split(',');
  39 + if(times.length>1){
  40 + res.object.times=times[0];
  41 + $.each(times,function(i,v){
  42 + if(i>0){
  43 + addTimeQuantum(times[i]);
  44 + }
  45 + });
  46 + }
  47 + }
  48 + form.val("add-alarmsubscribe-form",res.object);
  49 + //处理回显
  50 + if(res.object.subWay){
  51 + var subWay = res.object.subWay;
  52 + $("#alarmsubscribe_add_subway").find('[data-type="'+subWay+'"]').removeClass("gray").siblings().addClass("gray");
  53 + }
  54 +
  55 + if(res.data){
  56 + $.each(res.data,function (i,v){
  57 + writeTagsInfo(v);
  58 + })
  59 + }
  60 +
  61 + if (res.obj){
  62 + if (res.obj.subOrgLists){
  63 + $.each(res.obj.subOrgLists,function (i,v){
  64 + v.value = v.targetId;
  65 + writeOrgTagsInfo(v,'selecte_org_content_id')
  66 + });
  67 + }
  68 + if (res.obj.subGroupLists){
  69 + $.each(res.obj.subGroupLists,function (i,v){
  70 + v.value = v.targetId;
  71 + writeOrgTagsInfo(v,'selecte_group_content_id')
  72 + });
  73 + }
  74 +
  75 + }
  76 +
  77 + if(res.object.subType == '1'){//告警订阅
  78 + $("div.alarmLevel").show();
  79 + $("div.reportType").hide();
  80 + var alarmLevels = res.object.alarmLevel.split(",");
  81 + for(var i in alarmLevels){
  82 + let chkbox = $(`input[type="checkbox"][name="alarmLevel"][value="${alarmLevels[i]}"]`);
  83 + if (chkbox && chkbox.length > 0) {
  84 + chkbox[0].checked = true;
  85 + form.render();
  86 + }
  87 + }
  88 + }else if(res.object.subType == '2'){//报表订阅
  89 + $("div.alarmLevel").hide();
  90 + $("div.reportType").show();
  91 + var reportTypes = res.object.reportType.split(",");
  92 + for(var i in reportTypes){
  93 + let chkbox = $(`input[type="checkbox"][name="reportType"][value="${reportTypes[i]}"]`);
  94 + if (chkbox && chkbox.length > 0) {
  95 + chkbox[0].checked = true;
  96 + form.render();
  97 + }
  98 + }
  99 + }else{
  100 + $("div.alarmLevel").hide();
  101 + $("div.reportType").hide();
  102 + }
  103 +
  104 + if(res.object.sentFrequency && res.object.sentFrequency.indexOf("?")>0){
  105 + $("#sentFrequency_input").val(res.object.sentFrequency);
  106 + $(".sentFrequency_input").show();
  107 + $(".sentFrequency_select").hide();
  108 + }else{
  109 + $("#sentFrequency_select").val(res.object.sentFrequency);
  110 + $(".sentFrequency_input").hide();
  111 + $(".sentFrequency_select").show();
  112 + }
  113 + switchSubType(res.object.subType,res.object)
  114 + form.render();
  115 + }
  116 + });
  117 + }
  118 +
  119 + //corn表达式
  120 + $("#show_corn_info").on("click",function (){
  121 + layer.open({
  122 + type: 1
  123 + , title: 'Cron表达式示例'
  124 + , closeBtn: 1
  125 + , area: ['60%', '80%']
  126 + , shade: 0.8
  127 + , id: 'lay_cron_subcribe' //设定一个id,防止重复弹出
  128 + , content: $("#cronHtml").html()
  129 + });
  130 + });
  131 +
  132 +
  133 + // 初始化Cron表达式组件
  134 + cron.render({
  135 + elem: "#sentFrequency_input", // 绑定元素
  136 + value: $("#sentFrequency_input").val(), // 默认值
  137 + done: function (cronStr) { // 点击确定,或运行时,触发,参数为 cron 表达式字符串
  138 + $("#sentFrequency_input").val(cronStr);
  139 + },
  140 + });
  141 +
  142 + //全天
  143 + $(".allday_subscribe").on("click",function (){
  144 + $(this).prev().find('input[name="times"]').val('00:00:00 - 23:59:59');
  145 + });
  146 + //工作时间
  147 + $(".worktime_subscribe").on("click",function (){
  148 + $(this).prev().prev().find('input[name="times"]').val('08:00:00 - 19:59:59');
  149 + });
  150 + //添加时间段
  151 + $("#save_subscribe").on("click",function (){
  152 + addTimeQuantum();
  153 + });
  154 + //添加时间段
  155 + function addTimeQuantum(v){
  156 + var html=' <div class="layui-form-item">\n' +
  157 + ' <div class="layui-inline-block">\n' +
  158 + ' <label class="layui-form-label">通知时间段</label>\n' +
  159 + ' <div class="layui-input-inline">\n' +
  160 + ' <input type="text" class="layui-input alarm_subscribe_times" placeholder=" 选择告警时间段 ">\n' +
  161 + ' </div>\n' +
  162 + ' <div class="layui-form-mid layui-word-aux allday_subscribe" lay-time="times" lay-tips="全天" style="margin-left: 10px;"><i class="layui-icon form-btn-icon">&#xe637;</i></div>\n' +
  163 + ' <div class="layui-form-mid layui-word-aux worktime_subscribe" lay-time="times" lay-tips="工作时间"><i class="layui-icon form-btn-icon">&#xe665;</i></div>\n' +
  164 + ' <div class="layui-form-mid layui-word-aux del_subscribe" lay-time="times" lay-tips="删除时间段"><i class="layui-icon form-btn-icon">&#xe67e;</i></div>\n' +
  165 + ' </div>\n' +
  166 + ' </div>';
  167 + //添加组件
  168 + $('#message-time-quantum-div').before(html);
  169 + //获取添加的节点
  170 + var alarm_subscribe_times=$('#message-time-quantum-div').prev().find('.alarm_subscribe_times').eq(0).get(0);
  171 +
  172 + laydate.render({
  173 + elem: alarm_subscribe_times
  174 + ,type: 'time'
  175 + ,range: true
  176 + });
  177 +
  178 + //全天
  179 + $('#message-time-quantum-div').prev().find('.allday_subscribe').on("click",function (){
  180 + $(this).prev().find('.alarm_subscribe_times').val('00:00:00 - 23:59:59');
  181 + });
  182 + //工作时间
  183 + $('#message-time-quantum-div').prev().find('.worktime_subscribe').on("click",function (){
  184 + $(this).prev().prev().find('.alarm_subscribe_times').val('08:00:00 - 19:59:59');
  185 + });
  186 + //删除
  187 + $('#message-time-quantum-div').prev().find('.del_subscribe').on("click",function (){
  188 + $(this).closest('.layui-form-item').remove();
  189 + layer.closeAll('tips');
  190 + });
  191 + if(v){
  192 + $('#message-time-quantum-div').prev().find('.alarm_subscribe_times').val(v);
  193 + }
  194 + form.render();
  195 + }
  196 + //订阅方式
  197 + $("#alarmsubscribe_add_subway li").on("click",function (){
  198 + $(this).removeClass("gray").siblings().addClass("gray");
  199 + $("#alarmsubscribe_subway").val($(this).data("type"));
  200 + });
  201 +
  202 + //订阅类型切换事件
  203 + form.on('select(alarm-subscribe-subype)', function (data) {
  204 + if(data.value == '1'){
  205 + $("div.alarmLevel").show();
  206 + $("div.reportType").hide();
  207 + }else if(data.value == '2'){
  208 + $("div.alarmLevel").hide();
  209 + $("div.reportType").show();
  210 + }else{
  211 + $("div.alarmLevel").hide();
  212 + $("div.reportType").hide();
  213 + }
  214 + switchSubType(data.value,undefined)
  215 + form.render()
  216 + });
  217 +
  218 + //通知类型
  219 + form.on('radio(sub_send-type)', function (data) {
  220 + if(data.value == '1'){
  221 + $(".sentFrequency_select").show();
  222 + $(".sentFrequency_input").hide();
  223 + }else{
  224 + $(".sentFrequency_select").hide();
  225 + $(".sentFrequency_input").show();
  226 + }
  227 + });
  228 +
  229 + $('#orgusergroup').on('click',function () {
  230 +
  231 + });
  232 +
  233 + //选择用户
  234 + $("#alarmsubscirbe-form-select-users").on("click",function (){
  235 + var selObj ={};
  236 + //回填订阅用户
  237 + var selectedUserTags = $("#selecte_content_id").find("span");
  238 + if (selectedUserTags.length > 0){
  239 + var userSelIds = new Array();
  240 + selectedUserTags.each(function () {
  241 + userSelIds.push($(this).data("username"));
  242 + });
  243 + selObj.userSelIds = userSelIds;
  244 + }
  245 + //回填订阅部门
  246 + var selecteOrgTags = $("#selecte_org_content_id").find("span");
  247 + if (selecteOrgTags.length > 0){
  248 + var orgSelIds = new Array();
  249 + selecteOrgTags.each(function () {
  250 + orgSelIds.push($(this).data("id"));
  251 + });
  252 + selObj.orgSelIds = orgSelIds;
  253 + }
  254 + //回填订阅组
  255 + var selecteGoupTags = $("#selecte_group_content_id").find("span");
  256 + if (selecteGoupTags.length > 0){
  257 + var groupSelIds = new Array();
  258 + selecteGoupTags.each(function () {
  259 + groupSelIds.push($(this).data("id"));
  260 + });
  261 + selObj.groupSelIds = groupSelIds;
  262 + }
  263 + selectPerson(selObj);
  264 + });
  265 +
  266 + //通知时间段拼接字符
  267 + function times(timeVal){
  268 + var str='';
  269 + $.each($('.alarm_subscribe_times'),function (i,v) {
  270 + if($('.alarm_subscribe_times').eq(i).val()!=''){
  271 + str+=$('.alarm_subscribe_times').eq(i).val()+',';
  272 + }else{
  273 + timeVal.val=0;
  274 + }
  275 + })
  276 + return str.slice(0,str.length-1);
  277 + }
  278 + //保存
  279 + $("#alarmsubscribe-form-save-id").on("click",function (){
  280 + var data = form.val("add-alarmsubscribe-form");
  281 + var val=1;
  282 + var timeVal={val};
  283 + //通知时间段
  284 + data.times=times(timeVal);
  285 + if(data.times=='' || timeVal.val==0){
  286 + layer.msg("请将信息填写完整", {offset: '15px', icon: 7, time: 1500});
  287 + return false;
  288 + }
  289 + var verdict=1;
  290 + var timeVals={verdict};
  291 + //时间格式判断
  292 + if(timeHorizon(data.times,timeVals)==0 || timeVals.verdict==0){
  293 + layer.msg("请选择合理的时间范围或时间段", {offset: '15px', icon: 7, time: 1500});
  294 + return false;
  295 + }
  296 + //订阅用户
  297 + var selectedTags = $("#selecte_content_id").find("span");
  298 + var contents = []
  299 + selectedTags.each(function () {
  300 + contents.push($(this).data("id"))
  301 + receiveUserInfos.push({
  302 + username:$(this).data("username"),
  303 + nickname:$(this).data("nickname"),
  304 + phone:$(this).data("phone"),
  305 + operator:$(this).data("operator"),
  306 + email:$(this).data("email")
  307 + })
  308 + });
  309 + receiveUser = contents.toString()
  310 + data.receiveUser = receiveUser;
  311 + data.subUserLists = receiveUserInfos;
  312 + //订阅部门
  313 + var selectedOrgs = $("#selecte_org_content_id").find("span");
  314 + selectedOrgs.each(function () {
  315 + receiveOrgInfos.push({
  316 + targetId: $(this).data("id")+'',
  317 + type: 1
  318 + });
  319 + });
  320 + data.subOrgLists = receiveOrgInfos;
  321 + //订阅部门
  322 + var selectedGroups = $("#selecte_group_content_id").find("span");
  323 + selectedGroups.each(function () {
  324 + receiveGroupInfoS.push({
  325 + targetId: $(this).data("id")+'',
  326 + type: 2
  327 + })
  328 + });
  329 + data.subGroupLists = receiveGroupInfoS;
  330 + delete data["sub_send_type"];
  331 + form.on('submit(add-alarmsubscribe-form)',function () {
  332 + var alrmlevels = [],reportTypes = [];
  333 + $('input[name="reportType"]:checked').each(function() {
  334 + reportTypes.push($(this).val());
  335 + });
  336 + $('input[name="alarmLevel"]:checked').each(function() {
  337 + alrmlevels.push($(this).val());
  338 + });
  339 + data.alarmLevel = alrmlevels.toString();
  340 + data.reportType = reportTypes.toString();
  341 + //通知周期
  342 + if($('input[name="sub_send_type"]:checked').val() == "1"){
  343 + data.sentFrequency = $("#sentFrequency_select").val();
  344 + }else{
  345 + data.sentFrequency = $("#sentFrequency_input").val();
  346 + }
  347 + admin.req({
  348 + url : domainName + '/api-web/alarmsubscribe/save?access_token='+accessToken
  349 + ,data:JSON.stringify(data)
  350 + ,type:'post'
  351 + ,contentType: "application/json; charset=utf-8"
  352 + ,done:function (res){
  353 + if(res.success){
  354 + localStorage.setItem("detailPageOfcustomSubId",res.str)
  355 + layer.msg(res.msg, { offset: '15px' , icon: 1 , time: 1000 },function (){
  356 + receiveUserInfos = [];
  357 + if(layui.alarmsubscribeIndex && layui.alarmsubscribeIndex()){
  358 + layer.closeAll();
  359 + layui.alarmsubscribeIndex().reloadsubscribe();
  360 + }
  361 + });
  362 + }else{
  363 + layer.msg(res.msg, { offset: '15px' , icon: 7 , time: 1000 });
  364 + }
  365 + }
  366 + });
  367 +
  368 + return false;//必须要写,解决禁用submit提交,ajax方法才能正确执行,且表单不会自动刷新
  369 + })
  370 + });
  371 +
  372 + //为用户添加资源权限
  373 + function selectPerson(selObj) {
  374 + var orgusergroup;
  375 + layer.open({
  376 + title: '订阅绑定信息',
  377 + id: 'layer-subscribe-select',
  378 + type: 1,
  379 + area: ['50%', '80%'],
  380 + btn: ['添加', '取消'],
  381 + success: function (layero, layerIndex) {
  382 + view(this.id).render('/template/user/orgusergroup').done(function () {
  383 + orgusergroup = layui.orgusergroup({selObj: selObj}); //传参
  384 + });
  385 + },
  386 + yes: function (index, layero) {
  387 + layer.close(index);
  388 + var returnValue = orgusergroup.returnValue();
  389 + //回填订阅人员
  390 + var selectUser = returnValue.selectUser;
  391 + // if (selectUser){ //如果有选择用户返回
  392 + $('#selecte_content_id').html('');
  393 + $.each(selectUser,function (i,v){ //处理元素,满足writeTagsInfo格式
  394 + v.nickname = v.name;
  395 + v.username = v.value;
  396 + writeTagsInfo(v); //将选择的用户回填到
  397 + })
  398 + // }
  399 + //回填订阅部门
  400 + var selectOrg = returnValue.selectOrg;
  401 + // if (selectOrg){
  402 + var divId = 'selecte_org_content_id';
  403 + $('#'+divId).html('');
  404 + $.each(selectOrg,function (i,v){
  405 + writeOrgTagsInfo(v,divId);
  406 + })
  407 + // }
  408 + //回填订阅组
  409 + var selectGroup = returnValue.selectGroup;
  410 + // if (selectGroup){
  411 + var divId = 'selecte_group_content_id';
  412 + $('#'+divId).html('');
  413 + $.each(selectGroup,function (i,v){
  414 + writeOrgTagsInfo(v,divId);
  415 + })
  416 +
  417 + // }
  418 + form.render();
  419 + }
  420 + });
  421 + }
  422 +
  423 + //写入标签内容
  424 + function writeTagsInfo(data) {
  425 + var tags = `
  426 + <span id="tags_span_${data.id}" data-id="${data.id}" data-username="${data.username}"
  427 + data-nickname="${data.nickname}" data-phone="${data.phone}" data-operator="${data.operator}"
  428 + data-email="${data.email}"><em>${data.nickname}</em>
  429 + <button type="button" value="${data.id}" class="tagsclose close">×</button>
  430 + </span>
  431 + `;
  432 + if(data.username){
  433 + //拼接标签
  434 + $("#selecte_content_id").append(tags);
  435 + //绑定标签的删除事件
  436 + bindTagesDelEvent();
  437 + }
  438 + }
  439 +
  440 + //写入订阅部门或组标签内容
  441 + //data:数据 type:org/group
  442 + function writeOrgTagsInfo(data,divId) {
  443 + var tags = `
  444 + <span id="tags_span_${data.value}" data-id="${data.value}" data-name="${data.name}"
  445 + ><em>${data.name}</em>
  446 + <button type="button" value="${data.value}" class="tagsclose close">×</button>
  447 + </span>
  448 + `;
  449 + if(data.value){
  450 + //拼接标签
  451 + $("#"+divId).append(tags);
  452 + //绑定标签的删除事件
  453 + bindTagesDelEvent();
  454 + }
  455 + }
  456 +
  457 + //切换订阅类型
  458 + function switchSubType(subType,data) {
  459 + var dom = $('form[name="add-alarmsubscribe-form"]');
  460 + if (subType == '3'){
  461 + dom.find('input[name="sendTotal"]').attr('readonly','readonly').val('1');
  462 + dom.find('input[name="sub_send_type"]').attr('disabled','disabled');
  463 + dom.find('input[type="radio"][name="sub_send_type"][value="1"]').attr('checked','checked');
  464 + dom.find('#sentFrequency_select').attr('disabled','disabled').val('1');
  465 + } else {
  466 + var sendTotal = '';
  467 + var sentFrequency = '1';
  468 + if (data) {
  469 + sendTotal = data.sendTotal
  470 + sentFrequency = data.sentFrequency
  471 + }
  472 + dom.find('input[name="sendTotal"]').removeAttr('readonly').val(sendTotal);
  473 + dom.find('input[name="sub_send_type"]').removeAttr('disabled');
  474 + dom.find('#sentFrequency_select').removeAttr('disabled').val(sentFrequency);
  475 + }
  476 + }
  477 +
  478 + //删除标签事件
  479 + function bindTagesDelEvent() {
  480 + //删除已选主体的页签
  481 + $("button.tagsclose").on("click",function () {
  482 + var id = $(this).attr("value");
  483 + $("#tags_span_"+id).remove();
  484 + });
  485 + }
  486 +
  487 + //时间范围判断
  488 + function timeHorizon(times,timeVals){
  489 + var judge=1;
  490 + var list=times.split(',');
  491 + if(list.length.length<=1){
  492 + return 1;
  493 + }
  494 + var listTime = [...new Set(list)];
  495 + if(list.length-listTime.length>0){
  496 + timeVals.verdict=0;
  497 + }
  498 + $.each(list,function (x,y) {
  499 + var beforeTime=dateTime(y.split(' - ')[0]);
  500 + var afterTime=dateTime(y.split(' - ')[1]);
  501 + //判断时间段是否错误
  502 + if(beforeTime>=afterTime){
  503 + timeVals.verdict=0;
  504 + }
  505 + $.each(list,function (i,v) {
  506 + if(v!=y){
  507 + //获取开始时间
  508 + var startTime=dateTime(v.split(' - ')[0]);
  509 + //获取结束时间
  510 + var overTime=dateTime(v.split(' - ')[1]);
  511 + //判断是否在时间段里
  512 + if (beforeTime >= startTime && beforeTime <= overTime) {
  513 + judge=0;
  514 + }
  515 + if(afterTime >= startTime && afterTime <= overTime){
  516 + judge=0;
  517 + }
  518 + }
  519 + });
  520 + });
  521 + return judge;
  522 + }
  523 + //时间格式转换
  524 + function dateTime(timeDate){
  525 + var split=timeDate.split(":");
  526 + var myDate=new Date(2021,6,14,split[0],split[1],split[2]);
  527 + return myDate;
  528 + }
  529 + });
  530 +});