Browse Source

mcs 版本更新

all 5 years ago
parent
commit
3e59becf2b
70 changed files with 2970 additions and 650 deletions
  1. BIN
      backend/src/dashoo.cn/alertorapp/alertorapp
  2. 2 2
      backend/src/dashoo.cn/alertorapp/conf/app.ini
  3. 3 3
      backend/src/dashoo.cn/dataapi/conf/app.ini
  4. BIN
      backend/src/dashoo.cn/dataapi/dataapi
  5. 3 3
      backend/src/dashoo.cn/dataapi/datapoint.go
  6. 0 32
      backend/src/dashoo.cn/dg_dataapi/main.go
  7. 1 1
      backend/src/dashoo.cn/mms_api/conf/app.conf
  8. 3 1
      backend/src/dashoo.cn/mms_api/controllers/abnormals.go
  9. 3 0
      backend/src/dashoo.cn/mms_api/controllers/base.go
  10. 1 1
      backend/src/dashoo.cn/mms_api/controllers/common.go
  11. 7 7
      backend/src/dashoo.cn/mms_api/controllers/dataexports.go
  12. 1 1
      backend/src/dashoo.cn/mms_api/controllers/equipment.go
  13. 1 1
      backend/src/dashoo.cn/mms_api/controllers/loginfo.go
  14. 1 1
      backend/src/dashoo.cn/mms_api/controllers/monthreports.go
  15. 2 2
      backend/src/dashoo.cn/mms_api/controllers/reports.go
  16. 1 1
      backend/src/dashoo.cn/mms_api/controllers/token.go
  17. 1 2
      backend/src/dashoo.cn/mms_api/controllers/triggerinfos.go
  18. 3 2
      backend/src/dashoo.cn/mms_api/controllers/triggers.go
  19. BIN
      backend/src/dashoo.cn/mms_api/static/file/excel/report/1368/daydevicedata.xlsx
  20. 1 1
      backend/src/dashoo.cn/mms_api_mobile/controllers/common.go
  21. 1 0
      backend/src/dashoo.cn/mms_api_weixin/business/device/deviceService.go
  22. 1 1
      backend/src/dashoo.cn/mms_api_weixin/conf/app.conf
  23. 52 12
      backend/src/dashoo.cn/mms_api_weixin/controllers/channels.go
  24. 25 25
      backend/src/dashoo.cn/mms_api_weixin/controllers/common.go
  25. 0 0
      backend/src/dashoo.cn/mms_api_weixin/ui/static/js/0.2ef0f3ab9854a787b475.js
  26. 0 0
      backend/src/dashoo.cn/mms_api_weixin/ui/static/js/0.2ef0f3ab9854a787b475.js.map
  27. 0 0
      backend/src/dashoo.cn/mms_api_weixin/ui/static/js/2.dad6a2fb7ead13aa269d.js
  28. 0 0
      backend/src/dashoo.cn/mms_api_weixin/ui/static/js/2.dad6a2fb7ead13aa269d.js.map
  29. 0 0
      backend/src/dashoo.cn/mms_api_weixin/ui2/js/3ff4b1ec.913af40e.js
  30. 0 0
      backend/src/dashoo.cn/mms_api_weixin/ui3/static/js/0.de61a9aa154c6f0dd1d2.js
  31. 0 0
      backend/src/dashoo.cn/mms_api_weixin/ui3/static/js/0.de61a9aa154c6f0dd1d2.js.map
  32. 0 0
      backend/src/dashoo.cn/mms_api_weixin/ui3/static/js/1.5272bfe09ae2740468fe.js
  33. 0 0
      backend/src/dashoo.cn/mms_api_weixin/ui3/static/js/1.5272bfe09ae2740468fe.js.map
  34. 3 2
      backend/src/dashoo.cn/qatoolsweb/conf/app.ini
  35. 2 2
      backend/src/dashoo.cn/qatoolsweb/controllers/CommWeb.go
  36. 1 0
      backend/src/dashoo.cn/qatoolsweb/controllers/admin/datacurv.go
  37. 1 1
      backend/src/dashoo.cn/qatoolsweb/controllers/admin/datareport.go
  38. 1 1
      backend/src/dashoo.cn/qatoolsweb/controllers/admin/lossrate.go
  39. 1 1
      backend/src/dashoo.cn/qatoolsweb/views/admin/datareport/index.tpl
  40. 240 237
      frontend_web/package-lock.json
  41. BIN
      frontend_web/src/assets/images/4.png
  42. BIN
      frontend_web/src/assets/images/off.png
  43. BIN
      frontend_web/src/assets/images/on.png
  44. 7 7
      frontend_web/src/assets/locales/zh.json
  45. 2 0
      frontend_web/src/assets/styles/modules/global.scss
  46. 1 1
      frontend_web/src/components/devices/equipment_dialog.vue
  47. 81 6
      frontend_web/src/components/timelinechart.vue
  48. 7 0
      frontend_web/src/libraries/router/main-routes.js
  49. 2 2
      frontend_web/src/libraries/store/state.js
  50. 1 0
      frontend_web/src/libraries/utils/axios.js
  51. 13 10
      frontend_web/src/views/login.vue
  52. 5 2
      frontend_web/src/views/main/abnormalmsg.vue
  53. 3 3
      frontend_web/src/views/main/authcodeman.vue
  54. 2 2
      frontend_web/src/views/main/devicechart.vue
  55. 1 1
      frontend_web/src/views/main/devicechart.vue.orig
  56. 2 2
      frontend_web/src/views/main/devicechart1.vue
  57. 37 22
      frontend_web/src/views/main/devicegps.vue
  58. 2 2
      frontend_web/src/views/main/devices.vue
  59. 221 97
      frontend_web/src/views/main/equipment.vue
  60. 1613 0
      frontend_web/src/views/main/equipment1.vue
  61. 110 92
      frontend_web/src/views/main/index.vue
  62. 104 30
      frontend_web/src/views/main/index2.vue
  63. 101 7
      frontend_web/src/views/main/loginfo.vue
  64. 12 11
      frontend_web/src/views/main/management.vue
  65. 264 0
      frontend_web/src/views/main/record_history.vue
  66. 1 1
      frontend_web/src/views/main/sgmanage.vue
  67. 6 6
      frontend_web/src/views/main/triggerinfos.vue
  68. 3 3
      frontend_web/src/views/main/users.vue
  69. 2 0
      frontend_web/src/views/main/usersetting.vue
  70. 5 0
      frontend_web/yarn.lock

BIN
backend/src/dashoo.cn/alertorapp/alertorapp


+ 2 - 2
backend/src/dashoo.cn/alertorapp/conf/app.ini

@@ -40,7 +40,7 @@ label_names=Web Frame.|ORM|DB Driver|GUI|Networking|Toolkit
 
 [db]
 type=mysql
-host=47.92.238.200
+host=47.92.249.239
 #name=mcs_db
 #user=mcs_user
 #pwd=X6T1pa5o1AgO
@@ -55,6 +55,6 @@ max_skip_time=5
 min_pro_num=100
 
 [redis]
-addr = 114.215.26.149:26379
+addr = 39.98.34.197:26379
 poolnum = 5
 

+ 3 - 3
backend/src/dashoo.cn/dataapi/conf/app.ini

@@ -1,18 +1,18 @@
 [db]
 type=mysql
 name=seed_db
-host=47.92.238.200
+host=47.92.249.239
 user=seed_user
 pwd_windows=Ruvaher8gObi
 pwd_linux=Ruvaher8gObi
 pwd=Ruvaher8gObi
 
 [nosqldb]
-nqldbipport=114.215.27.56:9086
+nqldbipport=47.92.249.239:9086
 nqldbname=coldcloud
 nqldbwuser=coldcloud
 nqldbwpass=cc@1qaz2wsx
 
 [redis]
-addr = 114.215.26.149:26379
+addr = 39.98.34.197:26379
 poolnum = 5

BIN
backend/src/dashoo.cn/dataapi/dataapi


+ 3 - 3
backend/src/dashoo.cn/dataapi/datapoint.go

