Commit 06b64e55 authored by yating.lin's avatar yating.lin

接口调试

parent ea2e1ad5
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
<div class="body"> <div class="body">
<h3 style="margin-bottom: 5px;">{{item.description}}</h3> <h3 style="margin-bottom: 5px;">{{item.description}}</h3>
<div> <div>
<div style="width:70%; float: left"> <div style="width:65%; float: left">
<div *ngIf="item.data.temp" class="warnContent">温度: {{item.data.temp}} ℃</div> <div *ngIf="item.data.temp" class="warnContent">温度: {{item.data.temp}} ℃</div>
<div *ngIf="item.data.humi" class="warnContent">湿度: {{item.data.humi}} %</div> <div *ngIf="item.data.humi" class="warnContent">湿度: {{item.data.humi}} %</div>
<div *ngIf="item.data.heatStressLevel" class="warnContent">热应激等级: {{item.data.heatStressLevel}}</div> <div *ngIf="item.data.heatStressLevel" class="warnContent">热应激等级: {{item.data.heatStressLevel}}</div>
...@@ -77,7 +77,7 @@ ...@@ -77,7 +77,7 @@
<div *ngIf="item.data.press" class="warnContent">电磁阀压力: {{item.data.press}} MPa</div> <div *ngIf="item.data.press" class="warnContent">电磁阀压力: {{item.data.press}} MPa</div>
<div *ngIf="item.data.NH3" class="warnContent">氨气: {{item.data.NH3}} ppm</div> <div *ngIf="item.data.NH3" class="warnContent">氨气: {{item.data.NH3}} ppm</div>
</div> </div>
<div style="width:30%; float: left"> <div style="width:35%; float: left">
<div *ngIf="displayArea === 'trouble' && item.disposeState === 0" > <div *ngIf="displayArea === 'trouble' && item.disposeState === 0" >
<ion-button color="secondary" style="display: inline-block; width: 55px; height: 30px; font-size: 12px; border-radius: 20px;" (click)="onRecvClick(item)">确认修复</ion-button> <ion-button color="secondary" style="display: inline-block; width: 55px; height: 30px; font-size: 12px; border-radius: 20px;" (click)="onRecvClick(item)">确认修复</ion-button>
</div> </div>
......
...@@ -22,10 +22,10 @@ ...@@ -22,10 +22,10 @@
<div style="max-height: calc(100% - 100px);overflow-y:auto;"> <div style="max-height: calc(100% - 100px);overflow-y:auto;">
<ion-item lines="full" class="inputItem" *ngFor="let item of fieldRegionNameList"> <ion-item lines="full" class="inputItem" *ngFor="let item of fieldRegionNameList">
<div style="width:40%; font-size:16px;"> <div style="width:45%; font-size:16px;">
{{item.name}}单产奶量 {{item.name}}单产奶量
</div> </div>
<div style="width:27%; padding-left:10px; font-size:16px;"> <div style="width:25%; padding-left:10px; font-size:16px;">
<ion-input class="inputText" [(ngModel)]="item.num"></ion-input> <ion-input class="inputText" [(ngModel)]="item.num"></ion-input>
</div> </div>
<div style="width:30%; text-align:right; padding-right:15px; font-size:14px;"> <div style="width:30%; text-align:right; padding-right:15px; font-size:14px;">
......
...@@ -80,7 +80,7 @@ ...@@ -80,7 +80,7 @@
.inputItem { .inputItem {
font-size: 16px; font-size: 16px;
--padding-start: 10px; --padding-start: 10px;
--padding-end: 10px; --padding-end: 0px;
height: 45px; height: 45px;
padding-left: 5px; padding-left: 5px;
padding-right: 5px; padding-right: 5px;
......
...@@ -13,16 +13,17 @@ describe('EnvAnalDetailPage', () => { ...@@ -13,16 +13,17 @@ describe('EnvAnalDetailPage', () => {
declarations: [ EnvAnalDetailPage ], declarations: [ EnvAnalDetailPage ],
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
}) })
.compileComponents(); .compileComponents();
})); }));
beforeEach((void) => { beforeEach(() => {
fixture = TestBed.createComponent(EnvAnalDetailPage); fixture = TestBed.createComponent(EnvAnalDetailPage);
component = fixture.componentInstance; component = fixture.componentInstance;
fixture.detectChanges(); fixture.detectChanges();
}); });
it('should create', (void) => { it('should create', () => {
expect(component).toBeTruthy(); expect(component).toBeTruthy();
}); });
}); });
...@@ -339,7 +339,7 @@ export class EnvAnalPage implements OnInit { ...@@ -339,7 +339,7 @@ export class EnvAnalPage implements OnInit {
trigger: 'axis' trigger: 'axis'
}, },
legend: { legend: {
data: ['温度(℃)', '湿度(% rH)'] data: ['温度', '湿度']
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
...@@ -350,7 +350,7 @@ export class EnvAnalPage implements OnInit { ...@@ -350,7 +350,7 @@ export class EnvAnalPage implements OnInit {
{ {
type: 'value', type: 'value',
scale: true, scale: true,
name: '温度(℃)', name: '湿度(% rH)',
// max: 1200, // max: 1200,
// min: 0, // min: 0,
boundaryGap: [0.1, 0.1] boundaryGap: [0.1, 0.1]
...@@ -358,7 +358,7 @@ export class EnvAnalPage implements OnInit { ...@@ -358,7 +358,7 @@ export class EnvAnalPage implements OnInit {
{ {
type: 'value', type: 'value',
scale: true, scale: true,
name: '湿度(% rH)', name: '温度(℃)',
// max: 1200, // max: 1200,
// min: 0, // min: 0,
boundaryGap: [0.1, 0.1] boundaryGap: [0.1, 0.1]
...@@ -388,8 +388,8 @@ export class EnvAnalPage implements OnInit { ...@@ -388,8 +388,8 @@ export class EnvAnalPage implements OnInit {
} }
], ],
grid : { grid : {
left : '5%', // 组件离容器左侧的距离 left : '9%', // 组件离容器左侧的距离
right : '5%', right : '8%',
bottom : '0%', bottom : '0%',
top : '15%', top : '15%',
containLabel : true // grid 区域是否包含坐标轴的刻度标签 containLabel : true // grid 区域是否包含坐标轴的刻度标签
......
...@@ -10,19 +10,21 @@ ...@@ -10,19 +10,21 @@
</ion-toolbar> </ion-toolbar>
<div class="top"> <div class="top">
<span [ngClass]="{'online': item.online, 'offline': !item.online}">{{item.online ? '在线' : '离线'}} </span> <span [ngClass]="{'online': item.online, 'offline': !item.online}">{{item.online ? '在线' : '离线'}} </span>
<span *ngIf="item.operationModel" class="online">{{item.operationModel ? '平控' :'现控'}} </span> <span *ngIf="item.operationModel === 1 || item.operationModel === 0" class="online">{{item.operationModel ? '平控' :'现控'}} </span>
<span *ngIf="item.operationModel === 4" class="offline">现控 </span>
<span *ngIf="item.operationModel" [ngClass]="{'online': item.isWisdomModel, 'offline': !item.isWisdomModel}" class="online">智控 </span> <span *ngIf="item.operationModel" [ngClass]="{'online': item.isWisdomModel, 'offline': !item.isWisdomModel}" class="online">智控 </span>
<span *ngIf="item.ts" class="right">{{item.ts | date: 'yyyy-MM-dd HH:mm'}}</span> <span *ngIf="item.ts" class="right" style="padding-top: 3px;">{{item.ts | date: 'yyyy-MM-dd HH:mm'}}</span>
</div> </div>
<div style="background-color: #F0F0F0;" align="center"> <div style="background-color: #F0F0F0;" align="center">
<v-kanban class="home-bar" name="温度" [inData]="item.temp" iconClass="vo v-wendu" iconColor="#285B90" iconSize="20px" fontSize="14px"></v-kanban> <v-kanban class="home-bar" name="温度" [inData]="item.temp" iconClass="vo v-wendu" iconColor="#285B90" iconSize="20px" fontSize="14px"></v-kanban>
<v-kanban class="home-bar" name="湿度" [inData]="item.humi" iconClass="vo v-shidu" iconColor="#285B90" iconSize="20px" fontSize="14px"></v-kanban> <v-kanban class="home-bar" name="湿度" [inData]="item.humi" iconClass="vo v-shidu" iconColor="#285B90" iconSize="20px" fontSize="14px"></v-kanban>
<v-kanban class="home-bar" name="热应激" [inData]="item.heatStressLevelName" iconClass="vo v-nav-ico" [iconColor]="item.heatStressColor" iconSize="20px" fontSize="14px"></v-kanban> <v-kanban class="home-bar" name="热应激" [inData]="item.heatStressLevelName" iconClass="vo v-nav-ico" [iconColor]="item.heatStressColor" iconSize="20px" fontSize="14px"></v-kanban>
<v-kanban class="home-bar" name="在舍状态" [inData]="item.inHouse" iconClass="vo v-dapeng-" iconColor="#285B90" iconSize="20px" fontSize="14px"></v-kanban> <v-kanban class="home-bar" name="在舍状态" [inData]="item.inHouse.inHouseName" iconClass="vo v-dapeng-" iconColor="#285B90" iconSize="20px" fontSize="14px"></v-kanban>
</div> </div>
<div style="background-color: #F0F0F0; height: 30px; padding-right: 10px; padding-top: 5px;"> <div class="inHouse">
<ion-label style="margin-left:15px; height: 30px; vertical-align: middle;">在离舍开关控制</ion-label> <ion-label class="inHouseLabel">在离舍开关控制</ion-label>
<v-switch (click)="setInHouse(item.inHouse)" [value]="item.inHouse" [loading]="loading"></v-switch> <ion-toggle [(ngModel)]="item.inHouse.inHouse" (click)="inHouseControl(item.inHouse)"></ion-toggle>
<!--<v-switch (click)="inHouseControl(item.inHouse)" [value]="item.inHouse.inHouse" [loading]="loading"></v-switch>-->
</div> </div>
</ion-header> </ion-header>
<ion-content style="background-color: #F3F4F4;"> <ion-content style="background-color: #F3F4F4;">
......
...@@ -60,3 +60,19 @@ ...@@ -60,3 +60,19 @@
--color-selected: #62C7CC; --color-selected: #62C7CC;
// --background: #62C7CC; // --background: #62C7CC;
} }
.inHouse {
background-color: rgb(240, 240, 240);
height: 35px;
padding-right: 10px;
padding: 5px;
text-align: right;
}
.inHouseLabel {
display: inline-block;
margin-left: 15px;
margin-right: 10px;
height: 35px;
vertical-align: middle;
}
...@@ -18,12 +18,30 @@ export class EnvDetailPage implements OnInit { ...@@ -18,12 +18,30 @@ export class EnvDetailPage implements OnInit {
private load: Load, private load: Load,
private tf: Transfer) {} private tf: Transfer) {}
item: any = {}; item: any = {
factoryNo: '',
factoryName: '',
fieldRegionNo: '',
fieldRegionName: '',
temp: 0,
humi: 0,
heatStressLevel: 0,
online: 0,
operationModel: 1,
isWisdomModel: 1,
alarm: 1,
inHouse: {
inHouse: 1,
inHouseName: '',
fieldDeviceNo: '',
fieldDeviceType: '',
},
ts: 0
};
fieldRegionNo = ''; fieldRegionNo = '';
loading = false; loading = false;
// 发送指令延时判断 // 发送指令延时判断
comm = { comm = {
remain: 20, remain: 20,
...@@ -52,11 +70,11 @@ export class EnvDetailPage implements OnInit { ...@@ -52,11 +70,11 @@ export class EnvDetailPage implements OnInit {
this.showerLink = '/env-detail/shower/' + this.fieldRegionNo; this.showerLink = '/env-detail/shower/' + this.fieldRegionNo;
this.lightLink = '/env-detail/light/' + this.fieldRegionNo; this.lightLink = '/env-detail/light/' + this.fieldRegionNo;
this.waterchannelLink = '/env-detail/waterchannel/' + this.fieldRegionNo; this.waterchannelLink = '/env-detail/waterchannel/' + this.fieldRegionNo;
if (this.item && this.item.heatStressLevel && this.item.heatStressLevel !== '') { if (this.item) {
this.item.heatStressColor = this.item.heatStressLevel === '0' ? '#71fa1d' : this.item.heatStressColor = this.item.heatStressLevel === 0 ? '#71fa1d' :
this.item.heatStressLevel === '1' ? '#71fa1d' : this.item.heatStressLevel === 1 ? '#71fa1d' :
this.item.heatStressLevel === '2' ? '#FAB139' : this.item.heatStressLevel === 2 ? '#FAB139' :
this.item.heatStressLevel === '3' ? '#ff6a1f' : '#b22222'; this.item.heatStressLevel === 3 ? '#ff6a1f' : '#b22222';
} }
} }
...@@ -64,36 +82,38 @@ export class EnvDetailPage implements OnInit { ...@@ -64,36 +82,38 @@ export class EnvDetailPage implements OnInit {
if (time) { if (time) {
this.load.toLoad('加载中...', false); this.load.toLoad('加载中...', false);
} }
// this.api.cowshedApp.getRealDataByFieldRegionNo([{'fieldRegionNo' : this.fieldRegionNo}, (data) => { this.api.cowshedApp.getRealDataByFieldRegionNo([{fieldRegionNo: this.fieldRegionNo}, (data) => {
// if (data) { if (data) {
// this.item = data; this.item = data;
// this.initLayout(); this.item.heatStressLevelName = this.getHeatStressLevelName(data.heatStressLevel);
// } this.item.inHouse.inHouseName = this.getInHouseState(data.inHouse.inHouse);
// }]); this.initLayout();
// ---------------------------------------------- }
}]);
// START----------------------------------------------
// TODO 测试用准备数据 // TODO 测试用准备数据
this.item = { // this.item = {
// 3-重度热应激 在线 平控 非智控(自控) 有报警 // // 3-重度热应激 在线 平控 非智控(自控) 有报警
fieldRegionNo: 'FRN136641006052720640', // fieldRegionNo: 'FRN136641006052720640',
fieldRegionName: '1号牛舍', // fieldRegionName: '1号牛舍',
temp: '23.5', // temp: '23.5',
humi: '82.8', // humi: '82.8',
heatStressLevel: '3', // heatStressLevel: '3',
heatStressLevelName: this.getHeatStressLevelName('3'), // heatStressLevelName: this.getHeatStressLevelName('3'),
online: 1, // 0-离线,1-在线 // online: 1, // 0-离线,1-在线
operationModel: 1, // 0-现控,1-平控 // operationModel: 1, // 0-现控,1-平控
isWisdomModel: 0, // 0-非智控(自控),1-智控 // isWisdomModel: 0, // 0-非智控(自控),1-智控
alarm: 1, // alarm: 1,
inHouse : this.getInHouseState(1), // 0-离舍,1-在舍 // inHouse : this.getInHouseState(1), // 0-离舍,1-在舍
ts: '2019-08-05 23:44', // ts: '2019-08-05 23:44',
}; // };
this.initLayout(); // this.initLayout();
// ---------------------------------------------- // END----------------------------------------------
} }
getHeatStressLevelName(id) { getHeatStressLevelName(level) {
let levelName = ''; let levelName = '';
switch (id) { switch (level) {
case '0': case '0':
levelName = '无'; levelName = '无';
break; break;
...@@ -115,9 +135,9 @@ export class EnvDetailPage implements OnInit { ...@@ -115,9 +135,9 @@ export class EnvDetailPage implements OnInit {
return levelName; return levelName;
} }
getInHouseState(id) { getInHouseState(state) {
let stateName = ''; let stateName = '';
switch (id) { switch (state) {
case 0: case 0:
stateName = '离舍 '; stateName = '离舍 ';
break; break;
...@@ -125,22 +145,39 @@ export class EnvDetailPage implements OnInit { ...@@ -125,22 +145,39 @@ export class EnvDetailPage implements OnInit {
stateName = '在舍'; stateName = '在舍';
break; break;
default: default:
stateName = ' ';
break; break;
} }
return stateName; return stateName;
} }
toHistory(item) { // 在离舍开关控制
const query = 'env-history?no=' + item.fieldRegionNo; inHouseControl(inHouse) {
this.nav.navigateForward(query); if (inHouse.fieldDeviceNo !== null && inHouse.fieldDeviceNo !== '') {
const opt = {fieldDeviceNo: '', fieldDeviceType: '', op: '', ts: 0};
opt.fieldDeviceNo = inHouse.fieldDeviceNo;
opt.fieldDeviceType = inHouse.fieldDeviceType;
opt.op = inHouse.inHouse;
opt.ts = new Date().valueOf();
this.comm.remain = 20;
this.api.control.controlCowedSwitch([opt, (data) => {
if (data && data.code === 1) {
this.getData(1);
this.api.presentMsgToast(data.message);
// this.alarmMsg.locked = false;
} else {
this.api.presentMsgToast(data.message);
}
this.comm.remain = 0;
}]);
}
} }
setInHouse() { toHistory(item) {
this.loading = true; const query = 'env-history?no=' + item.fieldRegionNo + '&name=' + item.fieldRegionName + '&heatStressLevel=' + item.heatStressLevel;
// TODO 在离舍开关控制 this.nav.navigateForward(query);
this.loading = false;
} }
// doRefresh(event) { // doRefresh(event) {
// setTimeout(() => { // setTimeout(() => {
// this.getData(0); // this.getData(0);
......
...@@ -23,18 +23,24 @@ ...@@ -23,18 +23,24 @@
margin-bottom: 5px;">控制/状态</h1> margin-bottom: 5px;">控制/状态</h1>
<ion-item *ngIf="batchSwitch" lines="full" insert="false"> <ion-item *ngIf="batchSwitch" lines="full" insert="false">
<ion-label>一键控制</ion-label> <ion-label>一键控制</ion-label>
<!--<ion-toggle slot="end" [checked]="batchSwitch.op" [disabled]="batchSwitch.s"></ion-toggle>--> <ion-toggle slot="end" [checked]="batchSwitch.op === 1" [disabled]="batchSwitch.disabled"
<v-switch (click)="allCheck(batchSwitch)" [value]="batchSwitch.op" [disabled]="batchSwitch.disabled" [loading]="batchSwitch.load"></v-switch> [(ngModel)]="batchSwitch.op" (load)="batchSwitch.load" (click)="allCheck(batchSwitch)"></ion-toggle>
<!--<v-switch (click)="allCheck(batchSwitch)" [value]="batchSwitch.op" [disabled]="batchSwitch.disabled" [loading]="batchSwitch.load"></v-switch>-->
</ion-item> </ion-item>
<div> <div>
<ion-card *ngFor="let device of devices" class="card" color="white"> <ion-card *ngFor="let device of devices" class="card" color="white">
<ion-card-header> <ion-card-header class="cardHeader">
<ion-card-subtitle align="center">{{device.fieldDeviceName}}</ion-card-subtitle> <ion-card-subtitle align="center">{{device.fieldDeviceName}}</ion-card-subtitle>
</ion-card-header> </ion-card-header>
<ion-card-content> <ion-card-content class="cardContent">
<!--<ion-toggle slot="middle" [checked]="device.state"></ion-toggle>--> <!--<ion-toggle slot="middle" [checked]="device.state"></ion-toggle>-->
<v-switch class="btn-switch" (click)="deviceCheck(device)" [value]="device.state" [disabled]="device.disabled" [loading]="device.load"></v-switch> <ion-toggle class="btn-switch" *ngIf="device.alarm === 0" [checked]="batchSwitch.op === 1" [disabled]="device.disabled"
[(ngModel)]="device.state" (click)="deviceCheck(device)"></ion-toggle>
<ion-toggle class="btn-switch" *ngIf="device.alarm === 1" [checked]="batchSwitch.op === 1" [disabled]="device.disabled" color="danger"
[(ngModel)]="device.state" (click)="deviceCheck(device)"></ion-toggle>
<!--<v-switch *ngIf="device.alarm === 0" class="btn-switch" (click)="deviceCheck(device)" [value]="device.state" [disabled]="device.disabled" [loading]="device.load"></v-switch>-->
<!--<v-switch *ngIf="device.alarm === 1" class="btn-switch" color="danger" (click)="deviceCheck(device)" [value]="device.state" [disabled]="device.disabled" [loading]="device.load"></v-switch>-->
</ion-card-content> </ion-card-content>
</ion-card> </ion-card>
</div> </div>
......
.card{ .card{
float: none; float: none;
display: inline-block; display: inline-block;
width:28%; width:22%;
margin: 10px 10px 5px 5px; margin: 5px;
} }
.btn-switch { .btn-switch {
...@@ -10,3 +10,18 @@ ...@@ -10,3 +10,18 @@
display: inline-block; display: inline-block;
margin-top: 5px; margin-top: 5px;
} }
.btn-switch-alarm {
// --background-checked: #ff95a1;
--background: #ff95a1;
}
.cardHeader {
--padding-inline-start: 0px !important;
--padding-inline-end: 0px !important;
padding: 10px;
}
.cardContent {
padding: 5px;
text-align: center;
}
...@@ -26,7 +26,7 @@ export class EnvFanPage implements OnInit { ...@@ -26,7 +26,7 @@ export class EnvFanPage implements OnInit {
controlModelOptions = [ controlModelOptions = [
{modelId: 0, modelValue: '手控模式'}, {modelId: 0, modelValue: '手控模式'},
{modelId: 1, modelValue: '自控模式'}, {modelId: 1, modelValue: '自控模式'},
{modelId: 2, modelValue: '智慧控制'}]; {modelId: 2, modelValue: '智控模式'}];
// 发送指令延时判断 // 发送指令延时判断
comm = { comm = {
...@@ -37,68 +37,74 @@ export class EnvFanPage implements OnInit { ...@@ -37,68 +37,74 @@ export class EnvFanPage implements OnInit {
constructor(private api: Api, private ac: ActivatedRoute, private load: Load, private alertControlle: AlertController) { } constructor(private api: Api, private ac: ActivatedRoute, private load: Load, private alertControlle: AlertController) { }
ngOnInit() { ngOnInit() {
this.init();
}
init() {
this.ac.queryParams.subscribe((data) => { this.ac.queryParams.subscribe((data) => {
this.fieldRegionNo = data.no; this.fieldRegionNo = data.no;
this.getData(0);
}); });
this.getData(0);
} }
getData(time) { getData(time) {
if (time) { if (time) {
this.load.toLoad('加载中...', false); this.load.toLoad('加载中...', false);
} }
this.api.cowshedApp.getFengJiData([{'fieldRegionNo' : this.fieldRegionNo}, (data) => { this.api.cowshedApp.getFengJiData([{fieldRegionNo: this.fieldRegionNo}, (data) => {
if (data) { if (data && data.fieldRegionNo) {
this.fieldRegionNo = data.fieldRegionNo; this.fieldRegionNo = data.fieldRegionNo;
this.fieldDeviceType = data.fieldDeviceType; this.fieldDeviceType = data.fieldDeviceType;
this.controlModel = data.controlModel; this.controlModel = data.controlModel;
this.devices = data.param; this.devices = data.param;
// -------------------------------------------------------------------- this.initButtons();
// TODO 测试用准备数据
// this.fieldRegionNo = 'FRN136641006052720640';
this.fieldDeviceType = '风机';
this.controlModel = 0;
this.devices = [{fieldDeviceNo: '136641005998194688', fieldDeviceName: 'A号风机组', state: 1},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: 'B号风机组', state: 0},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: 'C号风机组', state: 1},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: 'D号风机组', state: 0},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: 'E号风机组', state: 1},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: 'F号风机组', state: 1}];
// --------------------------------------------------------------------
// [手控(0)]的状态下:活性(false) 以外:非活性(true)
const allDisabled = this.controlModel === 0 ? false : true;
this.batchSwitch.disabled = allDisabled;
this.devices.forEach((device, i) => {
device.disabled = allDisabled;
});
// 设置[一键控制]按钮(默认: 开启)
// 当任意子按钮[关闭]的状态下: 关闭 以外:开启
this.batchSwitch.op = 1;
this.devices.map((device) => {
if (device.state === 0) {
this.batchSwitch.op = 0;
}
});
} }
// START--------------------------------------------------------------------
// TODO 测试用准备数据
this.fieldDeviceType = '风机';
this.controlModel = 0;
this.devices = [{fieldDeviceNo: '136641005998194688', fieldDeviceName: '1号组', state: 1, alarm: 1},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: '2号组', state: 0, alarm: 1},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: '3号组', state: 1, alarm: 0},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: '4号组', state: 0, alarm: 1},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: '5号组', state: 1, alarm: 0},
{fieldDeviceNo: '136641005998194688', fieldDeviceName: '6号组', state: 1, alarm: 0}];
this.initButtons();
// END--------------------------------------------------------------------
}]); }]);
}
initButtons() {
// [手控(0)]的状态下:活性(false) 以外:非活性(true)
const allDisabled = this.controlModel === 0 ? false : true;
this.batchSwitch.disabled = allDisabled;
this.devices.forEach((device, i) => {
device.disabled = allDisabled;
});
// [一键控制]按钮(默认: 开启)
// 当任意子按钮[关闭]的状态下: 关闭 以外:开启
this.batchSwitch.op = 1;
this.devices.map((device) => {
if (device.state === 0) {
this.batchSwitch.op = 0;
}
});
} }
// 一键控制 // 一键控制
allCheck(btn) { allCheck(btn) {
btn.load = true; btn.load = true;
const req = { const req = {
fieldRegionNo: this.fieldRegionNo, fieldRegionNo: this.fieldRegionNo,
fieldDeviceType: this.fieldDeviceType,
op: btn.op ? 0 : 1, op: btn.op ? 0 : 1,
type: this.fieldDeviceType,
ts: parseInt((new Date().getTime() / 1000).toString(), 10) ts: parseInt((new Date().getTime() / 1000).toString(), 10)
}; };
this.comm.remain = 120; this.comm.remain = 120;
// 一键开启设备 // 一键开启设备
this.api.control.controlBatchSwitch([req, (data) => { this.api.control.controlCowedBatchSwitch([req, (data) => {
if (data.code === 1) { if (data.code === 1) {
this.getData(1); this.getData(1);
this.api.presentMsgToast(data.message); this.api.presentMsgToast(data.message);
...@@ -117,23 +123,23 @@ export class EnvFanPage implements OnInit { ...@@ -117,23 +123,23 @@ export class EnvFanPage implements OnInit {
// 单个设备控制 // 单个设备控制
deviceCheck(btn) { deviceCheck(btn) {
btn.loading = true; // btn.load = true;
const req = { const req = {
fieldDeviceNo: btn.fieldDeviceNo, fieldDeviceNo: btn.fieldDeviceNo,
fieldDeviceType: this.fieldDeviceType,
op: btn.state ? 0 : 1, op: btn.state ? 0 : 1,
ts: parseInt((new Date().getTime() / 1000).toString(), 10) ts: new Date().valueOf()
}; };
this.comm.remain = 20; this.comm.remain = 20;
this.api.control.controlSwitch([req, (data) => { this.api.control.controlCowedSwitch([req, (data) => {
if (data && data.code === 1) { if (data && data.code === 1) {
this.getData(1); this.getData(1);
this.comm.remain = 0;
this.api.presentMsgToast(data.message); this.api.presentMsgToast(data.message);
} else { } else {
this.comm.remain = 0;
this.api.presentMsgToast(data.message); this.api.presentMsgToast(data.message);
} }
btn.loading = false; this.comm.remain = 0;
// btn.load = false;
}]); }]);
} }
} }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<ion-buttons slot="start"> <ion-buttons slot="start">
<ion-back-button text="" ></ion-back-button> <ion-back-button text="" ></ion-back-button>
</ion-buttons> </ion-buttons>
<ion-title mode="ios" class="title">{{item.fieldRegionName}}历史数据</ion-title> <ion-title mode="ios" class="title">{{fieldRegionName}}历史数据</ion-title>
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>
...@@ -11,23 +11,23 @@ ...@@ -11,23 +11,23 @@
<div style="padding-top: 10px"> <div style="padding-top: 10px">
<h1 class="subTittle">牛舍热应激状态</h1> <h1 class="subTittle">牛舍热应激状态</h1>
<div style="width:100%; padding: 10px"> <div style="width:100%; padding: 10px">
<img [src]="'../../assets/img/level-best.png'" style="width:50px !important"> <img [src]="'../../assets/img/level-' + heatStressLevel + '.png'" style="width:50px !important">
</div> </div>
<h1 class="subTittle">近8个小时环境参数曲线</h1> <h1 class="subTittle">近8个小时环境参数曲线</h1>
<div echarts [options]="chartOption" class="demo-chart"></div> <div echarts [options]="chartOption" class="demo-chart"></div>
<h1 class="subTittle">近8个小时环境参数表</h1> <h1 class="subTittle">近8个小时环境参数表</h1>
<div style="width: 98%"> <div style="width: 98%">
<ngx-datatable class="material" [rows]="rows" [columnMode]="'force'" [scrollbarH]="true" [scrollbarV]="true" style="white-space: nowrap; text-align: center; font-size:14px"> <ngx-datatable class="material" [rows]="tableRows" [columnMode]="'force'" [scrollbarH]="true" [scrollbarV]="true" style="text-align: center; font-size:14px">
<ngx-datatable-column name="时间" prop="time" width="80"> <ngx-datatable-column name="时间" prop="ts" [width]="80">
</ngx-datatable-column> </ngx-datatable-column>
<ngx-datatable-column name="热应激" prop="thi" width="60"> <ngx-datatable-column name="热应激" prop="thi" [width]="80">
</ngx-datatable-column> </ngx-datatable-column>
<ngx-datatable-column name="温度" prop="temp" width="60"> <ngx-datatable-column name="温度" prop="temp" [width]="80">
</ngx-datatable-column> </ngx-datatable-column>
<ngx-datatable-column name="湿度" prop="humi" width="60"> <ngx-datatable-column name="湿度" prop="humi" [width]="80">
</ngx-datatable-column> </ngx-datatable-column>
<ngx-datatable-column name="氨气浓度" prop="NH3" width="80"> <ngx-datatable-column name="氨气浓度" prop="NH3" [width]="90">
</ngx-datatable-column> </ngx-datatable-column>
</ngx-datatable> </ngx-datatable>
</div> </div>
......
...@@ -3,6 +3,7 @@ import {ActivatedRoute} from '@angular/router'; ...@@ -3,6 +3,7 @@ import {ActivatedRoute} from '@angular/router';
import {Api} from '../../service/api'; import {Api} from '../../service/api';
import {Load} from '../../service/load'; import {Load} from '../../service/load';
import {NgxDatatableModule} from '@swimlane/ngx-datatable'; import {NgxDatatableModule} from '@swimlane/ngx-datatable';
import {DateFormatter} from '@angular/common/src/pipes/deprecated/intl';
@Component({ @Component({
selector: 'v-env-history', selector: 'v-env-history',
...@@ -14,9 +15,13 @@ export class EnvHistoryPage implements OnInit { ...@@ -14,9 +15,13 @@ export class EnvHistoryPage implements OnInit {
constructor(private api: Api, private ac: ActivatedRoute, private load: Load) { constructor(private api: Api, private ac: ActivatedRoute, private load: Load) {
} }
fieldRegionNo = '';
fieldRegionName = '';
heatStressLevel = 0;
item: any = {}; item: any = {};
// -------------------------------------------------------------------------------- // START--------------------------------------------------------------------------------
// TODO 以下为假数据 待删除 // TODO 以下为假数据 待删除
chartOption = { chartOption = {
backgroundColor: '#F0F8FF', backgroundColor: '#F0F8FF',
...@@ -39,43 +44,109 @@ export class EnvHistoryPage implements OnInit { ...@@ -39,43 +44,109 @@ export class EnvHistoryPage implements OnInit {
}; };
// 时间 热应激 温度 湿度 光照 风机 喷淋 照明 // 时间 热应激 温度 湿度 光照 风机 喷淋 照明
rows = [ tableRows = [
{time: '17:00', thi: '轻', temp: '23.8', humi: '56', NH3: '70'}, {ts: '17:00', thi: '轻', temp: '23.8', humi: '56', NH3: '70'},
{time: '17:30', thi: '中', temp: '27.2', humi: '43', NH3: '80'}, {ts: '17:30', thi: '中', temp: '27.2', humi: '43', NH3: '80'},
{time: '18:00', thi: '轻', temp: '23.2', humi: '61', NH3: '99'}, {ts: '18:00', thi: '轻', temp: '23.2', humi: '61', NH3: '99'},
{time: '18:30', thi: '轻', temp: '23.1', humi: '47', NH3: '100'}, {ts: '18:30', thi: '轻', temp: '23.1', humi: '47', NH3: '100'},
{time: '19:00', thi: '轻', temp: '20.2', humi: '43', NH3: '60'}, {ts: '19:00', thi: '轻', temp: '20.2', humi: '43', NH3: '60'},
{time: '19:30', thi: '轻', temp: '21.6', humi: '34', NH3: '50'}, {ts: '19:30', thi: '轻', temp: '21.6', humi: '34', NH3: '50'},
{time: '20:00', thi: '轻', temp: '22.5', humi: '43', NH3: '40'}, {ts: '20:00', thi: '轻', temp: '22.5', humi: '43', NH3: '40'},
]; ];
// -------------------------------------------------------------------------------- // END--------------------------------------------------------------------------------
ngOnInit() { ngOnInit() {
this.init();
}
init() {
this.ac.queryParams.subscribe((data) => { this.ac.queryParams.subscribe((data) => {
this.item.fieldRegionNo = data.no; this.fieldRegionNo = data.no;
this.fieldRegionName = data.name;
this.heatStressLevel = data.heatStressLevel;
this.getData(0);
}); });
this.getData(0);
// --------------------------------------------------------------------------------
// TODO 待删除
this.chartOption.xAxis.data = ['1', '2', '3', '4', '5', '6', '7', '8'];
// for (let i = 0; i < 8; i++) {
// this.chartOption.xAxis.data = ['1', '2', '3', '4', '5', '6', '7', '8'];
// }
// --------------------------------------------------------------------------------
} }
getData(time) { getData(time) {
if (time) { if (time) {
this.load.toLoad('加载中...', false); this.load.toLoad('加载中...', false);
} }
this.api.cowshedApp.getRealDataByFieldRegionNo([{'fieldRegionNo': this.item.fieldRegionNo}, (data) => { const req: any = {};
// TODO 测试用假数据 req.fieldRegionNo = this.fieldRegionNo;
data.fieldRegionName = '1号牛舍'; req.startTime = new Date().valueOf() - 8 * 3600 * 1000;
req.endTime = new Date().valueOf();
this.api.cowshedApp.getHistoryByFieldRegionNo([req, (data) => {
if (data) { if (data) {
this.paintChart(data);
}
}]);
req.counts = 1;
this.api.cowshedApp.getHistoryTableByFieldRegionNo([req, (data) => {
if (data && data.constructor === Array) {
this.item = data; this.item = data;
this.paintTable(data);
} }
}]); }]);
} }
paintChart(param) {
const temp = [];
const humi = [];
const thi = [];
const times = [];
if (param.temp && param.temp.constructor === Array) {
param.temp.map(item => {
times.push(new Date(item.time).getHours());
temp.push(item.value);
});
}
if (param.humi && param.humi.constructor === Array) {
param.humi.map(item => {
humi.push(item.value);
});
}
if (param.thi && param.thi.constructor === Array) {
param.thi.map(item => {
thi.push(item.value);
});
}
this.chartOption = {
backgroundColor: '#fff',
visualMap: [
{show: false, type: 'continuous', seriesIndex: 0, min: 0, max: 400},
{show: false, type: 'continuous', seriesIndex: 1, dimension: 0, min: 0, max: 400}],
xAxis: {
name: '', type: 'category',
data: times,
},
yAxis: [
{name: '温度(℃)', type: 'value', splitLine: {show: false}},
{name: '湿度(%)', type: 'value', max: 100, splitLine: {show: false}}
],
series: [
{data: temp, type: 'line'},
{data: humi, yAxisIndex: 1, type: 'line'},
{data: thi, yAxisIndex: 1, type: 'line'}
]
};
}
paintTable(param) {
this.tableRows = [];
param.map(item => {
this.tableRows.push({
ts: item.ts,
thi: item.heatStressLevel,
temp: item.temp,
humi: item.humi,
NH3: item.NH3
});
});
}
} }
...@@ -3,19 +3,8 @@ ...@@ -3,19 +3,8 @@
<ion-buttons slot="start"> <ion-buttons slot="start">
<ion-back-button color="secondary" defaultHref="/index" text=""></ion-back-button> <ion-back-button color="secondary" defaultHref="/index" text=""></ion-back-button>
</ion-buttons> </ion-buttons>
<!--<ion-searchbar (ionInput)="getItems($event)" (ionClear)="resetItems()" debounce="1000" style="height: 40px;"></ion-searchbar>-->
<ion-searchbar (ionInput)="getItems($event)" debounce="1000" style="height: 40px;"></ion-searchbar> <ion-searchbar (ionInput)="getItems($event)" debounce="1000" style="height: 40px;"></ion-searchbar>
<!--<ion-searchbar debounce="1000" style="height: 40px;"></ion-searchbar>-->
<!--<ion-searchbar (ionInput)="getItems($event)" [(ngModel)]="searchItem"></ion-searchbar>-->
<!--<div class="topSearch">
<SearchBar [placeholder]="'点击此处进行搜索'" [(ngModel)]="searchText"
(onCancel)="searchText ='';toggleFocus(false);"
[setFocus]="false" (onFocus)="toggleFocus(true)" (onBlur)="toggleFocus(false)"
(onClear)="searchText ='';toggleFocus(false);"></SearchBar>
</div>-->
</ion-toolbar> </ion-toolbar>
<!--<v-search *ngIf="ifFocus" [(value)]="searchText"></v-search>-->
<ion-slides style="width: 100%; height: 125px;" mode="ios" <ion-slides style="width: 100%; height: 125px;" mode="ios"
[options]="lunbo" #slide (ionSlideTouchEnd)="slideDidChange()"> [options]="lunbo" #slide (ionSlideTouchEnd)="slideDidChange()">
<ion-slide class="slideCon" *ngFor="let one of imgs"> <ion-slide class="slideCon" *ngFor="let one of imgs">
...@@ -51,18 +40,29 @@ ...@@ -51,18 +40,29 @@
<ion-item *ngFor="let item of items" (click)="toControl(item)" class="ion-item" style="width: 100%; --padding-start: 0px"> <ion-item *ngFor="let item of items" (click)="toControl(item)" class="ion-item" style="width: 100%; --padding-start: 0px">
<div class="item"> <div class="item">
<div class="top"> <div class="top">
<i *ngIf="item.alarm" class="vo v-tixing"></i> {{item.fieldRegionName}} <div style="width:10%; float:left"><img [src]="'../../assets/img/house.png'" style="display: inline-block;margin-right: 10px; width:23px !important"> </div>
<div style="width:90%; float:left; padding-top: 4px;">
<span style="text-align: center">{{item.fieldRegionName}}</span><span style="text-align: center; font-size:12px; padding-left:10px; color:red;" *ngIf="item.operationModel === 4">(部分设备处于现控状态)</span></div>
</div> </div>
<div class="content"> <div class="content">
<span *ngIf="item.temp">温度: &nbsp;&nbsp;{{item.temp}} ℃ &nbsp;&nbsp;</span> <span *ngIf="item.temp" class="detailInfo" style="width: 40%">温度: &nbsp;&nbsp;{{item.temp}} ℃</span>
<span *ngIf="item.humi">湿度: &nbsp;&nbsp;{{item.humi}} % &nbsp;&nbsp;</span> <span *ngIf="item.humi" class="detailInfo" style="width: 40%">湿度: &nbsp;&nbsp;{{item.humi}} % rH</span>
<span *ngIf="item.heatStressLevel">热应激等级: &nbsp;&nbsp;<span class="warmColor{{item.heatStressLevel}}">{{item.heatStressLevelName}}</span></span> <span *ngIf="item.humi" class="detailInfo" style="width: 40%">氨气: &nbsp;&nbsp;{{item.NH3}} ppm</span>
<span *ngIf="item.heatStressLevel" class="detailInfo" style="width: 40%">热应激: &nbsp;&nbsp;<span class="warmColor{{item.heatStressLevel}}">{{item.heatStressLevelName}}</span></span>
</div> </div>
<div class="bottom"> <div class="bottom">
<span [ngClass]="{'online': item.online, 'offline': !item.online}">{{item.online ? '在线' : '离线'}} </span> <div style="width:100%">
<span *ngIf="item.operationModel" class="online">{{item.operationModel ? '远控' :'现控'}} </span> <!--<span [ngClass]="{'online': item.online, 'offline': !item.online}">{{item.online ? '在线' : '离线'}} </span>-->
<span *ngIf="item.operationModel" [ngClass]="{'online': item.isWisdomModel, 'offline': !item.isWisdomModel}" class="online">智控 </span> <!--<span *ngIf="item.operationModel" class="online">{{item.operationModel ? '远控' :'现控'}} </span>-->
<span *ngIf="item.ts" class="right">{{item.ts | date: 'yyyy-MM-dd HH:mm'}}</span> <!--<span *ngIf="item.operationModel" [ngClass]="{'online': item.isWisdomModel, 'offline': !item.isWisdomModel}" class="online">智控 </span>-->
<!--<span *ngIf="item.ts" class="right">{{item.ts | date: 'yyyy-MM-dd HH:mm'}}</span>-->
<div [ngClass]="{'online': item.online, 'offline': !item.online}">{{item.online ? '在线' : '离线'}} </div>
<!-- 1:远控 0:现控 4:混乱 -->
<div *ngIf="item.operationModel === 1 || item.operationModel === 0" class="online">{{item.operationModel === 1 ? '远控' :'现控'}} </div>
<div *ngIf="item.operationModel === 4" class="offline">现控 </div>
<div *ngIf="item.operationModel" [ngClass]="{'online': item.isWisdomModel, 'offline': !item.isWisdomModel}" class="online">智控 </div>
<div *ngIf="item.ts" class="right">{{item.ts | date: 'yyyy-MM-dd HH:mm'}}</div>
</div>
</div> </div>
</div> </div>
</ion-item> </ion-item>
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
} }
.top { .top {
line-height: 25px; // line-height: 25px;
//border-bottom: 1px solid #cccc; //border-bottom: 1px solid #cccc;
padding-bottom: 5px; padding-bottom: 5px;
font-size: 17px; font-size: 17px;
...@@ -45,13 +45,21 @@ ...@@ -45,13 +45,21 @@
//border-top: 1px solid #ccc; //border-top: 1px solid #ccc;
padding: 3px; padding: 3px;
color: #aaa; color: #aaa;
margin-top: 10px; margin-top: 60px;
width: 100%;
} }
.content{ .content{
margin-top: 10px; width:100%;
margin-top: 25px;
font-size: 14px; font-size: 14px;
color: #aaa; color: #aaa;
text-align: center; // text-align: center;
}
.detailInfo {
padding-left:15px;
float: left;
margin-top: 2px;
} }
.online { .online {
...@@ -82,6 +90,7 @@ ...@@ -82,6 +90,7 @@
float: right; float: right;
color: #aaa; color: #aaa;
font-size: 14px; font-size: 14px;
padding-top: 5px;
} }
.topSearch { .topSearch {
......
This diff is collapsed.
...@@ -47,8 +47,10 @@ export class Api { ...@@ -47,8 +47,10 @@ export class Api {
// 获取水槽信息 // 获取水槽信息
getShuiCaoData: (data) => this.trans('post', '/cowshedApp/getShuiCaoData', data), getShuiCaoData: (data) => this.trans('post', '/cowshedApp/getShuiCaoData', data),
// 获取当前牛舍历史数据信息 TODO 追加待 // 获取环境参数曲线
// getShuiCaoData: (data) => this.trans('post', '/cowshedApp/getShuiCaoData', data), getHistoryByFieldRegionNo: (data) => this.trans('post', '/cowshedApp/getHistoryByFieldRegionNo', data),
// 获取环境参数表
getHistoryTableByFieldRegionNo: (data) => this.trans('post', '/cowshedApp/getHistoryTableByFieldRegionNo', data),
}; };
public alert = { public alert = {
...@@ -87,6 +89,9 @@ export class Api { ...@@ -87,6 +89,9 @@ export class Api {
public control = { public control = {
controlBatchSwitch: (data) => this.trans('post', '/control/controlBatchSwitch', data), controlBatchSwitch: (data) => this.trans('post', '/control/controlBatchSwitch', data),
controlSwitch: (data) => this.trans('post', '/control/controlSwitch', data), controlSwitch: (data) => this.trans('post', '/control/controlSwitch', data),
controlCowedBatchSwitch: (data) => this.trans('post', '/control/controlCowedBatchSwitch', data),
controlCowedSwitch: (data) => this.trans('post', '/control/controlCowedSwitch', data),
}; };
public config = { public config = {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment