Browse Source

Update 优化代码逻辑

YueYunyun 2 years ago
parent
commit
1e3b0fda3e

+ 5 - 9
SERVER/Meter_Service/data/dtu.go

@@ -7,20 +7,16 @@ import (
 )
 
 var (
-	DtuMap      *dataStruct.DMapDtuDev
-	CalcParam   *dataStruct.DMapInterface
-	DtuMapState *dataStruct.DMapClientState
-	IpSN        *dataStruct.DMapKv
-	OnlineSN    *dataStruct.DMapClientState
-	TranSN      chan *dataStruct.DtuRegisterChanMsg
-	AppApiMap   *dataStruct.MapAppApi
+	DtuMap    *dataStruct.DMapDtuDev
+	CalcParam *dataStruct.DMapInterface
+	OnlineSN  *dataStruct.DMapClientState
+	TranSN    chan *dataStruct.DtuRegisterChanMsg
 )
 
 func InitData() bool {
 	OnlineSN = dataStruct.NewDMapClientState()
-	IpSN = dataStruct.NewDMapKv()
 	TranSN = make(chan *dataStruct.DtuRegisterChanMsg, 100)
-	DtuMapState = dataStruct.NewDMapClientState()
+	//DtuMapState = dataStruct.NewDMapClientState()
 	DtuMap = dataStruct.NewDMapDtuDev()
 	CalcParam = initMeterCalcParam()
 	initAppApiMap()

+ 4 - 0
SERVER/Meter_Service/dataStruct/meterCalcParam.go

@@ -1,5 +1,7 @@
 package dataStruct
 
+import "MeterService/core/logger"
+
 type MeterCalcParam struct {
 	Id             string         //电表编码
 	Time           int64          //计算日期
@@ -52,6 +54,7 @@ func (m *MeterCalcParam) ClearDayEnergy() {
 	m.PowerRate.Count = 0
 	m.PowerRate.MaxPower = 0
 	m.PowerRate.SumPower = 0
+	logger.Debug("计算电表数据清零")
 	m.isClean = true
 }
 
@@ -59,6 +62,7 @@ func (m *MeterCalcParam) ClearDayEnergy() {
 func (m *MeterCalcParam) CalcAndSetDayEnergy(colData *CollectData) {
 	if m.isClean {
 		m.isClean = false
+		logger.Debug("当日电表日电能第一次采集 电表编码: %s", colData.Slave.NO)
 		return
 	}
 	m.DayTotalEnergy.Tp += colData.Tps - m.TotalEnergy.Tp

+ 2 - 2
SERVER/Meter_Service/database/appApi/db.go

@@ -31,11 +31,11 @@ func (m *DbAppApi) GetList() ([]interface{}, error) {
 func (m *DbAppApi) AddOrUpdate(v interface{}) error {
 	d := v.(*App)
 	if d.AppId == 0 {
-		if _, err := m.Db.Exec("INSERT INTO t_app_info(app_secret,app_name, host,isDelete) VALUES(?,?,?,?)", d.AppSecret, d.AppName, d.Host, 0); err != nil {
+		if _, err := m.Db.Exec("INSERT INTO t_app_info(app_secret,app_name, host,is_delete) VALUES(?,?,?,?)", d.AppSecret, d.AppName, d.Host, 0); err != nil {
 			return err
 		}
 	} else {
-		if _, err := m.Db.Exec("UPDATE t_app_info SET app_secret=?,app_name=?,host=?,isDelete=? WHERE app_id=?", d.AppSecret, d.AppName, d.Host, d.GetDelete(), d.AppId); err != nil {
+		if _, err := m.Db.Exec("UPDATE t_app_info SET app_secret=?,app_name=?,host=?,is_delete=? WHERE app_id=?", d.AppSecret, d.AppName, d.Host, d.GetDelete(), d.AppId); err != nil {
 			return err
 		}
 		if _, err := m.Db.Exec("DELETE FROM t_app_api_info WHERE app_id=?", d.AppId); err != nil {

BIN
SERVER/Meter_Service/database/vber.db


+ 6 - 3
SERVER/Meter_Service/service/downStreamService/collect.go

@@ -23,7 +23,8 @@ func collectData(sn string, config *dataStruct.DtuConfig) []*dataStruct.CollectD
 		return array
 	}
 
-	client, ok := data.DtuMapState.Get(sn)
+	//client, ok := data.DtuMapState.Get(sn)
+	client, ok := data.OnlineSN.Get(sn)
 	if !ok {
 		logger.Error("采集数据失败,[%s]客户端不存在", sn)
 		return array
@@ -82,18 +83,20 @@ func processCollectData(colData *dataStruct.CollectData, cfg *dataStruct.DtuSlav
 	tms := int64(today)
 	if x, ok := data.CalcParam.Get(cfg.NO); ok {
 		calc = x.(*dataStruct.MeterCalcParam)
+		//logger.Debug("[%s][%d] 查询到电表计算参数: [%v]", cfg.NO, today, calc)
 		if calc.Time != tms {
 			calc.ClearDayEnergy()
 		}
 	} else {
+		logger.Debug("[%s][%d] 没有查询到电表计算参数。", cfg.NO, today)
 		calc.ClearDayEnergy()
 	}
 
 	// 计算电表数据
-	logger.Debug("[%s] 计算前: [%v]", cfg.NO, calc)
+	logger.Debug("[%d]计算前: [%v]", today, *calc)
 	colData.CalcWithParam(calc)
 	calc.Time = tms
-	logger.Debug("[%s] 计算完成: [%v]", cfg.NO, calc)
+	logger.Debug("[%d]计算后: [%v]", today, *calc)
 	// 更新电表计算参数
 	data.CalcParam.Add(cfg.NO, calc)
 	db := meterCalcParam.NewMeterCalcParamDb()

+ 81 - 54
SERVER/Meter_Service/service/downStreamService/service.go

@@ -8,15 +8,19 @@ import (
 	"MeterService/dataStruct"
 	"encoding/json"
 	"fmt"
-	"log"
 	"time"
 )
 
+var (
+	errCount = 0
+)
+
 func NewDownStreamService() {
 	logger.Info("启动DTU服务:%d", config.C.Vber.CmdPort)
 	server := tcpserver.New(fmt.Sprintf(":%d", config.C.Vber.CmdPort))
 	server.OnNewClient(func(conn *tcpserver.Client) {
 		logger.Info("新设备连接:%s", conn.GetClientHost())
+
 	})
 	server.OnNewMessage(func(conn *tcpserver.Client, msg []byte) {
 		//logger.Debug("[%s]收到新消息:%s", conn.GetClientHost(), string(msg))
@@ -50,27 +54,31 @@ func dealDtuUpMsg(conn *tcpserver.Client, msg []byte) bool {
 
 // 处理DTU注册包及心跳包
 func dealDtuRegisterHeartBeat(conn *tcpserver.Client, dtuMsg *dataStruct.DTUManageCmd) {
-	if dtuMsg.Cmd == 0 || dtuMsg.Cmd == 1 {
-		clientState, _ := data.DtuMapState.Get(dtuMsg.SN)
+	if dtuMsg.Cmd == dataStruct.CmdRegister || dtuMsg.Cmd == dataStruct.CmdHeartBeat {
+		//clientState, _ := data.DtuMapState.Get(dtuMsg.SN)
+		clientState, ok := data.OnlineSN.Get(dtuMsg.SN)
 		conn.SetClientRegisterID(dtuMsg.SN)
 		clientState.FD = conn
 		clientState.Online = true
 		clientState.UpdateTime()
-		data.DtuMapState.Add(dtuMsg.SN, clientState)
-		data.IpSN.Add(conn.GetClientHost(), dtuMsg.SN)
-		onlineSn, ok := data.OnlineSN.Get(dtuMsg.SN)
-		if !ok || onlineSn.FD.GetClientHost() != clientState.FD.GetClientHost() {
+
+		//data.IpSN.Add(conn.GetClientHost(), dtuMsg.SN)
+		//onlineSn, ok := data.OnlineSN.Get(dtuMsg.SN)
+		if !ok || clientState.FD.GetClientHost() != clientState.FD.GetClientHost() {
 			msg := &dataStruct.DtuRegisterChanMsg{
 				Sn:    dtuMsg.SN,
 				Value: clientState,
 			}
 			data.TranSN <- msg
+		} else {
+			logger.Debug("[%s]设备上线:%s", clientState.FD.GetClientHost(), dtuMsg.SN)
+			data.OnlineSN.Add(dtuMsg.SN, clientState)
 		}
-		if dtuMsg.Cmd == 0 {
-			logger.Info(dtuMsg.SN + "[" + clientState.FD.GetClientHost() + "] Register")
+		if dtuMsg.Cmd == dataStruct.CmdRegister {
+			logger.Info("======【%s】====== Register  %s", dtuMsg.SN, conn.GetClientHost())
 		}
-		if dtuMsg.Cmd == 1 {
-			logger.Info(dtuMsg.SN + "[" + clientState.FD.GetClientHost() + "] HeartBeat")
+		if dtuMsg.Cmd == dataStruct.CmdHeartBeat {
+			logger.Info("======【%s】====== HeartBeat %s", dtuMsg.SN, conn.GetClientHost())
 		}
 	} else {
 		logger.Error("Register || HeartBeat 失败")
@@ -83,13 +91,16 @@ func dealDTUDisconnect(conn *tcpserver.Client) {
 	addr := conn.GetClientHost()
 	logger.Info("[%s]设备断开连接:%s", addr, sn)
 	if sn != "" {
-		if client, ok := data.DtuMapState.Get(sn); ok && client.FD.GetClientHost() == addr {
-			client.Online = false
-			data.DtuMapState.Add(sn, client)
-			logger.Debug("[%s]设备离线:%s", addr, sn)
-		}
+		//if client, ok := data.DtuMapState.Get(sn); ok && client.FD.GetClientHost() == addr {
+		//	client.Online = false
+		//	data.DtuMapState.Add(sn, client)
+		//	logger.Debug("[%s]设备离线:%s", addr, sn)
+		//}
 		if client, ok := data.OnlineSN.Get(sn); ok && client.FD.GetClientHost() == addr {
 			data.OnlineSN.Remove(sn)
+			//client.Online = false
+			//data.OnlineSN.Add(sn, client)
+			logger.Debug("[%s]设备离线:%s", addr, sn)
 		}
 	}
 }
@@ -104,56 +115,72 @@ func runTran(msg <-chan *dataStruct.DtuRegisterChanMsg) {
 			logger.Info("【更新设备配置】 SN:%s", msg.Sn)
 			updateOnlineConf(msg)
 		case nowTime := <-ticker.C:
-			minute := nowTime.Minute() //当前分钟
-			if minute != lastMinute {
-				count := 0
-				onlineDtu := make(map[string]*dataStruct.ClientState)
-
-				for _, v := range data.DtuMap.Map.Map {
-					vv := v.(*dataStruct.DTUDeviceState)
-					log.Println("===============", vv.Info.Name)
-				}
-				data.OnlineSN.Map.Range(func(key, value interface{}) bool {
-					v := value.(*dataStruct.ClientState)
-					dtuSn := key.(string)
-					logger.Debug("【检查在线设备配置】 SN:%s", dtuSn)
-					if v.Config != nil {
-						onlineDtu[dtuSn] = v
-					}
-					count++
-					return true
-				})
-				if count == 0 {
-					logger.Info("没有在线设备。")
-				}
-				for dtuSn, client := range onlineDtu {
-					if minute%client.Config.Secs == 0 {
-						// 采集上报数据
-						if dataArray := collectData(dtuSn, client.Config); len(dataArray) > 0 {
-							logger.Debug("开始上报平台:%s", dtuSn)
-							reportData(dataArray, client.Config)
-						}
-					}
-				}
-
-				lastMinute = minute
-			}
+			collectAndReport(nowTime, lastMinute)
 		}
 	}
 }
 
-// 更新设备配置
+// 设备上线更新配置
 func updateOnlineConf(msg *dataStruct.DtuRegisterChanMsg) {
 	dtuConfig := &dataStruct.DtuConfig{}
 	if dtu, ok := data.DtuMap.Get(msg.Sn); ok {
 		if err := json.Unmarshal([]byte(dtu.Info.Configs), dtuConfig); err != nil {
-			logger.Error("[%s]设备配置解析失败。", msg.Sn)
+			logger.Error("[%s]设备上线配置解析失败。", msg.Sn)
 			return
 		}
 		msg.Value.Config = dtuConfig
 		data.OnlineSN.Add(msg.Sn, msg.Value)
-		logger.Debug("[%s]设备配置更新成功。 %v ", msg.Sn, *dtuConfig)
+		logger.Debug("[%s]设备上线:%s ;配置:  %v", msg.Value.FD.GetClientHost(), msg.Sn, *dtuConfig)
 	} else {
-		logger.Debug("【更新设备配置失败】[%s]设备不存在。", msg.Sn)
+		logger.Debug("【设备上线失败】[%s]设备不存在。", msg.Sn)
+	}
+}
+
+// 采集并上报数据
+func collectAndReport(nowTime time.Time, lastMinute int) {
+	minute := nowTime.Minute() //当前分钟
+	if minute != lastMinute {
+		lastMinute = minute
+		count := 0
+		onlineDtu := make(map[string]*dataStruct.ClientState)
+
+		//for _, v := range data.DtuMap.Map.Map {
+		//	vv := v.(*dataStruct.DTUDeviceState)
+		//	log.Println("===============", vv.Info.Name)
+		//}
+		data.OnlineSN.Map.Range(func(key, value interface{}) bool {
+			v := value.(*dataStruct.ClientState)
+			dtuSn := key.(string)
+			dtu, ok := data.DtuMap.Get(dtuSn)
+			if !ok || dtu.Info.Configs == "" {
+				logger.Error("【在线设备更新配置】设备不存在  SN:%s", dtuSn)
+				return true
+			}
+			dtuConfig := &dataStruct.DtuConfig{}
+			if err := json.Unmarshal([]byte(dtu.Info.Configs), dtuConfig); err != nil {
+				logger.Error("【在线设备更新配置】解析失败  SN:%s", dtuSn)
+				return true
+			}
+			v.Config = dtuConfig
+			onlineDtu[dtuSn] = v
+			count++
+			return true
+		})
+		if count == 0 && errCount < 10 {
+			errCount++
+			logger.Info("没有在线设备。")
+			return
+		}
+		for dtuSn, client := range onlineDtu {
+			if minute%client.Config.Secs == 0 {
+				// 采集上报数据
+				if dataArray := collectData(dtuSn, client.Config); len(dataArray) > 0 {
+					logger.Debug("开始上报平台:%s", dtuSn)
+					reportData(dataArray, client.Config)
+				}
+			}
+		}
+		errCount = 0
+
 	}
 }