Преглед на файлове

featrue(mcs_api): 增加智能瓶塞、wave反应发生器设备支持;数据导出增加服务端报告及报表下载特性

sunmiao преди 12 часа
родител
ревизия
f8c6f85c03

+ 3 - 0
backend/src/dashoo.cn/mcs_api/Makefile

@@ -11,6 +11,9 @@ default: build
 build:
 	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO_BUILD) -o $(OUTPUT_DIR)
 
+build-arm:
+	CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $(GO_BUILD) -o $(OUTPUT_DIR)
+
 build-win:
 	CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go $(GO_BUILD) -o $(OUTPUT_DIR).exe
 

+ 1 - 0
backend/src/dashoo.cn/mcs_api/business/device/channels.go

@@ -118,6 +118,7 @@ type DeviceChannels struct {
 	PowerFactor       string // 功率因数
 	PowerSum          string // 电量统计
 	Outage            string // 智能插座 断电报警 1 or 0
+	WaveAlarm         string // wave反应发生器 报警状态,0或者>1
 }
 
 type DeviceAlertor struct {

+ 42 - 3
backend/src/dashoo.cn/mcs_api/controllers/channels.go

@@ -82,6 +82,7 @@ type ChannelLast struct {
 	PowerFactor       string // 功率因数
 	PowerSum          string // 电量统计
 	Outage            string // 智能插座 断电报警 1 or 0
+	WaveAlarm         string // wave反应发生器 报警状态,0或者>1
 }
 
 type ChannelModel struct {
@@ -264,6 +265,7 @@ func (this *ChannelsController) DataValue() {
 		data.PowerFactor = utils.ToStr(lastdata.PowerFactor)
 		data.PowerSum = utils.ToStr(lastdata.PowerSum)
 		data.Outage = utils.ToStr(lastdata.Outage)
+		data.WaveAlarm = utils.ToStr(lastdata.WaveAlarm) // wave反应发生器 报警状态,0或者>1
 
 		// 根据设备类型设置不同的离线判断时间
 		// 无法获取dataItem,所有放弃在服务端判断
@@ -799,7 +801,6 @@ func (this *ChannelsController) HistoryDataValue() {
 }
 
 func (this *ChannelsController) ChannelManageview(client labsop.LabSopClient, code, dataitem string, start, end int64) ([][]float64, []float64) {
-
 	level, difftime, weeks := "0", int64(end-start), int64(60*60*24*7)
 	switch {
 	case difftime <= weeks:
@@ -815,8 +816,8 @@ func (this *ChannelsController) ChannelManageview(client labsop.LabSopClient, co
 	case difftime > 52*weeks:
 		level = "24h"
 	}
-	var arrvs [][]float64
-	var arrgroup []float64
+	arrvs := make([][]float64, 0)
+	arrgroup := make([]float64, 0)
 	queryCommand := ""
 	queryGroupCommand := ""
 
@@ -1294,6 +1295,42 @@ func (this *ChannelsController) ChannelManageview(client labsop.LabSopClient, co
 				arrvs = append(arrvs, arr)
 			}
 		}
+	case "46": //46:wave反应发生器
+		queryGroupCommand = fmt.Sprintf("select max(wave_alarm),min(wave_alarm),MEAN(wave_alarm) from %v where time > %vs and time < %vs", code, start, end)
+		if level == "0" {
+			queryCommand = fmt.Sprintf("select wave_alarm from %v where time > %vs and time < %vs", code, start, end)
+		} else {
+			queryCommand = fmt.Sprintf("select MEDIAN(wave_alarm) as wave_alarm from %v where time > %vs and time < %vs group by time(%v) fill(none)", code, start, end, level)
+		}
+		for i := 0; i < len(waringhistory.Items); i++ {
+			var arr []float64
+			if waringhistory.Items[i].EventFiled == "wave_alarm" {
+				arr = append(arr, float64(waringhistory.Items[i].AlarmOn.Unix()*1000))
+				arr = append(arr, float64(waringhistory.Items[i].Value))
+				arrvs = append(arrvs, arr)
+			}
+		}
+	case "47": //47:液位(带温度)
+		queryGroupCommand = fmt.Sprintf("select max(liquidlevel),min(liquidlevel),MEAN(liquidlevel),max(temperature),min(temperature),MEAN(temperature) from %v where time > %vs and time < %vs", code, start, end)
+		if level == "0" {
+			queryCommand = fmt.Sprintf("select liquidlevel,temperature from %v where time > %vs and time < %vs", code, start, end)
+		} else {
+			queryCommand = fmt.Sprintf("select MEDIAN(liquidlevel) as liquidlevel,MEDIAN(temperature) as temperature from %v where time > %vs and time < %vs group by time(%v) fill(none)", code, start, end, level)
+		}
+		for i := 0; i < len(waringhistory.Items); i++ {
+			var arr []float64
+			if waringhistory.Items[i].EventFiled == "liquidlevel" {
+				arr = append(arr, float64(waringhistory.Items[i].AlarmOn.Unix()*1000))
+				arr = append(arr, float64(waringhistory.Items[i].Value))
+				arr = append(arr, -9999)
+				arrvs = append(arrvs, arr)
+			} else if waringhistory.Items[i].EventFiled == "temperature" {
+				arr = append(arr, float64(waringhistory.Items[i].AlarmOn.Unix()*1000))
+				arr = append(arr, -9999)
+				arr = append(arr, float64(waringhistory.Items[i].Value))
+				arrvs = append(arrvs, arr)
+			}
+		}
 	case "38": //38:漏水
 		queryGroupCommand = fmt.Sprintf("select max(leak),min(leak),MEAN(leak) from %v where time > %vs and time < %vs", code, start, end)
 		queryCommand = fmt.Sprintf("select leak from %v where time > %vs and time < %vs", code, start, end)
@@ -1381,6 +1418,7 @@ func (this *ChannelsController) ChannelManageview(client labsop.LabSopClient, co
 			var arr []float64
 			for i := 0; i < len(cols); i++ {
 				if arrs[x][i] == nil {
+					arr = append(arr, 0)
 					continue
 				}
 				valuef, _ := arrs[x][i].(json.Number).Float64()
@@ -1452,6 +1490,7 @@ func (this *ChannelsController) HistoryDataValueReport() {
 					var arr []float64
 					for i := 0; i < len(cols); i++ {
 						if arrs[x][i] == nil {
+							arr = append(arr, 0)
 							continue
 						}
 						valuef, _ := arrs[x][i].(json.Number).Float64()

+ 47 - 47
backend/src/dashoo.cn/mcs_api/controllers/common.go

@@ -212,56 +212,56 @@ func CoderGBKtoUTF8(str string) string {
 const (
 	Device_Box         = "0" //设备,普通box
 	Device_Alertor     = "4" //设备,报警器
-	ChannelItem_Sensor = "0,6,7,9,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,43,44,45"
+	ChannelItem_Sensor = "0,6,7,9,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,43,44,45,46,47"
 	//传感器类型 0:常温,6:深低温,7:o2(带温湿度),9:co2(带温湿度),10:特殊(隐藏湿度的常温),13:功率,14:外接设备1,15:外接液位设备,16:常温带定位,17:氧气设备,18:风速,19:气压
 	// 20:二氧化氯,21:乙烯,22:氯气,23:臭氧,24:TVOC,25:乙炔,26:纯二氧化碳,27:电导率,28:二氧化硫,29:微压差(压力),30:位移,31:扫码智能锁,32:基点5传感器,33:人脸识别锁
-	// 34:视频摄像头,35:门禁一体机,36:仪器控制终端,37:刷卡智能锁,38:漏水监测,39:氢气,40:烟感,41:噪声,42:浮游菌,43:环境9合1,44:智能插座,45:智能开关面板
+	// 34:视频摄像头,35:门禁一体机,36:仪器控制终端,37:刷卡智能锁,38:漏水监测,39:氢气,40:烟感,41:噪声,42:浮游菌,43:环境9合1,44:智能插座,45:智能开关面板,46:wave反应发生器,47:液位(带温度)
 	// 首页中显示的传感器类型
-	ChannelItem_HomeList        = "0,6,7,9,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,39,41,43,44,38"
-	ChannelItem_Report          = "0,6,7,9,10,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,39,41" //sensor报表使用,不需要功率,常温,深低温,o2,co2,特殊(隐藏湿度的常温),外接设备1,外接液位设备,常温带定位,氧气设备
-	ChannelItem_Box             = "1"                                                                      //sensor,box自身数据
-	ChannelItem_TAndH           = "0,14,16"                                                                //sensor,常温,显示温湿度
-	ChannelItem_Temperature     = "6,10"                                                                   //sensor,深低温,特殊,显示温度
-	ChannelItem_Co2             = "9,26"                                                                   //sensor,co2,显示温湿度,co2
-	ChannelItem_O2              = "7,17"                                                                   //sensor,o2,显示温湿度,O2
-	ChannelItem_Power           = "13,44"                                                                  //sensor,功率插座,显示功率,电量
-	ChannelItem_LiquidLevel     = "15"                                                                     //sensor,外接液位设备,显示温度,液位
-	ChannelItem_HaveT           = "0,6,7,9,10,15,16"                                                       //含温度数据
-	ChannelItem_HaveV           = "0,6,7,9,10,16"                                                          //含电压数据
-	ChannelItem_HaveH           = "0,7,9,16"                                                               //含湿度数据
-	ChannelItem_HaveCO2         = "9,26"                                                                   //含二氧化碳数据,co2
-	ChannelItem_HaveO2          = "7,17"                                                                   //含氧气数据,o2
-	ChannelItem_HaveLiquidLevel = "15"                                                                     //含液位数据
-	ChannelItem_WindSpeed       = "18"                                                                     //风速
-	ChannelItem_Pressure        = "19"                                                                     //气压
-	ChannelItem_MicroPressure   = "29"                                                                     //微压差(压力)
-	ChannelItem_Displacement    = "30"                                                                     //位移大港
-	ChannelItem_Doorlock        = "31,33,35,37"                                                            //智能锁 门锁 或者 门禁(海康)
-	ChannelItem_ClO2            = "20"                                                                     //二氧化氯
-	ChannelItem_C2H4            = "21"                                                                     //乙烯
-	ChannelItem_Cl2             = "22"                                                                     //氯气
-	ChannelItem_O3              = "23"                                                                     //臭氧
-	ChannelItem_TVOC            = "24"                                                                     //TVOC
-	ChannelItem_C2H2            = "25"                                                                     //乙炔
-	ChannelItem_H2O             = "27"                                                                     //水质
-	ChannelItem_SO2             = "28"                                                                     //二氧化硫
-	ChannelItem_H2              = "39"                                                                     //氢气
-	ChannelItem_Smoke           = "40"                                                                     // 烟感
-	ChannelItem_Leak            = "38"                                                                     // 漏水
-	ChannelItem_Noise           = "41"                                                                     // 噪声
-	ChannelItem_Camera          = "34"                                                                     // 视频监控摄像头
-	ChannelItem_RControl        = "36"                                                                     // 反向控制设备开关(仪器控制终端)
-	ChannelItem_SwitchPanel     = "45"                                                                     // 智能开关面板
-	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"                                                                     //报警器,不需要添加动作
+	ChannelItem_HomeList        = "0,6,7,9,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,39,41,43,44,38,47"
+	ChannelItem_Report          = "0,6,7,9,10,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,39,41,47" //sensor报表使用,不需要功率,常温,深低温,o2,co2,特殊(隐藏湿度的常温),外接设备1,外接液位设备,常温带定位,氧气设备
+	ChannelItem_Box             = "1"                                                                         //sensor,box自身数据
+	ChannelItem_TAndH           = "0,14,16"                                                                   //sensor,常温,显示温湿度
+	ChannelItem_Temperature     = "6,10"                                                                      //sensor,深低温,特殊,显示温度
+	ChannelItem_Co2             = "9,26"                                                                      //sensor,co2,显示温湿度,co2
+	ChannelItem_O2              = "7,17"                                                                      //sensor,o2,显示温湿度,O2
+	ChannelItem_Power           = "13,44"                                                                     //sensor,功率插座,显示功率,电量
+	ChannelItem_LiquidLevel     = "15,47"                                                                     //sensor,外接液位设备,显示温度,液位
+	ChannelItem_HaveT           = "0,6,7,9,10,15,16,47"                                                       //含温度数据
+	ChannelItem_HaveV           = "0,6,7,9,10,16"                                                             //含电压数据
+	ChannelItem_HaveH           = "0,7,9,16"                                                                  //含湿度数据
+	ChannelItem_HaveCO2         = "9,26"                                                                      //含二氧化碳数据,co2
+	ChannelItem_HaveO2          = "7,17"                                                                      //含氧气数据,o2
+	ChannelItem_HaveLiquidLevel = "15,47"                                                                     //含液位数据
+	ChannelItem_WindSpeed       = "18"                                                                        //风速
+	ChannelItem_Pressure        = "19"                                                                        //气压
+	ChannelItem_MicroPressure   = "29"                                                                        //微压差(压力)
+	ChannelItem_Displacement    = "30"                                                                        //位移大港
+	ChannelItem_Doorlock        = "31,33,35,37"                                                               //智能锁 门锁 或者 门禁(海康)
+	ChannelItem_ClO2            = "20"                                                                        //二氧化氯
+	ChannelItem_C2H4            = "21"                                                                        //乙烯
+	ChannelItem_Cl2             = "22"                                                                        //氯气
+	ChannelItem_O3              = "23"                                                                        //臭氧
+	ChannelItem_TVOC            = "24"                                                                        //TVOC
+	ChannelItem_C2H2            = "25"                                                                        //乙炔
+	ChannelItem_H2O             = "27"                                                                        //水质
+	ChannelItem_SO2             = "28"                                                                        //二氧化硫
+	ChannelItem_H2              = "39"                                                                        //氢气
+	ChannelItem_Smoke           = "40"                                                                        // 烟感
+	ChannelItem_Leak            = "38"                                                                        // 漏水
+	ChannelItem_Noise           = "41"                                                                        // 噪声
+	ChannelItem_Camera          = "34"                                                                        // 视频监控摄像头
+	ChannelItem_RControl        = "36"                                                                        // 反向控制设备开关(仪器控制终端)
+	ChannelItem_SwitchPanel     = "45"                                                                        // 智能开关面板
+	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"                                                                        //报警器,不需要添加动作
 )
 
 // 设备类型判断

+ 12 - 1
backend/src/dashoo.cn/mcs_api/controllers/dataexports.go

@@ -247,7 +247,7 @@ func (this *DataExportsController) SaveTemperatureXlsx(name, code, timerange, u,
 	}
 	sheet.Cols[0].Width = 20 //设置时间单元格的宽度
 }
-func (this *DataExportsController) SaveXlsx(timeinterval, name, code, timerange, u, p string, f *xlsx.File, start, end int64) {
+func (this *DataExportsController) SaveXlsx(timeinterval, name, code, timerange, u, p string, f *xlsx.File, start, end int64, dataitem int) {
 	sheet, _ := f.AddSheet(name)
 	rowname := sheet.AddRow()
 	celln := rowname.AddCell()
@@ -267,10 +267,14 @@ func (this *DataExportsController) SaveXlsx(timeinterval, name, code, timerange,
 		"",
 		timerange,
 	}
+	if DeviceItemContainint(ChannelItem_HaveLiquidLevel, dataitem) {
+		headsname.Emptystr = "液位"
+	}
 	rowhead.WriteStruct(&headsname, -1)
 	indext := utils.SliceIndexOf(cols, "temperature")
 	indexh := utils.SliceIndexOf(cols, "humidity")
 	indexv := utils.SliceIndexOf(cols, "voltage")
+	indexl := utils.SliceIndexOf(cols, "liquidlevel")
 	indextime := utils.SliceIndexOf(cols, "time")
 	indexstate := utils.SliceIndexOf(cols, "devicestate") //设备状态
 	for j, l := 0, len(data); j < l; j++ {
@@ -310,12 +314,19 @@ func (this *DataExportsController) SaveXlsx(timeinterval, name, code, timerange,
 			}
 
 		}
+		lstr := ""
+		if indexl > -1 {
+			lstr = utils.ToStr(data[l-j-1][indexl])
+		}
 		testStruct := datas{
 			time.Unix(int64(valuetime), 0).Format("2006-01-02 15:04:05"),
 			tstr,
 			hstr,
 			vstr,
 		}
+		if DeviceItemContainint(ChannelItem_HaveLiquidLevel, dataitem) {
+			testStruct.Voltagedata = lstr
+		}
 		row.WriteStruct(&testStruct, -1)
 	}
 	sheet.Cols[0].Width = 20 //设置时间单元格的宽度

+ 20 - 5
backend/src/dashoo.cn/mcs_api/controllers/dataexports_worker.go

@@ -89,7 +89,9 @@ func ProcessExportTask(taskId int64, params ExportParams) {
 				name = channel[i].Code
 			}
 			xlssheetname := utils.ToStr(i+1) + "." + name
-			if DeviceItemContainint(ChannelItem_HaveO2, channel[i].DataItem) {
+			if DeviceItemContainint(ChannelItem_HaveLiquidLevel, channel[i].DataItem) {
+				SaveXlsx(params.RealName, timeinterval, xlssheetname, channel[i].Code, timerange, u, p, f, start, end, channel[i].DataItem)
+			} else if DeviceItemContainint(ChannelItem_HaveO2, channel[i].DataItem) {
 				Saveo2Xlsx(params.RealName, xlssheetname, channel[i].Code, timerange, u, p, f, start, end)
 			} else if DeviceItemContainint(ChannelItem_HaveCO2, channel[i].DataItem) {
 				Saveco2Xlsx(params.RealName, xlssheetname, channel[i].Code, timerange, u, p, f, start, end)
@@ -120,7 +122,7 @@ func ProcessExportTask(taskId int64, params ExportParams) {
 			} else if DeviceItemContainint(ChannelItem_TVOC, channel[i].DataItem) {
 				SaveliquidlevelXlsx(params.RealName, xlssheetname, channel[i].Code, timerange, u, p, f, start, end)
 			} else {
-				SaveXlsx(params.RealName, timeinterval, xlssheetname, channel[i].Code, timerange, u, p, f, start, end)
+				SaveXlsx(params.RealName, timeinterval, xlssheetname, channel[i].Code, timerange, u, p, f, start, end, channel[i].DataItem)
 			}
 
 		}
@@ -138,7 +140,9 @@ func ProcessExportTask(taskId int64, params ExportParams) {
 				name = channel[i].Code
 			}
 			xlssheetname := utils.ToStr(i+1) + "." + name
-			if DeviceItemContainint(ChannelItem_HaveO2, channel[i].DataItem) {
+			if DeviceItemContainint(ChannelItem_HaveLiquidLevel, channel[i].DataItem) {
+				SaveXlsx(params.RealName, timeinterval, xlssheetname, channel[i].Code, timerange, u, p, f, start, end, channel[i].DataItem)
+			} else if DeviceItemContainint(ChannelItem_HaveO2, channel[i].DataItem) {
 				Saveo2Xlsx(params.RealName, xlssheetname, channel[i].Code, timerange, u, p, f, start, end)
 			} else if DeviceItemContainint(ChannelItem_HaveCO2, channel[i].DataItem) {
 				Saveco2Xlsx(params.RealName, xlssheetname, channel[i].Code, timerange, u, p, f, start, end)
@@ -151,7 +155,7 @@ func ProcessExportTask(taskId int64, params ExportParams) {
 			} else if DeviceItemContainint(ChannelItem_WindSpeed, channel[i].DataItem) {
 				SaveliquidlevelXlsx(params.RealName, xlssheetname, channel[i].Code, timerange, u, p, f, start, end)
 			} else {
-				SaveXlsx(params.RealName, timeinterval, xlssheetname, channel[i].Code, timerange, u, p, f, start, end)
+				SaveXlsx(params.RealName, timeinterval, xlssheetname, channel[i].Code, timerange, u, p, f, start, end, channel[i].DataItem)
 			}
 
 		}
@@ -230,7 +234,7 @@ func SaveTemperatureXlsx(realname, name, code, timerange, u, p string, f *xlsx.F
 	sheet.Cols[0].Width = 20 //设置时间单元格的宽度
 }
 
-func SaveXlsx(realname, timeinterval, name, code, timerange, u, p string, f *xlsx.File, start, end int64) {
+func SaveXlsx(realname, timeinterval, name, code, timerange, u, p string, f *xlsx.File, start, end int64, dataitem int) {
 	sheet, _ := f.AddSheet(name)
 	rowname := sheet.AddRow()
 	celln := rowname.AddCell()
@@ -250,10 +254,14 @@ func SaveXlsx(realname, timeinterval, name, code, timerange, u, p string, f *xls
 		"",
 		timerange,
 	}
+	if DeviceItemContainint(ChannelItem_HaveLiquidLevel, dataitem) {
+		headsname.Emptystr = "液位"
+	}
 	rowhead.WriteStruct(&headsname, -1)
 	indext := utils.SliceIndexOf(cols, "temperature")
 	indexh := utils.SliceIndexOf(cols, "humidity")
 	indexv := utils.SliceIndexOf(cols, "voltage")
+	indexl := utils.SliceIndexOf(cols, "liquidlevel")
 	indextime := utils.SliceIndexOf(cols, "time")
 	indexstate := utils.SliceIndexOf(cols, "devicestate") //设备状态
 	for j, l := 0, len(data); j < l; j++ {
@@ -293,12 +301,19 @@ func SaveXlsx(realname, timeinterval, name, code, timerange, u, p string, f *xls
 			}
 
 		}
+		lstr := ""
+		if indexl > -1 {
+			lstr = utils.ToStr(data[l-j-1][indexl])
+		}
 		testStruct := datas{
 			time.Unix(int64(valuetime), 0).Format("2006-01-02 15:04:05"),
 			tstr,
 			hstr,
 			vstr,
 		}
+		if DeviceItemContainint(ChannelItem_HaveLiquidLevel, dataitem) {
+			testStruct.Voltagedata = lstr
+		}
 		row.WriteStruct(&testStruct, -1)
 	}
 	sheet.Cols[0].Width = 20 //设置时间单元格的宽度

+ 27 - 3
backend/src/dashoo.cn/mcs_api/controllers/monthreports.go

@@ -67,6 +67,8 @@ func (this *MonthReportsController) List() {
 		if DeviceItemContainint(ChannelItem_Power, channelmodel.DataItem) {
 			queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3 ,MEDIAN(tvoc) as tvoc ,MEDIAN(electricalsupply) as electricalsupply,MEDIAN(electricalpower) as electricalpower from %v where time > %vs and time < %vs group by time(%v) fill(none)", code, begin, end, timearea)
 			fmt.Println("--------queryCommand---------", queryCommand)
+		} else if DeviceItemContainint(ChannelItem_HaveLiquidLevel, channelmodel.DataItem) {
+			queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2 ,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3,MEDIAN(tvoc) as tvoc,MEDIAN(liquidlevel) as liquidlevel from %v where time > %vs and time < %vs group by time(%v) fill(none)", code, begin, end, timearea)
 		}
 		result := client.QueryLabSop(queryCommand, data)
 		reportdata := GetReportData(utils.TimeFormat(t1.AddDate(0, 0, i), "2006-1-2"), channelmodel.DataItem, showcols, result, []TriggerHourData{})
@@ -143,6 +145,8 @@ func (this *MonthReportsController) GetExcel() {
 					queryCommand := fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2 ,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o ,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3,MEDIAN(tvoc) as tvoc from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 					if DeviceItemContainint(ChannelItem_Power, v.DataItem) {
 						queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o ,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3 ,MEDIAN(tvoc) as tvoc ,MEDIAN(electricalsupply) as electricalsupply,MEDIAN(electricalpower) as electricalpower from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
+					} else if DeviceItemContainint(ChannelItem_HaveLiquidLevel, v.DataItem) {
+						queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2 ,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o ,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3,MEDIAN(tvoc) as tvoc,MEDIAN(liquidlevel) as liquidlevel from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 					}
 					result := client.QueryLabSop(queryCommand, data)
 					reportdata := GetReportData(utils.TimeFormat(t1.AddDate(0, 0, i), "2006-1-2"), v.DataItem, showcols, result, []TriggerHourData{})
@@ -179,6 +183,8 @@ func (this *MonthReportsController) GetExcel() {
 					queryCommand := fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement ,MEDIAN(h2o) as h2o ,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3,MEDIAN(tvoc) as tvoc from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 					if DeviceItemContainint(ChannelItem_Power, v.DataItem) {
 						queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o ,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3 ,MEDIAN(tvoc) as tvoc ,MEDIAN(electricalsupply) as electricalsupply,MEDIAN(electricalpower) as electricalpower from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
+					} else if DeviceItemContainint(ChannelItem_HaveLiquidLevel, v.DataItem) {
+						queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o ,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3 ,MEDIAN(tvoc) as tvoc ,MEDIAN(liquidlevel) as liquidlevel from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 					}
 					result := client.QueryLabSop(queryCommand, data)
 					reportdata := GetReportData(utils.TimeFormat(t1.AddDate(0, 0, i), "2006-1-2"), v.DataItem, showcols, result, []TriggerHourData{})
@@ -270,6 +276,8 @@ func (this *MonthReportsController) GetPDF() {
 				queryCommand := fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2 ,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o ,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3,MEDIAN(tvoc) as tvoc from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 				if DeviceItemContainint(ChannelItem_Power, v.DataItem) {
 					queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o ,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3 ,MEDIAN(tvoc) as tvoc ,MEDIAN(electricalsupply) as electricalsupply,MEDIAN(electricalpower) as electricalpower from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
+				} else if DeviceItemContainint(ChannelItem_HaveLiquidLevel, v.DataItem) {
+					queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2 ,MEDIAN(ots) as ots,MEDIAN(displacement) as displacement,MEDIAN(h2o) as h2o ,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3,MEDIAN(tvoc) as tvoc,MEDIAN(liquidlevel) as liquidlevel from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 				}
 				result := client.QueryLabSop(queryCommand, data)
 				reportdata := GetReportData(utils.TimeFormat(t1.AddDate(0, 0, j), "2006-1-2"), v.DataItem, showcols, result, []TriggerHourData{})
@@ -512,7 +520,7 @@ func (this *MonthReportsController) MaxReport() {
 		for k, v := range channel1 {
 			if v.Code != "" {
 
-				queryGroupCommand := fmt.Sprintf("select max(temperature),min(temperature),max(humidity),min(humidity),max(o2),min(o2),max(co2),min(co2),max(ots),min(ots),max(displacement),min(displacement),max(h2o),min(h2o),max(so2),min(so2),max(electricalpower),min(electricalpower),max(electricalsupply),min(electricalsupply) from %v where time > %vs and time < %vs group by time(1d,16h) fill(none) ", v.Code, t1.Unix()-1, t2.Unix()+1)
+				queryGroupCommand := fmt.Sprintf("select max(temperature),min(temperature),max(humidity),min(humidity),max(o2),min(o2),max(co2),min(co2),max(ots),min(ots),max(displacement),min(displacement),max(h2o),min(h2o),max(so2),min(so2),max(electricalpower),min(electricalpower),max(electricalsupply),min(electricalsupply),max(liquidlevel),min(liquidlevel) from %v where time > %vs and time < %vs group by time(1d,16h) fill(none) ", v.Code, t1.Unix()-1, t2.Unix()+1)
 				datagroup, _ := client.QueryOneResultByCommand(queryGroupCommand)
 				var datas [][]interface{}
 				if datagroup != nil && len(datagroup) > 0 {
@@ -540,7 +548,7 @@ func (this *MonthReportsController) MaxReport() {
 		_, channel := svc.GetChannelsList(-1, 8, where, uidstr)
 		for k, v := range channel {
 			if v.Code != "" {
-				queryGroupCommand := fmt.Sprintf("select max(temperature),min(temperature),max(humidity),min(humidity),max(o2),min(o2),max(co2),min(co2),max(ots),min(ots),max(displacement),min(displacement),max(h2o),min(h2o),max(so2),min(so2),max(electricalpower),min(electricalpower),max(electricalsupply),min(electricalsupply) from %v where time > %vs and time < %vs group by time(1d,16h) fill(none) ", v.Code, t1.Unix()-1, t2.Unix()+1)
+				queryGroupCommand := fmt.Sprintf("select max(temperature),min(temperature),max(humidity),min(humidity),max(o2),min(o2),max(co2),min(co2),max(ots),min(ots),max(displacement),min(displacement),max(h2o),min(h2o),max(so2),min(so2),max(electricalpower),min(electricalpower),max(electricalsupply),min(electricalsupply),max(liquidlevel),min(liquidlevel) from %v where time > %vs and time < %vs group by time(1d,16h) fill(none) ", v.Code, t1.Unix()-1, t2.Unix()+1)
 				datagroup, _ := client.QueryOneResultByCommand(queryGroupCommand)
 				var datas [][]interface{}
 				if datagroup != nil && len(datagroup) > 0 {
@@ -656,10 +664,14 @@ func (this *MonthReportsController) GroupSaveXlsx(name, code, timestr string, da
 		cell = rowhead.AddCell()
 		cell.Value = "电量V"
 	}
+	if DeviceItemContainint(ChannelItem_HaveLiquidLevel, dataitem) {
+		cell = rowhead.AddCell()
+		cell.Value = "液位mm"
+	}
 	if report != nil && len(report) > 0 && report[0] != nil && len(report[0]) > 0 {
 		for _, v := range report {
 			var valuef0, valuef1, valuef2, valuef3, valuef4, valuef5,
-				valuef6, valuef7, valuef8 float64
+				valuef6, valuef7, valuef8, valuef9, valuef10 float64
 			var valuei0, valuei1, valuei2, valuei3 int64
 			valuef0, _ = v[0].(json.Number).Float64()
 			vint := int64(valuef0)
@@ -701,6 +713,10 @@ func (this *MonthReportsController) GroupSaveXlsx(name, code, timestr string, da
 				valuei2, _ = v[11].(json.Number).Int64()
 				valuei3, _ = v[12].(json.Number).Int64()
 			}
+			if DeviceItemContainint(ChannelItem_HaveLiquidLevel, dataitem) {
+				valuef9, _ = v[20].(json.Number).Float64()
+				valuef10, _ = v[21].(json.Number).Float64()
+			}
 			row := sheet.AddRow()
 			cell = row.AddCell()
 			cell.Value = time.Unix(vint, 0).Format("2006-01-02")
@@ -745,6 +761,10 @@ func (this *MonthReportsController) GroupSaveXlsx(name, code, timestr string, da
 				cell = row.AddCell()
 				cell.Value = utils.ToStr(valuei2)
 			}
+			if DeviceItemContainint(ChannelItem_HaveLiquidLevel, dataitem) {
+				cell = row.AddCell()
+				cell.Value = utils.ToStr(valuef9)
+			}
 			row = sheet.AddRow()
 			cell = row.AddCell()
 			cell.Value = ""
@@ -788,6 +808,10 @@ func (this *MonthReportsController) GroupSaveXlsx(name, code, timestr string, da
 				cell = row.AddCell()
 				cell.Value = utils.ToStr(valuei3)
 			}
+			if DeviceItemContainint(ChannelItem_HaveLiquidLevel, dataitem) {
+				cell = row.AddCell()
+				cell.Value = utils.ToStr(valuef10)
+			}
 		}
 
 	}

+ 6 - 0
backend/src/dashoo.cn/mcs_api/controllers/reports.go

@@ -131,6 +131,8 @@ func (this *ReportsController) List() {
 		queryCommand := fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(h2o) as h2o,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(tvoc) as tvoc,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(doorlock) as doorlock,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3,MEDIAN(value) as value,MEDIAN(concentration) as concentration,MEDIAN(eventcode) as eventcode from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 		if DeviceItemContainint(ChannelItem_Power, v.DataItem) {
 			queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(h2o) as h2o,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(c2h2) as c2h2,MEDIAN(tvoc) as tvoc,MEDIAN(c2h4) as c2h4,MEDIAN(cl2) as cl2,MEDIAN(doorlock) as doorlock,MEDIAN(o3) as o3 ,MEDIAN(electricalsupply) as electricalsupply,MEDIAN(electricalpower) as electricalpower from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
+		} else if DeviceItemContainint(ChannelItem_HaveLiquidLevel, v.DataItem) {
+			queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(h2o) as h2o,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(tvoc) as tvoc,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(doorlock) as doorlock,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3,MEDIAN(value) as value,MEDIAN(concentration) as concentration,MEDIAN(eventcode) as eventcode,MEDIAN(liquidlevel) as liquidlevel from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 		}
 		result := client.QueryLabSop(queryCommand, data)
 		fmt.Println("&&&result:", result)
@@ -444,6 +446,8 @@ func (this *ReportsController) GetExcel() {
 		queryCommand := fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(doorlock) as doorlock,MEDIAN(doorlock) as h2o,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(tvoc) as tvoc,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3  from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 		if DeviceItemContainint(ChannelItem_Power, v.DataItem) {
 			queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(doorlock) as doorlock, MEDIAN(h2o) as h2o,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(tvoc) as tvoc,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3 ,MEDIAN(electricalsupply) as electricalsupply,MEDIAN(electricalpower) as electricalpower from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
+		} else if DeviceItemContainint(ChannelItem_HaveLiquidLevel, v.DataItem) {
+			queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(doorlock) as doorlock,MEDIAN(doorlock) as h2o,MEDIAN(so2) as so2,MEDIAN(windspeed) as windspeed ,MEDIAN(pressure) as pressure,MEDIAN(clo2) as clo2,MEDIAN(tvoc) as tvoc,MEDIAN(c2h4) as c2h4,MEDIAN(c2h2) as c2h2,MEDIAN(cl2) as cl2,MEDIAN(o3) as o3,MEDIAN(liquidlevel) as liquidlevel from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 		}
 		result := client.QueryLabSop(queryCommand, data)
 		titlename := v.Title
@@ -668,6 +672,8 @@ func (this *ReportsController) GetPDF() {
 		queryCommand := fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(h2o) as h2o,MEDIAN(so2) as so2 from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 		if DeviceItemContainint(ChannelItem_Power, v.DataItem) {
 			queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(h2o) as h2o,,MEDIAN(so2) as so2 MEDIAN(electricalsupply) as electricalsupply,MEDIAN(electricalpower) as electricalpower from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
+		} else if DeviceItemContainint(ChannelItem_HaveLiquidLevel, v.DataItem) {
+			queryCommand = fmt.Sprintf("select MEDIAN(temperature) as temperature,MEDIAN(humidity) as humidity,MEDIAN(voltage) as voltage,MEDIAN(rssi) as rssi,MEDIAN(o2) as o2,MEDIAN(co2) as co2,MEDIAN(h2o) as h2o,MEDIAN(so2) as so2,MEDIAN(liquidlevel) as liquidlevel from %v where time > %vs and time < %vs group by time(%v) fill(none)", v.Code, begin, end, timearea)
 		}
 		result := client.QueryLabSop(queryCommand, data)
 		reportdata := GetReportData(v.Title, v.DataItem, showcols, result, []TriggerHourData{})

+ 18 - 15
backend/src/dashoo.cn/mcs_api/models/user.go

@@ -1,5 +1,7 @@
 package models
 
+import "time"
+
 //	"errors"
 //	"strconv"
 //	"time"
@@ -25,21 +27,22 @@ type User struct {
 }
 
 type Profile struct {
-	Gender       string
-	Age          int
-	Address      string
-	Email        string
-	Realname     string
-	Roleid       int
-	Mobile       string
-	Telephone    string
-	CompanyCode  string
-	Photo        string
-	Manager      string //联系人
-	Description  string //备注
-	Host         string //域名
-	AccCode      string //客户企业编号
-	DepartmentId string
+	Gender             string
+	Age                int
+	Address            string
+	Email              string
+	Realname           string
+	Roleid             int
+	Mobile             string
+	Telephone          string
+	CompanyCode        string
+	Photo              string
+	Manager            string //联系人
+	Description        string //备注
+	Host               string //域名
+	AccCode            string //客户企业编号
+	DepartmentId       string
+	Changepassworddate time.Time
 }
 
 //func AddUser(u User) string {