mpinfo_service.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. package service
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "reflect"
  7. "rtzh_elec_temperature/enum"
  8. "rtzh_elec_temperature/global"
  9. "rtzh_elec_temperature/logger"
  10. "rtzh_elec_temperature/models/bo"
  11. "rtzh_elec_temperature/tools"
  12. "strconv"
  13. "sync"
  14. "time"
  15. "github.com/spf13/cast"
  16. "git.rtzhtech.cn/iss/public-lib/logic"
  17. "git.rtzhtech.cn/iss/public-lib/model"
  18. "github.com/astaxie/beego/orm"
  19. )
  20. //设备测点分组模型(本地库)
  21. type t_data_mp_group struct {
  22. Id int `"pk;auto"` //(11) NOT NULL AUTO_INCREMENT,
  23. Deviceid int32 //(11) NOT NULL,
  24. Groupid int64 //(11) NOT NULL,
  25. Groupname string //varchar(20) NOT NULL,
  26. Mpid int64 //(20) NOT NULL,
  27. Attrname string
  28. }
  29. //设备测点列表缓存
  30. var mpList = sync.Map{}
  31. //测点相关服务
  32. type MpinfoService struct {
  33. BaseService
  34. }
  35. func init() {
  36. orm.RegisterModel(new(t_data_mp_group))
  37. }
  38. // 根据模型ID获取对应的测点定义
  39. // 返回对应的mpid、mpname、attrname等
  40. func (t *MpinfoService) MpList(modelid int) []orm.Params {
  41. key := fmt.Sprintf("%d", modelid)
  42. var list = []orm.Params{}
  43. if info, ok := mpList.Load(key); ok {
  44. return info.([]orm.Params)
  45. } else {
  46. db := orm.NewOrm()
  47. db.Using("iss")
  48. var sqlCommandText = "select * from dev_mpinfo where appid=? and modelid=?"
  49. _, err := db.Raw(sqlCommandText, RtelecManageApp().RegAppID, modelid).Values(&list)
  50. if err == nil {
  51. if len(list) > 0 {
  52. mpList.Store(key, list)
  53. return list
  54. }
  55. } else {
  56. logger.Logger.Error(err)
  57. logger.Logger.Println(fmt.Sprintf("Error SQL:%s 参数:%s,%s", sqlCommandText, RtelecManageApp().RegAppID, modelid))
  58. }
  59. }
  60. return list
  61. }
  62. //根据测点id获取测点信息
  63. func (t *MpinfoService) GetMpinfo(mpid int64) (orm.Params, error) {
  64. db := orm.NewOrm()
  65. db.Using("iss")
  66. rowset := []orm.Params{}
  67. sqlCommandText := "select * from dev_mpinfo where appid=? and mpid=?"
  68. _, err := db.Raw(sqlCommandText, RtelecManageApp().RegAppID, mpid).Values(&rowset)
  69. if err == nil {
  70. if len(rowset) > 0 {
  71. return rowset[0], nil
  72. }
  73. } else {
  74. logger.Logger.Error(err)
  75. logger.Logger.Println(fmt.Sprintf("Error SQL:%s 参数:%s,%d", sqlCommandText, RtelecManageApp().RegAppID, mpid))
  76. return orm.Params{}, err
  77. }
  78. return orm.Params{}, nil
  79. }
  80. //获取测点参数
  81. func (t *MpinfoService) GetMpField(mpinfo_parameter string, AppId, ModelId int32) ([]model.DevMpinfo, error) {
  82. var MpField []model.DevMpinfo
  83. if mpinfo_parameter == "" {
  84. return MpField, nil
  85. }
  86. var MpData []map[string]interface{}
  87. bytes := []byte(mpinfo_parameter)
  88. json_err := json.Unmarshal(bytes, &MpData)
  89. if json_err != nil {
  90. return MpField, errors.New("测点信息不是标准的json格式!")
  91. } else {
  92. for _, Record := range MpData {
  93. var newFile model.DevMpinfo
  94. if mpid, ok := Record["mpid"]; ok && tools.IsEmpty(mpid) != "" {
  95. _id := mpid.(string)
  96. newFile.Mpid, _ = strconv.ParseInt(_id, 10, 64)
  97. }
  98. if mpname, ok := Record["mpname"]; ok && tools.IsEmpty(mpname) != "" {
  99. newFile.Mpname = mpname.(string)
  100. }
  101. if newFile.Mpname == "" {
  102. return MpField, errors.New("测点信息不允许为空!")
  103. }
  104. if zonename, ok := Record["zonename"]; ok && tools.IsEmpty(zonename) != "" {
  105. newFile.Zonename = zonename.(string)
  106. }
  107. if position, ok := Record["positionname"]; ok && tools.IsEmpty(position) != "" {
  108. newFile.Positionname = position.(string)
  109. }
  110. if unit, ok := Record["unit"]; ok && tools.IsEmpty(unit) != "" {
  111. newFile.Unit = unit.(string)
  112. }
  113. if online, ok := Record["online"]; ok && tools.IsEmpty(online) != "" {
  114. var OnLine = ""
  115. if reflect.TypeOf(online).Kind() == reflect.Float64 {
  116. OnLine = strconv.FormatFloat(online.(float64), 'f', 10, 64)
  117. } else {
  118. OnLine = online.(string)
  119. }
  120. if _online, toerr := strconv.Atoi(OnLine); toerr == nil {
  121. newFile.Online = int32(_online)
  122. }
  123. }
  124. if attrname, ok := Record["attrname"]; ok && tools.IsEmpty(attrname) != "" {
  125. newFile.Attrname = attrname.(string)
  126. }
  127. newFile.Appid = AppId
  128. newFile.Modelid = ModelId
  129. MpField = append(MpField, newFile)
  130. }
  131. }
  132. return MpField, nil
  133. }
  134. //获取控制点参数
  135. func (t *MpinfoService) GetControlField(mpinfo_parameter string, AppId, ModelId int32, deviceid int64) ([]map[string]interface{}, error) {
  136. var Result []map[string]interface{}
  137. if mpinfo_parameter == "" {
  138. return Result, nil
  139. }
  140. var ControlData []map[string]interface{}
  141. bytes := []byte(mpinfo_parameter)
  142. json_err := json.Unmarshal(bytes, &ControlData)
  143. if json_err != nil {
  144. return Result, errors.New("控制点信息不是标准的json格式!")
  145. } else {
  146. for _, Record := range ControlData {
  147. var Cpinfo model.CpMpinfo
  148. var rowRecord = make(map[string]interface{})
  149. if cpid, ok := Record["cpid"]; ok && tools.IsEmpty(cpid) != "" {
  150. _cpid := tools.IsEmpty(cpid)
  151. Cpinfo.Cpid, _ = strconv.ParseInt(_cpid, 10, 64)
  152. }
  153. if cpname, ok := Record["cpname"]; ok && tools.IsEmpty(cpname) != "" {
  154. Cpinfo.Cpname = cpname.(string)
  155. }
  156. if Cpinfo.Cpname == "" {
  157. return Result, errors.New("控制点名称不允许为空!")
  158. }
  159. if zonename, ok := Record["zonename"]; ok && tools.IsEmpty(zonename) != "" {
  160. Cpinfo.Zonename = zonename.(string)
  161. }
  162. if Cpinfo.Zonename == "" {
  163. return Result, errors.New("控制点所在区域不允许为空!")
  164. }
  165. if position, ok := Record["positionname"]; ok && tools.IsEmpty(position) != "" {
  166. Cpinfo.Positionname = position.(string)
  167. }
  168. if attrname, ok := Record["attrname"]; ok && tools.IsEmpty(attrname) != "" {
  169. Cpinfo.Attrname = attrname.(string)
  170. }
  171. if mpname, ok := Record["mpname"]; ok && tools.IsEmpty(mpname) != "" {
  172. //这里进行查找
  173. // Cpinfo.Mpid, _ = strconv.ParseInt(_mpid, 10, 64)
  174. Mpinfo, err := logic.GetMpidByMpnameDeviceId(deviceid, mpname.(string), int(AppId))
  175. if err != nil {
  176. tools.Log(err)
  177. }
  178. Cpinfo.Mpname = mpname.(string)
  179. Cpinfo.Mpid = Mpinfo
  180. }
  181. Cpinfo.Appid = AppId
  182. Cpinfo.Modelid = ModelId
  183. rowRecord["control"] = Cpinfo //控制点记录
  184. //控制点动作记录
  185. var ActionField []model.DevCpaction
  186. if action_parameter, ok := Record["actiondata"]; ok {
  187. if reflect.TypeOf(action_parameter).Kind() == reflect.Slice {
  188. ActionData := action_parameter.([]interface{})
  189. for _, ActionRow := range ActionData {
  190. row := ActionRow.(map[string]interface{})
  191. var RowField model.DevCpaction
  192. if id, ok := row["actid"]; ok && tools.IsEmpty(id) != "" {
  193. RowField.Actid, _ = strconv.ParseInt(tools.IsEmpty(id), 10, 64)
  194. }
  195. if acttype, ok := row["acttype"]; ok && tools.IsEmpty(acttype) != "" {
  196. var act_type = tools.IsEmpty(acttype)
  197. acttypeValue, _ := strconv.Atoi(act_type)
  198. RowField.Acttype = int32(acttypeValue)
  199. }
  200. if desc, ok := row["actdesc"]; ok && tools.IsEmpty(desc) != "" {
  201. RowField.Actdesc = desc.(string)
  202. }
  203. if value, ok := row["value"]; ok && tools.IsEmpty(value) != "" {
  204. _value := tools.IsEmpty(value)
  205. newValue, _ := strconv.ParseInt(_value, 10, 64)
  206. RowField.Value = float64(newValue)
  207. }
  208. if delay, ok := row["delay"]; ok && tools.IsEmpty(delay) != "" {
  209. var _actionDelay = tools.IsEmpty(delay)
  210. actionDelay, _ := strconv.Atoi(_actionDelay)
  211. RowField.Delay = int32(actionDelay)
  212. }
  213. if v, ok := row["successval"]; ok && tools.IsEmpty(v) != "" {
  214. RowField.Successval, _ = strconv.ParseFloat(tools.IsEmpty(v), 64)
  215. } else {
  216. RowField.Successval, _ = strconv.ParseFloat(tools.IsEmpty(row["value"]), 64)
  217. }
  218. ActionField = append(ActionField, RowField)
  219. }
  220. }
  221. }
  222. if len(ActionField) == 0 {
  223. return []map[string]interface{}{}, errors.New("控制点动作不允许为空,请检查传入参数!")
  224. }
  225. rowRecord["action"] = ActionField
  226. Result = append(Result, rowRecord)
  227. }
  228. }
  229. return Result, nil
  230. }
  231. //保存测点分组
  232. func (t *MpinfoService) SaveGroup(deviceid int32, groupid int64, groupname string, mps []string) error {
  233. if len(mps) == 0 {
  234. return errors.New("分组测点不能为空")
  235. }
  236. if len(mps) < 2 {
  237. return errors.New("同一分组测点数不能小于2个")
  238. }
  239. if len(mps) > 3 {
  240. return errors.New("同一分组测点数不能大于3个")
  241. }
  242. if groupname == "" {
  243. return errors.New("分组名称不能为空")
  244. }
  245. devSrv := new(DeviceService)
  246. key := fmt.Sprintf("GroupList_%d", deviceid)
  247. key2 := fmt.Sprintf("GroupList_mp_%d_%d", deviceid, groupid)
  248. db := orm.NewOrm()
  249. sql := "select groupid from t_data_mp_group where deviceid=? and groupname=?"
  250. rowset := []orm.Params{}
  251. sqlparams := []interface{}{deviceid, groupname}
  252. _, err := db.Raw(sql, sqlparams).Values(&rowset)
  253. if err != nil {
  254. logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlparams))
  255. return err
  256. }
  257. if len(rowset) > 0 && groupid != cast.ToInt64(rowset[0]["groupid"]) {
  258. return errors.New("分组名称" + groupname + "已存在")
  259. }
  260. if groupid == 0 {
  261. groupid = time.Now().Unix()
  262. } else {
  263. //清除原分组测点
  264. db.Raw("delete from t_data_mp_group where deviceid=? and groupid=?", deviceid, groupid).Exec()
  265. global.GoCahce.Delete(key2)
  266. }
  267. //获取设备测点列表
  268. mpMap := devSrv.DeviceMpInfo(deviceid)
  269. var getAttrNameByMpid = func(mpmap map[string]orm.Params, mpid string) string {
  270. for _, row := range mpmap {
  271. if tools.IsEmpty(row["mpid"]) == mpid {
  272. return tools.IsEmpty(row["attrname"])
  273. }
  274. }
  275. return ""
  276. }
  277. db.Begin()
  278. for _, k := range mps {
  279. obj := t_data_mp_group{}
  280. obj.Deviceid = deviceid
  281. obj.Groupid = groupid
  282. obj.Groupname = groupname
  283. obj.Mpid, _ = strconv.ParseInt(k, 10, 64)
  284. obj.Attrname = getAttrNameByMpid(mpMap, k)
  285. _, err = db.Insert(&obj)
  286. if err != nil {
  287. db.Rollback()
  288. logger.Logger.Error(err)
  289. new(bo.SystemLog).Fail(enum.AuditType_mp,
  290. enum.LogType_Insert,
  291. enum.OptEventType_Bus,
  292. enum.OptEventLevel_Hight,
  293. fmt.Sprintf("创建测点分组失败:%s 操作数据:%+v", err.Error(), obj),
  294. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  295. )
  296. return err
  297. }
  298. }
  299. err = db.Commit()
  300. if err != nil {
  301. logger.Logger.Error(err)
  302. new(bo.SystemLog).Fail(enum.AuditType_mp,
  303. enum.LogType_Insert,
  304. enum.OptEventType_Bus,
  305. enum.OptEventLevel_Hight,
  306. fmt.Sprintf("创建测点分组失败:%s", err.Error()),
  307. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  308. )
  309. }
  310. global.GoCahce.Delete(key)
  311. new(bo.SystemLog).Success(enum.AuditType_mp,
  312. enum.LogType_Insert,
  313. enum.OptEventType_Bus,
  314. enum.OptEventLevel_Hight,
  315. "创建测点分组成功",
  316. map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
  317. )
  318. return err
  319. }
  320. //删除指定测点的分组记录
  321. func (t *MpinfoService) DeleteMp(deviceid int32, mpId int64) error {
  322. key := fmt.Sprintf("GroupList_%d", deviceid)
  323. db := orm.NewOrm()
  324. sql := "delete from t_data_mp_group where deviceid=? and mpid=?"
  325. _, err := db.Raw(sql, deviceid, mpId).Exec()
  326. if err != nil {
  327. logger.Logger.Error(err)
  328. return err
  329. }
  330. global.GoCahce.Delete(key)
  331. return nil
  332. }
  333. //根据设备查询测点分组列表
  334. func (t *MpinfoService) GroupList(deviceid int32) ([]orm.Params, error) {
  335. key := fmt.Sprintf("GroupList_%d", deviceid)
  336. if v, h := global.GoCahce.Get(key); h {
  337. return v.([]orm.Params), nil
  338. }
  339. sql := "select groupid,groupname from t_data_mp_group where deviceid=? group by groupid ORDER BY groupid"
  340. rowset := []orm.Params{}
  341. _, err := orm.NewOrm().Raw(sql, deviceid).Values(&rowset)
  342. if err != nil {
  343. logger.Logger.Error(err)
  344. return nil, err
  345. }
  346. global.GoCahce.Set(key, rowset, -1)
  347. return rowset, nil
  348. }
  349. //根据设备查询分组中的测点列表
  350. func (t *MpinfoService) GroupMpList(deviceid int32, groupid int64) ([]orm.Params, error) {
  351. key := fmt.Sprintf("GroupList_mp_%d_%d", deviceid, groupid)
  352. if v, h := global.GoCahce.Get(key); h {
  353. return v.([]orm.Params), nil
  354. }
  355. sql := "select * from t_data_mp_group where deviceid=? and groupid=?"
  356. rowset := []orm.Params{}
  357. _, err := orm.NewOrm().Raw(sql, deviceid, groupid).Values(&rowset)
  358. if err != nil {
  359. logger.Logger.Error(err)
  360. return nil, err
  361. }
  362. global.GoCahce.Set(key, rowset, -1)
  363. return rowset, nil
  364. }
  365. // 根据测点id判断该测点是否在分组中
  366. func (t *MpinfoService) MpidInGroup(mpid int64) (bool, error) {
  367. db := orm.NewOrm()
  368. lst := []orm.Params{}
  369. var sql = "select id from t_data_mp_group where mpid=?"
  370. _, err := db.Raw(sql, mpid).Values(&lst)
  371. if err != nil {
  372. logger.Logger.Error(err)
  373. logger.Logger.Println(fmt.Sprintf("****************Error is:%s.", err.Error()))
  374. return false, err
  375. }
  376. if len(lst) == 0 {
  377. return false, nil
  378. } else {
  379. return true, nil
  380. }
  381. }