import { NzMessageService } from 'ng-zorro-antd';
|
import { filter } from 'rxjs/operators';
|
import { HttpClient } from '@angular/common/http';
|
import { FormGroup, FormBuilder, FormControl, Validators, FormArray, AbstractControl } from '@angular/forms';
|
import { Grid, PageBean } from '@business/entity/grid';
|
import { Organization, AlarmConfig, AlarmSensorLevel, AlarmConfigValue } from '@business/entity/data';
|
import { Component, OnInit, OnDestroy } from '@angular/core';
|
import { OrganizationService } from '@business/services/http/organization.service';
|
import { _HttpClient } from '@delon/theme';
|
import { AlarmConfigService } from '@business/services/http/alarm-config.service';
|
import { AlarmStyle } from '@business/enum/types.enum';
|
import { patterns } from '@business/enum/patterns.enum';
|
import { ToolsService } from '@business/services/util/tools.service';
|
|
@Component({
|
selector: 'app-organization-config',
|
templateUrl: './organization-config.component.html',
|
styles: [],
|
providers: [AlarmConfigService]
|
})
|
export class OrganizationConfigComponent implements OnInit, OnDestroy {
|
ngOnDestroy(): void {
|
this.backToList();
|
}
|
public organization: Organization;
|
grid: Grid<object> = new Grid<object>(null);
|
validateForm: FormGroup;
|
constructor(
|
private organizationService: OrganizationService,
|
private alarmConfigService: AlarmConfigService,
|
private formBuilder: FormBuilder,
|
private http: _HttpClient,
|
public msgSrv: NzMessageService
|
|
) {
|
this.organization = this.organizationService.data;
|
}
|
|
ngOnInit() {
|
this.load();
|
}
|
load(reload: boolean = false) {
|
if (reload) {
|
this.grid.pageIndex = 1;
|
}
|
// 延时加载避免ExpressionChangedAfterItHasBeenCheckedError
|
setTimeout(() => {
|
this.grid.loading = true;
|
}, 1);
|
const pageBean = this.organizationService.config.pageBean;
|
let resultBean = this.organizationService.config.resultBean;
|
resultBean = resultBean == null ? {} : resultBean;
|
if (pageBean != null && pageBean.data != null) {
|
this.grid.initData(pageBean);
|
let alarmConfig: AlarmConfig = null;
|
if (resultBean == null || resultBean.data == null) {
|
alarmConfig = this.alarmConfigService.generateAlarmConfig(pageBean.data);
|
} else {
|
// 防止 新增 传感器
|
alarmConfig = this.alarmConfigService.generateAlarmConfig(pageBean.data, resultBean.data);
|
}
|
const alarmConfigValue = alarmConfig.value;
|
|
const alarmLevels = alarmConfigValue.alarmLevels;
|
const alarmLevelsGroupsConfig = {};
|
Object.keys(alarmLevels).forEach(key => {
|
|
let increment = alarmLevels[key].increment;
|
increment = increment == null || increment.length !== 3 ? [0, 0, 0] : increment;
|
const incrementArray = this.formBuilder.array([
|
[increment[0]],
|
[increment[1]],
|
[increment[2]]
|
]);
|
let degression = alarmLevels[key].degression;
|
degression = degression == null || degression.length !== 3 ? [0, 0, 0] : degression;
|
const degressionArray =
|
this.formBuilder.array([
|
[degression[0]],
|
[degression[1]],
|
[degression[2]]
|
]);
|
// 判断逆向是否启用
|
// let _degressionEnable = degression[0] != 0 || degression[1] != 0 || degression[2] != 0;
|
|
const alarmSensorGroup = this.formBuilder.group(
|
{
|
degressEnable: [alarmLevels[key].degressEnable],
|
enable: [alarmLevels[key].enable],
|
increment: incrementArray,
|
degression: degressionArray,
|
}, { validator: this.alarmLevelValidator }
|
);
|
alarmSensorGroup.get('enable').valueChanges.subscribe(
|
(value: any) => {
|
if (this._allCheckTriggers <= 0) {
|
this.refreshIndeterminate();
|
} else {
|
this._allCheckTriggers--;
|
}
|
}
|
);
|
alarmLevelsGroupsConfig[key] = alarmSensorGroup;
|
});
|
this.alarmModes.push(
|
{ label: '邮件', value: AlarmStyle.email, disabled: false },
|
{ label: '短信', value: AlarmStyle.sms, disabled: false },
|
{ label: '语音', value: AlarmStyle.voice, disabled: false },
|
{ label: '微信', value: AlarmStyle.weixin, disabled: false }
|
);
|
const alarmMode = alarmConfigValue.alarmMode;
|
this.validateForm = this.formBuilder.group({
|
alarmLevels: this.formBuilder.group(alarmLevelsGroupsConfig),
|
alarmMode: this.formBuilder.group(
|
{
|
enable: [alarmMode.enable],
|
interval: [alarmMode.interval],
|
level1: [alarmMode.level1],
|
level2: [alarmMode.level2],
|
level3: [alarmMode.level3]
|
}
|
),
|
'_id': alarmConfig.id,
|
'_allChecked': []
|
});
|
this.validateForm.statusChanges.subscribe(
|
item => {
|
this.setErrorMessage();
|
}
|
);
|
this.refreshIndeterminate();
|
}
|
this.refreshHasDegression(false);
|
// 延时加载避免ExpressionChangedAfterItHasBeenCheckedError
|
setTimeout(() => {
|
this.grid.loading = false;
|
}, 1);
|
}
|
alarmModes: { label: string, value: AlarmStyle, disabled: boolean }[] = [];
|
backToList() {
|
this.organizationService.handle = 'list';
|
this.organizationService.title = '组织列表';
|
}
|
indeterminate: boolean;
|
checkAll(param) {
|
const keys = this.grid.data.map(
|
item => {
|
return item['sensorKey'];
|
}
|
);
|
this._allCheckTriggers = 0;
|
keys.forEach(
|
(key: string) => {
|
this._allCheckTriggers++;
|
this.validateForm.get('alarmLevels.' + key + '.enable').setValue(param);
|
}
|
);
|
this.refreshIndeterminate();
|
}
|
private _allCheckTriggers = 0;
|
refreshIndeterminate() {
|
const keys = this.grid.data.map(
|
item => {
|
return item['sensorKey'];
|
}
|
);
|
const allChecked = keys.every(key => this.validateForm.get('alarmLevels.' + key + '.enable').value);
|
const allUnChecked = keys.every(key => !this.validateForm.get('alarmLevels.' + key + '.enable').value);
|
this.indeterminate = (!allChecked) && (!allUnChecked);
|
}
|
isSaving = false;
|
save($event, value, valid) {
|
$event.preventDefault();
|
if (valid) {
|
this.isSaving = true;
|
const data: AlarmConfig = {
|
id: value._id,
|
organizationId: this.organization.id,
|
value: value
|
};
|
// ToolsService.removePrivate(data.value);
|
this.alarmConfigService.save(data).subscribe(
|
result => {
|
if (result != null && result.code === 1) {
|
this.msgSrv.success(this.organization.name + ' 配置成功!');
|
this.backToList();
|
}
|
}
|
);
|
}
|
}
|
|
setErrorMessage() {
|
this.errorMessage = '';
|
const errObj = this.getLastError(this.validateForm);
|
if (errObj != null && Object.keys(errObj).length > 0) {
|
if (errObj['increment']) {
|
this.errorMessage = '一级 二级 三级 依次递增';
|
} else if (errObj['degression']) {
|
this.errorMessage = '反向一级 反向二级 反向三级 依次递减';
|
} else if (errObj['pattern'] != null && errObj['pattern']['requiredPattern'] === '^' + patterns.num.toString() + '$') {
|
this.errorMessage = '阀值只能为数字';
|
}
|
}
|
}
|
errorMessage = '';
|
private removeError(error: 'increment'|'degression', ...controls: AbstractControl[]) {
|
controls.forEach(
|
item => {
|
if (item.hasError(error) && Object.keys(item.errors).length === 1) {
|
item.setErrors(null);
|
}
|
}
|
);
|
}
|
private addError(error: 'increment'|'degression', ...controls: AbstractControl[]) {
|
controls.forEach(
|
item => {
|
const errs = {};
|
errs[error] = true;
|
item.setErrors(errs);
|
item.markAsDirty();
|
}
|
);
|
}
|
private alarmLevelValidator = (control: FormControl): { [s: string]: boolean } => {
|
const enable = control.get('enable').value;
|
const degressEnable = control.get('degressEnable').value;
|
const i0 = control.get('increment.0');
|
const i1 = control.get('increment.1');
|
const i2 = control.get('increment.2');
|
const d0 = control.get('degression.0');
|
const d1 = control.get('degression.1');
|
const d2 = control.get('degression.2');
|
// 如果未启用 删除错误信息,不验证
|
if (!enable) {
|
this.removeError('increment', i0, i1, i2);
|
this.removeError('degression', d0, d1, d2);
|
return null;
|
}
|
const result = {};
|
const i0_value = parseInt(i0.value, 10);
|
const i1_value = parseInt(i1.value, 10);
|
const i2_value = parseInt(i2.value, 10);
|
if ((i0_value !== 0 || i1_value !== 0 || i2_value !== 0) && (i0_value >= i1_value || i1_value >= i2_value)) {
|
this.addError('increment', i0, i1, i2);
|
result['increment'] = true;
|
} else {
|
this.removeError('increment', i0, i1, i2);
|
}
|
const d0_value = parseInt(d0.value, 10);
|
const d1_value = parseInt(d1.value, 10);
|
const d2_value = parseInt(d2.value, 10);
|
if (degressEnable && (d0_value !== 0 || d1_value !== 0 || d2_value !== 0) && (d1_value >= d0_value || d2_value >= d1_value)) {
|
this.addError('degression', d0, d1, d2);
|
result['degression'] = true;
|
} else {
|
this.removeError('degression', d0, d1, d2);
|
}
|
return Object.keys(result).length === 0 ? null : result;
|
}
|
getLastError(control: FormGroup|FormArray) {
|
if (control.errors != null) {
|
return control.errors;
|
} else {
|
const controls = Object.values(control.controls);
|
for (let i = controls.length - 1; i >= 0; i--) {
|
const c = controls[i];
|
if (c.errors != null) {
|
return c.errors;
|
} else if (c instanceof FormArray || c instanceof FormGroup) {
|
const result = this.getLastError(c);
|
if (result != null) {
|
return result;
|
}
|
}
|
}
|
}
|
}
|
public hasDegression = false;
|
public refreshHasDegression(value) {
|
if (value) {
|
this.hasDegression = true;
|
} else {
|
this.hasDegression = Object.values(this.validateForm.value['alarmLevels']).some(
|
( item: any) => {
|
return item['degressEnable'];
|
}
|
);
|
}
|
}
|
// 转整型
|
parserInt = (value) => parseInt(value , 10);
|
}
|