dataoptimize_service.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954
  1. package service
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "math/rand"
  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. "strings"
  14. "time"
  15. "github.com/astaxie/beego/orm"
  16. "github.com/spf13/cast"
  17. )
  18. type DataoptimizeService struct {
  19. BaseService
  20. }
  21. //优化数据值
  22. /*
  23. @param modelid 模型id
  24. @param deviceid 设备id
  25. @param mpname 需要优化的测点名称
  26. @param pushallvalues 当前接收到的所有测点值
  27. */
  28. func (t *DataoptimizeService) OptimizeValue(modelid int, deviceid int32, attrname string, pushallvalues map[string]interface{}) float64 {
  29. //获取填充状态
  30. ruleFillState := t.GetRuleStatus()
  31. if _, h := pushallvalues[attrname]; !h {
  32. //当测点未采集到数据时
  33. //判断是否开启了缺点填充
  34. if ruleFillState["deletion_fill_rule"] == "1" {
  35. return t.getDeletionFillValue(ruleFillState, modelid, deviceid, attrname, pushallvalues)
  36. }
  37. return cast.ToFloat64(global.NullNumber)
  38. }
  39. originvalue := cast.ToFloat64(pushallvalues[attrname])
  40. //判断是否有针对当前设备配置优化
  41. if ruleFillState["invalid_fill_rule"] == "1" {
  42. //获取当前测点的范围优化配置
  43. return t.getInvalidFillValue(originvalue, ruleFillState, modelid, deviceid, attrname, pushallvalues)
  44. }
  45. return originvalue
  46. }
  47. //生成无效范围填充值
  48. func (t *DataoptimizeService) getInvalidFillValue(v float64, ruleFillState map[string]string, modelid int, deviceid int32, attrname string, pushallvalues map[string]interface{}) float64 {
  49. invalid_fill_rowset, _ := t.InvalidOptimizeCnfList()
  50. if invalid_fill_rowset != nil {
  51. for _, row := range invalid_fill_rowset {
  52. if tools.IsEmpty(deviceid) == tools.IsEmpty(row["device_id"]) && tools.IsEmpty(modelid) == tools.IsEmpty(row["model_id"]) {
  53. cnf := tools.IsEmpty(row["fill_cnf"])
  54. if cnf != "" {
  55. //应用规则
  56. cnfObj := map[string]interface{}{}
  57. json.Unmarshal([]byte(cnf), &cnfObj)
  58. if cnfObj != nil {
  59. //获取该测点的指定填充测点配置
  60. pointFillCnf := cnfObj[attrname]
  61. if pointFillCnf != nil {
  62. fillpoints := pointFillCnf.(map[string]interface{})["value"].([]interface{})
  63. minvalue := cast.ToFloat64(fillpoints[0])
  64. maxvalue := cast.ToFloat64(fillpoints[1])
  65. //logger.Logger.Debug(fmt.Sprintf("=====无效值判断。当前值%f 范围最小值:%f 最大值%:%f", v, minvalue, maxvalue))
  66. if v <= minvalue || v >= maxvalue {
  67. //采集数值不在有效范围内
  68. invalid_show_rule, _ := bo.GetSysParamValue("invalid_show_rule", "0")
  69. if invalid_show_rule == "2" {
  70. //应用填充规则
  71. return t.getDeletionFillValue(ruleFillState, modelid, deviceid, attrname, pushallvalues)
  72. }
  73. if invalid_show_rule == "0" {
  74. //不显示。前端显示为空
  75. return cast.ToFloat64(global.NullNumber)
  76. }
  77. //使用的字符填充。在查询数据时需要针对-99999的测点值替换为设置的填充字符返回
  78. v, _ = strconv.ParseFloat(global.ReplaceNumber, 64)
  79. return v
  80. }
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }
  87. return v
  88. }
  89. //生成缺点填充值
  90. func (t *DataoptimizeService) getDeletionFillValue(ruleFillState map[string]string, modelid int, deviceid int32, attrname string, pushallvalues map[string]interface{}) float64 {
  91. //判断是相邻测点填充还是指定测点填充
  92. if ruleFillState["deletion_fill_randompoint"] == "1" {
  93. //获取当前采集中的同类测点,再随机获取其中一个测点的值
  94. pointTypeCode := attrname[0:3]
  95. for tmpAttrname, v := range pushallvalues {
  96. if tmpAttrname != attrname && tmpAttrname[0:3] == pointTypeCode && tools.IsEmpty(v) != "" {
  97. //logger.Logger.Debug(fmt.Sprintf("====当前缺点测点%s,使用测点%s数据进行填充:%+v", attrname, tmpAttrname, v))
  98. return cast.ToFloat64(v)
  99. }
  100. }
  101. } else if ruleFillState["deletion_fill_specifypoint"] == "1" {
  102. deletion_fill_rule_rowset, _ := t.DeletionOptimizeCnfList()
  103. //logger.Logger.Debug(fmt.Sprintf("当前采集属性%s的缺点填充:%+v", attrname, deletion_fill_rule_rowset))
  104. if deletion_fill_rule_rowset != nil {
  105. //优先查找针对设备配置的缺点填充规则
  106. deletionRuleCnf, _ := t.DeletionOptimizeCnfMap()
  107. if deletionRuleCnf == nil {
  108. return cast.ToFloat64(global.NullNumber)
  109. }
  110. deletionRuleCnfByMD := deletionRuleCnf[fmt.Sprintf("%d%d", modelid, deviceid)]
  111. if deletionRuleCnfByMD != nil {
  112. //logger.Logger.Debug(fmt.Sprintf("设备%s缺点填充规则:%+v", tools.IsEmpty(deviceid), row["fill_cnf"]))
  113. cnf := tools.IsEmpty(deletionRuleCnfByMD["fill_cnf"])
  114. if cnf != "" {
  115. //应用规则
  116. cnfObj := []map[string]interface{}{}
  117. json.Unmarshal([]byte(cnf), &cnfObj)
  118. if cnfObj != nil {
  119. //获取该测点的指定填充测点配置
  120. for _, cnfObjItem := range cnfObj {
  121. if tools.IsEmpty(cnfObjItem["attrname"]) == attrname {
  122. pointFillCnf := cnfObjItem["value"]
  123. if pointFillCnf != nil {
  124. fillpoints := pointFillCnf.([]interface{})
  125. if len(fillpoints) > 0 {
  126. //随机获取一个测点
  127. rand.Seed(time.Now().Unix())
  128. ind := rand.Intn(len(fillpoints) - 1)
  129. tmpObj := fillpoints[ind].(map[string]interface{})
  130. return cast.ToFloat64(pushallvalues[tools.IsEmpty(tmpObj["attrname"])])
  131. }
  132. }
  133. }
  134. }
  135. }
  136. }
  137. }
  138. //logger.Logger.Debug(fmt.Sprintf("未找到设备%d及测点%s的填充设置,采用通用配置!", deviceid, attrname))
  139. deletionRuleCnfByMD = deletionRuleCnf[fmt.Sprintf("%d0", modelid)]
  140. //查找模型通用配置
  141. if deletionRuleCnfByMD != nil {
  142. cnf := tools.IsEmpty(deletionRuleCnfByMD["fill_cnf"])
  143. if cnf != "" {
  144. //应用规则
  145. cnfObj := []map[string]interface{}{}
  146. json.Unmarshal([]byte(cnf), &cnfObj)
  147. if cnfObj != nil {
  148. //获取该测点的指定填充测点配置
  149. for _, cnfObjItem := range cnfObj {
  150. if tools.IsEmpty(cnfObjItem["attrname"]) == attrname {
  151. pointFillCnf := cnfObjItem["value"]
  152. if pointFillCnf != nil {
  153. fillpoints := pointFillCnf.([]interface{})
  154. if len(fillpoints) > 0 {
  155. //随机获取一个测点
  156. rand.Seed(time.Now().Unix())
  157. ind := rand.Intn(len(fillpoints) - 1)
  158. tmpObj := fillpoints[ind].(map[string]interface{})
  159. return cast.ToFloat64(pushallvalues[tools.IsEmpty(tmpObj["attrname"])])
  160. }
  161. }
  162. }
  163. }
  164. }
  165. }
  166. }
  167. }
  168. }
  169. return cast.ToFloat64(global.NullNumber)
  170. }
  171. //查询缺点数据填充规则配置
  172. func (t *DataoptimizeService) DeletionOptimizeCnfList() ([]orm.Params, error) {
  173. key := "optimize_deletion_fillrule"
  174. if v, h := global.GoCahce.Get(key); h {
  175. return v.([]orm.Params), nil
  176. }
  177. db := orm.NewOrm()
  178. sql := "select * from t_data_optimize_deletion_fillrule"
  179. rowset := []orm.Params{}
  180. _, err := db.Raw(sql).Values(&rowset)
  181. if err != nil {
  182. logger.Logger.Error(err)
  183. return nil, err
  184. }
  185. global.GoCahce.Set(key, rowset, -1)
  186. return rowset, err
  187. }
  188. //查询缺点数据填充规则配置。以Map返回,key为模型id+设备id
  189. func (t *DataoptimizeService) DeletionOptimizeCnfMap() (map[string]orm.Params, error) {
  190. key := "optimize_deletion_fillrule_map"
  191. if v, h := global.GoCahce.Get(key); h {
  192. return v.(map[string]orm.Params), nil
  193. }
  194. rowset, err := t.DeletionOptimizeCnfList()
  195. result := map[string]orm.Params{}
  196. if err == nil {
  197. for _, row := range rowset {
  198. k := fmt.Sprintf("%v%v", row["model_id"], row["device_id"])
  199. result[k] = row
  200. }
  201. global.GoCahce.Set(key, result, -1)
  202. }
  203. return result, err
  204. }
  205. //查询无效数据填充规则配置
  206. func (t *DataoptimizeService) InvalidOptimizeCnfList() ([]orm.Params, error) {
  207. key := "optimize_invalid_fillrule"
  208. if v, h := global.GoCahce.Get(key); h {
  209. return v.([]orm.Params), nil
  210. }
  211. db := orm.NewOrm()
  212. sql := "select * from t_data_optimize_invalid_fillrule"
  213. rowset := []orm.Params{}
  214. _, err := db.Raw(sql).Values(&rowset)
  215. if err != nil {
  216. logger.Logger.Error(err)
  217. return nil, err
  218. }
  219. global.GoCahce.Set(key, rowset, -1)
  220. return rowset, err
  221. }
  222. //查询无效数据填充规则配置。以Map返回,key为模型id+设备id
  223. func (t *DataoptimizeService) InvalidOptimizeCnfMap() (map[string]orm.Params, error) {
  224. key := "optimize_invalid_fillrule_map"
  225. if v, h := global.GoCahce.Get(key); h {
  226. return v.(map[string]orm.Params), nil
  227. }
  228. rowset, err := t.InvalidOptimizeCnfList()
  229. result := map[string]orm.Params{}
  230. if err == nil {
  231. for _, row := range rowset {
  232. k := fmt.Sprintf("%v%v", row["model_id"], row["device_id"])
  233. result[k] = row
  234. }
  235. global.GoCahce.Set(key, result, -1)
  236. }
  237. return result, err
  238. }
  239. //编辑数据优化配置
  240. //optimizetype:填充规则类型。invalid:无效数据填充 deletion:缺点数据填充
  241. //modelid:模型id.指定了deviceid时可以不指定该参数
  242. //deviceid:设备ID.指定了modelid时可以不指定该参数
  243. //cnf:配置内容。json格式
  244. func (t *DataoptimizeService) EditOptimize(optimizetype string, modelid int64, deviceid int32, cnf string) error {
  245. var err error
  246. db := orm.NewOrm()
  247. key := "optimize_deletion_fillrule"
  248. tn := "t_data_optimize_deletion_fillrule"
  249. if optimizetype == "invalid" {
  250. tn = "t_data_optimize_invalid_fillrule"
  251. key = "optimize_invalid_fillrule"
  252. }
  253. sql := "REPLACE INTO " + tn + "(model_id,device_id,fill_cnf,cr,ct)values(?,?,?,?,now()) "
  254. sqlParas := []interface{}{modelid, deviceid, cnf, t.UserInfo.Id}
  255. _, err = db.Raw(sql, sqlParas).Exec()
  256. if err != nil {
  257. logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlParas))
  258. new(bo.SystemLog).Fail(
  259. enum.AuditType_Dataoptimize,
  260. enum.LogType_Update,
  261. enum.OptEventType_Bus,
  262. enum.OptEventLevel_Hight,
  263. fmt.Sprintf("编辑数据优化配置,操作数据:%+v", cnf),
  264. map[string]interface{}{
  265. "name": t.UserInfo.Usrname,
  266. "ip": t.UserInfo.Ip,
  267. },
  268. )
  269. } else {
  270. global.GoCahce.Delete(key) //清除缓存。下次查询时重新缓存最新数据
  271. global.GoCahce.Delete(fmt.Sprintf("%s_map", key))
  272. new(bo.SystemLog).Success(
  273. enum.AuditType_Dataoptimize,
  274. enum.LogType_Update,
  275. enum.OptEventType_Bus,
  276. enum.OptEventLevel_Hight,
  277. fmt.Sprintf("编辑数据优化配置,操作数据:%+v", cnf),
  278. map[string]interface{}{
  279. "name": t.UserInfo.Usrname,
  280. "ip": t.UserInfo.Ip,
  281. },
  282. )
  283. }
  284. return err
  285. }
  286. //删除指定设备的数据优化配置
  287. //deviceid:设备ID
  288. func (t *DataoptimizeService) DeleteOptimize(optimizetype string, deviceid int32) error {
  289. var err error
  290. db := orm.NewOrm()
  291. tn := "t_data_optimize_invalid_fillrule"
  292. if optimizetype == "deletion" {
  293. tn = "t_data_optimize_deletion_fillrule"
  294. }
  295. _, err = db.Raw("delete from "+tn+" where device_id=?", deviceid).Exec()
  296. if err != nil {
  297. logger.Logger.Error(err)
  298. return err
  299. }
  300. global.GoCahce.Delete(strings.ReplaceAll(tn, "t_data_", ""))
  301. global.GoCahce.Delete(strings.ReplaceAll(tn, "t_data_", "") + "_map")
  302. new(bo.SystemLog).Success(
  303. enum.AuditType_Dataoptimize,
  304. enum.LogType_Delete,
  305. enum.OptEventType_Bus,
  306. enum.OptEventLevel_Hight,
  307. "删除数据填充规则",
  308. map[string]interface{}{
  309. "name": t.UserInfo.Usrname,
  310. "ip": t.UserInfo.Ip,
  311. },
  312. )
  313. return err
  314. }
  315. //删除指定设备的某个测点的数据优化配置
  316. //deviceid:设备ID
  317. //attrname:模型属性名
  318. func (t *DataoptimizeService) DeleteAttrnameOptimize(optimizetype string, deviceid int32, attrname string) error {
  319. var err error
  320. db := orm.NewOrm()
  321. tn := "t_data_optimize_invalid_fillrule"
  322. if optimizetype == "deletion" {
  323. tn = "t_data_optimize_deletion_fillrule"
  324. }
  325. rowset := []orm.Params{}
  326. _, err = db.Raw("select * from "+tn+" where device_id=?", deviceid).Values(&rowset)
  327. if err != nil {
  328. logger.Logger.Error(err)
  329. return err
  330. }
  331. if len(rowset) == 0 {
  332. return nil
  333. }
  334. foundOne := false
  335. for _, row := range rowset {
  336. found := false
  337. fillcnf := tools.IsEmpty(row["fill_cnf"])
  338. if fillcnf == "" {
  339. continue
  340. }
  341. updateObj := map[string]interface{}{"n": nil}
  342. if optimizetype == "deletion" {
  343. fillcnfobj := []map[string]interface{}{}
  344. err = json.Unmarshal([]byte(fillcnf), &fillcnfobj)
  345. if err != nil {
  346. logger.Logger.Error(err, fillcnf)
  347. return err
  348. }
  349. newFillcnfObj := []map[string]interface{}{}
  350. for _, cnfitem := range fillcnfobj {
  351. if tools.IsEmpty(cnfitem["attrname"]) == attrname {
  352. found = true
  353. continue
  354. }
  355. value := cnfitem["value"].([]interface{})
  356. newvalues := []map[string]interface{}{}
  357. for _, v1 := range value {
  358. v2 := v1.(map[string]interface{})
  359. if tools.IsEmpty(v2["attrname"]) == attrname {
  360. found = true
  361. continue
  362. }
  363. newvalues = append(newvalues, v2)
  364. }
  365. cnfitem["value"] = newvalues
  366. newFillcnfObj = append(newFillcnfObj, cnfitem)
  367. }
  368. if len(newFillcnfObj) > 0 {
  369. updateObj["n"] = newFillcnfObj
  370. }
  371. } else {
  372. fillcnfobj := map[string]interface{}{}
  373. err = json.Unmarshal([]byte(fillcnf), &fillcnfobj)
  374. if err != nil {
  375. logger.Logger.Error(err, fillcnf)
  376. return err
  377. }
  378. newFillcnfObj := map[string]interface{}{}
  379. for k, cnfitem := range fillcnfobj {
  380. if k == attrname {
  381. found = true
  382. continue
  383. }
  384. newFillcnfObj[k] = cnfitem
  385. }
  386. if len(newFillcnfObj) > 0 {
  387. updateObj["n"] = newFillcnfObj
  388. }
  389. }
  390. if !found {
  391. //没有该测点的配置,不处理
  392. continue
  393. }
  394. foundOne = true //至少匹配到一条记录
  395. id := tools.IsEmpty(row["id"])
  396. logger.Logger.Debug(updateObj)
  397. if updateObj["n"] != nil {
  398. newFillcnf, _ := json.Marshal(updateObj["n"])
  399. db.Raw("update "+tn+" set fill_cnf=? where id=?", string(newFillcnf), id).Exec()
  400. } else {
  401. db.Raw("delete from "+tn+" where id=?", id).Exec()
  402. }
  403. }
  404. if !foundOne {
  405. return nil
  406. }
  407. global.GoCahce.Delete(strings.ReplaceAll(tn, "t_data_", ""))
  408. global.GoCahce.Delete(strings.ReplaceAll(tn, "t_data_", "") + "_map")
  409. new(bo.SystemLog).Success(
  410. enum.AuditType_Dataoptimize,
  411. enum.LogType_Delete,
  412. enum.OptEventType_Bus,
  413. enum.OptEventLevel_Hight,
  414. fmt.Sprintf("删除设备%d的测点%s配置的数据填充规则", deviceid, attrname),
  415. map[string]interface{}{
  416. "name": t.UserInfo.Usrname,
  417. "ip": t.UserInfo.Ip,
  418. },
  419. )
  420. return err
  421. }
  422. //设置填充规则开启状态
  423. func (t *DataoptimizeService) SetRuleStatus(rulecode, value string) error {
  424. dict := map[string]string{
  425. "deletion_fill_rule": "数据缺失填充规则",
  426. "deletion_fill_specifypoint": "指定测点填充",
  427. "deletion_fill_randompoint": "相邻测点填充",
  428. "invalid_fill_rule": "无效数据填充规则",
  429. "invalid_show_rule": "无效数据显示设置",
  430. }
  431. memo := dict[rulecode]
  432. if memo == "" {
  433. return errors.New("无效的规则代码!")
  434. }
  435. if rulecode != "invalid_show_rule" && value != "1" && value != "0" {
  436. return errors.New("无效的规则启用状态值,仅支持1或0!")
  437. }
  438. if rulecode == "invalid_show_rule" && value != "0" && value != "2" {
  439. //字符转成字节,简单拼接成一个长数字
  440. vs := ""
  441. for _, by := range []byte(value) {
  442. vs = vs + tools.IsEmpty(by)
  443. }
  444. value = vs
  445. }
  446. _, err := bo.SaveSysParam(bo.Global_sys_param{
  447. Param_name: rulecode,
  448. Param_value: value,
  449. Param_memo: memo,
  450. }, map[string]interface{}{
  451. "userid": t.UserInfo.Id,
  452. "name": t.UserInfo.Usrname,
  453. "ip": t.UserInfo.Ip,
  454. })
  455. if err == nil {
  456. new(bo.SystemLog).Success(
  457. enum.AuditType_Dataoptimize,
  458. enum.LogType_Update,
  459. enum.OptEventType_Bus,
  460. enum.OptEventLevel_Hight,
  461. "设置数据填充规则启用状态",
  462. map[string]interface{}{
  463. "name": t.UserInfo.Usrname,
  464. "ip": t.UserInfo.Ip,
  465. },
  466. )
  467. }
  468. return err
  469. }
  470. //获取填充规则策略开启状态
  471. func (t *DataoptimizeService) GetRuleStatus() map[string]string {
  472. result := map[string]string{}
  473. //数据缺失填充规则开启状态。默认开启
  474. result["deletion_fill_rule"], _ = bo.GetSysParamValue("deletion_fill_rule", "1")
  475. result["deletion_fill_specifypoint"] = "0"
  476. result["deletion_fill_randompoint"] = "0"
  477. if result["deletion_fill_rule"] == "1" {
  478. //获取指定特定测点填充开启状态
  479. result["deletion_fill_specifypoint"], _ = bo.GetSysParamValue("deletion_fill_specifypoint", "0")
  480. //获取相邻测点填充开启状态
  481. result["deletion_fill_randompoint"], _ = bo.GetSysParamValue("deletion_fill_randompoint", "0")
  482. }
  483. //数据无效填充规则开启状态。默认开启
  484. result["invalid_fill_rule"], _ = bo.GetSysParamValue("invalid_fill_rule", "1")
  485. //invalid_show_rule
  486. result["invalid_show_rule"], _ = bo.GetSysParamValue("invalid_show_rule", "99999") //默认为不显示,即显示为空
  487. return result
  488. }
  489. //导出缺点数据规则
  490. func (t *DataoptimizeService) ExpDeletionFillRule(modelid int, deviceid int) (exceldatas []orm.Params, err error) {
  491. modelSrv := new(ModelService)
  492. deviceSrv := new(DeviceService)
  493. modelObj := modelSrv.GetModelInfo(tools.IsEmpty(modelid))
  494. if modelObj == nil {
  495. return nil, errors.New("无效的模型ID")
  496. }
  497. modename := tools.IsEmpty(modelObj.(map[string]interface{})["model_name"])
  498. deviceMp := map[string]orm.Params{} //设备测点列表
  499. modelAttrNames := map[string]interface{}{} //模型属性列表
  500. modelAttrNames = modelSrv.GetModelAttrMap(int64(modelid))
  501. if modelAttrNames == nil {
  502. return nil, errors.New("该模型未定义模型属性")
  503. }
  504. devicename := ""
  505. if deviceid > 0 {
  506. if v, h := deviceSrv.DeviceNameByID().Load(tools.IsEmpty(deviceid)); h {
  507. devicename = tools.IsEmpty(v)
  508. } else {
  509. return nil, errors.New("无效的设备编号")
  510. }
  511. deviceMp = deviceSrv.DeviceMpInfo(int32(deviceid))
  512. if deviceMp == nil {
  513. return nil, errors.New("该设备未创建任何测点")
  514. }
  515. }
  516. deletionList, err := t.DeletionOptimizeCnfMap()
  517. if err != nil {
  518. return nil, err
  519. }
  520. result := []orm.Params{}
  521. k := fmt.Sprintf("%d%d", modelid, deviceid)
  522. res := deletionList[k]
  523. if res != nil {
  524. cnf := tools.IsEmpty(res["fill_cnf"])
  525. cnfobj := []map[string]interface{}{}
  526. err := json.Unmarshal([]byte(cnf), &cnfobj)
  527. if err != nil {
  528. logger.Logger.Error(err)
  529. return nil, err
  530. }
  531. for _, item2 := range cnfobj {
  532. value := item2["value"].([]interface{})
  533. attr := tools.IsEmpty(item2["attrname"])
  534. mpname := ""
  535. fillvalues := []string{}
  536. if devicename != "" {
  537. mpname = tools.IsEmpty(deviceMp[attr]["mpname"])
  538. for _, vs := range value {
  539. tmpVs := vs.(map[string]interface{})
  540. devAttrname := tools.IsEmpty(tmpVs["attrname"])
  541. fillvalues = append(fillvalues, tools.IsEmpty(deviceMp[devAttrname]["mpname"]))
  542. }
  543. } else {
  544. for _, vs := range value {
  545. tmpVs := vs.(map[string]interface{})
  546. fillvalues = append(fillvalues, tools.IsEmpty(tmpVs["attrname"]))
  547. }
  548. }
  549. obj := orm.Params{
  550. "modelname": modename,
  551. "attrname": attr,
  552. "devicename": devicename,
  553. "mpname": mpname,
  554. "fill": strings.Join(fillvalues, ","),
  555. }
  556. result = append(result, obj)
  557. }
  558. }
  559. new(bo.SystemLog).Success(
  560. enum.AuditType_Dataoptimize,
  561. enum.LogType_exp,
  562. enum.OptEventType_Bus,
  563. enum.OptEventLevel_Hight,
  564. "导出缺点数据填充规则",
  565. map[string]interface{}{
  566. "name": t.UserInfo.Usrname,
  567. "ip": t.UserInfo.Ip,
  568. },
  569. )
  570. return result, nil
  571. }
  572. //导出无效数据规则
  573. func (t *DataoptimizeService) ExpInvalidFillRule(modelid int, deviceid int) (exceldatas []orm.Params, err error) {
  574. modelSrv := new(ModelService)
  575. deviceSrv := new(DeviceService)
  576. modelObj := modelSrv.GetModelInfo(tools.IsEmpty(modelid))
  577. if modelObj == nil {
  578. return nil, errors.New("无效的模型ID")
  579. }
  580. modename := tools.IsEmpty(modelObj.(map[string]interface{})["model_name"])
  581. deviceMp := map[string]orm.Params{} //设备测点列表
  582. modelAttrNames := map[string]interface{}{} //模型属性列表
  583. modelAttrNames = modelSrv.GetModelAttrMap(int64(modelid))
  584. if modelAttrNames == nil {
  585. return nil, errors.New("该模型未定义模型属性")
  586. }
  587. devicename := ""
  588. if deviceid > 0 {
  589. if v, h := deviceSrv.DeviceNameByID().Load(tools.IsEmpty(deviceid)); h {
  590. devicename = tools.IsEmpty(v)
  591. } else {
  592. return nil, errors.New("无效的设备编号")
  593. }
  594. deviceMp = deviceSrv.DeviceMpInfo(int32(deviceid))
  595. if deviceMp == nil {
  596. return nil, errors.New("该设备未创建任何测点")
  597. }
  598. }
  599. invalidList, err := t.InvalidOptimizeCnfMap()
  600. if err != nil {
  601. return nil, err
  602. }
  603. result := []orm.Params{}
  604. k := fmt.Sprintf("%d%d", modelid, deviceid)
  605. res := invalidList[k]
  606. if res != nil {
  607. cnf := tools.IsEmpty(res["fill_cnf"])
  608. cnfobj := map[string]interface{}{}
  609. err := json.Unmarshal([]byte(cnf), &cnfobj)
  610. if err != nil {
  611. logger.Logger.Error(err)
  612. return nil, err
  613. }
  614. for attr, item := range cnfobj {
  615. item2 := item.(map[string]interface{})
  616. value := item2["value"].([]interface{})
  617. if len(value) == 0 {
  618. value = []interface{}{"", ""}
  619. }
  620. mpname := ""
  621. if devicename != "" {
  622. mpname = tools.IsEmpty(deviceMp[attr]["mpname"])
  623. }
  624. obj := orm.Params{
  625. "modelname": modename,
  626. "attrname": attr,
  627. "devicename": devicename,
  628. "mpname": mpname,
  629. "minvalue": tools.IsEmpty(value[0]),
  630. "maxvalue": tools.IsEmpty(value[1]),
  631. }
  632. result = append(result, obj)
  633. }
  634. }
  635. new(bo.SystemLog).Success(
  636. enum.AuditType_Dataoptimize,
  637. enum.LogType_exp,
  638. enum.OptEventType_Bus,
  639. enum.OptEventLevel_Hight,
  640. "导出无效数据填充规则",
  641. map[string]interface{}{
  642. "name": t.UserInfo.Usrname,
  643. "ip": t.UserInfo.Ip,
  644. },
  645. )
  646. return result, nil
  647. }
  648. //导入数据规则
  649. func (t *DataoptimizeService) ImpDeletionExcel(param map[string]interface{}) error {
  650. exceldatalist := param["datalist"].([]map[int]string)
  651. logger.Logger.Debug(fmt.Sprintf("EXCEL Deletion DATA: %+v", exceldatalist))
  652. modelid := "0" //模型ID
  653. deviceid := "0" //设备ID
  654. modelSrv := new(ModelService)
  655. deviceSrv := new(DeviceService)
  656. modelnameids := map[string]string{}
  657. devicenameids := map[string]string{}
  658. fillcnf := map[string][]interface{}{} //填充规则
  659. deviceMp := map[string]interface{}{} //设备测点列表
  660. modelAttrNames := map[string]interface{}{} //模型属性列表
  661. var FindModelAttr = func(lst map[string]interface{}, attrname string) map[string]interface{} {
  662. if v, h := lst[attrname]; h {
  663. return v.(map[string]interface{})
  664. }
  665. return nil
  666. }
  667. for _, linedata := range exceldatalist {
  668. modelid = "0"
  669. deviceid = "0"
  670. attrname := tools.IsEmpty(linedata[2])
  671. modename := tools.IsEmpty(linedata[1])
  672. if modename == "" {
  673. return errors.New("模型名称不能为空")
  674. }
  675. if attrname == "" {
  676. return errors.New("模型属性名称不能为空")
  677. }
  678. if mid, h := modelnameids[modename]; h {
  679. modelid = mid
  680. } else {
  681. mid := modelSrv.GetModelId(modename)
  682. if mid == 0 {
  683. return errors.New("无效的模型名称:" + modename)
  684. }
  685. modelnameids[modename] = tools.IsEmpty(mid)
  686. modelid = modelnameids[modename]
  687. }
  688. if _, h := modelAttrNames[modelid]; !h {
  689. modelidint64, _ := strconv.ParseInt(modelid, 10, 64)
  690. modelAttrNames[modelid] = modelSrv.GetModelAttrMap(modelidint64)
  691. }
  692. if FindModelAttr(modelAttrNames[modelid].(map[string]interface{}), attrname) == nil {
  693. return errors.New("模型属性名" + attrname + "不存在")
  694. }
  695. devicename := tools.IsEmpty(linedata[3])
  696. if devicename != "" {
  697. mpname := strings.Trim(tools.IsEmpty(linedata[4]), " ")
  698. if mpname == "" {
  699. return errors.New("设备" + devicename + "的测点名称不能为空")
  700. }
  701. if mid, h := devicenameids[devicename]; h {
  702. deviceid = mid
  703. } else {
  704. mid, _ := deviceSrv.DeviceIdByDeviceName().Load(devicename)
  705. if mid == nil {
  706. return errors.New("无效的设备名称:" + devicename)
  707. }
  708. devicenameids[devicename] = tools.IsEmpty(mid)
  709. deviceid = devicenameids[devicename]
  710. deviceidint32, _ := strconv.ParseInt(deviceid, 10, 64)
  711. dMp := deviceSrv.DeviceMpInfo(int32(deviceidint32))
  712. deviceMp[deviceid] = dMp
  713. }
  714. if vmplist, h := deviceMp[deviceid]; h {
  715. vmplist2 := vmplist.(map[string]orm.Params)
  716. if vt1, h1 := vmplist2[attrname]; h1 {
  717. if tools.IsEmpty(vt1["mpname"]) != mpname {
  718. return errors.New("设备" + devicename + "的模型属性" + attrname + "与测点名称(" + mpname + ")不匹配")
  719. }
  720. } else {
  721. return errors.New("设备" + devicename + "未定义模型属性" + attrname + "的关联测点")
  722. }
  723. } else {
  724. return errors.New("设备" + devicename + "未定义任何测点")
  725. }
  726. }
  727. fillvalue := map[string]interface{}{
  728. "attrname": attrname,
  729. "value": []interface{}{},
  730. }
  731. //组装填充测点列表
  732. fillmp := strings.Trim(tools.IsEmpty(linedata[5]), " ")
  733. if fillmp != "" {
  734. fillmp = strings.ReplaceAll(fillmp, ",", ",")
  735. fillmps := strings.Split(fillmp, ",")
  736. for _, mp := range fillmps {
  737. if deviceid != "0" {
  738. //设备测点填充
  739. //判断该设备测点中是否存在当前填充测点
  740. vmplist := deviceMp[deviceid].(map[string]orm.Params)
  741. foundMp := false
  742. for _, mprows := range vmplist {
  743. if tools.IsEmpty(mprows["mpname"]) == mp {
  744. fillvalue["value"] = append(fillvalue["value"].([]interface{}), map[string]interface{}{
  745. "attrname": tools.IsEmpty(mprows["attrname"]),
  746. "mpname": mp,
  747. })
  748. foundMp = true
  749. break
  750. }
  751. }
  752. if !foundMp {
  753. return errors.New("设备" + devicename + "未定义填充测点列表中的测点" + mp)
  754. }
  755. } else {
  756. //模型属性填充
  757. if FindModelAttr(modelAttrNames[modelid].(map[string]interface{}), mp) == nil {
  758. return errors.New("填充测点列表中的模型属性名" + mp + "不存在")
  759. }
  760. fillvalue["value"] = append(fillvalue["value"].([]interface{}), map[string]interface{}{
  761. "attrname": mp,
  762. "mpname": mp,
  763. })
  764. }
  765. }
  766. }
  767. fillkey := fmt.Sprintf("%s,%s", modelid, deviceid)
  768. if _, h := fillcnf[fillkey]; !h {
  769. fillcnf[fillkey] = []interface{}{fillvalue}
  770. } else {
  771. fillcnf[fillkey] = append(fillcnf[fillkey], fillvalue)
  772. }
  773. }
  774. db := orm.NewOrm()
  775. for key, t1 := range fillcnf {
  776. sql := "replace into t_data_optimize_deletion_fillrule(model_id,device_id,fill_cnf,cr,ct)values(?,?,?,?,now())"
  777. ks := strings.Split(key, ",")
  778. fillcnfstr, _ := json.Marshal(t1)
  779. _, err := db.Raw(sql, ks[0], ks[1], string(fillcnfstr), t.UserInfo.Id).Exec()
  780. if err != nil {
  781. logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, []interface{}{ks[0], ks[1], string(fillcnfstr), t.UserInfo.Id}))
  782. return err
  783. }
  784. }
  785. key := "optimize_deletion_fillrule"
  786. global.GoCahce.Delete(key)
  787. global.GoCahce.Delete(key + "_map")
  788. new(bo.SystemLog).Success(
  789. enum.AuditType_Dataoptimize,
  790. enum.LogType_imp,
  791. enum.OptEventType_Bus,
  792. enum.OptEventLevel_Hight,
  793. "导入缺点数据填充规则",
  794. map[string]interface{}{
  795. "name": t.UserInfo.Usrname,
  796. "ip": t.UserInfo.Ip,
  797. },
  798. )
  799. return nil
  800. }
  801. //导入数据规则
  802. func (t *DataoptimizeService) ImpInvalidExcel(param map[string]interface{}) error {
  803. exceldatalist := param["datalist"].([]map[int]string)
  804. logger.Logger.Debug(fmt.Sprintf("EXCEL Invalid DATA: %+v", exceldatalist))
  805. modelid := "0" //模型ID
  806. deviceid := "0" //设备ID
  807. modelSrv := new(ModelService)
  808. deviceSrv := new(DeviceService)
  809. modelnameids := map[string]string{}
  810. devicenameids := map[string]string{}
  811. fillcnf := map[string]map[string]interface{}{} //填充规则
  812. deviceMp := map[string]interface{}{} //设备测点列表
  813. modelAttrNames := map[string]interface{}{} //模型属性列表
  814. var FindModelAttr = func(lst map[string]interface{}, attrname string) map[string]interface{} {
  815. if v, h := lst[attrname]; h {
  816. return v.(map[string]interface{})
  817. }
  818. return nil
  819. }
  820. for _, linedata := range exceldatalist {
  821. modelid = "0"
  822. deviceid = "0"
  823. attrname := tools.IsEmpty(linedata[2])
  824. modename := tools.IsEmpty(linedata[1])
  825. minvalue := tools.IsEmpty(linedata[5])
  826. maxvalue := tools.IsEmpty(linedata[6])
  827. if modename == "" {
  828. return errors.New("模型名称不能为空")
  829. }
  830. if attrname == "" {
  831. return errors.New("模型属性名称不能为空")
  832. }
  833. if minvalue == "" {
  834. return errors.New("有效最小值不能为空")
  835. }
  836. _, err := strconv.ParseFloat(minvalue, 64)
  837. if err != nil {
  838. return errors.New("有效最小值只能为数字")
  839. }
  840. if maxvalue == "" {
  841. return errors.New("有效最大值不能为空")
  842. }
  843. _, err = strconv.ParseFloat(maxvalue, 64)
  844. if err != nil {
  845. return errors.New("有效最大值只能为数字")
  846. }
  847. if mid, h := modelnameids[modename]; h {
  848. modelid = mid
  849. } else {
  850. mid := modelSrv.GetModelId(modename)
  851. if mid == 0 {
  852. return errors.New("无效的模型名称:" + modename)
  853. }
  854. modelnameids[modename] = tools.IsEmpty(mid)
  855. modelid = modelnameids[modename]
  856. }
  857. if _, h := modelAttrNames[modelid]; !h {
  858. modelidint64, _ := strconv.ParseInt(modelid, 10, 64)
  859. modelAttrNames[modelid] = modelSrv.GetModelAttrMap(modelidint64)
  860. }
  861. if FindModelAttr(modelAttrNames[modelid].(map[string]interface{}), attrname) == nil {
  862. return errors.New("模型属性名" + attrname + "不存在")
  863. }
  864. devicename := tools.IsEmpty(linedata[3])
  865. if devicename != "" {
  866. mpname := strings.Trim(tools.IsEmpty(linedata[4]), " ")
  867. if mpname == "" {
  868. return errors.New("设备" + devicename + "的测点名称不能为空")
  869. }
  870. if mid, h := devicenameids[devicename]; h {
  871. deviceid = mid
  872. } else {
  873. mid, _ := deviceSrv.DeviceIdByDeviceName().Load(devicename)
  874. if mid == nil {
  875. return errors.New("无效的设备名称:" + devicename)
  876. }
  877. devicenameids[devicename] = tools.IsEmpty(mid)
  878. deviceid = devicenameids[devicename]
  879. deviceidint32, _ := strconv.ParseInt(deviceid, 10, 64)
  880. dMp := deviceSrv.DeviceMpInfo(int32(deviceidint32))
  881. deviceMp[deviceid] = dMp
  882. }
  883. if vmplist, h := deviceMp[deviceid]; h {
  884. vmplist2 := vmplist.(map[string]orm.Params)
  885. if vt1, h1 := vmplist2[attrname]; h1 {
  886. if tools.IsEmpty(vt1["mpname"]) != mpname {
  887. return errors.New("设备" + devicename + "的模型属性" + attrname + "与测点名称(" + mpname + ")不匹配")
  888. }
  889. } else {
  890. return errors.New("设备" + devicename + "未定义模型属性" + attrname + "的关联测点")
  891. }
  892. } else {
  893. return errors.New("设备" + devicename + "未定义任何测点")
  894. }
  895. }
  896. fillvalue := map[string]interface{}{
  897. "attrname": attrname,
  898. "value": []string{minvalue, maxvalue},
  899. }
  900. fillkey := fmt.Sprintf("%s,%s", modelid, deviceid)
  901. if _, h := fillcnf[fillkey]; !h {
  902. fillcnf[fillkey] = map[string]interface{}{attrname: fillvalue}
  903. }
  904. fillcnf[fillkey][attrname] = fillvalue
  905. }
  906. db := orm.NewOrm()
  907. for key, t1 := range fillcnf {
  908. sql := "replace into t_data_optimize_invalid_fillrule(model_id,device_id,fill_cnf,cr,ct)values(?,?,?,?,now())"
  909. ks := strings.Split(key, ",")
  910. fillcnfstr, _ := json.Marshal(t1)
  911. _, err := db.Raw(sql, ks[0], ks[1], string(fillcnfstr), t.UserInfo.Id).Exec()
  912. if err != nil {
  913. logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, []interface{}{ks[0], ks[1], string(fillcnfstr), t.UserInfo.Id}))
  914. return err
  915. }
  916. }
  917. key := "optimize_invalid_fillrule"
  918. global.GoCahce.Delete(key)
  919. global.GoCahce.Delete(key + "_map")
  920. new(bo.SystemLog).Success(
  921. enum.AuditType_Dataoptimize,
  922. enum.LogType_imp,
  923. enum.OptEventType_Bus,
  924. enum.OptEventLevel_Hight,
  925. "导入无效数据填充规则",
  926. map[string]interface{}{
  927. "name": t.UserInfo.Usrname,
  928. "ip": t.UserInfo.Ip,
  929. },
  930. )
  931. return nil
  932. }