@@ -33,7 +33,7 @@ var Producernsq *nsq.Producer
 var cClient labsop.LabSopClient
 
 func InitColdCloudDB() {
-	dbIpPort := "114.215.27.56:9086"
+	dbIpPort := "47.92.249.239:9086"
 	dbName := "coldcloud"
 	dbUser := "coldcloud"
 	dbPass := "cc@1qaz2wsx"
@@ -43,7 +43,7 @@ func InitColdCloudDB() {
 //初始化redis
 func InitRedis() {
 	poolnum := 5
-	addr := "114.215.26.149:26379"
+	addr := "39.98.34.197:26379"
 	//addr := "192.168.0.252:26379"
 	redis.InitRedis(poolnum, addr)
 }
@@ -51,7 +51,7 @@ func InitRedis() {
 //初始化nsq
 func InitNSQ() {
 	cfg := nsq.NewConfig()
-	Producernsq, _ = nsq.NewProducer("114.215.26.149  :9150", cfg)
+	Producernsq, _ = nsq.NewProducer("39.98.34.197:9150", cfg)
 	//Producernsq, _ = nsq.NewProducer("192.168.0.251:9150", cfg)
 }
 

+ 0 - 32
backend/src/dashoo.cn/dg_dataapi/main.go

@@ -1,32 +0,0 @@
-package main
-
-// 定义一个接口
-type People interface {
-	getAge() int     // 定义抽象方法1
-	getName() string // 定义抽象方法2
-}
-
-type Man struct {
-}
-
-func (a *Man) getAge() int { // 实现抽象方法1
-	return 18
-}
-
-func (a *Main) getName() string { // 实现抽象方法2
-	return "Sheldon"
-}
-
-func TestPeople(p interface{}) {
-	switch p.(type) { // 变量.(type) 只能在 switch 中使用
-	case People:
-		fmt.Println("实现了 People 接口")
-	case People2:
-		fmt.Println("实现了 People2 接口")
-	}
-}
-
-func main() {
-	man1 := Man{}
-	TestPeople(man1)
-}

+ 1 - 1
backend/src/dashoo.cn/mms_api/conf/app.conf

@@ -12,7 +12,7 @@ apiurl=http://47.92.238.200:10015/v1
 [db]
 type=mysql
 name=mcs_db
-host=47.92.238.200
+host=rm-8vbk16zx2rbfu6jt6uo.mysql.zhangbei.rds.aliyuncs.com
 user=mcs_user
 pwd=X6T1pa5o1AgO
 

+ 3 - 1
backend/src/dashoo.cn/mms_api/controllers/abnormals.go

@@ -2,6 +2,7 @@ package controllers
 
 import (
 	"encoding/json"
+	"fmt"
 	"strings"
 	"time"
 
@@ -47,7 +48,7 @@ func (this *AbnormalsController) Save() {
 	var entity triggerabnormal.Trigger_Abnormal
 	var entityempty triggerabnormal.Trigger_Abnormal
 	svc.GetEntity(&entity, "CreateUserId="+utils.ToStr(this.User.Id))
-
+	fmt.Println("------utils.ToStr(this.User.Id)----", utils.ToStr(this.User.Id))
 	entity.AId = strings.Join(model.Aid, ",")
 	entity.DId = strings.Join(model.BBs, ",")
 	entity.Lang = "cn"
@@ -72,6 +73,7 @@ func (this *AbnormalsController) Save() {
 			this.ServeJSON()
 		}
 	} else {
+		fmt.Println("-------this.User.Realname------", this.User.Realname)
 		entity.ModifiedBy = this.User.Realname
 		entity.ModifiedUserId, _ = utils.StrTo(this.User.Id).Int()
 		var cols []string = []string{"AId", "DId", "Lang", "Modifieduserid", "Modifiedby", "RemindType"}

+ 3 - 0
backend/src/dashoo.cn/mms_api/controllers/base.go

@@ -111,7 +111,10 @@ func (this *BaseController) GetAccode() string {
 func (this *BaseController) GetupdbAndHost() (string, string, string, string) {
 	// return "coldcloud", "cc@1qaz2wsx", "coldcloud", "114.215.27.56:9086"
 	//	return "coldcloud", "cc@1qaz2wsx", "coldcloud", "121.42.244.202:9086"
+	//新三台
 	return "coldcloud", "cc@1qaz2wsx", "coldcloud", "47.92.249.239:9086"
+	//第四台
+	// return "coldcloud", "cc@1qaz2wsx", "coldcloud", "47.92.212.59:9086"
 
 }
 

+ 1 - 1
backend/src/dashoo.cn/mms_api/controllers/common.go

@@ -210,7 +210,7 @@ const (
 	ChannelItem_Temperature     = "6,10"                                                                //sensor,深低温,特殊,显示温度
 	ChannelItem_Co2             = "9,26"                                                                //sensor,co2,显示温湿度,co2
 	ChannelItem_O2              = "7,17"                                                                //sensor,o2,显示温湿度,O2
-	ChannelItem_Power           = "13"                                                                  //sensor,功率插座,显示功率,
+	ChannelItem_Power           = "13"                                                                  //sensor,功率插座,显示功率,电
 	ChannelItem_LiquidLevel     = "15"                                                                  //sensor,外接液位设备,显示温度,液位
 	ChannelItem_HaveT           = "0,6,7,9,10,15,16"                                                    //含温度数据
 	ChannelItem_HaveV           = "0,6,7,9,10,16"                                                       //含电压数据

+ 7 - 7
backend/src/dashoo.cn/mms_api/controllers/dataexports.go

@@ -450,7 +450,7 @@ func (this *DataExportsController) SavepowerXlsx(name, code, timerange, u, p str
 	headsname := headnamepower{
 		"时间",
 		"功率",
-		"电",
+		"电",
 		"",
 		timerange,
 	}
@@ -603,7 +603,7 @@ func (this *DataExportsController) GetPDF() {
 			indexo3 := utils.SliceIndexOf(cols, "o3")                   //臭氧
 			indextvoc := utils.SliceIndexOf(cols, "tvoc")               //tvoc
 			indexpower := utils.SliceIndexOf(cols, "electricalpower")   //功率
-			indexsupply := utils.SliceIndexOf(cols, "electricalsupply") //
+			indexsupply := utils.SliceIndexOf(cols, "electricalsupply") //电
 			indexstate := utils.SliceIndexOf(cols, "devicestate")       //设备状态
 			indexliquidlevel := utils.SliceIndexOf(cols, "liquidlevel") //液位
 
@@ -764,7 +764,7 @@ func (this *DataExportsController) GetPDF() {
 					pdf.Cell(nil, "功率")
 					pdf.Curr.X = 750
 					pdf.Curr.Y = 120
-					pdf.Cell(nil, "电")
+					pdf.Cell(nil, "电")
 				} else if DeviceItemContainint(ChannelItem_HaveLiquidLevel, v.DataItem) {
 					pdf.Curr.X = 550
 					pdf.Curr.Y = 120
@@ -845,7 +845,7 @@ func (this *DataExportsController) GetPDF() {
 				if indexsupply > -1 && DeviceItemContainint(ChannelItem_Power, v.DataItem) {
 					pdf.Curr.X = 750
 					pdf.Curr.Y = 120
-					pdf.Cell(nil, "电")
+					pdf.Cell(nil, "电")
 				}
 				if DeviceItemContainint(ChannelItem_LiquidLevel, v.DataItem) {
 					pdf.Curr.X = 550
@@ -937,7 +937,7 @@ func (this *DataExportsController) GetPDF() {
 							pdf.Cell(nil, "功率")
 							pdf.Curr.X = 750
 							pdf.Curr.Y = 120
-							pdf.Cell(nil, "电")
+							pdf.Cell(nil, "电")
 						} else if DeviceItemContainint(ChannelItem_LiquidLevel, v.DataItem) {
 							pdf.Curr.X = 550
 							pdf.Curr.Y = 120
@@ -977,7 +977,7 @@ func (this *DataExportsController) GetPDF() {
 						if indexsupply > -1 && DeviceItemContainint(ChannelItem_Power, v.DataItem) {
 							pdf.Curr.X = 750
 							pdf.Curr.Y = 120
-							pdf.Cell(nil, "电")
+							pdf.Cell(nil, "电")
 						}
 						if DeviceItemContainint(ChannelItem_LiquidLevel, v.DataItem) {
 							pdf.Curr.X = 550
@@ -1065,7 +1065,7 @@ func (this *DataExportsController) GetPDF() {
 					pdf.Cell(nil, powerv)
 
 					supplyv = utils.ToStr(data[l-j-1][indexsupply])
-					//
+					//电
 					pdf.Curr.X = 750
 					pdf.Curr.Y = 50*float64(yu+1) + 120
 					pdf.Cell(nil, supplyv)

+ 1 - 1
backend/src/dashoo.cn/mms_api/controllers/equipment.go

@@ -450,7 +450,7 @@ func (this *EquipmentController) EditData() {
 	var cols []string = []string{"ModelId", "Code", "DeviceState", "OrganizeId", "OrganizeName", "ModifiedUserId", "ModifiedBy"}
 	svc := equipment.GetEquipmentService(utils.DBE)
 	err := svc.UpdateEntityAndBackupByCols(id, &equipmententity, &equipmententityempty, cols, utils.ToStr(this.User.Id), this.User.Realname)
-
+	fmt.Println("")
 	if err == nil {
 		//修改缓存中设备状态
 		clist := make([]device.Channels, 0)

+ 1 - 1
backend/src/dashoo.cn/mms_api/controllers/loginfo.go

@@ -105,7 +105,7 @@ type Trigger_Manager_Log struct {
 type Trigger_Log struct {
 	Id            int     `name:"-"`
 	Serial        string  `name:"logs.alarm_serial" json:"serial"`
-	EventFiled    string  `name:"logs.alarm_items" json:"column" des:"temperature,温度;humidity,湿度;voltage,电压;co2,Co2;o2,O2;electricalpower,功率;electricalsupply,电"`
+	EventFiled    string  `name:"logs.alarm_items" json:"column" des:"temperature,温度;humidity,湿度;voltage,电压;co2,Co2;o2,O2;electricalpower,功率;electricalsupply,电"`
 	TItemName     string  `name:"logs.alarm_condition" json:"itemname" des:"1,>;2,>=;3,<;4,<=,5,="`
 	TValue        float64 `name:"logs.alarm_condition_value" json:"value"`
 	AId           string  `name:"logs.alarm_action" json:"aid"`

+ 1 - 1
backend/src/dashoo.cn/mms_api/controllers/monthreports.go

@@ -654,7 +654,7 @@ func (this *MonthReportsController) GroupSaveXlsx(name, code, timestr string, da
 		cell = rowhead.AddCell()
 		cell.Value = "功率W"
 		cell = rowhead.AddCell()
-		cell.Value = "电V"
+		cell.Value = "电V"
 	}
 	if report != nil && len(report) > 0 && report[0] != nil && len(report[0]) > 0 {
 		for _, v := range report {

+ 2 - 2
backend/src/dashoo.cn/mms_api/controllers/reports.go

@@ -45,7 +45,7 @@ type Reportinfo struct {
 	DataH2O          []string
 	DataSO2          []string
 	Datapower        []string //功率
-	Datasupply       []string //
+	Datasupply       []string //电
 	DataLiquidLevel  []string //液位
 }
 
@@ -217,7 +217,7 @@ func GetReportData(name string, dataitem int, showcols []string, data []labsop.D
 	}
 	if DeviceItemContainint(ChannelItem_Power, dataitem) {
 		datapower = append(datapower, "功率(W)")
-		datasupply = append(datasupply, "电(V)")
+		datasupply = append(datasupply, "电(V)")
 	}
 	if DeviceItemContainint(ChannelItem_HaveLiquidLevel, dataitem) {
 		dataliquidlevel = append(dataliquidlevel, "液位(mm)")

+ 1 - 1
backend/src/dashoo.cn/mms_api/controllers/token.go

@@ -25,7 +25,7 @@ type TokenController struct {
 func (this *TokenController) Post() {
 	var user4CreateToken models.User4CreateToken
 	json.Unmarshal(this.Ctx.Input.RequestBody, &user4CreateToken)
-	fmt.Println("---------------", user4CreateToken.Username)
+	fmt.Println("-------22--------", user4CreateToken.Username)
 	// todo 验证用户密码
 	svc := auth.GetAuthServic(utils.DBE)
 	var user userRole.Base_User

+ 1 - 2
backend/src/dashoo.cn/mms_api/controllers/triggerinfos.go

@@ -70,7 +70,6 @@ func (this *TriggerinfosController) List() {
 	// strUrl := utils.Cfg.MustValue("server", "apiurl") + "/triggerhistorys?u=" + u + "&p=" + p + "&ccode=" + svc.GetCIds(where)
 	strUrl = strUrl + "&start=" + utils.ToStr(formmodel.TimeStart/1000)
 	strUrl = strUrl + "&end=" + utils.ToStr(formmodel.TimeEnd/1000)
-	fmt.Println("------strUrlstrUrlstrUrl--------------", strUrl)
 	if formmodel.Sendto != "" {
 		strUrl = strUrl + "&sendto=" + formmodel.Sendto
 	}
@@ -86,7 +85,7 @@ func (this *TriggerinfosController) List() {
 
 	// 新增内容
 	strUrl = strUrl + "&page=" + utils.ToStr(page.CurrentPage) + "&itemsPerPage=" + utils.ToStr(page.Size)
-	fmt.Println("-----strUrl-------", strUrl)
+	fmt.Println("-----strUrl---1111----", strUrl)
 	json.Unmarshal(Apiget(strUrl), &data)
 	var datainfo DataInfo
 	datainfo.Items = data.Items

+ 3 - 2
backend/src/dashoo.cn/mms_api/controllers/triggers.go

@@ -2,6 +2,7 @@ package controllers
 
 import (
 	"encoding/json"
+	"fmt"
 	"strings"
 
 	"dashoo.cn/mms_api/business/actions"
@@ -240,7 +241,7 @@ func (this *TriggersController) EditTrigger() {
 	var model TriggerModel
 	var jsonblob = this.Ctx.Input.RequestBody
 	json.Unmarshal(jsonblob, &model)
-
+	fmt.Println("-----model------", model.Title)
 	svc := device.GetDeviceService(utils.DBE)
 	var entity trigger.Trigger
 	entity.Eventfiled = model.Eventfiled
@@ -278,7 +279,7 @@ func (this *TriggersController) EditTrigger() {
 	strUrl1 := utils.Cfg.MustValue("server", "apiurl") + "/triggers/" + utils.ToStr(entity.Id) + "?u=" + u + "&p=" + p
 	json.Unmarshal(Apiget(strUrl1), &entity1)
 
-	trigger_Log := Logcompare{Value1: Trigger_Log{entity1.Id, strings.TrimLeft(entity.Ccode, "c"), entity1.Eventfiled, utils.ToStr(entity1.TItem), entity1.TValue, entity1.AId, entity1.EventType, entity1.RangeWeek, entity1.RangeStartStr, entity1.RangeEndStr, entity1.Enabled, entity1.ContentMode}, Value2: Trigger_Log{entity.Id, strings.TrimLeft(entity.Ccode, "c"), entity.Eventfiled, utils.ToStr(entity.TItem), entity.TValue, entity.AId, entity.EventType, entity.RangeWeek, entity.RangeStartStr, entity.RangeEndStr, entity.Enabled, entity.ContentMode}}
+	trigger_Log := Logcompare{Value1: Trigger_Log{entity1.Id, strings.TrimLeft(entity.Ccode, "c"), entity1.Eventfiled, utils.ToStr(entity1.TItem), entity1.TValue, entity1.AId, entity1.EventType, model.Title, entity1.RangeStartStr, entity1.RangeEndStr, entity1.Enabled, entity1.ContentMode}, Value2: Trigger_Log{entity.Id, strings.TrimLeft(entity.Ccode, "c"), entity.Eventfiled, utils.ToStr(entity.TItem), entity.TValue, entity.AId, entity.EventType, entity.RangeWeek, entity.RangeStartStr, entity.RangeEndStr, entity.Enabled, entity.ContentMode}}
 	svc.InsertUpdateLog(0, &trigger_Log, utils.ToStr(this.User.Id), this.User.Realname, TriggerTName)
 
 	strUrl := utils.Cfg.MustValue("server", "apiurl") + "/triggers/" + utils.ToStr(entity.Id) + "?u=" + u + "&p=" + p

BIN
backend/src/dashoo.cn/mms_api/static/file/excel/report/1368/daydevicedata.xlsx


+ 1 - 1
backend/src/dashoo.cn/mms_api_mobile/controllers/common.go

@@ -202,7 +202,7 @@ const (
 	ChannelItem_Temperature = "6,10"             //sensor,深低温,特殊,显示温度
 	ChannelItem_Co2         = "9"                //sensor,co2,显示温湿度,co2
 	ChannelItem_O2          = "7"                //sensor,o2,显示温湿度,O2
-	ChannelItem_Power       = "13"               //sensor,功率插座,显示功率,
+	ChannelItem_Power       = "13"               //sensor,功率插座,显示功率,电
 	ChannelItem_HaveT       = "0,6,7,9,10"       //含温度数据
 	ChannelItem_HaveV       = "0,6,7,9,10"       //含电压数据
 	ChannelItem_HaveH       = "0,7,9"            //含湿度数据

+ 1 - 0
backend/src/dashoo.cn/mms_api_weixin/business/device/deviceService.go

@@ -61,6 +61,7 @@ func (s *DeviceService) GetPagingEntitiesWithOrderSearch(pageIndex, itemsPerPage
 		left join Base_User d on a.CreateUserId=d.Id
 		where ` + searchstring + ` order by ` + order + limitstr
 	List := make([]DeviceChannels, 0)
+	fmt.Println("----sql----", sql)
 	utils.DBE.Sql(sql).Find(&List)
 	resultsSlice, err := s.DBE.Query(sqlCount)
 	LogError(err)

+ 1 - 1
backend/src/dashoo.cn/mms_api_weixin/conf/app.conf

@@ -12,7 +12,7 @@ apiurl=http://47.92.238.200:10015/v1
 [db]
 type=mysql
 name=mcs_db
-host=47.92.238.200
+host=rm-8vbk16zx2rbfu6jt6uo.mysql.zhangbei.rds.aliyuncs.com
 user=mcs_user
 pwd=X6T1pa5o1AgO
 

+ 52 - 12
backend/src/dashoo.cn/mms_api_weixin/controllers/channels.go

@@ -10,6 +10,7 @@ import (
 	"dashoo.cn/mms_api_weixin/business/device"
 	"dashoo.cn/mms_api_weixin/business/userweixin"
 	"dashoo.cn/utils"
+	"github.com/silenceper/wechat"
 )
 
 // 动作接口说明
@@ -18,18 +19,19 @@ type ChannelsController struct {
 }
 
 type ChannelLast struct {
-	Temp   string
-	Hum    string
-	Vol    string
-	Rssi   string
-	Time   string
-	O2     string
-	Serial string
-	Co2    string
-	Power  string
-	Supply string
-	Signal string
-	DState int //设备状态 1在线,2离线
+	Temp     string
+	Hum      string
+	Vol      string
+	Rssi     string
+	Time     string
+	O2       string
+	Serial   string
+	Co2      string
+	Power    string
+	Supply   string
+	Signal   string
+	Doorlock string
+	DState   int //设备状态 1在线,2离线
 }
 
 type GenerateActionModel struct {
@@ -114,6 +116,7 @@ func (this *ChannelsController) DataValues() {
 		data.Power = utils.ToStr(lastdata.ElectricalPower)
 		data.Supply = utils.ToStr(lastdata.ElectricalSupply)
 		data.Signal = utils.ToStr(lastdata.SimSignal)
+		data.Doorlock = utils.ToStr(lastdata.Doorlock)
 		data.Time = lastdata.Time.Format("2006-01-02 15:04:05")
 		// fmt.Println("------data.Time----", data.Time)
 		if (time.Now().Unix() - 3600*int64(5)) < lasttimeint {
@@ -283,6 +286,7 @@ func (this *ChannelsController) DataValue() {
 	if lasttimeint := lastdata.Time.Unix(); err == nil && lasttimeint > 0 {
 		data.Temp = utils.ToStr(lastdata.Temperature)
 		data.Hum = utils.ToStr(lastdata.Humidity)
+		data.Doorlock = utils.ToStr(lastdata.Doorlock)
 		data.Vol = utils.ToStr(lastdata.Voltage)
 		data.Rssi = utils.ToStr(lastdata.RSSI)
 		data.O2 = utils.ToStr(lastdata.O2)
@@ -457,3 +461,39 @@ func (this *ChannelsController) Generateaction() {
 	this.Data["json"] = errinfo
 	this.ServeJSON()
 }
+
+// @Title 获取微信配置
+// @Description 设备列表
+// @Success 200 {object} business.device.DeviceChannels
+// @router /getwxconfig [get]
+func (this *ChannelsController) Getwxconfig() {
+	InitWeiXin()
+
+	wx := wechat.NewWechat(&wxConfig)
+	js := wx.GetJs()
+	cfg, err := js.GetConfig(this.GetString("openid"))
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	fmt.Println("-----", cfg)
+	// page := this.GetPageInfoForm()
+	// svcweixin := userweixin.GetUserWeixinService(utils.DBE)
+	// uid := svcweixin.GetUserByWeixin(this.GetString("openid"))
+	// svc := device.GetDeviceService(utils.DBE)
+
+	// svceq := equipment.GetEquipmentService(utils.DBE)
+	// eids := svceq.GetEquipmentidsByUid(utils.ToStr(uid))
+	// where := " (a.CreateUserId=" + utils.ToStr(uid) + " or a.EquipMentId in (" + eids + ")) and a.DataItem in (" + ChannelItem_Sensor + ") "
+
+	// keyword := this.GetString("keyword")
+	// if keyword != "" {
+	// 	where = where + " and (a.Title like '%" + keyword + "%'  or a.TagCode like '%" + keyword + "%' or a.Serial like '%" + keyword + "%')"
+	// }
+	// total, devices := svc.GetPagingEntitiesWithOrderSearch(page.CurrentPage, page.Size, "c.sortcode, a.CreateOn desc", where, utils.ToStr(uid))
+	var datainfo DataInfo
+	datainfo.Items = cfg
+	// datainfo.CurrentItemCount = total
+	this.Data["json"] = &datainfo
+	this.ServeJSON()
+}

+ 25 - 25
backend/src/dashoo.cn/mms_api_weixin/controllers/common.go

@@ -192,31 +192,31 @@ func CoderGBKtoUTF8(str string) string {
 
 //设备类型汇总
 const (
-	Device_Box              = "0"                         //设备,普通box
-	Device_Alertor          = "4"                         //设备,报警器
-	ChannelItem_Sensor      = "0,6,7,9,10,13,14,17,26,25" //sensor,常温,深低温,o2,co2,特殊(隐藏湿度的常温),功率
-	ChannelItem_Report      = "0,6,7,9,10,14"             //sensor报表使用,不需要功率,常温,深低温,o2,co2,特殊(隐藏湿度的常温)
-	ChannelItem_Box         = "1"                         //sensor,box自身数据
-	ChannelItem_TAndH       = "0"                         //sensor,常温,显示温湿度
-	ChannelItem_Temperature = "6,10"                      //sensor,深低温,特殊,显示温度
-	ChannelItem_Co2         = "9,26"                      //sensor,co2,显示温湿度,co2
-	ChannelItem_O2          = "7,17"                      //sensor,o2,显示温湿度,O2
-	ChannelItem_Power       = "13"                        //sensor,功率插座,显示功率,
-	ChannelItem_HaveT       = "0,6,7,9,10"                //含温度数据
-	ChannelItem_HaveV       = "0,6,7,9,10"                //含电压数据
-	ChannelItem_HaveH       = "0,7,9"                     //含湿度数据
-	ChannelItem_HaveCO2     = "9,26"                      //含二氧化碳数据,co2
-	ChannelItem_HaveO2      = "7,17"                      //含氧气数据,o2
-	Alertor_Alarm           = "2,4,5,8,12"                //报警器,普通,纯报警,纯正常,android,条屏
-	Alertor_AlarmBindData   = "3"                         //报警器,绑定数据
-	Alertor_Alarm1          = "2"                         //报警器,普通
-	Alertor_Alarm3          = "4"                         //报警器,纯报警
-	Alertor_AlarmOnlyData   = "5"                         //报警器,纯正常
-	Alertor_AlarmAndroid    = "8"                         //报警器,android
-	Alertor_AlarmBaoJing    = "2,4,5,8"                   //报警器,报警
-	Alertor_AlarmLed        = "12"                        //报警器,条屏
-	Alertor_NeedAction      = "2,4,5,8"                   //报警器,需要添加动作
-	Alertor_NotNeedAction   = "12"                        //报警器,不需要添加动作
+	Device_Box              = "0"                            //设备,普通box
+	Device_Alertor          = "4"                            //设备,报警器
+	ChannelItem_Sensor      = "0,6,7,9,10,13,14,17,26,25,31" //sensor,常温,深低温,o2,co2,特殊(隐藏湿度的常温),功率
+	ChannelItem_Report      = "0,6,7,9,10,14"                //sensor报表使用,不需要功率,常温,深低温,o2,co2,特殊(隐藏湿度的常温)
+	ChannelItem_Box         = "1"                            //sensor,box自身数据
+	ChannelItem_TAndH       = "0"                            //sensor,常温,显示温湿度
+	ChannelItem_Temperature = "6,10"                         //sensor,深低温,特殊,显示温度
+	ChannelItem_Co2         = "9,26"                         //sensor,co2,显示温湿度,co2
+	ChannelItem_O2          = "7,17"                         //sensor,o2,显示温湿度,O2
+	ChannelItem_Power       = "13"                           //sensor,功率插座,显示功率,电
+	ChannelItem_HaveT       = "0,6,7,9,10"                   //含温度数据
+	ChannelItem_HaveV       = "0,6,7,9,10"                   //含电压数据
+	ChannelItem_HaveH       = "0,7,9"                        //含湿度数据
+	ChannelItem_HaveCO2     = "9,26"                         //含二氧化碳数据,co2
+	ChannelItem_HaveO2      = "7,17"                         //含氧气数据,o2
+	Alertor_Alarm           = "2,4,5,8,12"                   //报警器,普通,纯报警,纯正常,android,条屏
+	Alertor_AlarmBindData   = "3"                            //报警器,绑定数据
+	Alertor_Alarm1          = "2"                            //报警器,普通
+	Alertor_Alarm3          = "4"                            //报警器,纯报警
+	Alertor_AlarmOnlyData   = "5"                            //报警器,纯正常
+	Alertor_AlarmAndroid    = "8"                            //报警器,android
+	Alertor_AlarmBaoJing    = "2,4,5,8"                      //报警器,报警
+	Alertor_AlarmLed        = "12"                           //报警器,条屏
+	Alertor_NeedAction      = "2,4,5,8"                      //报警器,需要添加动作
+	Alertor_NotNeedAction   = "12"                           //报警器,不需要添加动作
 )
 
 //设备类型判断

File diff suppressed because it is too large
+ 0 - 0
backend/src/dashoo.cn/mms_api_weixin/ui/static/js/0.2ef0f3ab9854a787b475.js


File diff suppressed because it is too large
+ 0 - 0
backend/src/dashoo.cn/mms_api_weixin/ui/static/js/0.2ef0f3ab9854a787b475.js.map


File diff suppressed because it is too large
+ 0 - 0
backend/src/dashoo.cn/mms_api_weixin/ui/static/js/2.dad6a2fb7ead13aa269d.js


File diff suppressed because it is too large
+ 0 - 0
backend/src/dashoo.cn/mms_api_weixin/ui/static/js/2.dad6a2fb7ead13aa269d.js.map


File diff suppressed because it is too large
+ 0 - 0
backend/src/dashoo.cn/mms_api_weixin/ui2/js/3ff4b1ec.913af40e.js


File diff suppressed because it is too large
+ 0 - 0
backend/src/dashoo.cn/mms_api_weixin/ui3/static/js/0.de61a9aa154c6f0dd1d2.js


File diff suppressed because it is too large
+ 0 - 0
backend/src/dashoo.cn/mms_api_weixin/ui3/static/js/0.de61a9aa154c6f0dd1d2.js.map


File diff suppressed because it is too large
+ 0 - 0
backend/src/dashoo.cn/mms_api_weixin/ui3/static/js/1.5272bfe09ae2740468fe.js


File diff suppressed because it is too large
+ 0 - 0
backend/src/dashoo.cn/mms_api_weixin/ui3/static/js/1.5272bfe09ae2740468fe.js.map


+ 3 - 2
backend/src/dashoo.cn/qatoolsweb/conf/app.ini

@@ -45,12 +45,13 @@ rock_reset=0
 max_skip_time=5
 min_pro_num=100
 
+
 [redis]
-addr = 114.215.26.149:26379
+addr = 39.98.34.197:26379
 poolnum = 5
 
 [influxdb]
-addr = "114.215.27.56:9086"
+addr = "47.92.212.59:9086"
 name = "coldcloud"
 user = "ccqawriter"
 password = "ccqa@P1as72jd4wdw2"

+ 2 - 2
backend/src/dashoo.cn/qatoolsweb/controllers/CommWeb.go

@@ -252,9 +252,9 @@ func Apiget(str string) (body []byte) {
 // "ccqa", "ccqa@1qaz2wsx", "coldcloudqa", "121.42.183.126:9086"10.251.48.16:9086
 func GetInfluxDBService(qadb string) (string, string, string, string) {
 	if qadb == "test" {
-		return "ccqa", "ccqa@1qaz2wsx", "coldcloudqa", "114.215.27.56:9086"
+		return "ccqa", "ccqa@1qaz2wsx", "coldcloudqa", "47.92.212.59:9086"
 	} else {
-		return "coldcloud", "cc@1qaz2wsx", "coldcloud", "114.215.27.56:9086"
+		return "coldcloud", "cc@1qaz2wsx", "coldcloud", "47.92.212.59:9086"
 	}
 
 }

+ 1 - 0
backend/src/dashoo.cn/qatoolsweb/controllers/admin/datacurv.go

@@ -42,6 +42,7 @@ func (this *DataCurvsController) ChannelManageview(client labsop.LabSopClient, c
 	queryCommand := fmt.Sprintf("select temperature,humidity,voltage,o2,co2 from %v where time > %vs and time < %vs", code, start, end)
 
 	data, err := client.QueryOneResultByCommand(queryCommand)
+	fmt.Println("------data----")
 	if err == nil && len(data) > 0 && len(data[0].Values) > 0 {
 		cols, arrs := data[0].Columns, data[0].Values
 		vl := len(arrs)

+ 1 - 1
backend/src/dashoo.cn/qatoolsweb/controllers/admin/datareport.go

@@ -239,7 +239,7 @@ func (this *DatareportController) SaveXlsx(data []labsop.DatapointLabSop, f *xls
 	//		"氧气/%",
 	//		"二氧化碳/‰",
 	//		"电器功率/w",
-	//		"电/v",
+	//		"电/v",
 	//		"信号强度",
 	//		"Sensor电压",
 	//		"BB电压",

+ 1 - 1
backend/src/dashoo.cn/qatoolsweb/controllers/admin/lossrate.go

@@ -827,7 +827,7 @@ func (this *LossrateController) SaveAllXlsx(data map[string][]labsop.DatapointLa
 	//		"氧气/%",
 	//		"二氧化碳/‰",
 	//		"电器功率/w",
-	//		"电/v",
+	//		"电/v",
 	//		"信号强度",
 	//		"Sensor电压",
 	//		"BB电压",

+ 1 - 1
backend/src/dashoo.cn/qatoolsweb/views/admin/datareport/index.tpl

@@ -49,7 +49,7 @@
 <th style="width:60px;">氧气/%</th>
 <th style="width:75px;">二氧化碳/‰</th>
 <th style="width:75px;">电器功率/w</th>
-<th style="width:75px;">电/v</th>
+<th style="width:75px;">电/v</th>
 <th style="width:60px;">信号强度</th>
 <th style="width:75px;">Sensor电压</th>
 <th style="width:60px;">BB电压</th>

File diff suppressed because it is too large
+ 240 - 237
frontend_web/package-lock.json


BIN
frontend_web/src/assets/images/4.png


BIN
frontend_web/src/assets/images/off.png


BIN
frontend_web/src/assets/images/on.png


+ 7 - 7
frontend_web/src/assets/locales/zh.json

@@ -90,8 +90,8 @@
     "wind": "风速 m/s",
     "pressure": " 气压 hpa",
     "power": "功率 W",
-    "electric": "电 V",
-    "Voltage": "电 ",
+    "electric": "电 V",
+    "Voltage": "电 ",
     "Update": "更新时间 :"
   },
   "usersetting":{
@@ -138,7 +138,7 @@
     "wind": "风速:",
     "pressure": "气压 :",
     "power": "功率:",
-    "electric": "电:",
+    "electric": "电:",
     "co2": "二氧化碳:",
     "level": "液位 :",
     "doorlock": "门禁 :",
@@ -153,7 +153,7 @@
     "signal": "传感器信号"
   },
   "equipment":{
-    "electric": "电断电",
+    "electric": "电断电",
     "Voltage": "电压 ",
     "New": "新增设备",
     "Batch": "批量操作",
@@ -412,7 +412,7 @@
     "c2h2": "乙炔",
     "cl2": "氯气",
     "o3": "臭氧",
-    "electrical": "电",
+    "electrical": "电",
     "level": "液位 ",
     "Triggering": "触发条件",
     "Alarm": "报警策略 ",
@@ -442,7 +442,7 @@
     "on": "上",
     "in": "下",
     "under": "中",
-    "Please": "请输入传感器序列号",
+    "Please": "请输入传感器序列号1",
     "name": "请输入设备名称!",
     "sensor": "传感器名称"
   },
@@ -473,7 +473,7 @@
     "first": "请先选择复制模板!",
     "ddd": "请选择目标设备!",
     "eee": "确定执行报警复制操作吗, 是否继续?",
-    "supply": "电"
+    "supply": "电"
   },
   "login":{
     "Login": "登录",

+ 2 - 0
frontend_web/src/assets/styles/modules/global.scss

@@ -62,6 +62,8 @@ body {
   > .main {
     display: flex;
     flex: 1;
+    height: calc(100vh - 80px);
+    overflow-y: auto;
 
     > .content {
       flex: 1;

+ 1 - 1
frontend_web/src/components/devices/equipment_dialog.vue

@@ -136,7 +136,7 @@ export default {
       }
     }
     return {
-      remoteurl: 'http://47.92.238.200:18015',
+      remoteurl: 'http://47.92.238.200:8081',
       channelnametemp: '', // 传感器名字,临时变量,点击快捷选择标签时使用
       equipmentstate: '1', // 设备状态,form字段中需要类型是int,下拉框需要string,所以另外定义了此字段
       update: true,

+ 81 - 6
frontend_web/src/components/timelinechart.vue

@@ -5,6 +5,7 @@
 
 <script>
 import highstock from 'highcharts/highstock'
+import highcharts from 'highcharts'
 export default {
   name: 'TimeLineChart',
   props: {
@@ -18,6 +19,27 @@ export default {
       target: undefined
     }
   },
+   methods: {
+    dateFormat(fmt, date) {
+     let ret
+     const opt = {
+        'Y+': date.getFullYear().toString(),        // 年
+        'm+': (date.getMonth() + 1).toString(),     // 月
+        'd+': date.getDate().toString(),            // 日
+        'H+': date.getHours().toString(),           // 时
+        'M+': date.getMinutes().toString(),         // 分
+        'S+': date.getSeconds().toString()          // 秒
+        // 有其他格式化字符需求可以继续添加,必须转化成字符串
+    }
+    for (let k in opt) {
+        ret = new RegExp('(' + k + ')').exec(fmt)
+        if (ret) {
+            fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
+        }
+    }
+    return fmt
+}
+   },
   mounted() {
     let _this = this
     let _yaxis = []
@@ -55,14 +77,32 @@ export default {
         text: 'dashoo'
       },
       xAxis: {
+        minorTickColor: '#F0041A',
         tickPixelInterval: 200,
         type: 'date',
         labels: {
           formatter: function () {
             var vDate = new Date(this.value)
-            vDate.setHours(vDate.getHours())
-            vDate.setMonth(vDate.getMonth())
-            return vDate.getFullYear() + '-' + (vDate.getMonth() + 1) + '-' + vDate.getDate() + ' ' + vDate.getHours() + ':' + vDate.getMinutes() + ':' + vDate.getSeconds()
+             // return vDate.getFullYear() + '-' + (vDate.getMonth() + 1) + '-' + vDate.getDate() + ' ' + vDate.getHours() + ':' + vDate.getMinutes()
+            let fmt = 'YYYY-mm-dd HH:MM'
+          let ret
+             const opt = {
+            'Y+': vDate.getFullYear().toString(),        // 年
+        'm+': (vDate.getMonth() + 1).toString(),     // 月
+        'd+': vDate.getDate().toString(),            // 日
+        'H+': vDate.getHours().toString(),           // 时
+        'M+': vDate.getMinutes().toString(),         // 分
+        'S+': vDate.getSeconds().toString()          // 秒
+        // 有其他格式化字符需求可以继续添加,必须转化成字符串
+    }
+    for (let k in opt) {
+        ret = new RegExp('(' + k + ')').exec(fmt)
+        if (ret) {
+            fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
+        }
+    }
+    return fmt
+          //  return this.dateFormat('YYYY-mm-dd HH:MM', vDate)
           },
           align: 'center'
         }
@@ -72,15 +112,49 @@ export default {
         formatter: function () {
           if (typeof this.series === 'undefined') {
             let vDate = new Date(this.x)
-            let xypointstr = vDate.getFullYear() + '-' + (vDate.getMonth() + 1) + '-' + vDate.getDate() + ' ' + vDate.getHours() + ':' + vDate.getMinutes() + ':' + vDate.getSeconds()
-            let s = '<b>' + xypointstr + '</b>'
+            let fmt = 'YYYY-mm-dd HH:MM'
+          let ret
+             const opt = {
+            'Y+': vDate.getFullYear().toString(),        // 年
+        'm+': (vDate.getMonth() + 1).toString(),     // 月
+        'd+': vDate.getDate().toString(),            // 日
+        'H+': vDate.getHours().toString(),           // 时
+        'M+': vDate.getMinutes().toString(),         // 分
+        'S+': vDate.getSeconds().toString()          // 秒
+        // 有其他格式化字符需求可以继续添加,必须转化成字符串
+    }
+    for (let k in opt) {
+        ret = new RegExp('(' + k + ')').exec(fmt)
+        if (ret) {
+            fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
+        }
+    }
+           let xypointstr = fmt
+          let s = '<b>' + xypointstr + '</b>'
             this.points.forEach((point, k) => {
               s += '<br/><span style="color:' + point.color + '">' + window.getchartsname(k) + '</span>:<b>' + Math.round(point.y * 100) / 100 + ' </b><br/>'
             })
             return s
           } else {
             let vDate = new Date(this.x)
-            let xypointstr = vDate.getFullYear() + '-' + (vDate.getMonth() + 1) + '-' + vDate.getDate() + ' ' + vDate.getHours() + ':' + vDate.getMinutes() + ':' + vDate.getSeconds()
+             let fmt = 'YYYY-mm-dd HH:MM'
+          let ret
+             const opt = {
+            'Y+': vDate.getFullYear().toString(),        // 年
+        'm+': (vDate.getMonth() + 1).toString(),     // 月
+        'd+': vDate.getDate().toString(),            // 日
+        'H+': vDate.getHours().toString(),           // 时
+        'M+': vDate.getMinutes().toString(),         // 分
+        'S+': vDate.getSeconds().toString()          // 秒
+        // 有其他格式化字符需求可以继续添加,必须转化成字符串
+    }
+    for (let k in opt) {
+        ret = new RegExp('(' + k + ')').exec(fmt)
+        if (ret) {
+            fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
+        }
+    }
+           let xypointstr = fmt
             let s = '<b>' + xypointstr + '</b>'
             return s
           }
@@ -97,6 +171,7 @@ export default {
         enabled: false
       }
     })
+    highcharts.setOptions({ global: { useUTC: false } })
   },
   beforeDestroy() {
     this.target.destroy()

+ 7 - 0
frontend_web/src/libraries/router/main-routes.js

@@ -220,6 +220,13 @@ export default [
     path: 'icons',
     meta: { requiresAuth: true },
     component: resolve => require.ensure([], () => resolve(require('views/main/icons')), 'icons')
+  },
+   // - 异常报警信息
+   {
+    name: 'record_history',
+    path: 'record_history',
+    meta: { requiresAuth: true },
+    component: resolve => require.ensure([], () => resolve(require('views/main/record_history')), 'record_history')
   }
 ].concat(demo)
 

+ 2 - 2
frontend_web/src/libraries/store/state.js

@@ -158,8 +158,8 @@ const state = {
           // { text: '常规', name: 'options', params: { type: 'general' } },
           // { divider: true },
           { text: '异常提醒', name: 'abnormalsetting' },
-          { text: '异常历史', name: 'abnormalmsg' },
-          { text: '访问授权', name: 'authcodeman' }
+          { text: '异常历史', name: 'abnormalmsg' }
+          // { text: '访问授权', name: 'authcodeman' }
         ]
       },
       {

+ 1 - 0
frontend_web/src/libraries/utils/axios.js

@@ -15,6 +15,7 @@ const instance = axios.create({
   // // TODO: full base url
       //  baseURL: '//localhost:8081/api/', // 本地测试
         baseURL: '//47.92.238.200:8081/api/', // labsop 发布
+        // baseURL: '//47.105.138.102:8081/api/', // xiaowei 发布
     // baseURL: '//47.92.238.200:8081/api/', // labsop 老服务器发布
   // baseURL: '//47.92.238.200:18015/api/', // 369yun 发布
   timeout: 60000,

+ 13 - 10
frontend_web/src/views/login.vue

@@ -3,10 +3,10 @@
     <header>
       <a href="/" class="nav-logo leftpadding" alt="egg"><img src="../assets/logo.png" style="height:55px;"></a>
       <ul class="nav-item">
-        <li><a href="http://www.dashoo.cn/fangan/mcs1.html" alt="其他">解决方案</a></li>
+        <!-- <li><a href="http://www.dashoo.cn/fangan/mcs1.html" alt="其他">解决方案</a></li>
         <li><a href="http://www.dashoo.cn/product/" alt="介绍">产品中心</a></li>
         <li><a href="http://www.dashoo.cn/ruanjian/mcs2.html" alt="API">软件产品</a></li>
-        <li><a href="http://www.dashoo.cn/dashunews/" alt="其他">新闻资讯</a></li>
+        <li><a href="http://www.dashoo.cn/dashunews/" alt="其他">新闻资讯</a></li> -->
         <li>
         <li class="translations">
           <!-- <a class="nav-link">切换语言</a> -->
@@ -51,16 +51,16 @@
           <el-col :span="10">
             <div>
               <el-row class="coptright">
-                <a href="http://www.dashoo.cn/dashu/company1.html" target="_blank">公司简介</a>
+                <a href="http://www.dashoo.cn/index.html" target="_blank">关于我们</a>
                 <a>|</a>
-                <a href="http://www.dashoo.cn/industry/" target="_blank">行业资讯</a>
+                <a href="http://www.dashoo.cn/fangan/mcs1.html" target="_blank">产品中心</a>
                <a>|</a>
-                <a href="http://www.dashoo.cn/dashu/customer5.html" target="_blank">合作客户</a>
-                 <a>|</a>
-                <a href="http://www.dashoo.cn/dashu/contact4.html" target="_blank">联系我们</a>
+                <a href="https://www.yuque.com/docs/share/f372faa1-b1b7-4dc1-9c70-631f836172c3?# 《隐私政策》" target="_blank">免责声明</a>
+                 <!-- <a>|</a>
+                <a href="http://www.dashoo.cn/dashu/contact4.html" target="_blank">联系我们</a> -->
               </el-row>
               <el-row>
-                <div class="license">青岛大数华创科技有限公司版权所有 Coptright @ 2019 DASHOO.</div>
+                <div class="license">青岛大数华创科技有限公司版权所有 Coptright @ 2020 DASHOO.</div>
               </el-row>
             </div>
           </el-col>
@@ -112,6 +112,7 @@
     methods: {
       handleLogin(ref) {
         // form validate
+        console.log('------11111111111--------')
         this.$refs[ref].validate(valid => {
           if (!valid) return false
           let _this = this
@@ -119,8 +120,10 @@
           this.error = null
           this.loading = true
           // create token from remote
+           console.log('------22222222-------')
           _this.$store.dispatch('createToken', this.model)
             .then(token => {
+              console.log('-----asdasd-----33333333---')
               _this.$store.dispatch('getCurrentUser')
                 .then(token => {
                   _this.$router.replace({
@@ -143,7 +146,7 @@
               }
               switch (err.response && err.response.status) {
                 case 401:
-                  this.error.message = this.$t('message.login.wrong')
+                  this.$message.error('用户认证错误,请检查用户名或密码')
                   break
                 case 500:
                   this.error.message = this.$t('message.login.later')
@@ -196,7 +199,7 @@
   }
 
   .coptright a {
-    margin-left: 3px;
+    margin-left: 20px;
   }
 
   .nav ul.nav-item a {

+ 5 - 2
frontend_web/src/views/main/abnormalmsg.vue

@@ -11,9 +11,12 @@
         <el-option :label="$t('message.abnormalsetting.battery')" value="box_low"></el-option>
         <el-option  :label="$t('message.abnormalsetting.Gateway')" value="box_offline"></el-option>
       </el-select>
+    <div  style="margin-left:10px;">
       {{ $t('message.abnormalsetting.Time') }}
+      </div>
       <el-date-picker
         v-model="seachform.timerange"
+        style="margin-left:10px;"
         type="datetimerange"
         clearable="true"
         :placeholder="$t('message.abnormalsetting.Select')">
@@ -22,12 +25,12 @@
         <input v-model="seachform.channel"  :placeholder="$t('message.abnormalsetting.device')" style="width:150px;">
       </div>
       <el-button type="primary" size="small" icon="search" @click="seachdata">{{$t('message.users.search')}}</el-button>
-      <el-button type="primary" size="small" icon="delete2" @click="batchdata" style="margin-left:0px;">  {{ $t('message.abnormalsetting.selected') }}</el-button>
+      <el-button type="primary" size="small" icon="delete2" @click="batchdata" style="margin-left:10px;">  {{ $t('message.abnormalsetting.selected') }}</el-button>
     </div>
     <el-table :data="list" @selection-change="handleSelectionChange">
       <el-table-column
       type="selection"
-      width="40"></el-table-column>
+      width="60"></el-table-column>
       <el-table-column :label="$t('message.abnormalsetting.type')" width="150" show-overflow-tooltip>
         <template scope="scope">
           <el-tag type="success" v-if="scope.row.eventfiled === 'sensor_abnormal'">{{ $t('message.abnormalsetting.offline') }}</el-tag>

+ 3 - 3
frontend_web/src/views/main/authcodeman.vue

@@ -2,9 +2,9 @@
   <div class="page">
     <el-row>
       <el-col :span="12">
-        <el-form :model="authform" label-width="200px">
-          <el-form-item label="API Key :" prop="pass" required>
-            <el-input v-model="authform.authcode" auto-complete="off"></el-input>
+        <el-form :model="authform" :rules="addnewrules" label-width="200px">
+          <el-form-item label="API Key :"  required >
+            <el-input v-model="authform.authcode"  auto-complete="off"></el-input>
           </el-form-item>
           <el-form-item>
             <el-button type="primary" @click="submitForm()">{{ $t('message.abnormalsetting.regenerate') }}</el-button>

+ 2 - 2
frontend_web/src/views/main/devicechart.vue

@@ -201,8 +201,8 @@
             } else if (this.contains(this.itempower, this.dataitem)) {
               this.c = this.$t('message.management.power')
               this.d = this.$t('message.index.Voltage')
-              this.lastdata = this.c + `【${res.data.Power} ℃ 】` + this.d + `【${res.data.Supply} % 】`
-              // this.lastdata = `功率 【${res.data.Power} ℃ 】 电  【${res.data.Supply} % 】`
+              this.lastdata = this.c + `【${res.data.Power} W 】` + this.d + `【${res.data.Supply} V 】`
+              // this.lastdata = `功率 【${res.data.Power} ℃ 】 电  【${res.data.Supply} % 】`
             } else if (this.contains(this.itemliquidLevel, this.dataitem)) {
                 this.a = this.$t('message.equipment.Temperature')
               this.e = this.$t('message.management.level')

+ 1 - 1
frontend_web/src/views/main/devicechart.vue.orig

@@ -202,7 +202,7 @@
               this.c = this.$t('message.management.power')
               this.d = this.$t('message.index.Voltage')
               this.lastdata = this.c + `【${res.data.Power} ℃ 】` + this.d + `【${res.data.Supply} % 】`
-              // this.lastdata = `功率 【${res.data.Power} ℃ 】 电  【${res.data.Supply} % 】`
+              // this.lastdata = `功率 【${res.data.Power} ℃ 】 电  【${res.data.Supply} % 】`
             } else if (this.contains(this.itemliquidLevel, this.dataitem)) {
                 this.a = this.$t('message.equipment.Temperature')
               this.e = this.$t('message.management.level')

+ 2 - 2
frontend_web/src/views/main/devicechart1.vue

@@ -126,7 +126,7 @@
             name: '功率',
             unit: 'W'
           }, {
-            name: '电',
+            name: '电',
             unit: 'V'
           }]
         } else if (this.contains(this.itemliquidLevel, this.dataitem)) {
@@ -194,7 +194,7 @@
             } else if (this.contains(this.itemco2, this.dataitem)) {
               this.lastdata = `温度 【${res.data.Temp} ℃ 】 湿度  【${res.data.Hum} % 】  CO2  【${res.data.Co2} % 】`
             } else if (this.contains(this.itempower, this.dataitem)) {
-              this.lastdata = `功率 【${res.data.Power} ℃ 】 电  【${res.data.Supply} % 】`
+              this.lastdata = `功率 【${res.data.Power} ℃ 】 电  【${res.data.Supply} % 】`
             } else if (this.contains(this.itemliquidLevel, this.dataitem)) {
               this.lastdata = `温度 【${res.data.Temp} ℃ 】 液位  【${res.data.LiquidLevel} mm 】`
             } else if (this.contains(this.itemo2_17, this.dataitem)) {

+ 37 - 22
frontend_web/src/views/main/devicegps.vue

@@ -1,11 +1,10 @@
 <template>
-  <div>
-    <div style="margin-bottom:10px;">
-      <el-row>
+  <div class="amap-page-container">
+     <el-row>
         <el-col :span="12">
           <div>
             时间范围:
-            <el-date-picker v-model="timerange" type="datetimerange" clearable=true placeholder="选择时间范围">
+            <el-date-picker v-model="timerange" type="datetimerange" :clearable="true" placeholder="选择时间范围">
             </el-date-picker>
           </div>
         </el-col>
@@ -16,14 +15,16 @@
           <el-button type="primary" size="small" icon="search" @click="initData">查询</el-button>
         </el-col>
       </el-row>
-    </div>
-    <div id="content">
-      <el-amap vid="amap" :amap-manager="amapManager" :center="center" :zoom="zoom" :plugin="plugin" style="height:550px">
-        <el-amap-marker v-for="(marker, index) in markers" :position="marker.position" :content="marker.content" :events="marker.events"
-          :visible="marker.visible" :draggable="marker.draggable" :vid="index" @click="markerClick(marker)"></el-amap-marker>
+      <el-amap vid="amap" :zoom="zoom" :center="center" class="amap-demo">
+        <el-amap-polyline :editable="false"  :path="pathpath" ></el-amap-polyline>
+          <el-amap-marker v-for="(marker, index) in markers" :position="marker.position" :content="marker.content" :events="marker.events"
+          :visible="marker.visible" :draggable="marker.draggable"  :key="marker" :vid="index" @click="markerClick(marker)"></el-amap-marker>
       </el-amap>
+
+      <div class="toolbar">
+        <button type="button" name="button" v-on:click="changeEditable">change editable</button>
+      </div>
     </div>
-  </div>
 </template>
 <script>
   import Vue from 'vue'
@@ -34,12 +35,18 @@
     name: 'devicegps',
     data() {
       return {
+        polyline: {
+            path: [[120.430397, 36.324684], [120.418746, 36.196159], [120.449142, 36.114631]],
+            events: {
+            },
+            editable: false
+          },
         visible: false,
         serial: '',
         dataitem: '0',
-        center: [121.59996, 31.197646],
-        zoom: 12,
-        timerange: [new Date(new Date() - 3600 * 1000), new Date()],
+        center: [120.430397, 36.324684],
+        zoom: 11,
+        timerange: [new Date(new Date() - 13600 * 1000), new Date()],
         pointmsg: '',
         amapManager,
         plugin: [{
@@ -50,7 +57,8 @@
             }
           }
         }],
-        markers: []
+        markers: [],
+        pathpath: []
       }
     },
 
@@ -69,6 +77,9 @@
       this.initData()
     },
     methods: {
+       changeEditable() {
+          this.polyline.editable = !this.polyline.editable
+        },
       open7() {
         this.$notify({
           title: '自定义位置',
@@ -87,7 +98,6 @@
           .then(res => {
             // response
             var data = res.data
-            console.log('------data-------', data)
             this.draemap(data)
           })
           .catch(err => {
@@ -96,8 +106,10 @@
           })
       },
       draemap(arraygpsdata) {
-        let o = amapManager.getMap()
-        o.clearMap()
+        // let o = amapManager.getMap()
+        let _this = this
+        _this.pathpath = []
+        _this.markers = []
         //  let lineArr = []
         let totalpoint = arraygpsdata.length
         // var infoWindow = new AMap.InfoWindow({ offset: new AMap.Pixel(0, -30)})
@@ -120,18 +132,21 @@
                 var s = date.getSeconds()
                 let timestring = Y + M + D + h + m + s
                 //  alert('时间:' + timestring + '温度:' + arraygpsdata[i][3] + '湿度:' + arraygpsdata[i][4])
-                this.$message({
+                _this.$message({
                   message: '时间:' + timestring + '温度:' + arraygpsdata[i][3] + '湿度:' + arraygpsdata[i][4],
                   center: true
                })
               }
             }
           }
-           this.center = [arraygpsdata[0][2], arraygpsdata[0][1]]
-          this.markers.push(marker)
-          console.log('------------------------', marker)
+          _this.center = [arraygpsdata[0][2], arraygpsdata[0][1]]
+          _this.markers.push(marker)
+          let path1 = [arraygpsdata[i][2], arraygpsdata[i][1]]
+          this.pathpath.push(path1)
         }
-        this.pointmsg = `数据点:${totalpoint}    有效数据点:${totalpoint}`
+        // this.polyline.pathpath = [[120.430397, 36.324684], [120.418746, 36.196159], [120.449142, 36.114631]]
+        // console.log('------this.polyline.path----', this.polyline.path)
+        _this.pointmsg = `数据点:${totalpoint}    有效数据点:${totalpoint}`
       }
     },
     // https://router.vuejs.org/zh-cn/essentials/dynamic-matching.html#响应路由参数的变化

+ 2 - 2
frontend_web/src/views/main/devices.vue

@@ -98,7 +98,7 @@
               </el-col>
               <el-col :span="6" v-if="contains(havesupply,v.DataItem)">
                 <div class="grid-content contentvolt">
-                  电 V
+                  电 V
                   <hr class="contenthr" />
                   {{v.Supply}}
                 </div>
@@ -143,7 +143,7 @@
             <p v-if="scope.row.Trigger.column === 'o2'">O2 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
             <p v-if="scope.row.Trigger.column === 'voltage'">电压 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
             <p v-if="scope.row.Trigger.column === 'electricalpower'">功率 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
-            <p v-if="scope.row.Trigger.column === 'electricalsupply'">电断电</p>
+            <p v-if="scope.row.Trigger.column === 'electricalsupply'">电断电</p>
             <p v-if="scope.row.Trigger.column === 'liquidlevel'">液位 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
           </template>
         </el-table-column>

+ 221 - 97
frontend_web/src/views/main/equipment.vue

@@ -1,5 +1,5 @@
 <template>
-  <div>
+  <div style="min-width:1395px">
     <div class="heading">
       <div class="search icon-before icon-search">
         <el-cascader :options="orgtreelist" :props="orgtreeprops" clearable change-on-select :show-all-levels="false" v-model="selectedorg"
@@ -15,221 +15,285 @@
     </div>
     <p style="text-align:center" v-show="isnodata">{{ $t('message.nodata') }}</p>
     <el-row>
-      <el-col :span="6" v-for="(v, index) in equipmentlist" style="min-width:240px;">
-        <el-card style="margin:5px;min-width:240px;">
-          <div slot="header" style="font-weight: 800; font-size: 14px; height:17px;">
-            <div style="float: left;height:23px;overflow:hidden;width:70%" :title="v.Equipment.Code">{{v.Equipment.Code}}</div>
+      <el-col :span="8" v-for="(v, index) in equipmentlist" style="min-width:220px;">
+        <el-card style="margin:5px;min-width:220px;border-radius:10px;">
+          <div slot="header" style="font-weight: 800; font-size: 14px;height:17px;">
+            <div style="float: left;height:23px;overflow:hidden;width:70%" :title="v.Equipment.Code">设备名:&nbsp;{{v.Equipment.Code}}</div>
             <el-button-group style="float: right">
               <template v-if="permission_auth.edit">
-                <el-button :title="$t('message.equipment.edit')" type="primary" size="mini" @click="opendeitquipmentDialog(v.Equipment, index)">
-                  <i class="icon icon-pencil" style="height:12px;"></i>
+                <el-button :title="$t('message.equipment.edit')"  size="mini" @click="opendeitquipmentDialog(v.Equipment, index)">
+                  <i class="icon icon-pencil"  style="height:12px;color:#2b3b49"></i>
                 </el-button>
               </template>
               <template v-if="permission_auth.add">
-                <el-button :title="$t('message.equipment.Delete')" type="primary" size="mini" @click="deleteEquipment(v.Equipment.Id, index, v.Equipment.CSerial)">
-                  <i class="icon icon-bin" style="height:12px;"></i>
+                <el-button :title="$t('message.equipment.Delete')"  size="mini" @click="deleteEquipment(v.Equipment.Id, index, v.Equipment.CSerial)">
+                  <i class="icon icon-bin" style="height:12px;;color:#2b3b49"></i>
                 </el-button>
               </template>
               <template v-if="permission_auth.addchannel">
-                <el-button :title="$t('message.equipment.sensor')" type="primary" size="mini" @click="newChannel(v.Equipment.Id, v.Equipment.Code)">
-                  <i class="icon icon-eye-plus" style="height:12px;"></i>
+                <el-button :title="$t('message.equipment.sensor')"  size="mini" @click="newChannel(v.Equipment.Id, v.Equipment.Code)">
+                  <i class="icon icon-eye-plus" style="height:12px;;color:#2b3b49"></i>
                 </el-button>
               </template>
             </el-button-group>
+            <!-- <el-dropdown size="mini" split-button type="primary">
+                  操作
+                  <el-dropdown-menu slot="dropdown" style="color:black">
+                    <el-dropdown-item>编辑设备</el-dropdown-item>
+                    <el-dropdown-item>删除设备</el-dropdown-item>
+                    <el-dropdown-item>添加传感器</el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown> -->
           </div>
           <el-row style="margin-top:-10px;">
-            <el-col :span="15">
+               <el-col :span="6" style="padding:10px;">
+              <img :src="remoteurl+v.Equipment.Photo" style="width: 100%;">
+            </el-col>
+            <el-col :span="18" style="padding:0px 0px 0px 35px">
               <p class="devplab" :title="v.Equipment.Brands">{{ $t('message.equipment.Brand') }}:{{v.Equipment.Brands}}</p>
               <p class="devplab" style="height:17px;overflow:hidden;white-space:nowrap;" :title="v.Equipment.DModel">{{ $t('message.equipment.model') }}:{{v.Equipment.DModel}}</p>
-              <p class="devplab" style="height:17px;overflow:hidden;" :title="v.Equipment.OrganizeName">{{ $t('message.sgmanage.OrganizeName') }}:{{v.Equipment.OrganizeName}}</p>
-              <p class="devplab">{{ $t('message.equipment.Device') }}:
+               <p class="devplab">{{ $t('message.equipment.Device') }}:
                 <el-tag type="success" v-if="v.Equipment.DeviceState === 1">{{ $t('message.management.normal') }}</el-tag>
                 <el-tag v-if="v.Equipment.DeviceState === 2">{{ $t('message.triggerinfos.service') }}</el-tag>
                 <el-tag v-if="v.Equipment.DeviceState === 3">{{ $t('message.equipment.Disable') }}</el-tag>
                 <el-tag v-if="v.Equipment.DeviceState === 4">{{ $t('message.triggerinfos.Defrost') }}</el-tag>
               </p>
-            </el-col>
-            <el-col :span="9">
-              <img :src="remoteurl+v.Equipment.Photo" style="width: 110%;">
+              <p class="devplab" style="height:17px;overflow:hidden;" :title="v.Equipment.OrganizeName">{{ $t('message.sgmanage.OrganizeName') }}:{{v.Equipment.OrganizeName}}</p>
             </el-col>
           </el-row>
-          <el-carousel indicator-position="none" :interval="5000" :autoplay="true" height="250px">
+          <el-carousel indicator-position="none" :interval="5000" :autoplay="true" height="270px">
             <el-carousel-item v-for="(item, carouselindex) in v.ChannelLats">
-              <div style="font-size: 14px; font-weight: 800;height:18px;overflow:hidden;">
-                <router-link :to="'/devices/chart/'+item.Serial+'_'+item.DataItem+'?xn='+item.Title">
-                  <div style="float: left;width:75%;color:#24313C" :title="item.Title">{{item.Title}}</div>
-                </router-link>
-                <div style="float: right">
-                  <i class="icon icon-stop2" style="color:#FF4949;" v-if="item.DState === 2" :title="$t('message.index.offline')"></i>
-                  <i class="icon icon-stop2" style="color:#7FFF00;" v-if="item.DState === 1" :title="$t('message.index.online')"></i>
+             <el-row>
+               <el-col :span="16" >
+              <div style="font-size: 14px; font-weight: 600;height:18px;">
+                  <div style="float: left;width:75%;color:#24313C" :title="item.Title">传感器:&nbsp;{{item.Title}}</div>
+              </div>
+              </el-col>
+              <el-col :span="8" >
+               <div style="float: right">
+                  <!-- <i class="icon icon-stop2" style="color:#FF4949;" v-if="item.DState === 2" :title="$t('message.index.offline')"></i>
+                  <i class="icon icon-stop2" style="color:#7FFF00;" v-if="item.DState === 1" :title="$t('message.index.online')"></i> -->
                   <router-link :to="'/devices/chart/'+item.Serial+'_'+item.DataItem+'?xn='+item.Title+'&ma='+v.Equipment.MaxValue+'&mi='+v.Equipment.MinValue">
-                    <i class="icon icon-stats-dots chartico" style="margin:0" :title="$t('message.equipment.curve')"></i>
+                    <a>数据曲线</a>
+                    <!-- <i class="icon icon-stats-dots chartico" style="margin:0" :title="$t('message.equipment.curve')"></i> -->
+                  </router-link>
+                    <b>|</b>
+                  <router-link v-if="item.DataItem !== '31'"  :to="'/devices/gps/'+item.Serial+'_'+item.DataItem" >
+                  <!-- v-if="contains(havegps,item.DataItem)" -->
+                     <a>路线轨迹</a>
+                    <!-- <i class="icon icon-location2 chartico" style="margin:0" :title="$t('message.equipment.Map')"></i> -->
                   </router-link>
-                  <router-link :to="'/devices/gps/'+item.Serial+'_'+item.DataItem" >
+                  <router-link v-if="item.DataItem === '31'"  :to="'/record_history?code='+item.Serial" >
                   <!-- v-if="contains(havegps,item.DataItem)" -->
-                    <i class="icon icon-location2 chartico" style="margin:0" :title="$t('message.equipment.Map')"></i>
+                     <a>开锁记录</a>
+                    <!-- <i class="icon icon-location2 chartico" style="margin:0" :title="$t('message.equipment.Map')"></i> -->
                   </router-link>
                 </div>
-              </div>
-              <el-row :gutter="2" style="margin-top:5px; margin-left: 1px">
+                </el-col>
+                </el-row>
+              <el-row  style="max-width:412px">
                 <el-col :span="8" v-if="contains(havetemp,item.DataItem)">
-                  <div class="grid-content contenttemp">
+               <div class="indgrid-content temperaturecolcor" >
                   {{ $t('message.index.temperature') }}
-                    <hr class="contenthr" /> {{item.Temp}}
-                  </div>
+                  <!-- <hr class="indcontenthr" /> -->
+                  <div class="indata" >{{item.Temp}}</div>
+                </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(havehum,item.DataItem)">
-                  <div class="grid-content contenthum">
+                <div class="indgrid-content contenthum" >
                      {{ $t('message.index.humidity') }}
-                    <hr class="contenthr" /> {{item.Hum}}
+                  <!-- <hr class="indcontenthr" /> -->
+                  <div class="indata">{{item.Hum}}</div>
+                </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(doorlock,item.DataItem)">
+                  <div class="indgrid-content doorlock">
+                   门禁
+                      <div class="indata">{{item.Doorlock}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(haveo2,item.DataItem)">
                   <div class="grid-content contento2">
                     O2 %
-                    <hr class="contenthr" /> {{item.O2}}
+                       <div class="indata">{{item.O2}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(haveco2,item.DataItem)">
                   <div class="grid-content contento2">
                     CO2 %
-                    <hr class="contenthr" /> {{item.Co2}}
+                      <div class="indata">{{item.Co2}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(windspeed,item.DataItem)">
-                  <div class="grid-content contentwindspeed">
+                  <div class="grid-content contento2">
                   {{ $t('message.index.wind') }}
-                    <hr class="contenthr" /> {{item.WindSpeed}}
+                      <div class="indata">{{item.WindSpeed}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(ots,item.DataItem)">
-                  <div class="grid-content contentpressure">
-                   Pa
-                    <hr class="contenthr" /> {{item.Ots}}
-                  </div>
-                </el-col>
-                  <el-col :span="8" v-if="contains(doorlock,item.DataItem)">
                   <div class="grid-content contento2">
-                   门禁
-                    <hr class="contenthr" /> {{item.Doorlock}}
+                   Pa
+                    <div class="indata">{{item.Ots}}</div>
                   </div>
                 </el-col>
                  <el-col :span="8" v-if="contains(displacement,item.DataItem)">
-                  <div class="grid-content contentpressure">
+                  <div class="grid-content contento2">
                    Pa
-                    <hr class="contenthr" /> {{item.Displacement}}
+                     <div class="indata">{{item.Displacement}}</div>
                   </div>
                 </el-col>
                  <el-col :span="8" v-if="contains(pressure,item.DataItem)">
-                  <div class="grid-content contentpressure">
+                  <div class="grid-content contento2">
                    {{ $t('message.index.pressure') }}
-                    <hr class="contenthr" /> {{item.Pressure}}
+                    <div class="indata">{{item.Pressure}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(clo2,item.DataItem)">
                   <div class="grid-content contento2">
                     ClO2
-                    <hr class="contenthr" /> {{item.ClO2}}
+                      <div class="indata">{{item.ClO2}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(h2o,item.DataItem)">
                   <div class="grid-content contento2">
                     us/cm
-                    <hr class="contenthr" /> {{item.H2O}}
+                      <div class="indata">{{item.H2O}}</div>
                   </div>
                 </el-col>
                  <el-col :span="8" v-if="contains(so2,item.DataItem)">
                   <div class="grid-content contento2">
-                    SO2 ppm
-                    <hr class="contenthr" /> {{item.SO2}}
+                    SO2
+                     <div class="indata">{{item.SO2}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(c2h4,item.DataItem)">
                   <div class="grid-content contento2">
                     C2H4
-                    <hr class="contenthr" /> {{item.C2H4}}
+                     <div class="indata">{{item.C2H4}}</div>
                   </div>
                 </el-col>
                  <el-col :span="8" v-if="contains(c2h2,item.DataItem)">
                   <div class="grid-content contento2">
                     C2H2
-                    <hr class="contenthr" /> {{item.C2H2}}
+                      <div class="indata">{{item.C2H2}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(cl2,item.DataItem)">
                   <div class="grid-content contento2">
                     Cl2
-                    <hr class="contenthr" /> {{item.Cl2}}
+                    <div class="indata">{{item.Cl2}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(o3,item.DataItem)">
                   <div class="grid-content contento2">
                     O3
-                    <hr class="contenthr" /> {{item.O3}}
+                     <div class="indata">{{item.O3}}</div>
                   </div>
                 </el-col>
                   <el-col :span="8" v-if="contains(tvoc,item.DataItem)">
                   <div class="grid-content contento2">
                     TVOC 
-                    <hr class="contenthr" /> {{item.TVOC}}
+                     <div class="indata">{{item.TVOC}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(havepower,item.DataItem)">
-                  <div class="grid-content contentpw">
+                  <div class="grid-content contento2">
                      {{ $t('message.index.power') }}
-                    <hr class="contenthr" /> {{item.Power}}
+                       <div class="indata">{{item.Power}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(havesupply,item.DataItem)">
-                  <div class="grid-content contentvolt">
+                  <div class="grid-content contento2">
                   {{ $t('message.index.electric') }}
-                    <hr class="contenthr" /> {{item.Supply}}
+                   <div class="indata">{{item.Supply}}</div>
                   </div>
                 </el-col>
                 <el-col :span="8" v-if="contains(haveliquidlevel,item.DataItem)">
                   <div class="grid-content contento2">
                   {{ $t('message.equipment.level') }}
-                    <hr class="contenthr" /> {{item.LiquidLevel}}
+                    <div class="indata">{{item.LiquidLevel}}</div>
                   </div>
                 </el-col>
                  <el-col :span="5" v-if="contains(wuyuansu,item.DataItem)">
                   <div class="grid-content contento2">
                   顶部温度
-                    <hr class="contenthr" /> {{item.Temp}}
+                   <div class="indata">{{item.Temp}}</div>
                   </div>
                 </el-col>
                  <el-col :span="5" v-if="contains(wuyuansu,item.DataItem)">
                   <div class="grid-content contento2">
                    底部温度
-                    <hr class="contenthr" /> {{item.ThreeACVA}}
+                     <div class="indata">{{item.ThreeACVA}}</div>
                   </div>
                 </el-col>
                  <el-col :span="5" v-if="contains(wuyuansu,item.DataItem)">
-                  <div class="grid-content contentwindspeed">
+                  <div class="grid-content contento2">
                   液位
-                    <hr class="contenthr" /> {{item.ThreeACVB}}
+                   <div class="indata">{{item.ThreeACVB}}</div>
                   </div>
                 </el-col>
                  <el-col :span="4" v-if="contains(wuyuansu,item.DataItem)">
                     <div class="grid-content contento2">
                   腔内温度
-                    <hr class="contenthr" /> {{item.ThreeACVC}}
+                   <div class="indata">{{item.ThreeACVC}}</div>
                   </div>
                 </el-col>
                  <el-col :span="5" v-if="contains(wuyuansu,item.DataItem)">
                   <div class="grid-content contenthum">
                   腔内湿度
-                    <hr class="contenthr" /> {{item.Hum}}
+                   <div class="indata">{{item.Hum}}</div>
                   </div>
                 </el-col>
               </el-row>
+              <el-row :gutter='5'>
+                 <el-col :span="12" style="margin-top:5px">
               <p v-if="item.Vol !=='0'" class="devplab">{{ $t('message.management.Sensor') }}:{{item.Vol}} V [ {{voltageinfo(item.Vol, item.DataItem)}} ]</p>
               <p v-if="item.Vol =='0'" class="devplab">{{ $t('message.management.Sensor') }}:12 V [ 正常 ]</p>
+             </el-col>
+              <el-col :span="12" style="margin-top:5px">
               <p class="devplab">{{ $t('message.management.number') }}:{{item.Serial}}</p>
-              <p v-if="item.Rssi !=='0'" class="devplab" style="height:15px;overflow:hidden;">{{ $t('message.management.signal') }}:{{item.Rssi}} [{{rssiinfo(item.Rssi)}}]&nbsp;&nbsp; {{ $t('message.equipment.internet') }}:{{item.Signal}} [{{signalinfo(item.Signal)}}]</p>
-              <p v-if="item.Rssi =='0'" class="devplab" style="height:15px;overflow:hidden;">{{ $t('message.management.signal') }}:-- [-]&nbsp;&nbsp; {{ $t('message.equipment.internet') }}:{{item.Signal}} [{{signalinfo(item.Signal)}}]</p>
-              <p class="devplab">{{ $t('message.equipment.Update') }}:{{item.Time}}</p>
-              <el-button-group>
+               </el-col>
+              <el-col :span="12" style="margin-top:-15px">
+              <p v-if="item.Rssi !=='0'" class="devplab" style="height:15px;overflow:hidden;">{{ $t('message.management.signal') }}:{{item.Rssi}} [{{rssiinfo(item.Rssi)}}]</p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-15px">
+              <p v-if="item.Rssi !=='0'" class="devplab" style="height:15px;overflow:hidden;"> {{ $t('message.equipment.internet') }}:{{item.Signal}} [{{signalinfo(item.Signal)}}]</p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-15px">
+              <p v-if="item.Rssi =='0'" class="devplab" style="height:15px;overflow:hidden;">{{ $t('message.management.signal') }}:-- [-] </p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-12px">
+              <p v-if="item.Rssi =='0'" class="devplab" style="height:15px;overflow:hidden;"> {{ $t('message.equipment.internet') }}:{{item.Signal}} [{{signalinfo(item.Signal)}}]</p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-12px;">
+              <p class="devplab" >{{ $t('message.equipment.Update') }}:{{item.Time}}</p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-15px">
+            <p class="devplab">传感器状态:
+                <el-tag type="success"  v-if="item.DState === 1">在线</el-tag>
+                <el-tag  type="danger" v-if="item.DState === 2">离线</el-tag>
+              </p>
+               </el-col>
+              </el-row>
+              <div> 
+              <el-row :gutter='5' style="margin-top:5px"> 
+                <el-col span="6">
+                    <el-button style="width:100%;color:#409EFF;font-weight:bold;background:#F7F7F7;" size="mini" @click="editChannel(item,index,carouselindex,v.Equipment.Code,v.Equipment.MaxValue,v.Equipment.MinValue )">{{ $t('message.edit') }}</el-button>
+                </el-col>
+                <el-col span="6">
+                   <el-button  style="width:100%;color:#F56C6C;font-weight:bold;background:#F7F7F7;" size="mini" @click="deletedata(item.Serial,index,v.Equipment.Code)">{{ $t('message.delete') }}</el-button>
+                </el-col>
+                <el-col span="6">
+                   <el-button  style="width:100%;color:#409EFF;font-weight:bold;background:#F7F7F7;" size="mini" @click="clickdropdown('new',item.Serial,item.DataItem,item.Title, index, carouselindex)">{{ $t('message.equipment.alarm') }}</el-button>
+                </el-col>
+                <el-col span="6">
+                    <el-button  style="width:100%;color:#F56C6C;font-weight:bold;background:#F7F7F7;" size="mini" @click="clickdropdown('list',item.Serial,item.DataItem,item.Title, index, carouselindex)">{{ $t('message.equipment.caveat') }}
+                    <span> [ {{item.TriggerCount}} ] </span>
+                  </el-button>
+                </el-col>
+              </el-row>
+              </div>
+              <!-- <el-button-group >
                 <template v-if="permission_auth.editchannel">
                   <el-button type="primary" size="mini" @click="editChannel(item,index,carouselindex,v.Equipment.Code,v.Equipment.MaxValue,v.Equipment.MinValue )">{{ $t('message.edit') }}</el-button>
                 </template>
@@ -247,9 +311,10 @@
                 <template v-if="permission_auth.calibration">
                   <el-button v-if="!contains(havepower,item.DataItem)" type="primary" size="mini" @click="clickdropdown('adju',item.Serial,item.DataItem,item.Title, -1, -1)">{{ $t('message.equipment.calibration') }}</el-button>
                 </template>
-              </el-button-group>
+              </el-button-group> -->
             </el-carousel-item>
           </el-carousel>
+         
         </el-card>
       </el-col>
     </el-row>
@@ -299,13 +364,13 @@
             <p v-if="scope.row.Trigger.etype === 3">{{ $t('message.equipment.first') }}</p>
           </template>
         </el-table-column>
-        <el-table-column property="datastate" :label="$t('message.management.status')" width="100">
+        <el-table-column property="datastate" :label="$t('message.management.status')" width="130">
           <template scope="scope">
             <el-tag type="success" v-if="scope.row.Trigger.enabled === 1">{{ $t('message.equipment.Enable') }}</el-tag>
             <el-tag type="warning" v-if="scope.row.Trigger.enabled === 0">{{ $t('message.equipment.Disable') }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column :label="$t('message.operating')" width="100">
+        <el-table-column :label="$t('message.operating')" width="130">
           <template scope="scope">
             <el-button @click="updateTrigger(scope.row)" type="text" size="small">{{ $t('message.edit') }}</el-button>
             <el-button @click="deletetriggerdata(scope.row.Trigger.id)" type="text" size="small">{{ $t('message.delete') }}</el-button>
@@ -418,7 +483,7 @@
         }
       }
       return {
-        remoteurl: 'http://47.92.238.200:18015',
+        remoteurl: 'http://47.92.238.200:8081',
         addnew: false,
         currentItemCount: 0,
         currentItemCount3: 0,
@@ -621,7 +686,6 @@
           .then(res => {
             // response
             _this.equipmentlist = res.data.items
-            console.log('-----_this.equipmentlist-------------', _this.equipmentlist)
             _this.equipmentcurrentItemCount = res.data.currentItemCount
             if (_this.equipmentcurrentItemCount > 0) {
               _this.isnodata = false
@@ -658,10 +722,10 @@
             _this.equipmentlist[i].ChannelLats[j].Time = res.data.Time
             _this.equipmentlist[i].ChannelLats[j].O2 = res.data.O2
             _this.equipmentlist[i].ChannelLats[j].Co2 = res.data.Co2
-             if (res.data.Doorlock === '0') {
-                _this.equipmentlist[i].ChannelLats[j].Doorlock = '关闭'
+             if (res.data.Doorlock === '1') {
+                _this.equipmentlist[i].ChannelLats[j].Doorlock = '开启'
              } else {
-               _this.equipmentlist[i].ChannelLats[j].Doorlock = '开启'
+               _this.equipmentlist[i].ChannelLats[j].Doorlock = '关闭'
              }
             _this.equipmentlist[i].ChannelLats[j].WindSpeed = res.data.WindSpeed
             _this.equipmentlist[i].ChannelLats[j].Pressure = res.data.Pressure
@@ -838,8 +902,7 @@
       },
       clickdropdown(command, serial, dataitem, title, index, carouselindex) {
         // 记录索引便于界面更新
-        console.log('--------', command, serial, dataitem, title, index, carouselindex)
-        this.operatingequipmentindex = index
+       this.operatingequipmentindex = index
         this.operatingindex = carouselindex
         this.triggerform.serial = serial
         this.triggerform.dataitem = dataitem
@@ -912,7 +975,6 @@ this.triggerlistdialogtitle = this.me + `(${this.triggerform.title})`
           .then(res => {
             // response
             this.triggerlist = res.data.items
-            console.log('---------this.triggerlist------------', this.triggerlist)
           })
           .catch(err => {
             // handle error
@@ -1399,17 +1461,24 @@ this.triggerlistdialogtitle = this.me + `(${this.triggerform.title})`
 
 </script>
 
-<style>
+<style >
   .el-pagination {
     margin: 1rem 0 2rem;
     text-align: right;
   }
+  
+  .el-card__header {
+      background:#2b3b49; 
+      color:#FFF;
+  }  
 
   .devplab {
     font-size: 13px;
     color: #424242;
   }
-
+  .el-card__body {
+    padding: 15px 20px 0px 20px
+  }
   .bottom {
     margin-top: 13px;
     line-height: 12px;
@@ -1446,18 +1515,36 @@ this.triggerlistdialogtitle = this.me + `(${this.triggerform.title})`
     padding: 5px 0 5px 0;
   }
 
-  .contenthum {
-    background: #5FBDB7;
-    color: white;
+
+
+  .contento2 {
+   border-radius:5px;
+    /* background: #30c283db; */
+    /* background-image:url('/assets/images/avatar-default.jpg'); */
+   background: url('../../assets/images/3.png') center center no-repeat;
+   background-size:120px 80px;
+   color: white;
+    /* width: 60px; */
+    /* height: 60px; */
+    /* margin: 0px 5px 10px 0px; */
     text-align: center;
-    padding: 5px 0 5px 0;
+    padding: 15px 0px 10px 0px;
+    height: 55px;
   }
 
-  .contento2 {
-    background: #72CB6F;
-    color: white;
+  .doorlock {
+   border-radius:5px;
+    /* background: #30c283db; */
+    /* background-image:url('/assets/images/avatar-default.jpg'); */
+   background: url('../../assets/images/4.png') center center no-repeat;
+   background-size:120px 80px;
+   color: white;
+    /* width: 60px; */
+    /* height: 60px; */
+    /* margin: 0px 5px 10px 0px; */
     text-align: center;
-    padding: 5px 0 5px 0;
+    padding: 15px 0px 10px 0px;
+    height: 55px;
   }
 
   .contentwindspeed {
@@ -1503,11 +1590,48 @@ this.triggerlistdialogtitle = this.me + `(${this.triggerform.title})`
 
   .devtitle {
     font-weight: bold;
-    color: #5C5C5C;
+    color: #916f6f3a;
     font-family: '黑体';
     font-size: 13px
   }
 
+    .temperaturecolcor {
+    border-radius:5px;
+    /* background: #30c283db; */
+    /* background-image:url('/assets/images/avatar-default.jpg'); */
+   background: url('../../assets/images/1.png') center center no-repeat;
+   background-size:120px 80px;
+   color: white;
+    /* width: 60px; */
+    /* height: 60px; */
+    /* margin: 0px 5px 10px 0px; */
+    text-align: center;
+    padding: 15px 0px 10px 0px;
+    height: 55px;
+  }
+
+    .contenthum {
+  /* background: #5FBDB7; */
+    border-radius:5px;
+    background: url('../../assets/images/2.png') center center no-repeat;
+    background-size:120px 80px;
+    color: white;
+    text-align: center;
+    padding: 15px 0px 10px 0px;
+    height: 55px;
+      /* margin: 0px 5px 5px 0px; */
+  }
+   .indata {
+    font-size: 18px;
+    margin-top: 5px;
+  }
+  p
+  {
+  white-space: nowrap;
+  font-size: 10px;
+  font-weight:bold;
+  }
+
   ::-webkit-input-placeholder {
     color: #7A7A7A;
   }

+ 1613 - 0
frontend_web/src/views/main/equipment1.vue

@@ -0,0 +1,1613 @@
+<template>
+  <div style="min-width:1395px">
+    <div class="heading">
+      <div class="search icon-before icon-search">
+        <el-cascader :options="orgtreelist" :props="orgtreeprops" clearable change-on-select :show-all-levels="false" v-model="selectedorg"
+        :placeholder="$t('message.equipment.select')"></el-cascader>
+        <input type="text" v-model="keyword"  :placeholder="$t('message.sgmanage.Enter')">
+      </div>
+      <el-button type="primary" size="small" icon="search" @click="seachdata">{{ $t('message.search') }}</el-button>
+      <template v-if="permission_auth.add">
+        <el-button type="primary" size="small" icon="plus" @click="newDevice()">{{ $t('message.equipment.New') }}</el-button>
+      </template>
+      <el-button type="primary" size="small" @click="batchopera()">
+        <i class="icon icon-stack"></i> {{ $t('message.equipment.Batch') }}</el-button>
+    </div>
+    <p style="text-align:center" v-show="isnodata">{{ $t('message.nodata') }}</p>
+    <el-row>
+      <el-col :span="8" v-for="(v, index) in equipmentlist" style="min-width:220px;">
+        <el-card style="margin:5px;min-width:220px;border-radius:10px;">
+          <div slot="header" style="font-weight: 800; font-size: 14px;height:17px;">
+            <div style="float: left;height:23px;overflow:hidden;width:70%" :title="v.Equipment.Code">设备名:&nbsp;{{v.Equipment.Code}}</div>
+            <el-button-group style="float: right">
+              <template v-if="permission_auth.edit">
+                <el-button :title="$t('message.equipment.edit')"  size="mini" @click="opendeitquipmentDialog(v.Equipment, index)">
+                  <i class="icon icon-pencil"  style="height:12px;color:#2b3b49"></i>
+                </el-button>
+              </template>
+              <template v-if="permission_auth.add">
+                <el-button :title="$t('message.equipment.Delete')"  size="mini" @click="deleteEquipment(v.Equipment.Id, index, v.Equipment.CSerial)">
+                  <i class="icon icon-bin" style="height:12px;;color:#2b3b49"></i>
+                </el-button>
+              </template>
+              <template v-if="permission_auth.addchannel">
+                <el-button :title="$t('message.equipment.sensor')"  size="mini" @click="newChannel(v.Equipment.Id, v.Equipment.Code)">
+                  <i class="icon icon-eye-plus" style="height:12px;;color:#2b3b49"></i>
+                </el-button>
+              </template>
+            </el-button-group>
+            <!-- <el-dropdown size="mini" split-button type="primary">
+                  操作
+                  <el-dropdown-menu slot="dropdown" style="color:black">
+                    <el-dropdown-item>编辑设备</el-dropdown-item>
+                    <el-dropdown-item>删除设备</el-dropdown-item>
+                    <el-dropdown-item>添加传感器</el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown> -->
+          </div>
+          <el-row style="margin-top:-10px;">
+               <el-col :span="6" style="padding:10px;">
+              <img :src="remoteurl+v.Equipment.Photo" style="width: 100%;">
+            </el-col>
+            <el-col :span="18" style="padding:0px 0px 0px 35px">
+              <p class="devplab" :title="v.Equipment.Brands">{{ $t('message.equipment.Brand') }}:{{v.Equipment.Brands}}</p>
+              <p class="devplab" style="height:17px;overflow:hidden;white-space:nowrap;" :title="v.Equipment.DModel">{{ $t('message.equipment.model') }}:{{v.Equipment.DModel}}</p>
+               <p class="devplab">{{ $t('message.equipment.Device') }}:
+                <el-tag type="success" v-if="v.Equipment.DeviceState === 1">{{ $t('message.management.normal') }}</el-tag>
+                <el-tag v-if="v.Equipment.DeviceState === 2">{{ $t('message.triggerinfos.service') }}</el-tag>
+                <el-tag v-if="v.Equipment.DeviceState === 3">{{ $t('message.equipment.Disable') }}</el-tag>
+                <el-tag v-if="v.Equipment.DeviceState === 4">{{ $t('message.triggerinfos.Defrost') }}</el-tag>
+              </p>
+              <p class="devplab" style="height:17px;overflow:hidden;" :title="v.Equipment.OrganizeName">{{ $t('message.sgmanage.OrganizeName') }}:{{v.Equipment.OrganizeName}}</p>
+            </el-col>
+          </el-row>
+          <el-carousel indicator-position="none" :interval="5000" :autoplay="true" height="270px">
+            <el-carousel-item v-for="(item, carouselindex) in v.ChannelLats">
+             <el-row>
+               <el-col :span="16" >
+              <div style="font-size: 14px; font-weight: 600;height:18px;">
+                <router-link :to="'/devices/chart/'+item.Serial+'_'+item.DataItem+'?xn='+item.Title">
+                  <div style="float: left;width:75%;color:#24313C" :title="item.Title">传感器:&nbsp;{{item.Title}}</div>
+                </router-link>
+              </div>
+              </el-col>
+              <el-col :span="8" >
+               <div style="float: right">
+                  <!-- <i class="icon icon-stop2" style="color:#FF4949;" v-if="item.DState === 2" :title="$t('message.index.offline')"></i>
+                  <i class="icon icon-stop2" style="color:#7FFF00;" v-if="item.DState === 1" :title="$t('message.index.online')"></i> -->
+                  <router-link :to="'/devices/chart/'+item.Serial+'_'+item.DataItem+'?xn='+item.Title+'&ma='+v.Equipment.MaxValue+'&mi='+v.Equipment.MinValue">
+                    <a>数据曲线</a>
+                    <!-- <i class="icon icon-stats-dots chartico" style="margin:0" :title="$t('message.equipment.curve')"></i> -->
+                  </router-link>
+                    <b>|</b>
+                  <router-link :to="'/devices/gps/'+item.Serial+'_'+item.DataItem" >
+                  <!-- v-if="contains(havegps,item.DataItem)" -->
+                     <a>路线轨迹</a>
+                    <!-- <i class="icon icon-location2 chartico" style="margin:0" :title="$t('message.equipment.Map')"></i> -->
+                  </router-link>
+                </div>
+                </el-col>
+                </el-row>
+              <el-row :gutter="2" style="margin-top:5px;">
+                <el-col :span="8" v-if="contains(havetemp,item.DataItem)">
+               <div class="indgrid-content temperaturecolcor" style="margin:5px;">
+                  {{ $t('message.index.temperature') }}
+                  <!-- <hr class="indcontenthr" /> -->
+                  <div class="indata" >{{item.Temp}}</div>
+                </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(havehum,item.DataItem)">
+                <div class="indgrid-content contenthum" style="margin:5px">
+                     {{ $t('message.index.humidity') }}
+                  <!-- <hr class="indcontenthr" /> -->
+                  <div class="indata">{{item.Hum}}</div>
+                </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(haveo2,item.DataItem)">
+                  <div class="grid-content contento2">
+                    O2 %
+                    <hr class="contenthr" /> {{item.O2}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(haveco2,item.DataItem)">
+                  <div class="grid-content contento2">
+                    CO2 %
+                    <hr class="contenthr" /> {{item.Co2}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(windspeed,item.DataItem)">
+                  <div class="grid-content contentwindspeed">
+                  {{ $t('message.index.wind') }}
+                    <hr class="contenthr" /> {{item.WindSpeed}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(ots,item.DataItem)">
+                  <div class="grid-content contentpressure">
+                   Pa
+                    <hr class="contenthr" /> {{item.Ots}}
+                  </div>
+                </el-col>
+                  <el-col :span="8" v-if="contains(doorlock,item.DataItem)">
+                  <div class="grid-content contento2">
+                   门禁
+                    <hr class="contenthr" /> {{item.Doorlock}}
+                  </div>
+                </el-col>
+                 <el-col :span="8" v-if="contains(displacement,item.DataItem)">
+                  <div class="grid-content contentpressure">
+                   Pa
+                    <hr class="contenthr" /> {{item.Displacement}}
+                  </div>
+                </el-col>
+                 <el-col :span="8" v-if="contains(pressure,item.DataItem)">
+                  <div class="grid-content contentpressure">
+                   {{ $t('message.index.pressure') }}
+                    <hr class="contenthr" /> {{item.Pressure}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(clo2,item.DataItem)">
+                  <div class="grid-content contento2">
+                    ClO2
+                    <hr class="contenthr" /> {{item.ClO2}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(h2o,item.DataItem)">
+                  <div class="grid-content contento2">
+                    us/cm
+                    <hr class="contenthr" /> {{item.H2O}}
+                  </div>
+                </el-col>
+                 <el-col :span="8" v-if="contains(so2,item.DataItem)">
+                  <div class="grid-content contento2">
+                    SO2 ppm
+                    <hr class="contenthr" /> {{item.SO2}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(c2h4,item.DataItem)">
+                  <div class="grid-content contento2">
+                    C2H4
+                    <hr class="contenthr" /> {{item.C2H4}}
+                  </div>
+                </el-col>
+                 <el-col :span="8" v-if="contains(c2h2,item.DataItem)">
+                  <div class="grid-content contento2">
+                    C2H2
+                    <hr class="contenthr" /> {{item.C2H2}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(cl2,item.DataItem)">
+                  <div class="grid-content contento2">
+                    Cl2
+                    <hr class="contenthr" /> {{item.Cl2}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(o3,item.DataItem)">
+                  <div class="grid-content contento2">
+                    O3
+                    <hr class="contenthr" /> {{item.O3}}
+                  </div>
+                </el-col>
+                  <el-col :span="8" v-if="contains(tvoc,item.DataItem)">
+                  <div class="grid-content contento2">
+                    TVOC 
+                    <hr class="contenthr" /> {{item.TVOC}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(havepower,item.DataItem)">
+                  <div class="grid-content contentpw">
+                     {{ $t('message.index.power') }}
+                    <hr class="contenthr" /> {{item.Power}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(havesupply,item.DataItem)">
+                  <div class="grid-content contentvolt">
+                  {{ $t('message.index.electric') }}
+                    <hr class="contenthr" /> {{item.Supply}}
+                  </div>
+                </el-col>
+                <el-col :span="8" v-if="contains(haveliquidlevel,item.DataItem)">
+                  <div class="grid-content contento2">
+                  {{ $t('message.equipment.level') }}
+                    <hr class="contenthr" /> {{item.LiquidLevel}}
+                  </div>
+                </el-col>
+                 <el-col :span="5" v-if="contains(wuyuansu,item.DataItem)">
+                  <div class="grid-content contento2">
+                  顶部温度
+                    <hr class="contenthr" /> {{item.Temp}}
+                  </div>
+                </el-col>
+                 <el-col :span="5" v-if="contains(wuyuansu,item.DataItem)">
+                  <div class="grid-content contento2">
+                   底部温度
+                    <hr class="contenthr" /> {{item.ThreeACVA}}
+                  </div>
+                </el-col>
+                 <el-col :span="5" v-if="contains(wuyuansu,item.DataItem)">
+                  <div class="grid-content contentwindspeed">
+                  液位
+                    <hr class="contenthr" /> {{item.ThreeACVB}}
+                  </div>
+                </el-col>
+                 <el-col :span="4" v-if="contains(wuyuansu,item.DataItem)">
+                    <div class="grid-content contento2">
+                  腔内温度
+                    <hr class="contenthr" /> {{item.ThreeACVC}}
+                  </div>
+                </el-col>
+                 <el-col :span="5" v-if="contains(wuyuansu,item.DataItem)">
+                  <div class="grid-content contenthum">
+                  腔内湿度
+                    <hr class="contenthr" /> {{item.Hum}}
+                  </div>
+                </el-col>
+              </el-row>
+              <el-row :gutter="5">
+                 <el-col :span="12" style="margin-top:5px">
+              <p v-if="item.Vol !=='0'" class="devplab">{{ $t('message.management.Sensor') }}:{{item.Vol}} V [ {{voltageinfo(item.Vol, item.DataItem)}} ]</p>
+              <p v-if="item.Vol =='0'" class="devplab">{{ $t('message.management.Sensor') }}:12 V [ 正常 ]</p>
+             </el-col>
+              <el-col :span="12" style="margin-top:5px">
+              <p class="devplab">{{ $t('message.management.number') }}:{{item.Serial}}</p>
+               </el-col>
+              <el-col :span="12" style="margin-top:-15px">
+              <p v-if="item.Rssi !=='0'" class="devplab" style="height:15px;overflow:hidden;">{{ $t('message.management.signal') }}:{{item.Rssi}} [{{rssiinfo(item.Rssi)}}]&nbsp;&nbsp; </p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-15px">
+              <p v-if="item.Rssi !=='0'" class="devplab" style="height:15px;overflow:hidden;"> {{ $t('message.equipment.internet') }}:{{item.Signal}} [{{signalinfo(item.Signal)}}]</p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-15px">
+              <p v-if="item.Rssi =='0'" class="devplab" style="height:15px;overflow:hidden;">{{ $t('message.management.signal') }}:-- [-]&nbsp;&nbsp; </p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-12px">
+              <p v-if="item.Rssi =='0'" class="devplab" style="height:15px;overflow:hidden;"> {{ $t('message.equipment.internet') }}:{{item.Signal}} [{{signalinfo(item.Signal)}}]</p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-12px;">
+              <p class="devplab" >{{ $t('message.equipment.Update') }}:{{item.Time}}</p>
+               </el-col>
+               <el-col :span="12" style="margin-top:-15px">
+            <p class="devplab">传感器状态:
+                <el-tag type="success"  v-if="item.DState === 1">在线</el-tag>
+                <el-tag  type="danger" v-if="item.DState === 2">离线</el-tag>
+              </p>
+               </el-col>
+              </el-row>
+              <div> 
+              <el-row gutter="0"> 
+                <el-col span="6">
+                    <el-button style="width:100%;color:#409EFF;font-weight:bold;" size="mini" @click="editChannel(item,index,carouselindex,v.Equipment.Code,v.Equipment.MaxValue,v.Equipment.MinValue )">{{ $t('message.edit') }}</el-button>
+                </el-col>
+                <el-col span="6">
+                   <el-button  style="width:100%;color:#F56C6C;font-weight:bold;" size="mini" @click="deletedata(item.Serial,index,v.Equipment.Code)">{{ $t('message.delete') }}</el-button>
+                </el-col>
+                <el-col span="6">
+                   <el-button  style="width:100%;color:#409EFF;font-weight:bold;" size="mini" @click="clickdropdown('new',item.Serial,item.DataItem,item.Title, index, carouselindex)">{{ $t('message.equipment.alarm') }}</el-button>
+                </el-col>
+                <el-col span="6">
+                    <el-button  style="width:100%;color:#F56C6C;font-weight:bold;" size="mini" @click="clickdropdown('list',item.Serial,item.DataItem,item.Title, index, carouselindex)">{{ $t('message.equipment.caveat') }}
+                    <span> [ {{item.TriggerCount}} ] </span>
+                  </el-button>
+                </el-col>
+              </el-row>
+              </div>
+              <!-- <el-button-group >
+                <template v-if="permission_auth.editchannel">
+                  <el-button type="primary" size="mini" @click="editChannel(item,index,carouselindex,v.Equipment.Code,v.Equipment.MaxValue,v.Equipment.MinValue )">{{ $t('message.edit') }}</el-button>
+                </template>
+                <template v-if="permission_auth.addchannel">
+                  <el-button type="primary" size="mini" @click="deletedata(item.Serial,index,v.Equipment.Code)">{{ $t('message.delete') }}</el-button>
+                </template>
+                <template v-if="permission_auth.addtrigger">
+                  <el-button type="primary" size="mini" @click="clickdropdown('new',item.Serial,item.DataItem,item.Title, index, carouselindex)">{{ $t('message.equipment.alarm') }}</el-button>
+                </template>
+                <template v-if="permission_auth.addtrigger">
+                  <el-button type="primary" size="mini" @click="clickdropdown('list',item.Serial,item.DataItem,item.Title, index, carouselindex)">{{ $t('message.equipment.caveat') }}
+                    <span> [ {{item.TriggerCount}} ] </span>
+                  </el-button>
+                </template>
+                <template v-if="permission_auth.calibration">
+                  <el-button v-if="!contains(havepower,item.DataItem)" type="primary" size="mini" @click="clickdropdown('adju',item.Serial,item.DataItem,item.Title, -1, -1)">{{ $t('message.equipment.calibration') }}</el-button>
+                </template>
+              </el-button-group> -->
+            </el-carousel-item>
+          </el-carousel>
+         
+        </el-card>
+      </el-col>
+    </el-row>
+
+
+    <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[12, 16, 20, 24]"
+      :page-size="size" layout="total, sizes, prev, pager, next, jumper" :total="equipmentcurrentItemCount">
+    </el-pagination>
+
+    <channel-dialog @close="channelDialogCallback" :act="dialogAct" :visible.sync="datadialogVisible"></channel-dialog>
+    <trigger-dialog @close="triggerDialogCallback" :act="dialogAct" :visible.sync="triggerdialogVisible"></trigger-dialog>
+    <batchopera-dialog @close="batchoperaDialogCallback" :visible.sync="batchoperadialogVisible"></batchopera-dialog>
+    <equipment-dialog @close="deviceDialogCallback" :visible.sync="devicedialogVisible"></equipment-dialog>
+
+
+    <el-dialog :title="triggerlistdialogtitle" :visible.sync="triggerlistdialogVisible" top="5%">
+      <el-table :data="triggerlist">
+        <el-table-column :label="$t('message.equipment.condition')" width="100" show-overflow-tooltip>
+          <template scope="scope">
+            <p v-if="scope.row.Trigger.column === 'temperature'">{{ $t('message.management.temperature')}} {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'humidity'">{{ $t('message.management.humidity')}} {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'co2'">CO2 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'o2'">O2 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'windspeed'">{{ $t('message.management.wind') }} {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'pressure'">{{ $t('message.management.pressure') }} {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'ots'">{{ $t('message.management.ots') }} {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'doorlock'">{{ $t('message.management.doorlock') }} {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'clo2'">ClO2 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'h2o'">H2O {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'so2'">SO2 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'c2h4'">C2H4 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'c2h2'">C2H2 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'cl2'">Cl2 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'o3'">O3 {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+             <p v-if="scope.row.Trigger.column === 'tvoc'">TVOC {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'voltage'">{{ $t('message.management.power') }} {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'electricalpower'">{{ $t('message.management.power') }} {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+            <p v-if="scope.row.Trigger.column === 'electricalsupply'">{{ $t('message.equipment.electric') }}</p>
+            <p v-if="scope.row.Trigger.column === 'liquidlevel'">{{ $t('message.management.level') }} {{scope.row.Trigger.itemname}} {{scope.row.Trigger.value}}</p>
+          </template>
+        </el-table-column>
+        <el-table-column :label="$t('message.abnormalsetting.Item')"  prop="ANames" show-overflow-tooltip></el-table-column>
+        <el-table-column :label="$t('message.equipment.strategy')" width="100" show-overflow-tooltip>
+          <template scope="scope">
+            <p v-if="scope.row.Trigger.etype === 1">{{ $t('message.equipment.No') }}</p>
+            <p v-if="scope.row.Trigger.etype === 2">{{ $t('message.equipment.abnormality') }} {{scope.row.Trigger.count}} 次</p>
+            <p v-if="scope.row.Trigger.etype === 3">{{ $t('message.equipment.first') }}</p>
+          </template>
+        </el-table-column>
+        <el-table-column property="datastate" :label="$t('message.management.status')" width="130">
+          <template scope="scope">
+            <el-tag type="success" v-if="scope.row.Trigger.enabled === 1">{{ $t('message.equipment.Enable') }}</el-tag>
+            <el-tag type="warning" v-if="scope.row.Trigger.enabled === 0">{{ $t('message.equipment.Disable') }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column :label="$t('message.operating')" width="130">
+          <template scope="scope">
+            <el-button @click="updateTrigger(scope.row)" type="text" size="small">{{ $t('message.edit') }}</el-button>
+            <el-button @click="deletetriggerdata(scope.row.Trigger.id)" type="text" size="small">{{ $t('message.delete') }}</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div slot="footer" class="dialog-footer" style="margin-top:-20px;">
+        <el-button @click="triggerlistdialogVisible = false">{{ $t('message.cancel') }}</el-button>
+        <el-button type="primary" @click="savetriggerenabled('1')">{{ $t('message.equipment.Enable') }}</el-button>
+        <el-button type="warning" @click="savetriggerenabled('0')">{{ $t('message.equipment.disable') }}</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog :title="adjudialogtitle" :visible.sync="adjudialogVisible" top="5%">
+      <el-form :model="adjuform" :rules="rulesadju" ref="adjuform">
+        <el-form-item :label="$t('message.equipment.Temperature')"  prop="temp" label-width="120px" v-if="contains(havetemp,triggerform.dataitem)">
+          <el-input v-model="adjuform.temp" auto-complete="off"></el-input>
+        </el-form-item>
+        <el-form-item :label="$t('message.equipment.Humidity')" prop="hum" label-width="120px" v-if="contains(havehum,triggerform.dataitem)">
+          <el-input v-model="adjuform.hum"></el-input>
+        </el-form-item>
+        <el-form-item :label="$t('message.equipment.O2')" label-width="120px" prop="o2" v-if="contains(haveo2,triggerform.dataitem)">
+          <el-input v-model="adjuform.o2" auto-complete="off"></el-input>
+        </el-form-item>
+        <el-form-item :label="$t('message.equipment.CO2')" prop="co2" label-width="120px" v-if="contains(haveco2,triggerform.dataitem)">
+          <el-input v-model="adjuform.co2" auto-complete="off"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="adjudialogVisible = false">{{ $t('message.cancel') }}</el-button>
+        <el-button type="primary" @click="saveadjuform('adjuform');">{{ $t('message.confirm') }}</el-button>
+      </div>
+    </el-dialog>
+    <!--编辑设备-->
+    <el-dialog :title="editorgantitle" :visible.sync="editorganVisible" top="5%">
+      <el-form :model="editequipmentform" :rules="editequipmentrules" ref="editequipmentform">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item :label="$t('message.management.Device')" label-width="120px" required prop="code">
+              <el-input v-model="editequipmentform.code"></el-input>
+            </el-form-item>
+            <el-form-item :label="$t('message.equipment.Brand')" label-width="120px" required>
+              <el-select v-model="editequipmentform.brands" :placeholder="$t('message.equipment.Choose')" @change="selectDModel" @visible-change="opendialoging = false">
+                <el-option v-for="item in brandoptions" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item :label="$t('message.equipment.model')" label-width="120px" required>
+              <el-select v-model="editequipmentform.dModel" :placeholder="$t('message.equipment.modelaa')" @change="selectPhoto" @visible-change="handleVisible">
+                <el-option v-for="item in modeloptions" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" style="text-align: center">
+            <img :src="photoUrl" style="width: 120px; height: 110px">
+            <div>{{spareData}}</div>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item :label="$t('message.sgmanage.OrganizeName')" label-width="120px" required>
+              <el-cascader :options="orgtreelist" :props="orgtreeprops" change-on-select :show-all-levels="false" v-model="editequselectedorg"
+                :placeholder="$t('message.equipment.select')" :disabled="!permission_auth.edit_org"></el-cascader>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item :label="$t('message.equipment.equipment')" label-width="120px" required>
+              <el-select v-model="equipmentstate" :placeholder="$t('message.equipment.rolechange')">
+                <el-option :label="$t('message.management.normal')"  value="1"></el-option>
+                <el-option :label="$t('message.triggerinfos.service')" value="2"></el-option>
+                <el-option :label="$t('message.equipment.Disable')"  value="3"></el-option>
+                <el-option :label="$t('message.triggerinfos.Defrost')"  value="4"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="editorganVisible = false">{{ $t('message.cancel') }}</el-button>
+        <el-button type="primary" @click="saveeditequipmentform()">{{ $t('message.confirm') }}</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import ChannelDialog from '../../components/devices/channel_dialog'
+  import TriggerDialog from '../../components/devices/trigger_dialog'
+  import EquipmentsortDialog from '../../components/devices/equipmentsort_dialog'
+  import BatchoperaDialog from '../../components/devices/batchopera_dialog'
+  import EquipmentDialog from '../../components/devices/equipment_dialog'
+  import {
+    mapGetters
+  } from 'vuex'
+  export default {
+    name: 'equipment',
+    components: {
+      ChannelDialog,
+      TriggerDialog,
+      EquipmentsortDialog,
+      BatchoperaDialog,
+      EquipmentDialog
+    },
+    data() {
+      var checktriggercvalue = (rule, value, callback) => {
+        if (!isNaN(parseFloat(value)) && !isNaN(value)) {
+          callback()
+        } else {
+          callback(new Error(this.$t('message.equipment.numeric')))
+        }
+      }
+      return {
+        remoteurl: 'http://47.92.238.200:8081',
+        addnew: false,
+        currentItemCount: 0,
+        currentItemCount3: 0,
+        equipmentcurrentItemCount: 0, // 设备列表总数
+        currentPage: 1,
+        size: 12,
+        list: [],
+        isnodata: false,
+        loading: false,
+        havetemp: '0,6,7,9,10,14,15,16',
+        havehum: '0,7,9,14,16',
+        haveo2: '17',
+        haveco2: '9,26',
+        windspeed: '18',
+        pressure: '19',
+        ots: '29',
+         doorlock: '31',
+         wuyuansu: '32',
+        displacement: '30',
+        clo2: '20',
+        h2o: '27',
+         so2: '28',
+        c2h4: '21',
+        c2h2: '25',
+        cl2: '22',
+        o3: '23',
+        tvoc: '24',
+        havepower: '13',
+        havesupply: '13',
+        havevol: '0,6,7,9,10',
+        haveliquidlevel: '15',
+        havegps: '16',
+        itemiss1: '0,10',
+        keyword: '',
+        dialogAct: 'new',
+        datadialogVisible: false,
+        operatingindex: -1, // 传感器编辑索引
+        triggerform: {
+          column: 'temperature',
+          item: '1',
+          value: '',
+          aid: [],
+          etype: '1',
+          count: '2',
+          rangeweek: ['1', '2', '3', '4', '5', '6', '7'],
+          rangetime: [0, 48],
+          enabled: '1',
+          content: this.$t('message.Your'),
+          dataitem: '',
+          serial: '',
+          title: '',
+          operatingitem: 0,
+          id: 0
+        },
+        triggerdialogVisible: false,
+        triggerlistdialogtitle: '',
+        triggerlistdialogVisible: false,
+        triggerlist: [],
+        adjudialogtitle: '',
+        adjudialogVisible: false,
+        adjuform: {
+          temp: '0',
+          hum: '0',
+          co2: '0',
+          o2: '0',
+          windspeed: '0',
+          pressure: '0',
+           ots: '0',
+          doorlock: '0',
+            displacement: '0',
+          clo2: '0',
+          h2o: '0',
+          so2: '0',
+          c2h4: '0',
+          c2h2: '0',
+          cl2: '0',
+          o3: '0',
+          tvoc: '0'
+        },
+        rulesadju: {
+          temp: [{
+            validator: checktriggercvalue,
+            trigger: 'blur'
+          }],
+          hum: [{
+            validator: checktriggercvalue,
+            trigger: 'blur'
+          }],
+          co2: [{
+            validator: checktriggercvalue,
+            trigger: 'blur'
+          }],
+          o2: [{
+            validator: checktriggercvalue,
+            trigger: 'blur'
+          }]
+        },
+        permission_auth: { // 按钮权限
+          add: false,
+          edit: false,
+          edit_org: false,
+          addchannel: false,
+          editchannel: false,
+          addtrigger: false,
+          calibration: false
+        },
+        batchoperadialogVisible: false,
+        devicelist: [], // 走马灯数据
+        carouselIndex: 0,
+        alldevicelist: [],
+        updated: true,
+        organlist: [], // 分页用
+        editorgantitle: '', // 新对话框,编辑组织
+        editorganVisible: false,
+        opendialoging: false,
+        modeloptions: [], // 2017-09-26
+        brandoptions: [],
+        photoUrl: '',
+        spareData: '',
+        equipmentstate: '1',
+        operatingequipmentindex: -1, // 点击编辑设备时记录修改的索引,便于修改成功后做界面更新,而不需要重新加载数据
+        operatingequipmentid: 0, // 编辑id
+        editequipmentform: {
+          code: '',
+          brands: '',
+          dModel: '',
+          organizeName: '',
+          organizeId: 0,
+          devicestate: '1',
+          title: '',
+          serial: '',
+          about: '',
+          modelid: 0
+        },
+        editequipmentrules: {
+          code: [{
+            required: true,
+            message: this.$t('message.equipment.name'),
+            trigger: 'blur'
+          }],
+          organizeId: [{
+            required: true,
+            message: this.$t('message.equipment.organization'),
+            trigger: 'blur'
+          }]
+        },
+        devicedialogVisible: false, // 添加设备对话框
+        equipmentlist: [],
+        modellist: [],
+        sortedModelList: [],
+        equipmentindex: 0, // 用来保存位置数据
+        channelindex: 0,
+        orgtreelist: [],
+        orgtreeprops: {
+          value: 'id',
+          label: 'Fullname',
+          children: 'children'
+        },
+        selectedorg: [],
+        editequselectedorg: [],
+        mess: '',
+        me: ''
+      }
+    },
+
+    created() {
+      this.getpermissions()
+      this.initData()
+      this.getBrands()
+      this.getorgtreelist()
+      let _this = this
+      Window.equimentinterval = setInterval(function () {
+        _this.loaddataall()
+      }, 120000)
+    },
+    updated() {
+      if (this.currentItemCount !== 0 && this.currentItemCount3 !== 0 && this.updated) {
+        this.updated = false
+        this.handleCarousel()
+      }
+    },
+    computed: mapGetters({
+      session: 'session'
+    }),
+    methods: {
+      initData() {
+        // toggle loading
+        // this.loading = true
+        let _this = this
+        const params = {
+          _currentPage: this.currentPage,
+          _size: this.size,
+          keyword: this.keyword,
+          selected: this.selectedorg[this.selectedorg.length - 1]
+        }
+        // 获取设备列表equipment
+        this.$services.equipment.get('list', {
+            params
+          })
+          .then(res => {
+            // response
+            _this.equipmentlist = res.data.items
+            _this.equipmentcurrentItemCount = res.data.currentItemCount
+            if (_this.equipmentcurrentItemCount > 0) {
+              _this.isnodata = false
+            } else {
+              _this.isnodata = true
+            }
+            // 加载传感器数据
+            _this.loaddataall()
+            // 加载报警数
+            _this.loadtriggercountall()
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
+      handleSizeChange(value) {
+        this.size = value
+        this.currentPage = 1
+        this.initData()
+      },
+      handleCurrentChange(value) {
+        this.currentPage = value
+        this.initData()
+      },
+      loaddata(code, i, j) {
+        let _this = this
+        return _this.$services.channel.get('datavalue/' + code, null)
+          .then(res => {
+            _this.equipmentlist[i].ChannelLats[j].Temp = res.data.Temp
+            _this.equipmentlist[i].ChannelLats[j].Hum = res.data.Hum
+            _this.equipmentlist[i].ChannelLats[j].Vol = res.data.Vol
+            _this.equipmentlist[i].ChannelLats[j].Rssi = res.data.Rssi
+            _this.equipmentlist[i].ChannelLats[j].Time = res.data.Time
+            _this.equipmentlist[i].ChannelLats[j].O2 = res.data.O2
+            _this.equipmentlist[i].ChannelLats[j].Co2 = res.data.Co2
+             if (res.data.Doorlock === '0') {
+                _this.equipmentlist[i].ChannelLats[j].Doorlock = '关闭'
+             } else {
+               _this.equipmentlist[i].ChannelLats[j].Doorlock = '开启'
+             }
+            _this.equipmentlist[i].ChannelLats[j].WindSpeed = res.data.WindSpeed
+            _this.equipmentlist[i].ChannelLats[j].Pressure = res.data.Pressure
+            _this.equipmentlist[i].ChannelLats[j].ClO2 = res.data.ClO2
+            _this.equipmentlist[i].ChannelLats[j].H2O = res.data.H2O
+             _this.equipmentlist[i].ChannelLats[j].SO2 = res.data.SO2
+            _this.equipmentlist[i].ChannelLats[j].C2H4 = res.data.C2H4
+            _this.equipmentlist[i].ChannelLats[j].C2H2 = res.data.C2H2
+            _this.equipmentlist[i].ChannelLats[j].Cl2 = res.data.Cl2
+            _this.equipmentlist[i].ChannelLats[j].O3 = res.data.O3
+             _this.equipmentlist[i].ChannelLats[j].TVOC = res.data.TVOC
+            _this.equipmentlist[i].ChannelLats[j].Power = res.data.Power
+            _this.equipmentlist[i].ChannelLats[j].Supply = res.data.Supply
+            _this.equipmentlist[i].ChannelLats[j].DState = res.data.DState
+            _this.equipmentlist[i].ChannelLats[j].Signal = res.data.Signal
+            _this.equipmentlist[i].ChannelLats[j].LiquidLevel = res.data.LiquidLevel
+              _this.equipmentlist[i].ChannelLats[j].ThreeACVA = res.data.ThreeACVA
+                _this.equipmentlist[i].ChannelLats[j].ThreeACVB = res.data.ThreeACVB
+                  _this.equipmentlist[i].ChannelLats[j].ThreeACVC = res.data.ThreeACVC
+          })
+      },
+      loaddataall() {
+        for (let i = 0; i < this.equipmentlist.length; i++) {
+          for (let j = 0; j < this.equipmentlist[i].ChannelLats.length; j++) {
+            this.loaddata(this.equipmentlist[i].ChannelLats[j].Serial, i, j)
+          }
+        }
+      },
+      contains(strs, str) {
+        let arrs = strs.split(',')
+        for (let v in arrs) {
+          if (arrs[v] === (str + '')) return true
+        }
+        return false
+      },
+      seachdata() {
+        this.currentPage = 1
+        this.initData()
+      },
+      deletedata(code, index, equipmentcode) {
+        let _this = this
+        // var confirmtext = '此操作将永久删除该传感器所有数据, 是否继续?'
+        let confirmtype = 'warning'
+        if (_this.equipmentlist[index].ChannelLats.length < 2) {
+          // confirmtext = `此操作将永久删除该传感器所有数据,同时会删除设备【${equipmentcode}】的所有数据, 是否继续?`
+          confirmtype = 'error'
+        }
+        _this.$confirm(this.$t('message.warn'), this.$t('message.prompt'), {
+          confirmButtonText: this.$t('message.submit'),
+          cancelButtonText: this.$t('message.cancel'),
+          type: confirmtype
+        }).then(() => {
+          _this.$services.channel.delete(code, null)
+            .then(res => {
+              // response
+              if (res.data.code === 0) {
+                _this.$message({
+                  type: 'success',
+                  message: res.data.message
+                })
+                this.deletedata2(code)
+                // 更新界面
+                this.initData()
+              } else {
+                _this.$message({
+                  type: 'warning',
+                  message: res.data.message
+                })
+              }
+            })
+            .catch(() => {})
+        }).catch(() => {})
+      },
+      // 增加传感器
+      newChannel(id, code) {
+        let _this = this
+        _this.dialogAct = 'new'
+        let packnew = {
+          equipid: id,
+          title: code
+        }
+        _this.$store.dispatch('deviceNewModel', packnew)
+        _this.datadialogVisible = true
+      },
+      // 编辑传感器
+      editChannel(v, index, carouselindex, ecode, maxValue, minValue) {
+        // 记录索引便于界面更新
+        this.operatingequipmentindex = index
+        this.operatingindex = carouselindex
+        this.dialogAct = 'edit'
+        let packnew = {
+          title: v.Title,
+          Serial: v.Serial,
+          equipmentCode: ecode,
+          MaxValue: maxValue,
+          MinValue: minValue
+        }
+        this.$store.dispatch('deviceEditModel', packnew)
+        this.datadialogVisible = true
+      },
+      // 传感器编辑保存数据回调
+      channelDialogCallback(ack) {
+        if (ack === 'new') {
+          this.initData() // 实现及时更新id功能,待优化与测试
+        } else {
+          // 更新界面
+          // 上传更新数据
+          this.$services.channel.put('/' + this.$store.state.devices.deviceModel.serial, this.$store.state.devices.deviceModel)
+            .then(res => {
+              // response
+              if (res.data.code === 0) {
+                this.$message({
+                  type: 'success',
+                  message: res.data.message
+                })
+                this.adjudialogVisible = false
+                this.initData()
+              } else {
+                this.$message({
+                  type: 'warning',
+                  message: res.data.message
+                })
+              }
+            })
+            .catch(() => {})
+        }
+      },
+      // 计算射频信号
+      rssiinfo(value) {
+        if (value === '') {
+          return '--'
+        }
+        if (value > -70) {
+          return this.$t('message.alerts.Strong')
+        } else if (value > -90) {
+          return this.$t('message.alerts.general')
+        } else {
+          return this.$t('message.alerts.weak')
+        }
+      },
+      // 计算网络信号
+      signalinfo(value) {
+        if (value === '') {
+          return '--'
+        }
+        if (value > 20) {
+          return this.$t('message.alerts.Strong')
+        } else if (value > 15) {
+          return this.$t('message.alerts.general')
+        } else {
+          return this.$t('message.alerts.weak')
+        }
+      },
+      // 计算电量
+      voltageinfo(value, item) {
+        // if (this.contains(this.itemiss1, item)) {
+        if (value < 2.6) {
+          return '低电'
+        } else {
+          return '正常'
+        }
+        // } else {
+        //   if (value < 3.6) {
+        //     return 0
+        //   } else if (value < 4.1) {
+        //     return parseInt((value - 3.6) * 100 / 0.5)
+        //   } else {
+        //     return 100
+        //   }
+        // }
+      },
+      resetForm(formName) {
+        this.$refs[formName].resetFields()
+      },
+      clickdropdown(command, serial, dataitem, title, index, carouselindex) {
+        // 记录索引便于界面更新
+       this.operatingequipmentindex = index
+        this.operatingindex = carouselindex
+        this.triggerform.serial = serial
+        this.triggerform.dataitem = dataitem
+        this.triggerform.title = title
+        let value = {
+          serial: serial,
+          dataitem: dataitem,
+          title: title
+        }
+        this.$store.dispatch('triggerSetDeviceModel', value)
+        if (command === 'new') { // 新建报警
+          this.dialogAct = 'new'
+          // this.triggerform.operatingitem = 1
+          // 初始值
+          let column
+          if (this.contains(this.havepower, dataitem)) {
+            column = 'electricalpower'
+          } else {
+            column = 'temperature'
+          }
+          // 新修改,即时修改报警项目数
+          var triggerpack = {
+            index: index,
+            cindex: carouselindex,
+            column: column
+          }
+          this.$store.dispatch('triggerNewModel', triggerpack)
+          this.triggerdialogVisible = true
+        } else if (command === 'list') {
+          this.opentriggerlist()
+        } else if (command === 'adju') {
+          // this.adjudialogtitle = `传感器校准设置(${this.triggerform.title})`
+          this.mess = this.$t('message.triggerinfos.processing')
+          this.adjudialogtitle = this.mess + `${this.triggerform.title}`
+          this.$services.channel.get('adjudata/' + this.triggerform.serial, null)
+            .then(res => {
+              // response
+              this.adjuform.temp = res.data.CalibrationValue + ''
+              this.adjuform.hum = res.data.CalibrationHumidity + ''
+              this.adjuform.co2 = res.data.CalibrationCO2 + ''
+              this.adjuform.o2 = res.data.CalibrationO2 + ''
+              this.adjuform.windspeed = res.data.WindSpeed + ''
+              this.adjuform.displacement = res.data.Displacement + ''
+              this.adjuform.pressure = res.data.Pressure + ''
+              this.adjuform.ots = res.data.Ots + ''
+              this.adjuform.doorlock = res.data.Doorlock + ''
+              this.adjuform.clo2 = res.data.ClO2 + ''
+              this.adjuform.h2o = res.data.H2O + ''
+              this.adjuform.so2 = res.data.SO2 + ''
+              this.adjuform.c2h4 = res.data.C2H4 + ''
+              this.adjuform.c2h2 = res.data.C2H2 + ''
+              this.adjuform.cl2 = res.data.Cl2 + ''
+              this.adjuform.o3 = res.data.O3 + ''
+              this.adjuform.tvoc = res.data.TVOC + ''
+              this.adjudialogVisible = true
+            })
+            .catch(err => {
+              // handle error
+              console.error(err)
+              this.loading = false
+            })
+        }
+      },
+      opentriggerlist() {
+        this.triggerlistdialogVisible = true
+          this.me = this.$t('message.triggerinfos.processing')
+this.triggerlistdialogtitle = this.me + `(${this.triggerform.title})`
+        // this.triggerlistdialogtitle = `报警设置列表(${this.triggerform.title})`
+        this.$services.trigger.get('list/' + this.triggerform.serial, null)
+          .then(res => {
+            // response
+            this.triggerlist = res.data.items
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+            this.loading = false
+          })
+      },
+      gettriggercount(code, i, j) {
+        let _this = this
+        _this.$services.trigger.get('count/' + code, null)
+          .then(res => {
+            // response
+            _this.equipmentlist[i].ChannelLats[j].TriggerCount = res.data.message
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+            this.loading = false
+          })
+      },
+      loadtriggercountall() {
+        for (let i = 0; i < this.equipmentlist.length; i++) {
+          for (let j = 0; j < this.equipmentlist[i].ChannelLats.length; j++) {
+            this.gettriggercount(this.equipmentlist[i].ChannelLats[j].Serial, i, j)
+          }
+        }
+      },
+      savetriggerenabled(enabled) {
+        let _this = this
+        let enabledstr = enabled === '1' ? this.$t('message.equipment.Enable') : this.$t('message.equipment.enabled')
+        _this.$confirm(this.$t('message.equipment.whether') + enabledstr + this.$t('message.equipment.this'), this.$t('message.prompt'), {
+        confirmButtonText: this.$t('message.submit'),
+          cancelButtonText: this.$t('message.cancel'),
+          type: 'warning'
+        }).then(() => {
+          _this.triggerform.enabled = enabled
+          _this.$services.trigger.put('setenabled', _this.triggerform)
+            .then(res => {
+              // response
+              if (res.data.code === 0) {
+                _this.$message({
+                  type: 'success',
+                  message: res.data.message
+                })
+                // 更新界面
+                _this.opentriggerlist()
+              } else {
+                _this.$message({
+                  type: 'warning',
+                  message: res.data.message
+                })
+              }
+            })
+            .catch(() => {})
+        }).catch(() => {})
+      },
+      updateTrigger(val) {
+        this.$store.dispatch('triggerEditModel', val)
+        this.dialogAct = 'edit'
+        this.triggerdialogVisible = true
+      },
+      triggerDialogCallback(ack) {
+        let _this = this
+        if (ack === 'new') {
+          _this.equipmentlist[_this.operatingequipmentindex].ChannelLats[_this.operatingindex].TriggerCount = (parseInt(
+              _this.equipmentlist[_this.operatingequipmentindex].ChannelLats[_this.operatingindex].TriggerCount) + 1) +
+            ''
+        } else if (ack === 'edit') {
+          // 更新报警列表
+          this.opentriggerlist()
+        }
+      },
+      deletetriggerdata(id) {
+        let _this = this
+        _this.$confirm(this.$t('message.warn'), this.$t('message.prompt'), {
+          confirmButtonText: this.$t('message.submit'),
+          cancelButtonText: this.$t('message.cancel'),
+          type: 'warning'
+        }).then(() => {
+          _this.$services.trigger.delete(id, null)
+            .then(res => {
+              // response
+              if (res.data.code === 0) {
+                _this.$message({
+                  type: 'success',
+                  message: res.data.message
+                })
+                // 更新界面
+                _this.equipmentlist[_this.operatingequipmentindex].ChannelLats[_this.operatingindex].TriggerCount =
+                  (parseInt(_this.equipmentlist[_this.operatingequipmentindex].ChannelLats[_this.operatingindex].TriggerCount) -
+                    1) + ''
+                _this.opentriggerlist()
+              } else {
+                _this.$message({
+                  type: 'warning',
+                  message: res.data.message
+                })
+              }
+            })
+            .catch(() => {})
+        }).catch(() => {})
+      },
+      deletetriggerdata2(id) {
+        let _this = this
+          _this.$services.trigger.delete(id, null)
+            .then(res => {
+              // response
+              if (res.data.code === 0) {
+                console.log('-------idididid------', id)
+                // 更新界面
+                _this.equipmentlist[_this.operatingequipmentindex].ChannelLats[_this.operatingindex].TriggerCount =
+                  (parseInt(_this.equipmentlist[_this.operatingequipmentindex].ChannelLats[_this.operatingindex].TriggerCount) -
+                    1) + ''
+                // _this.opentriggerlist()
+              }
+            })
+            .catch(() => {})
+      },
+      saveadjuform(formName) {
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.$services.channel.put('adjudata/' + this.triggerform.serial, this.adjuform)
+              .then(res => {
+                // response
+                if (res.data.code === 0) {
+                  this.$message({
+                    type: 'success',
+                    message: res.data.message
+                  })
+                  this.adjudialogVisible = false
+                } else {
+                  this.$message({
+                    type: 'warning',
+                    message: res.data.message
+                  })
+                }
+              })
+              .catch(() => {})
+          } else {
+            return false
+          }
+        })
+      },
+      getpermissions() {
+        // 界面需要的权限
+        let percodes =
+          `'perm.equ.add','perm.equ.edit','perm.equ.edit.org','perm.equ.addchannel','perm.equ.editchannel','perm.equ.addtrigger','perm.equ.calibration'`
+        const params = {
+          percodes: percodes
+        }
+        let _this = this
+        // 定义window变量,eval使用需要
+        let foo = window
+        foo.permission_auth = _this.permission_auth
+        // request
+        _this.$services.permissions.get('isauths', {
+            params
+          })
+          .then(res => {
+            // 根据字段进行数据解析
+            if (res.data && res.data.length > 0) {
+              res.data.forEach(row => {
+                foo.eval('permission_auth.' + row.Code.substring(9).replace('.', '_') + '=' + row.Isperm)
+              })
+              // 将数据返回界面
+              _this.permission_auth = foo.permission_auth
+            }
+          })
+          .catch(() => {})
+      },
+      // 自定义排序
+      batchopera() {
+        this.batchoperadialogVisible = true
+      },
+      // 自定义排序保存数据回调
+      batchoperaDialogCallback() {
+        this.initData()
+      },
+      deviceDialogCallback(ack) {
+        this.initData()
+      },
+      newDevice() {
+        this.devicedialogVisible = true
+      },
+      handleCarousel() {
+        this.alldevicelist = []
+        for (var i = 0; i < this.equipmentlist.length; i++) {
+          for (var j = 0; j < this.list.length; j++) {
+            if (this.equipmentlist[i].Id === this.list[j].EquipMentId) {
+              this.devicelist.push(this.list[j])
+            }
+          }
+          this.alldevicelist.push(this.devicelist)
+          this.devicelist = []
+        }
+      },
+      opendeitquipmentDialog(value, index) {
+        let _this = this
+        this.$services.organizes.get('parentlist/' + value.OrganizeId, {})
+          .then(res => {
+            if (res.data.code === 0) {
+              _this.operatingequipmentindex = index // 记录索引,更新界面使用
+              _this.modeloptions = []
+              _this.operatingequipmentid = value.Id
+              _this.editorganVisible = true
+              _this.opendialoging = true
+              _this.equipmentstate = value.DeviceState + '' // 设备类型的中间变量
+              _this.dd = this.$t('message.equipment.edit')
+              _this.editorgantitle = _this.dd + ' (' + value.Code + ')'
+              _this.editequipmentform.code = value.Code
+              _this.editequipmentform.brands = value.Brands
+              _this.editequipmentform.dModel = value.DModel
+              _this.editequipmentform.organizeId = value.OrganizeId
+              _this.editequipmentform.organizeName = value.OrganizeName
+              _this.editequipmentform.devicestate = value.DeviceState
+              _this.selectPhoto(value.DModel)
+              // 选中状态
+              _this.editequselectedorg = []
+              let pidarr = res.data.message.split(',')
+              for (var i = pidarr.length - 1; i >= 0; i--) {
+                if (pidarr[i] !== '0') {
+                  _this.editequselectedorg.push(parseInt(pidarr[i]))
+                }
+              }
+            } else {
+              _this.$message({
+                type: 'warning',
+                message: this.$t('message.equipment.error')
+              })
+              this.datadialogVisible = false
+            }
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
+      saveeditequipmentform() {
+        let _this = this
+        this.$refs['editequipmentform'].validate((valid) => {
+          if (valid) {
+            // 所属组织赋值
+            this.editequipmentform.organizeId = this.editequselectedorg[this.editequselectedorg.length - 1]
+            // 设备类型赋值
+            _this.editequipmentform.devicestate = parseInt(_this.equipmentstate)
+            _this.$services.equipment.put('equipment/' + _this.operatingequipmentid, _this.editequipmentform)
+              .then(res => {
+                // response
+                if (res.data.code === 0) {
+                  _this.$message({
+                    type: 'success',
+                    message: res.data.message
+                  })
+                  // 更新界面
+                  _this.equipmentlist[_this.operatingequipmentindex].Equipment.Code = _this.editequipmentform.code
+                  _this.equipmentlist[_this.operatingequipmentindex].Equipment.Brands = _this.editequipmentform.brands
+                  _this.equipmentlist[_this.operatingequipmentindex].Equipment.DModel = _this.editequipmentform.dModel
+                  _this.equipmentlist[_this.operatingequipmentindex].Equipment.OrganizeId = _this.editequipmentform
+                    .organizeId
+                  _this.equipmentlist[_this.operatingequipmentindex].Equipment.OrganizeName = res.data.backup
+                  _this.equipmentlist[_this.operatingequipmentindex].Equipment.DeviceState = _this.editequipmentform
+                    .devicestate
+                  // 关闭弹框
+                  _this.editorganVisible = false
+                } else {
+                  _this.$message({
+                    type: 'warning',
+                    message: res.data.message
+                  })
+                }
+              })
+              .catch(() => {})
+          } else {
+            return false
+          }
+        })
+      },
+      // 2017-09-26
+      selectDModel(value) {
+        if (!this.opendialoging) {
+          // toggle loading
+          let _this = this
+          this.modeloptions = []
+          // request
+          this.$services.equipment.get('dmodels/' + value, {})
+            .then(res => {
+              // response
+              for (var i = 0; i < res.data.items.length; i++) {
+                _this.modeloptions.push({
+                  value: res.data.items[i],
+                  label: res.data.items[i]
+                })
+              }
+              _this.editequipmentform.dModel = _this.modeloptions[0].value
+            })
+            .catch(err => {
+              // handle error
+              console.error(err)
+              this.loading = false
+            })
+        }
+      },
+
+      selectPhoto(value) {
+        let _this = this
+        this.$services.equipment.get('getbydmodel/' + value, {})
+          .then(res => {
+            // response
+            _this.photoUrl = _this.remoteurl + res.data.Photo
+            _this.spareData = '[' + res.data.DItemName + '  ' + res.data.SpareData + ']'
+            // 给modelid字段赋值,后台可以直接获取,不用再查询
+            _this.editequipmentform.modelid = res.data.Id
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+            this.loading = false
+          })
+      },
+      getBrands() {
+        let _this = this
+        this.$services.equipment.get('brands', {})
+          .then(res => {
+            // response
+            for (var i = 0; i < res.data.items.length; i++) {
+              _this.brandoptions.push({
+                value: res.data.items[i],
+                label: res.data.items[i]
+              })
+            }
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+            this.loading = false
+          })
+      },
+      handleVisible(status) {
+        this.modeloptions = []
+        if (status) {
+          let _this = this
+          this.$services.equipment.get('dmodels/' + _this.editequipmentform.brands, {})
+            .then(res => {
+              // response
+              for (var i = 0; i < res.data.items.length; i++) {
+                _this.modeloptions.push({
+                  value: res.data.items[i],
+                  label: res.data.items[i]
+                })
+              }
+            })
+            .catch(err => {
+              // handle error
+              console.error(err)
+              this.loading = false
+            })
+        }
+      },
+      deleteEquipment(code, index, v) {
+        let _this = this
+        _this.$confirm(this.$t('message.equipment.will'), this.$t('message.prompt'), {
+        confirmButtonText: this.$t('message.submit'),
+          cancelButtonText: this.$t('message.cancel'),
+          type: 'warning'
+        }).then(() => {
+          _this.$services.equipment.delete(code, null)
+            .then(res => {
+              // response
+              if (res.data.code === 0) {
+                _this.$message({
+                  type: 'success',
+                  message: res.data.message
+                })
+                // 更新界面
+                this.deletedata2(v)
+                this.initData()
+              } else {
+                _this.$message({
+                  type: 'warning',
+                  message: res.data.message
+                })
+              }
+            })
+            .catch(() => {})
+        }).catch(() => {})
+      },
+      getorgtreelist() {
+        let _this = this
+        // request
+        _this.$services.organizes.get('list', {})
+          .then(res => {
+            _this.orgtreelist = _this.toolfun_gettreejson(res.data.items, 'Id', 'Parentid', 'Id,Fullname')
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
+      // 删除设备连带着删除报警
+       deletedata2(v) {
+        this.$services.trigger.get('list/' + v, null)
+          .then(res => {
+            // response
+            // this.triggerlist = res.data.items
+           for (var i = 0; i < res.data.items.length; i++) {
+               console.log('---------ID----------', res.data.items[i].Trigger.id)
+               this.deletetriggerdata2(res.data.items[i].Trigger.id)
+              }
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+            this.loading = false
+          })
+      },
+      toolfun_gettreejson(rows, idFieldName, pidFieldName, fileds) { // 工具方法,将扁平数据转化成tree格式数据
+        function nodejsonexists(rows, ParentId) {
+          for (var i = 0; i < rows.length; i++) {
+            if (rows[i][idFieldName] === ParentId) {
+              return true
+            }
+          }
+          return false
+        }
+        let nodes = []
+        // get the top level nodes
+        for (let i = 0; i < rows.length; i++) {
+          let row = rows[i]
+          if (!nodejsonexists(rows, row[pidFieldName])) {
+            var data = {
+              id: row[idFieldName]
+            }
+            let arrFiled = fileds.split(',')
+            for (var j = 0; j < arrFiled.length; j++) {
+              if (arrFiled[j] !== idFieldName) {
+                data[arrFiled[j]] = row[arrFiled[j]]
+              }
+            }
+            nodes.push(data)
+          }
+        }
+        let toDo = []
+        for (let i = 0; i < nodes.length; i++) {
+          toDo.push(nodes[i])
+        }
+        while (toDo.length) {
+          let node = toDo.shift() // the parent node
+          // get the children nodes
+          for (let i = 0; i < rows.length; i++) {
+            let row = rows[i]
+            if (row[pidFieldName] === node.id) {
+              let child = {
+                id: row[idFieldName]
+              }
+              let arrFiled = fileds.split(',')
+              for (let j = 0; j < arrFiled.length; j++) {
+                if (arrFiled[j] !== idFieldName) {
+                  child[arrFiled[j]] = row[arrFiled[j]]
+                }
+              }
+              if (node.children) {
+                node.children.push(child)
+              } else {
+                node.children = [child]
+              }
+              toDo.push(child)
+            }
+          }
+        }
+        return nodes
+      },
+      strsplit(str, char) { // 处理字符串,将字符串按符号分隔成数组
+        return str.split(char)
+      }
+    },
+    // https://router.vuejs.org/zh-cn/essentials/dynamic-matching.html#响应路由参数的变化
+    // https://router.vuejs.org/zh-cn/advanced/data-fetching.html
+    watch: {
+      $route() {
+        this.initData()
+      }
+    }
+  }
+
+</script>
+
+<style >
+  .el-pagination {
+    margin: 1rem 0 2rem;
+    text-align: right;
+  }
+  
+  .el-card__header {
+      background:#2b3b49; 
+      color:#FFF;
+  }  
+
+  .devplab {
+    font-size: 13px;
+    color: #424242;
+  }
+  .el-card__body {
+    padding: 15px 20px 0px 20px
+  }
+  .bottom {
+    margin-top: 13px;
+    line-height: 12px;
+  }
+
+  .button {
+    padding: 0;
+    float: right;
+  }
+
+  .image {
+    width: 100%;
+    display: block;
+  }
+
+  .clearfix:before,
+  .clearfix:after {
+    display: table;
+    content: "";
+  }
+
+  .clearfix:after {
+    clear: both
+  }
+
+  .grid-content {
+    height: 55px;
+  }
+
+  .contenttemp {
+    background: #F4A460;
+    color: white;
+    text-align: center;
+    padding: 5px 0 5px 0;
+  }
+
+
+
+  .contento2 {
+    background: #72CB6F;
+    color: white;
+    text-align: center;
+    padding: 5px 0 5px 0;
+  }
+
+  .contentwindspeed {
+    background: #40E0D0;
+    color: white;
+    text-align: center;
+    padding: 5px 0 5px 0;
+  }
+
+  .contentpressure {
+    background: #000080;
+    color: white;
+    text-align: center;
+    padding: 5px 0 5px 0;
+  }
+
+  .contentvolt {
+    background: #6984E3;
+    color: white;
+    text-align: center;
+    padding: 5px 0 5px 0;
+  }
+
+  .contentpw {
+    background: #EDDC49;
+    color: white;
+    text-align: center;
+    padding: 5px 0 5px 0;
+  }
+
+  .contenthr {
+    height: 2px;
+    border: none;
+    border-top: 1px dotted white;
+  }
+
+  .chartico {
+    color: #20A0FF;
+    margin-left: 10px;
+    width: 20px;
+    height: 20px;
+  }
+
+  .devtitle {
+    font-weight: bold;
+    color: #5C5C5C;
+    font-family: '黑体';
+    font-size: 13px
+  }
+
+    .temperaturecolcor {
+    border-radius:5px;
+    /* background: #30c283db; */
+    /* background-image:url('/assets/images/avatar-default.jpg'); */
+   background: url('../../assets/images/1.png') center center no-repeat;
+   background-size:120px 80px;
+   color: white;
+    /* width: 60px; */
+    /* height: 60px; */
+    /* margin: 0px 5px 10px 0px; */
+    text-align: center;
+    padding: 15px 0px 10px 0px;
+    height: 55px;
+  }
+
+    .contenthum {
+  /* background: #5FBDB7; */
+    border-radius:5px;
+    background: url('../../assets/images/2.png') center center no-repeat;
+    background-size:120px 80px;
+    color: white;
+    text-align: center;
+    padding: 15px 0px 10px 0px;
+    height: 55px;
+      /* margin: 0px 5px 5px 0px; */
+  }
+   .indata {
+    font-size: 18px;
+    margin-top: 5px;
+  }
+  p
+  {
+  white-space: nowrap;
+  font-size: 10px;
+  font-weight:bold;
+  }
+
+  ::-webkit-input-placeholder {
+    color: #7A7A7A;
+  }
+
+</style>

+ 110 - 92
frontend_web/src/views/main/index.vue

@@ -1,10 +1,10 @@
 <template>
   <div>
-    <el-card>
+    <!-- <el-card> -->
       <!--备用文字-->
-      <p style="text-align:center" v-show="isnodata">{{ $t('message.index.isnodata') }}</p>
+      <!-- <p style="text-align:center" v-show="isnodata">{{ $t('message.index.isnodata') }}</p> -->
       <!--标题部分-->
-      <div slot="header">
+      <!-- <div slot="header">
         <span>
           <img v-if="user.photo" :src="'http://'+user.host+user.photo" class="avatar-index">
           <img v-else class="avatar-index" src="../../assets/images/avatar-default.jpg" :alt="user.name"> &nbsp;[ {{user.Realname}} ]
@@ -12,172 +12,158 @@
         <router-link :to="'/usersetting'">
           <span style="float:right;color: #6B6B6B;">{{ $t('message.index.person') }}</span>
         </router-link>
-      </div>
+      </div> -->
       <!--单个设备单元-->
       <el-row>
-        <el-col :span="4" v-for="(v, index) in list" style="min-width:190px;">
-          <el-card style="margin:5px;min-width:180px; padding: 0px">
+        <el-col :span="6" v-for="(v, index) in list" style="min-width:253px;">
+          <el-card style="margin:10px;min-width:180px;min-height:180px; padding: 5px" shadow="hover">
             <!--单个设备标题-->
-            <div slot="header">
+            <div style="margin:px;min-width:180px; padding: 5px">
               <router-link :to="'/devices/chart/'+v.Serial+'_'+v.DataItem+'?xn='+v.title">
-                <div style="font-size: 13px; font-weight: 800;height:33px;overflow:hidden;color: #24313C;margin:-15px -15px -25px -15px">
-                  <div style="float: left;width:90%" :title="v.title">{{v.title}}</div>
-                  <div style="float: right">
-                    <i class="icon icon-stop2" style="color:#FF4949;" v-if="v.DState === 2" :title="$t('message.index.offline')"></i>
-                    <i class="icon icon-stop2" style="color:#7FFF00;" v-if="v.DState === 1" :title="$t('message.index.online')"></i>
+                <div style="font-size: 14px; font-weight: 800;height:33px;overflow:hidden;color: #24313C;margin:-10px -15px -15px -15px">
+                  <div style="float: left;width:90%" :title="v.title">传感器: &nbsp;{{v.title}}</div>
+                  <div style="float: right;margin-top:-20px;">
+                    <!-- <i class="icon icon-stop2" style="color:#FF4949;" v-if="v.DState === 2" title="$t('message.index.offline')"></i> -->
+                      <img style="weight:30px;height:25px;" v-if="v.DState === 2" src="../../assets/images/off.png" >
+                    <img style="weight:30px;height:25px;" v-if="v.DState === 1" src="../../assets/images/on.png" >
+                    
+                      <!-- <i class="icon icon-stop2" style="color:#7FFF00;" v-if="v.DState === 1" :title="$t('message.index.online')"></i> -->
                   </div>
                 </div>
               </router-link>
             </div>
-            <div style="height: 70px; padding: 3px; margin: -18px -13px -25px -13px">
+               <el-col class="line" :span="24" style="background-color:lightgrey; line-height: 1px;margin-top:7px;">&nbsp;</el-col>
+            <div style="height:120px; padding: 3px; margin: -18px -13px -25px -13px">
               <el-col :span="8" v-if="contains(havetemp,v.DataItem)">
-                <div class="indgrid-content contenttemp" >
+              <div class="indgrid-content temperaturecolcor1" style="margin:5px">
                   {{ $t('message.index.temperature') }}
-                  <hr class="indcontenthr" />
+                  <!-- <hr class="indcontenthr" /> -->
                   <div class="indata">{{v.Temp}}</div>
                 </div>
               </el-col>
               <el-col :span="8" v-if="contains(havehum,v.DataItem)">
-                <div class="indgrid-content contenthum">
-                 {{ $t('message.index.humidity') }}
-                  <hr class="indcontenthr" />
+               <div class="indgrid-content contenthum1" style="margin:5px">
+                     {{ $t('message.index.humidity') }}
+                  <!-- <hr class="indcontenthr" /> -->
                   <div class="indata">{{v.Hum}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(haveo2,v.DataItem)">
-                <div class="indgrid-content contento2">
+              <el-col :span="8" v-if="contains(haveo2,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                   O2 %
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.O2}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(haveco2,v.DataItem)">
-                <div class="indgrid-content contento2">
+              <el-col :span="8" v-if="contains(haveco2,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                   CO2 %
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.Co2}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(windspeed,v.DataItem)">
-                <div class="indgrid-content contentwindspeed">
+              <el-col :span="8" v-if="contains(windspeed,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                 {{ $t('message.index.wind') }}
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.WindSpeed}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(pressure,v.DataItem)">
-                <div class="indgrid-content contentpressure">
+              <el-col :span="8" v-if="contains(pressure,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                   {{ $t('message.index.pressure') }}
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.Pressure}}</div>
                 </div>
               </el-col>
-               <el-col :span="8" v-if="contains(Ots,v.DataItem)">
-                <div class="indgrid-content contentpressure">
+               <el-col :span="8" v-if="contains(Ots,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                   {{ $t('message.index.Ots') }}
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.Ots}}</div>
                 </div>
               </el-col>
-                <el-col :span="8" v-if="contains(Doorlock,v.DataItem)">
-                <div class="indgrid-content contento2">
+                <el-col :span="8" v-if="contains(Doorlock,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content doorlockc">
                  门禁
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.Doorlock}}</div>
                 </div>
               </el-col>
 
-               <el-col :span="8" v-if="contains(Displacement,v.DataItem)">
-                <div class="indgrid-content contentpressure">
+               <el-col :span="8" v-if="contains(Displacement,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                   {{ $t('message.index.Displacement') }}
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.Displacement}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(h2o,v.DataItem)">
-                <div class="indgrid-content contento2">
+              <el-col :span="8" v-if="contains(h2o,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                   us/cm
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.H2O}}</div>
                 </div>
               </el-col>
-               <el-col :span="8" v-if="contains(so2,v.DataItem)">
-                <div class="indgrid-content contento2">
-                  SO2 ppm
-                  <hr class="indcontenthr" />
+               <el-col :span="8" v-if="contains(so2,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
+                  SO2 
                   <div class="indata">{{v.SO2}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(clo2,v.DataItem)">
-                <div class="indgrid-content contento2">
-                  ClO2 ppm
-                  <hr class="indcontenthr" />
+              <el-col :span="8" v-if="contains(clo2,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
+                  ClO2 
                   <div class="indata">{{v.ClO2}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(c2h4,v.DataItem)">
-                <div class="indgrid-content contento2">
-                  C2H4 ppm
-                  <hr class="indcontenthr" />
+              <el-col :span="8" v-if="contains(c2h4,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
+                  C2H4 
                   <div class="indata">{{v.C2H4}}</div>
                 </div>
               </el-col>
-               <el-col :span="8" v-if="contains(c2h2,v.DataItem)">
-                <div class="indgrid-content contento2">
+               <el-col :span="8" v-if="contains(c2h2,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                   C2H2
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.C2H2}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(cl2,v.DataItem)">
-                <div class="indgrid-content contento2">
-                  Cl2 ppm
-                  <hr class="indcontenthr" />
+              <el-col :span="8" v-if="contains(cl2,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
+                  Cl2 
                   <div class="indata">{{v.Cl2}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(o3,v.DataItem)">
-                <div class="indgrid-content contento2">
-                  O3 ppm
-                  <hr class="indcontenthr" />
+              <el-col :span="8" v-if="contains(o3,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
+                  O3 
                   <div class="indata">{{v.O3}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(tvoc,v.DataItem)">
-                <div class="indgrid-content contento2">
+              <el-col :span="8" v-if="contains(tvoc,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                   TVOC mg
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.TVOC}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(havepower,v.DataItem)">
-                <div class="indgrid-content contentpw">
+              <el-col :span="8" v-if="contains(havepower,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                       {{ $t('message.index.power') }}
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.Power}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(havesupply,v.DataItem)">
-                <div class="indgrid-content contentvolt">
+              <el-col :span="8" v-if="contains(havesupply,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                      {{ $t('message.index.electric') }}
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.Supply}}</div>
                 </div>
               </el-col>
-              <el-col :span="8" v-if="contains(haveliquidlevel,v.DataItem)">
-                <div class="indgrid-content contentvolt">
+              <el-col :span="8" v-if="contains(haveliquidlevel,v.DataItem)" style="margin:5px">
+                <div class="indgrid-content contento2c">
                     {{ $t('message.index.Voltage') }}
-                  <hr class="indcontenthr" />
                   <div class="indata">{{v.LiquidLevel}}</div>
                 </div>
               </el-col>
-              <el-col class="line" :span="24" style="background-color:lightgrey; line-height: 1px;margin-top:7px">&nbsp;</el-col>
+              <el-col class="line" :span="24" style="background-color:lightgrey; line-height: 1px;margin-top:7px;">&nbsp;</el-col>
               <el-col class="devplab" :span="24">
-                  {{ $t('message.index.Update') }}
+                  {{ $t('message.index.Update') }} {{v.Time}}
               </el-col>
-              <el-col class="devplab" :span="24">
+              <!-- <el-col class="devplab" :span="24" >
                 {{v.Time}}
-              </el-col>
+              </el-col> -->
             </div>
           </el-card>
         </el-col>
@@ -186,7 +172,7 @@
       <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[30, 50, 100]"
         :page-size="size" layout="total, sizes, prev, pager, next, jumper" :total="currentItemCount">
       </el-pagination>
-    </el-card>
+    <!-- </el-card> -->
   </div>
 </template>
 
@@ -264,7 +250,6 @@
           .then(res => {
             // response
             _this.list = res.data.items
-            console.log('--------- _this.list---------', _this.list)
             if (_this.list.length < 1) {
               _this.isnodata = true
             } else {
@@ -361,7 +346,7 @@
     padding: 0;
     float: right;
   }
-
+  
   .clearfix:before,
   .clearfix:after {
     display: table;
@@ -385,11 +370,15 @@
     padding: 5px 0 5px 0;
   }
 
-  .contenthum {
-    background: #5FBDB7;
+  .contenthum1 {
+    /* background: #5FBDB7; */
+    background: url('../../assets/images/2.png') center center no-repeat;
+   background-size:100px 80px;
+     border-radius:5px;
     color: white;
     text-align: center;
-    padding: 5px 0 5px 0;
+    padding: 15px;
+      margin: 0px 5px 5px 0px;
   }
 
   .contentpw {
@@ -406,11 +395,25 @@
     padding: 5px 0 5px 0;
   }
 
-  .contento2 {
-    background: #72CB6F;
+  .contento2c {
+    /* background: #5FBDB7; */
+    background: url('../../assets/images/3.png') center center no-repeat;
+   background-size:100px 80px;
+     border-radius:5px;
     color: white;
     text-align: center;
-    padding: 5px 0 5px 0;
+    padding: 15px;
+      margin: 0px 5px 5px 0px;
+  }
+  .doorlockc{
+     /* background: #5FBDB7; */
+    background: url('../../assets/images/4.png') center center no-repeat;
+   background-size:100px 80px;
+     border-radius:5px;
+    color: white;
+    text-align: center;
+    padding: 15px;
+      margin: 0px 5px 5px 0px;
   }
 
   .contentwindspeed {
@@ -433,6 +436,19 @@
     border-top: 1px dotted white;
   }
 
+  .temperaturecolcor1 {
+    border-radius:5px;
+    /* background: #30c283db; */
+    /* background-image:url('/assets/images/avatar-default.jpg'); */
+   background: url('../../assets/images/1.png') center center no-repeat;
+   background-size:100px 80px;
+    color: white;
+    /* width: 60px; */
+    /* height: 60px; */
+    margin: 0px 5px 5px 0px;
+    text-align: center;
+    padding: 15px;
+  }
   .avatar-index {
     width: 45px;
     height: 45px;
@@ -441,12 +457,14 @@
   }
 
   .indata {
-    font-size: 15px;
-    margin-top: -2px
+    font-size: 18px;
+    margin-top: 5px;
   }
     .devplab {
     font-size: 13px;
     color: #424242;
+    font-weight:500;
+    margin-top:15px;
   }
 
 </style>

+ 104 - 30
frontend_web/src/views/main/index1.vue → frontend_web/src/views/main/index2.vue

@@ -1,10 +1,10 @@
 <template>
   <div>
-    <el-card>
+    <!-- <el-card> -->
       <!--备用文字-->
-      <p style="text-align:center" v-show="isnodata">{{ $t('message.index.isnodata') }}</p>
+      <!-- <p style="text-align:center" v-show="isnodata">{{ $t('message.index.isnodata') }}</p> -->
       <!--标题部分-->
-      <div slot="header">
+      <!-- <div slot="header">
         <span>
           <img v-if="user.photo" :src="'http://'+user.host+user.photo" class="avatar-index">
           <img v-else class="avatar-index" src="../../assets/images/avatar-default.jpg" :alt="user.name"> &nbsp;[ {{user.Realname}} ]
@@ -12,35 +12,39 @@
         <router-link :to="'/usersetting'">
           <span style="float:right;color: #6B6B6B;">{{ $t('message.index.person') }}</span>
         </router-link>
-      </div>
+      </div> -->
       <!--单个设备单元-->
       <el-row>
-        <el-col :span="4" v-for="(v, index) in list" style="min-width:190px;">
-          <el-card style="margin:5px;min-width:180px; padding: 0px">
+        <el-col :span="6" v-for="(v, index) in list" style="min-width:190px;">
+          <el-card style="margin:10px;min-width:180px;min-height:180px; padding: 5px" shadow="hover">
             <!--单个设备标题-->
-            <div slot="header">
+            <div style="margin:px;min-width:180px; padding: 5px">
               <router-link :to="'/devices/chart/'+v.Serial+'_'+v.DataItem+'?xn='+v.title">
-                <div style="font-size: 13px; font-weight: 800;height:33px;overflow:hidden;color: #24313C;margin:-15px -15px -25px -15px">
-                  <div style="float: left;width:90%" :title="v.title">{{v.title}}</div>
-                  <div style="float: right">
-                    <i class="icon icon-stop2" style="color:#FF4949;" v-if="v.DState === 2" :title="$t('message.index.offline')"></i>
-                    <i class="icon icon-stop2" style="color:#7FFF00;" v-if="v.DState === 1" :title="$t('message.index.online')"></i>
+                <div style="font-size: 14px; font-weight: 800;height:33px;overflow:hidden;color: #24313C;margin:-10px -15px -15px -15px">
+                  <div style="float: left;width:90%" :title="v.title">传感器: &nbsp;{{v.title}}</div>
+                  <div style="float: right;margin-top:-20px;">
+                    <!-- <i class="icon icon-stop2" style="color:#FF4949;" v-if="v.DState === 2" title="$t('message.index.offline')"></i> -->
+                      <img style="weight:30px;height:25px;" v-if="v.DState === 2" src="../../assets/images/off.png" >
+                    <img style="weight:30px;height:25px;" v-if="v.DState === 1" src="../../assets/images/on.png" >
+                    
+                      <!-- <i class="icon icon-stop2" style="color:#7FFF00;" v-if="v.DState === 1" :title="$t('message.index.online')"></i> -->
                   </div>
                 </div>
               </router-link>
             </div>
-            <div style="height: 70px; padding: 3px; margin: -18px -13px -25px -13px">
+               <el-col class="line" :span="24" style="background-color:lightgrey; line-height: 1px;margin-top:7px;">&nbsp;</el-col>
+            <div style="height:120px; padding: 3px; margin: -18px -13px -25px -13px">
               <el-col :span="8" v-if="contains(havetemp,v.DataItem)">
-                <div class="indgrid-content contenttemp" >
+              <div class="indgrid-content temperaturecolcor1" style="margin:5px">
                   {{ $t('message.index.temperature') }}
-                  <hr class="indcontenthr" />
+                  <!-- <hr class="indcontenthr" /> -->
                   <div class="indata">{{v.Temp}}</div>
                 </div>
               </el-col>
               <el-col :span="8" v-if="contains(havehum,v.DataItem)">
-                <div class="indgrid-content contenthum">
-                 {{ $t('message.index.humidity') }}
-                  <hr class="indcontenthr" />
+               <div class="indgrid-content contenthum1" style="margin:5px">
+                     {{ $t('message.index.humidity') }}
+                  <!-- <hr class="indcontenthr" /> -->
                   <div class="indata">{{v.Hum}}</div>
                 </div>
               </el-col>
@@ -71,6 +75,42 @@
                   <hr class="indcontenthr" />
                   <div class="indata">{{v.Pressure}}</div>
                 </div>
+              </el-col>
+               <el-col :span="8" v-if="contains(Ots,v.DataItem)">
+                <div class="indgrid-content contentpressure">
+                  {{ $t('message.index.Ots') }}
+                  <hr class="indcontenthr" />
+                  <div class="indata">{{v.Ots}}</div>
+                </div>
+              </el-col>
+                <el-col :span="8" v-if="contains(Doorlock,v.DataItem)">
+                <div class="indgrid-content contento2">
+                 门禁
+                  <!-- <hr class="indcontenthr" /> -->
+                  <div class="indata">{{v.Doorlock}}</div>
+                </div>
+              </el-col>
+
+               <el-col :span="8" v-if="contains(Displacement,v.DataItem)">
+                <div class="indgrid-content contentpressure">
+                  {{ $t('message.index.Displacement') }}
+                  <hr class="indcontenthr" />
+                  <div class="indata">{{v.Displacement}}</div>
+                </div>
+              </el-col>
+              <el-col :span="8" v-if="contains(h2o,v.DataItem)">
+                <div class="indgrid-content contento2">
+                  us/cm
+                  <hr class="indcontenthr" />
+                  <div class="indata">{{v.H2O}}</div>
+                </div>
+              </el-col>
+               <el-col :span="8" v-if="contains(so2,v.DataItem)">
+                <div class="indgrid-content contento2">
+                  SO2 ppm
+                  <hr class="indcontenthr" />
+                  <div class="indata">{{v.SO2}}</div>
+                </div>
               </el-col>
               <el-col :span="8" v-if="contains(clo2,v.DataItem)">
                 <div class="indgrid-content contento2">
@@ -135,13 +175,13 @@
                   <div class="indata">{{v.LiquidLevel}}</div>
                 </div>
               </el-col>
-              <el-col class="line" :span="24" style="background-color:lightgrey; line-height: 1px;margin-top:7px">&nbsp;</el-col>
+              <el-col class="line" :span="24" style="background-color:lightgrey; line-height: 1px;margin-top:7px;">&nbsp;</el-col>
               <el-col class="devplab" :span="24">
-                  {{ $t('message.index.Update') }}
+                  {{ $t('message.index.Update') }} {{v.Time}}
               </el-col>
-              <el-col class="devplab" :span="24">
+              <!-- <el-col class="devplab" :span="24" >
                 {{v.Time}}
-              </el-col>
+              </el-col> -->
             </div>
           </el-card>
         </el-col>
@@ -150,7 +190,7 @@
       <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[30, 50, 100]"
         :page-size="size" layout="total, sizes, prev, pager, next, jumper" :total="currentItemCount">
       </el-pagination>
-    </el-card>
+    <!-- </el-card> -->
   </div>
 </template>
 
@@ -174,7 +214,12 @@
         haveco2: '9,26',
         windspeed: '18',
         pressure: '19',
+        Doorlock: '31',
+        Ots: '29',
+        Displacement: '30',
         clo2: '20',
+        h2o: '27',
+        so2: '28',
         c2h4: '21',
         c2h2: '25',
         cl2: '22',
@@ -261,10 +306,20 @@
             _this.list[k].Co2 = res.data.Co2
             _this.list[k].WindSpeed = res.data.WindSpeed
             _this.list[k].Pressure = res.data.Pressure
+             _this.list[k].Ots = res.data.Ots
+             if (res.data.Doorlock === '0') {
+                 _this.list[k].Doorlock = '关闭'
+             } else {
+                _this.list[k].Doorlock = '开启'
+             }
+  
+              _this.list[k].Displacement = res.data.Displacement
             _this.list[k].C2H4 = res.data.C2H4
              _this.list[k].C2H2 = res.data.C2H2
             _this.list[k].Cl2 = res.data.Cl2
             _this.list[k].ClO2 = res.data.ClO2
+             _this.list[k].H2O = res.data.H2O
+             _this.list[k].SO2 = res.data.SO2
             _this.list[k].O3 = res.data.O3
             _this.list[k].TVOC = res.data.TVOC
             _this.list[k].Power = res.data.Power
@@ -309,7 +364,7 @@
     padding: 0;
     float: right;
   }
-
+  
   .clearfix:before,
   .clearfix:after {
     display: table;
@@ -333,11 +388,15 @@
     padding: 5px 0 5px 0;
   }
 
-  .contenthum {
-    background: #5FBDB7;
+  .contenthum1 {
+    /* background: #5FBDB7; */
+    background: url('../../assets/images/2.png') center center no-repeat;
+   background-size:100px 80px;
+     border-radius:5px;
     color: white;
     text-align: center;
-    padding: 5px 0 5px 0;
+    padding: 15px;
+      margin: 0px 5px 5px 0px;
   }
 
   .contentpw {
@@ -358,7 +417,7 @@
     background: #72CB6F;
     color: white;
     text-align: center;
-    padding: 5px 0 5px 0;
+   padding: 15px;
   }
 
   .contentwindspeed {
@@ -381,6 +440,19 @@
     border-top: 1px dotted white;
   }
 
+  .temperaturecolcor1 {
+    border-radius:5px;
+    /* background: #30c283db; */
+    /* background-image:url('/assets/images/avatar-default.jpg'); */
+   background: url('../../assets/images/1.png') center center no-repeat;
+   background-size:100px 80px;
+    color: white;
+    /* width: 60px; */
+    /* height: 60px; */
+    margin: 0px 5px 5px 0px;
+    text-align: center;
+    padding: 15px;
+  }
   .avatar-index {
     width: 45px;
     height: 45px;
@@ -389,12 +461,14 @@
   }
 
   .indata {
-    font-size: 15px;
-    margin-top: -2px
+    font-size: 18px;
+    margin-top: 5px;
   }
     .devplab {
     font-size: 13px;
     color: #424242;
+    font-weight:500;
+    margin-top:15px;
   }
 
 </style>

+ 101 - 7
frontend_web/src/views/main/loginfo.vue

@@ -6,18 +6,23 @@
       </div>
       <el-button type="primary" size="small" icon="search" @click="seachdata">{{ $t('message.Inquire') }}</el-button>
     </div>
-    <el-table :data="list" border>
-      <el-table-column prop="Createby" :label="$t('message.loginfo.Operator')" show-overflow-tooltip></el-table-column>
-      <el-table-column :label="$t('message.loginfo.time')" prop="Createon"  >
+    <el-table :data="list" >
+       <el-table-column :label="$t('message.loginfo.time')" align="center" prop="Createon"  >
         <template scope="scope">
-          <p>{{jstimehandle(scope.row.Createon)}}</p>
+          <p>{{jstimehandle(scope.row.Createon)}}&nbsp;中国标准时间</p>
         </template>
       </el-table-column>
-      <el-table-column prop="TName" :label="$t('message.loginfo.content')"  show-overflow-tooltip>
+      <el-table-column prop="Createby" align="center"  :label="$t('message.loginfo.Operator')" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="TName" align="center"  label="变更类型"  show-overflow-tooltip>
         <template scope="scope">
           <p>{{getoperaname(scope.row.TName)}}</p>
         </template>
       </el-table-column>
+       <el-table-column label="操作"  align="center"  width="180"> 
+        <template scope="scope">
+         <el-button size="small"  @click="opendatadialog(scope.row)">查看</el-button>
+        </template>
+      </el-table-column>
     </el-table>
     <el-pagination
       @size-change="handleSizeChange"
@@ -28,7 +33,50 @@
       layout="total, sizes, prev, pager, next, jumper"
       :total="currentItemCount">
     </el-pagination>
+     <el-dialog title="日志详情" :visible.sync="datadialogVisible" top="5%">
+      <el-form :model="listde" >
+        <el-form-item v-if="listde.TName == 'EquipMent'" label="操作设备" label-width="120px">
+          <el-input v-model="listde.Code" :disabled="true"></el-input>
+        </el-form-item>
+         <el-form-item v-if="listde.TName == 'AllalarmLog'" label="操作设备" label-width="120px">
+          <el-input v-model="listde.title" :disabled="true"></el-input>
+        </el-form-item>
+         <el-form-item v-if="listde.TName == 'Channels'" label="操作设备" label-width="120px">
+          <el-input v-model="listde.Serial" :disabled="true"></el-input>
+        </el-form-item>
+         <el-form-item v-if="listde.TName == 'Device'" label="操作设备" label-width="120px">
+          <el-input v-model="listde.Serial" :disabled="true"></el-input>
+        </el-form-item>
+          <el-form-item v-if="listde.TName == 'Base_User'" label="用户名" label-width="120px">
+          <el-input v-model="listde.Departmentname" :disabled="true"></el-input>
+        </el-form-item>
+         <el-form-item v-if="listde.TName == 'Base_User'" label="Email" label-width="120px">
+          <el-input v-model="listde.Email" :disabled="true"></el-input>
+        </el-form-item> 
+          <el-form-item v-if="listde.TName == 'Trigger'" label="设备编号" label-width="120px">
+          <el-input v-model="listde.serial" :disabled="true"></el-input>
+        </el-form-item>
+           <el-form-item v-if="listde.TName == 'Trigger'" label="设备名称" label-width="120px">
+          <el-input v-model="listde.rangeweek" :disabled="true"></el-input>
+        </el-form-item>
+          <el-form-item v-if="listde.TName == 'Trigger'" label="修改参数" label-width="120px">
+          <el-input v-model="listde.column" :disabled="true"></el-input>
+        </el-form-item>
+          <el-form-item v-if="listde.TName == 'Trigger'" label="数值" label-width="120px">
+          <el-input v-model="listde.value" :disabled="true"></el-input>
+        </el-form-item>
+          <el-form-item v-if="listde.TName == 'Trigger'" label="发送内容" label-width="120px">
+          <el-input v-model="listde.content" :disabled="true"></el-input>
+        </el-form-item>
+         <el-form-item label="操作人" label-width="120px">
+          <el-input v-model="listde.Createby" :disabled="true"></el-input>
+        </el-form-item>
+      </el-form>
 
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="datadialogVisible = false">关闭</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -41,7 +89,9 @@
         currentPage: 1,
         size: 10,
         list: [],
-        keyword: ''
+        listde: [],
+        keyword: '',
+        datadialogVisible: false
       }
     },
     created () {
@@ -58,6 +108,7 @@
           .then(res => {
             // response
             _this.list = res.data.items
+            console.log('-----res.data.items-----', res.data.items)
             // toggle loading
             // _this.loading = false
             _this.currentItemCount = res.data.currentItemCount
@@ -66,6 +117,41 @@
             // handle error
             console.error(err)
           })
+      },
+       opendatadialog (item) {
+        console.log('---item-----', item)
+        console.log('---222-----', JSON.parse(item.RecordData))
+        this.listde = []
+        this.datadialogVisible = true
+        this.listde.TName = item.TName
+        this.listde.Createby = item.Createby
+
+        // EquipMent
+        this.listde.Code = JSON.parse(item.RecordData).Code
+        // "AllalarmLog"
+        this.listde.title = JSON.parse(item.RecordData).title
+         // "Device"
+        this.listde.Serial = JSON.parse(item.RecordData).Serial
+        // "Base_User"
+        this.listde.Departmentname = JSON.parse(item.RecordData).Departmentname
+        this.listde.Email = JSON.parse(item.RecordData).Email
+        // temperature
+        this.listde.serial = JSON.parse(item.RecordData).valueold.serial
+        console.log('----温度-----', JSON.parse(item.RecordData).valueold.column)
+        if (JSON.parse(item.RecordData).valueold.column === 'temperature') {
+        this.listde.column = '温度'
+        } else if (JSON.parse(item.RecordData).valueold.column === 'humidity') {
+        this.listde.column = '湿度'
+        } else if (JSON.parse(item.RecordData).valueold.column === 'voltage') {
+        this.listde.column = '电量'
+        }
+        if (JSON.parse(item.RecordData).valueold.rangeweek === '1234567') {
+           this.listde.rangeweek = ''
+        } else {
+          this.listde.rangeweek = JSON.parse(item.RecordData).valueold.rangeweek
+        }
+        this.listde.content = JSON.parse(item.RecordData).valueold.content + '-->' + JSON.parse(item.RecordData).valuenew.content
+        this.listde.value = JSON.parse(item.RecordData).valueold.value + '-->' + JSON.parse(item.RecordData).valuenew.value
       },
       seachdata () {
         this.currentPage = 1
@@ -86,7 +172,7 @@
       },
       getoperaname(value) {
         switch (value) {
-          case 'Channels':
+          case 'EquipMent':
           return this.$t('message.loginfo.Device')
           case 'Base_Company':
           return this.$t('message.loginfo.Enterprise')
@@ -106,6 +192,14 @@
           return this.$t('message.loginfo.parameter')
           case 'AllalarmLog':
           return this.$t('message.loginfo.status')
+          case 'Channels':
+          return '设备管理参数'
+          case 'Device':
+          return '网关管理参数'
+          case 'Trigger':
+          return '报警参数'
+          case 'AuthCodeLog':
+          return '授权参数'
           default:
           return value
         }

+ 12 - 11
frontend_web/src/views/main/management.vue

@@ -2,7 +2,7 @@
   <div>
     <el-row :gutter="10">
       <el-col :span="12">
-        <el-card class="box-card">
+        <el-card style="height:280px;">
           <div slot="header" class="clearfix">
             <span class="box-card-title">
               <img v-if="session.user.Profile.Photo" :src="'http://'+session.user.Profile.Host+session.user.Profile.Photo" class="avatar-index">
@@ -13,10 +13,11 @@
           </div>
           <div>
             <el-row>
-              <el-col :span="10">
-                <div id="deviceChartPie" style="width:100%; height:150px;"></div>
+              <el-col :span="2" >
+               <div style="width:100%; height:150px;"></div>
+                <!-- <div id="deviceChartPie" style="width:100%; height:150px;"></div> -->
               </el-col>
-              <el-col :span="7">
+              <el-col :span="8">
                 <div style="padding: 20px;margin-top:30px;">
                   <span class="accountindex">{{useraccount.notenum}}</span>
                   <div class="bottom clearfix">
@@ -25,7 +26,7 @@
                   </div>
                 </div>
               </el-col>
-              <el-col :span="7">
+              <el-col :span="8">
                 <div style="padding: 20px;margin-top:30px;">
                   <span class="accountindex">{{useraccount.voicenum}}</span>
                   <div class="bottom clearfix">
@@ -39,7 +40,7 @@
         </el-card>
       </el-col>
       <el-col :span="12">
-        <el-card class="box-card">
+        <el-card style="height:280px;">
           <div slot="header" class="clearfix">
             <span class="box-card-title">
               <i class="icon icon-fire"></i> {{ $t('message.management.Alarm') }}</span>
@@ -55,8 +56,8 @@
       </el-col>
     </el-row>
 
-    <el-card class="box-card">
-      <div slot="header" class="clearfix">
+    <el-card style="margin-top:13px;">
+      <div slot="header" class="clearfix" style="margin-top:13px;">
         <span class="box-card-title">
           <i class="icon icon-leaf"></i> {{ $t('message.management.Normal') }}</span>
       </div>
@@ -150,7 +151,7 @@
 
     <br>
 
-    <el-card class="box-card">
+    <!-- <el-card >
       <div slot="header" class="clearfix">
         <span class="box-card-title">
           <i class="icon icon-lifebuoy"></i> {{ $t('message.management.Abnormal') }}</span>
@@ -218,7 +219,7 @@
           </el-col>
         </el-row>
       </div>
-    </el-card>
+    </el-card> -->
 
   </div>
 </template>
@@ -664,7 +665,7 @@
   }
 
   .el-row {
-    margin-bottom: 20px;
+    /* margin-bottom: 20px; */
     &:last-child {
       margin-bottom: 0;
     }

+ 264 - 0
frontend_web/src/views/main/record_history.vue

@@ -0,0 +1,264 @@
+<template>
+  <div v-loading="downloading" :element-loading-text="$t('message.Load')">
+  
+    <el-table :data="list" @selection-change="handleSelectionChange">
+      <el-table-column
+      type="selection"
+      width="60"></el-table-column>
+     
+      <el-table-column prop="DeviceName" label="设备名称" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="ChannelCode" label="设备编号" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="ChannelName" label="所属组织"  show-overflow-tooltip></el-table-column>
+       <el-table-column prop="SendTo" label="操作人"  show-overflow-tooltip></el-table-column>
+      <el-table-column label="开门时间"  show-overflow-tooltip>
+        <template scope="scope">
+          {{jstimehandle(scope.row.CreateOn)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="Message" label="操作状态"   show-overflow-tooltip>
+        <!-- <template scope="scope"> -->
+          <template scope="scope"> 
+          <el-tag type="success" >{{'开锁'}}</el-tag>
+          <!-- <el-tag type="danger" v-if="scope.row.issend === 1">{{ $t('message.abnormalsetting.failure') }}</el-tag>
+          <el-tag type="warning" v-if="scope.row.issend === 2">{{ $t('message.abnormalsetting.Unsent') }}</el-tag> -->
+        </template>
+      </el-table-column>
+     
+    </el-table>
+    <el-pagination
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+      :current-page="currentPage"
+      :page-sizes="[10, 15, 20, 25]"
+      :page-size="size"
+      layout="total, sizes, prev, pager, next, jumper"
+      :total="currentItemCount">
+    </el-pagination>
+
+    <el-dialog :title="dialogtitle" :visible.sync="datadialogVisible" top="5%">
+      <p class="triggerone">{{ $t('message.abnormalsetting.type') }}:{{getetypename(triggerform.eventfiled)}}</p>
+      <p class="triggerone">{{ $t('message.abnormalsetting.alarm') }}:{{gettypename(triggerform.type)}}</p>
+      <p class="triggerone">{{ $t('message.abnormalsetting.Device') }}:{{triggerform.cname}}</p>
+      <p class="triggerone">{{ $t('message.abnormalsetting.object') }}:{{triggerform.sendto}}</p>
+      <p class="triggerone">{{ $t('message.abnormalsetting.Alarm') }}:{{triggerform.alarmon}}</p>
+      <p class="triggerone">{{ $t('message.') }}:{{triggerform.message}}</p>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="datadialogVisible = false">{{ $t('message.users.cancel') }}</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import axios from 'axios'
+  export default {
+    name: 'abnormalmsg',
+
+    data () {
+      return {
+        currentItemCount: 0,
+        currentPage: 1,
+        size: 20,
+        list: [],
+        datadialogVisible: false,
+        dialogtitle: '',
+        triggerform: {
+          eventfiled: '',
+          cname: '',
+          ccode: '',
+          type: '',
+          alarmon: new Date(),
+          sendto: '',
+          message: '',
+          remark: '',
+          id: 0
+        },
+        selectlist: [],
+        seachform: {
+          etype: '',
+          timerange: [new Date(new Date() - 30 * 24 * 3600 * 1000), new Date()],
+          channel: ''
+        },
+        downloading: false
+      }
+    },
+
+    created () {
+      // initial data
+      this.initData(this.$route.query.code)
+    },
+
+    methods: {
+      initData (code) {
+       let _this = this
+        // request
+          axios.request({
+            method: 'get',
+            url: 'http://39.98.34.197:12001/api/remote_control/gettriggerhistory?current=1&size=20&code=' + code
+          }).then(res => {
+          _this.list = res.data.data
+            console.log('-----res------', res.data.data)
+            _this.currentItemCount = res.data.data.length
+          }).catch(error => {
+            console.log(error)
+          })
+      },
+      seachdata () {
+        let value = this.seachform.timerange
+        if (value) {
+          if (value.length === 2 && value[0] !== null) {
+            this.currentPage = 1
+            this.initData()
+            return
+          }
+        }
+        this.$message({
+          type: 'warning',
+          message: this.$t('message.abnormalsetting.range')
+        })
+      },
+      handleSizeChange (value) {
+        this.size = value
+        this.currentPage = 1
+        this.initData()
+      },
+      handleCurrentChange (value) {
+        this.currentPage = value
+        this.initData()
+      },
+      jstimehandle (val) {
+        val = val.replace('T', ' ')
+        return val.substring(0, 19)
+      },
+      opendatadialog (v, index) {
+        this.datadialogVisible = true
+        this.dialogtitle = this.$t('message.abnormalsetting.history')
+        this.triggerform.cname = v.cname
+        this.triggerform.ccode = v.ccode
+        this.triggerform.id = v.id
+        this.triggerform.type = v.type
+        this.triggerform.eventfiled = v.eventfiled
+        this.triggerform.alarmon = v.alarmon
+        this.triggerform.sendto = v.sendto
+        this.triggerform.message = v.message
+        this.triggerform.remark = v.remark
+      },
+      deletedata (val) {
+        let _this = this
+       _this.$confirm(this.$t('message.users.warn'), this.$t('message.users.tip'), {
+          confirmButtonText: this.$t('message.users.confirm'),
+          cancelButtonText: this.$t('message.users.cancel'),
+          type: 'warning'
+        }).then(() => {
+          _this.$services.abnormal.delete('historymsg/' + val.id, null)
+            .then(res => {
+              // response
+              if (res.data.code === 0) {
+                _this.$message({
+                  type: 'success',
+                  message: res.data.message
+                })
+                // 更新界面
+                this.initData()
+              } else {
+                _this.$message({
+                  type: 'warning',
+                  message: res.data.message
+                })
+              }
+            })
+            .catch(() => {})
+        }).catch(() => {})
+      },
+      gettypename (val) {
+        if (val === 'email') {
+          return this.$t('message.actions.e-mail')
+        } else if (val === 'url') {
+          return this.$t('message.actions.e-URL')
+        } else if (val === 'alertor') {
+          return this.$t('message.actions.Alarm')
+        } else if (val === 'sms') {
+          return this.$t('message.actions.SMS')
+        } else if (val === 'voice') {
+          return this.$t('message.actions.voice')
+        }
+      },
+      getetypename (val) {
+        if (val === 'sensor_abnormal') {
+          return this.$t('message.abnormalsetting.offline')
+        } else if (val === 'alarm_low') {
+          return this.$t('message.abnormalsetting.low')
+        } else if (val === 'alarm_offline') {
+          return this.$t('message.abnormalsetting.Sound')
+        } else if (val === 'sms') {
+          return this.$t('message.abnormalsetting.SMS')
+        } else if (val === 'voice') {
+          return this.$t('message.abnormalsetting.Voice')
+        } else if (val === 'box_low') {
+          return this.$t('message.abnormalsetting.battery')
+        } else if (val === 'box_offline') {
+          return this.$t('message.abnormalsetting.Gateway')
+        }
+      },
+      batchdata () {
+        let _this = this
+        if (_this.selectlist.length > 0) {
+         _this.$confirm(this.$t('message.users.warn'), this.$t('message.users.tip'), {
+          confirmButtonText: this.$t('message.users.confirm'),
+          cancelButtonText: this.$t('message.users.cancel'),
+            type: 'warning'
+          }).then(() => {
+            let ids = []
+            _this.selectlist.forEach(row => {
+              ids.push(row.id)
+            })
+            _this.$services.abnormal.delete('historymsg/batchdelete/' + ids, null)
+              .then(res => {
+                // response
+                if (res.data.code === 0) {
+                  _this.$message({
+                    type: 'success',
+                    message: res.data.message
+                  })
+                  // 更新界面
+                  this.initData()
+                } else {
+                  _this.$message({
+                    type: 'warning',
+                    message: res.data.message
+                  })
+                }
+              })
+              .catch(() => {})
+          }).catch(() => {})
+        } else {
+          _this.$message({
+            type: 'warning',
+            message: this.$t('message.users.select')
+          })
+        }
+      },
+      handleSelectionChange(val) {
+        this.selectlist = val
+      }
+    }
+  }
+</script>
+
+<style lang="css">
+ .el-pagination {
+    margin: 1rem 0 2rem;
+    text-align: right;
+  }
+  .triggerone {
+    font-size: 13px;
+    margin-left: 80px;
+  }
+  .plab {
+    font-size: 13px;
+    color: #999;
+  }
+
+  ::-webkit-input-placeholder{ color: #7A7A7A; }
+  ::-webkit-elinput-placeholder{ color: #7A7A7A; }
+</style>

+ 1 - 1
frontend_web/src/views/main/sgmanage.vue

@@ -10,7 +10,7 @@
       </template>
     </div>
     <el-table :data="list">
-      <el-table-column prop="Serial" :label="$t('message.sgmanage.serial')"></el-table-column>
+      <el-table-column prop="Serial"  :label="$t('message.sgmanage.serial')"></el-table-column>
       <el-table-column prop="title" :label="$t('message.sgmanage.title')"></el-table-column>
       <el-table-column prop="OrganizeName" :label="$t('message.sgmanage.OrganizeName')"></el-table-column>
       <el-table-column prop="Vol" :label="$t('message.sgmanage.Vol')" width="110"></el-table-column>

+ 6 - 6
frontend_web/src/views/main/triggerinfos.vue

@@ -40,14 +40,14 @@
       </el-dropdown>
     </div>
     <el-table :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="40"></el-table-column>
-      <el-table-column prop="cname" :label="$t('message.triggerinfos.device')" width="180" show-overflow-tooltip></el-table-column>
-      <el-table-column :label="$t('message.abnormalsetting.alarm')" width="100">
+      <el-table-column type="selection" ></el-table-column>
+      <el-table-column prop="cname" :label="$t('message.triggerinfos.device')"  show-overflow-tooltip></el-table-column>
+      <el-table-column :label="$t('message.abnormalsetting.alarm')" >
         <template scope="scope">
           <el-tag type="success">{{gettypename(scope.row.type)}}</el-tag>
         </template>
       </el-table-column>
-      <el-table-column :label="$t('message.actions.Send')" width="250" show-overflow-tooltip>
+      <el-table-column :label="$t('message.actions.Send')"  show-overflow-tooltip>
         <template scope="scope">
           <template v-if="scope.row.type === 'web'">
             --
@@ -57,7 +57,7 @@
           </template>
         </template>
       </el-table-column>
-      <el-table-column :label="$t('message.abnormalsetting.Alarm')" width="200" show-overflow-tooltip>
+      <el-table-column :label="$t('message.abnormalsetting.Alarm')"  show-overflow-tooltip>
         <template scope="scope">
           {{jstimehandle(scope.row.alarmon)}}
         </template>
@@ -70,7 +70,7 @@
           <el-tag type="warning" v-if="scope.row.issend === 2">{{ $t('message.abnormalsetting.Unsent') }}</el-tag>
         </template>
       </el-table-column>
-      <el-table-column :label="$t('message.operating')" width="160" align="center">
+      <el-table-column :label="$t('message.operating')"  align="center">
         <template scope="scope">
           <el-button size="small" type="success" v-if="scope.row.handleremark !== ''" @click="opendatadialog(scope.row,scope.$index)">{{ $t('message.triggerinfos.Processed') }}</el-button>
           <el-button size="small" v-if="scope.row.handleremark == ''" @click="opendatadialog(scope.row,scope.$index)">{{ $t('message.triggerinfos.Unprocessed') }}</el-button>

+ 3 - 3
frontend_web/src/views/main/users.vue

@@ -8,11 +8,11 @@
       <el-button type="primary" size="small" icon="plus" @click="opendatadialog(1,null,-1);resetForm('userform')">{{ $t('message.users.plus') }}</el-button>
     </div>
     <el-table :data="list">
-      <el-table-column prop="Username" :label="$t('message.users.Username')" width="160" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="Username"  align="center" :label="$t('message.users.Username')"  show-overflow-tooltip></el-table-column>
       <el-table-column :label="$t('message.users.Realname')" prop="Realname"  width="150"></el-table-column>
       <el-table-column prop="Telephone" :label="$t('message.users.Telephone')" show-overflow-tooltip></el-table-column>
       <el-table-column :label="$t('message.users.Mobile')" prop="Mobile" show-overflow-tooltip></el-table-column>
-      <el-table-column :label="$t('message.users.role')" width="100" show-overflow-tooltip>
+      <el-table-column :label="$t('message.users.role')"  show-overflow-tooltip>
         <template scope="scope">
           <el-tag type="success" v-if="scope.row.Roleid === 10000123">{{ $t('message.users.Ordinary') }}</el-tag>
           <el-tag type="danger" v-if="scope.row.Roleid === 10000119">{{ $t('message.users.manager') }}</el-tag>
@@ -20,7 +20,7 @@
       </el-table-column>
       <el-table-column prop="Description" :label="$t('message.users.Remarks')" show-overflow-tooltip></el-table-column>
       <el-table-column prop="Departmentname" :label="$t('message.users.organization')"></el-table-column>
-      <el-table-column :label="$t('message.users.operation')" width="280">
+      <el-table-column :label="$t('message.users.operation')"  align="center" width="280">
         <template scope="scope">
           <el-button
             size="small"

+ 2 - 0
frontend_web/src/views/main/usersetting.vue

@@ -120,7 +120,9 @@ export default {
     this.host = this.session.user.Profile.Host
     if (this.form.Photo !== '') {
       this.imageUrl = `http://${this.host}${this.form.Photo}`
+      console.log('----this.imageUrl---', this.imageUrl)
     }
+    console.log('----this.imageUrl---', this.imageUrl)
   },
   methods: {
     getpermissions () {

+ 5 - 0
frontend_web/yarn.lock

@@ -4850,6 +4850,11 @@ requires-port@^1.0.0:
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
 
+requset@0.0.1-security:
+  version "0.0.1-security"
+  resolved "https://registry.npm.taobao.org/requset/download/requset-0.0.1-security.tgz#2bc8012422fab3e92ce7750dfaaddbf00a21fda0"
+  integrity sha1-K8gBJCL6s+ks53UN+q3b8Aoh/aA=
+
 resolve-from@^1.0.0:
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/resolve-from/download/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"

Some files were not shown because too many files changed in this diff