| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399 |
- package service
- import (
- "encoding/json"
- "errors"
- "fmt"
- "reflect"
- "rtzh_elec_temperature/enum"
- "rtzh_elec_temperature/global"
- "rtzh_elec_temperature/logger"
- "rtzh_elec_temperature/models/bo"
- "rtzh_elec_temperature/tools"
- "strconv"
- "sync"
- "time"
- "github.com/spf13/cast"
- "git.rtzhtech.cn/iss/public-lib/logic"
- "git.rtzhtech.cn/iss/public-lib/model"
- "github.com/astaxie/beego/orm"
- )
- //设备测点分组模型(本地库)
- type t_data_mp_group struct {
- Id int `"pk;auto"` //(11) NOT NULL AUTO_INCREMENT,
- Deviceid int32 //(11) NOT NULL,
- Groupid int64 //(11) NOT NULL,
- Groupname string //varchar(20) NOT NULL,
- Mpid int64 //(20) NOT NULL,
- Attrname string
- }
- //设备测点列表缓存
- var mpList = sync.Map{}
- //测点相关服务
- type MpinfoService struct {
- BaseService
- }
- func init() {
- orm.RegisterModel(new(t_data_mp_group))
- }
- // 根据模型ID获取对应的测点定义
- // 返回对应的mpid、mpname、attrname等
- func (t *MpinfoService) MpList(modelid int) []orm.Params {
- key := fmt.Sprintf("%d", modelid)
- var list = []orm.Params{}
- if info, ok := mpList.Load(key); ok {
- return info.([]orm.Params)
- } else {
- db := orm.NewOrm()
- db.Using("iss")
- var sqlCommandText = "select * from dev_mpinfo where appid=? and modelid=?"
- _, err := db.Raw(sqlCommandText, RtelecManageApp().RegAppID, modelid).Values(&list)
- if err == nil {
- if len(list) > 0 {
- mpList.Store(key, list)
- return list
- }
- } else {
- logger.Logger.Error(err)
- logger.Logger.Println(fmt.Sprintf("Error SQL:%s 参数:%s,%s", sqlCommandText, RtelecManageApp().RegAppID, modelid))
- }
- }
- return list
- }
- //根据测点id获取测点信息
- func (t *MpinfoService) GetMpinfo(mpid int64) (orm.Params, error) {
- db := orm.NewOrm()
- db.Using("iss")
- rowset := []orm.Params{}
- sqlCommandText := "select * from dev_mpinfo where appid=? and mpid=?"
- _, err := db.Raw(sqlCommandText, RtelecManageApp().RegAppID, mpid).Values(&rowset)
- if err == nil {
- if len(rowset) > 0 {
- return rowset[0], nil
- }
- } else {
- logger.Logger.Error(err)
- logger.Logger.Println(fmt.Sprintf("Error SQL:%s 参数:%s,%d", sqlCommandText, RtelecManageApp().RegAppID, mpid))
- return orm.Params{}, err
- }
- return orm.Params{}, nil
- }
- //获取测点参数
- func (t *MpinfoService) GetMpField(mpinfo_parameter string, AppId, ModelId int32) ([]model.DevMpinfo, error) {
- var MpField []model.DevMpinfo
- if mpinfo_parameter == "" {
- return MpField, nil
- }
- var MpData []map[string]interface{}
- bytes := []byte(mpinfo_parameter)
- json_err := json.Unmarshal(bytes, &MpData)
- if json_err != nil {
- return MpField, errors.New("测点信息不是标准的json格式!")
- } else {
- for _, Record := range MpData {
- var newFile model.DevMpinfo
- if mpid, ok := Record["mpid"]; ok && tools.IsEmpty(mpid) != "" {
- _id := mpid.(string)
- newFile.Mpid, _ = strconv.ParseInt(_id, 10, 64)
- }
- if mpname, ok := Record["mpname"]; ok && tools.IsEmpty(mpname) != "" {
- newFile.Mpname = mpname.(string)
- }
- if newFile.Mpname == "" {
- return MpField, errors.New("测点信息不允许为空!")
- }
- if zonename, ok := Record["zonename"]; ok && tools.IsEmpty(zonename) != "" {
- newFile.Zonename = zonename.(string)
- }
- if position, ok := Record["positionname"]; ok && tools.IsEmpty(position) != "" {
- newFile.Positionname = position.(string)
- }
- if unit, ok := Record["unit"]; ok && tools.IsEmpty(unit) != "" {
- newFile.Unit = unit.(string)
- }
- if online, ok := Record["online"]; ok && tools.IsEmpty(online) != "" {
- var OnLine = ""
- if reflect.TypeOf(online).Kind() == reflect.Float64 {
- OnLine = strconv.FormatFloat(online.(float64), 'f', 10, 64)
- } else {
- OnLine = online.(string)
- }
- if _online, toerr := strconv.Atoi(OnLine); toerr == nil {
- newFile.Online = int32(_online)
- }
- }
- if attrname, ok := Record["attrname"]; ok && tools.IsEmpty(attrname) != "" {
- newFile.Attrname = attrname.(string)
- }
- newFile.Appid = AppId
- newFile.Modelid = ModelId
- MpField = append(MpField, newFile)
- }
- }
- return MpField, nil
- }
- //获取控制点参数
- func (t *MpinfoService) GetControlField(mpinfo_parameter string, AppId, ModelId int32, deviceid int64) ([]map[string]interface{}, error) {
- var Result []map[string]interface{}
- if mpinfo_parameter == "" {
- return Result, nil
- }
- var ControlData []map[string]interface{}
- bytes := []byte(mpinfo_parameter)
- json_err := json.Unmarshal(bytes, &ControlData)
- if json_err != nil {
- return Result, errors.New("控制点信息不是标准的json格式!")
- } else {
- for _, Record := range ControlData {
- var Cpinfo model.CpMpinfo
- var rowRecord = make(map[string]interface{})
- if cpid, ok := Record["cpid"]; ok && tools.IsEmpty(cpid) != "" {
- _cpid := tools.IsEmpty(cpid)
- Cpinfo.Cpid, _ = strconv.ParseInt(_cpid, 10, 64)
- }
- if cpname, ok := Record["cpname"]; ok && tools.IsEmpty(cpname) != "" {
- Cpinfo.Cpname = cpname.(string)
- }
- if Cpinfo.Cpname == "" {
- return Result, errors.New("控制点名称不允许为空!")
- }
- if zonename, ok := Record["zonename"]; ok && tools.IsEmpty(zonename) != "" {
- Cpinfo.Zonename = zonename.(string)
- }
- if Cpinfo.Zonename == "" {
- return Result, errors.New("控制点所在区域不允许为空!")
- }
- if position, ok := Record["positionname"]; ok && tools.IsEmpty(position) != "" {
- Cpinfo.Positionname = position.(string)
- }
- if attrname, ok := Record["attrname"]; ok && tools.IsEmpty(attrname) != "" {
- Cpinfo.Attrname = attrname.(string)
- }
- if mpname, ok := Record["mpname"]; ok && tools.IsEmpty(mpname) != "" {
- //这里进行查找
- // Cpinfo.Mpid, _ = strconv.ParseInt(_mpid, 10, 64)
- Mpinfo, err := logic.GetMpidByMpnameDeviceId(deviceid, mpname.(string), int(AppId))
- if err != nil {
- tools.Log(err)
- }
- Cpinfo.Mpname = mpname.(string)
- Cpinfo.Mpid = Mpinfo
- }
- Cpinfo.Appid = AppId
- Cpinfo.Modelid = ModelId
- rowRecord["control"] = Cpinfo //控制点记录
- //控制点动作记录
- var ActionField []model.DevCpaction
- if action_parameter, ok := Record["actiondata"]; ok {
- if reflect.TypeOf(action_parameter).Kind() == reflect.Slice {
- ActionData := action_parameter.([]interface{})
- for _, ActionRow := range ActionData {
- row := ActionRow.(map[string]interface{})
- var RowField model.DevCpaction
- if id, ok := row["actid"]; ok && tools.IsEmpty(id) != "" {
- RowField.Actid, _ = strconv.ParseInt(tools.IsEmpty(id), 10, 64)
- }
- if acttype, ok := row["acttype"]; ok && tools.IsEmpty(acttype) != "" {
- var act_type = tools.IsEmpty(acttype)
- acttypeValue, _ := strconv.Atoi(act_type)
- RowField.Acttype = int32(acttypeValue)
- }
- if desc, ok := row["actdesc"]; ok && tools.IsEmpty(desc) != "" {
- RowField.Actdesc = desc.(string)
- }
- if value, ok := row["value"]; ok && tools.IsEmpty(value) != "" {
- _value := tools.IsEmpty(value)
- newValue, _ := strconv.ParseInt(_value, 10, 64)
- RowField.Value = float64(newValue)
- }
- if delay, ok := row["delay"]; ok && tools.IsEmpty(delay) != "" {
- var _actionDelay = tools.IsEmpty(delay)
- actionDelay, _ := strconv.Atoi(_actionDelay)
- RowField.Delay = int32(actionDelay)
- }
- if v, ok := row["successval"]; ok && tools.IsEmpty(v) != "" {
- RowField.Successval, _ = strconv.ParseFloat(tools.IsEmpty(v), 64)
- } else {
- RowField.Successval, _ = strconv.ParseFloat(tools.IsEmpty(row["value"]), 64)
- }
- ActionField = append(ActionField, RowField)
- }
- }
- }
- if len(ActionField) == 0 {
- return []map[string]interface{}{}, errors.New("控制点动作不允许为空,请检查传入参数!")
- }
- rowRecord["action"] = ActionField
- Result = append(Result, rowRecord)
- }
- }
- return Result, nil
- }
- //保存测点分组
- func (t *MpinfoService) SaveGroup(deviceid int32, groupid int64, groupname string, mps []string) error {
- if len(mps) == 0 {
- return errors.New("分组测点不能为空")
- }
- if len(mps) < 2 {
- return errors.New("同一分组测点数不能小于2个")
- }
- if len(mps) > 3 {
- return errors.New("同一分组测点数不能大于3个")
- }
- if groupname == "" {
- return errors.New("分组名称不能为空")
- }
- devSrv := new(DeviceService)
- key := fmt.Sprintf("GroupList_%d", deviceid)
- key2 := fmt.Sprintf("GroupList_mp_%d_%d", deviceid, groupid)
- db := orm.NewOrm()
- sql := "select groupid from t_data_mp_group where deviceid=? and groupname=?"
- rowset := []orm.Params{}
- sqlparams := []interface{}{deviceid, groupname}
- _, err := db.Raw(sql, sqlparams).Values(&rowset)
- if err != nil {
- logger.Logger.Error(err, fmt.Sprintf("SQL:%s 参数:%+v", sql, sqlparams))
- return err
- }
- if len(rowset) > 0 && groupid != cast.ToInt64(rowset[0]["groupid"]) {
- return errors.New("分组名称" + groupname + "已存在")
- }
- if groupid == 0 {
- groupid = time.Now().Unix()
- } else {
- //清除原分组测点
- db.Raw("delete from t_data_mp_group where deviceid=? and groupid=?", deviceid, groupid).Exec()
- global.GoCahce.Delete(key2)
- }
- //获取设备测点列表
- mpMap := devSrv.DeviceMpInfo(deviceid)
- var getAttrNameByMpid = func(mpmap map[string]orm.Params, mpid string) string {
- for _, row := range mpmap {
- if tools.IsEmpty(row["mpid"]) == mpid {
- return tools.IsEmpty(row["attrname"])
- }
- }
- return ""
- }
- db.Begin()
- for _, k := range mps {
- obj := t_data_mp_group{}
- obj.Deviceid = deviceid
- obj.Groupid = groupid
- obj.Groupname = groupname
- obj.Mpid, _ = strconv.ParseInt(k, 10, 64)
- obj.Attrname = getAttrNameByMpid(mpMap, k)
- _, err = db.Insert(&obj)
- if err != nil {
- db.Rollback()
- logger.Logger.Error(err)
- new(bo.SystemLog).Fail(enum.AuditType_mp,
- enum.LogType_Insert,
- enum.OptEventType_Bus,
- enum.OptEventLevel_Hight,
- fmt.Sprintf("创建测点分组失败:%s 操作数据:%+v", err.Error(), obj),
- map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
- )
- return err
- }
- }
- err = db.Commit()
- if err != nil {
- logger.Logger.Error(err)
- new(bo.SystemLog).Fail(enum.AuditType_mp,
- enum.LogType_Insert,
- enum.OptEventType_Bus,
- enum.OptEventLevel_Hight,
- fmt.Sprintf("创建测点分组失败:%s", err.Error()),
- map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
- )
- }
- global.GoCahce.Delete(key)
- new(bo.SystemLog).Success(enum.AuditType_mp,
- enum.LogType_Insert,
- enum.OptEventType_Bus,
- enum.OptEventLevel_Hight,
- "创建测点分组成功",
- map[string]interface{}{"name": t.UserInfo.Usrname, "ip": t.UserInfo.Ip},
- )
- return err
- }
- //删除指定测点的分组记录
- func (t *MpinfoService) DeleteMp(deviceid int32, mpId int64) error {
- key := fmt.Sprintf("GroupList_%d", deviceid)
- db := orm.NewOrm()
- sql := "delete from t_data_mp_group where deviceid=? and mpid=?"
- _, err := db.Raw(sql, deviceid, mpId).Exec()
- if err != nil {
- logger.Logger.Error(err)
- return err
- }
- global.GoCahce.Delete(key)
- return nil
- }
- //根据设备查询测点分组列表
- func (t *MpinfoService) GroupList(deviceid int32) ([]orm.Params, error) {
- key := fmt.Sprintf("GroupList_%d", deviceid)
- if v, h := global.GoCahce.Get(key); h {
- return v.([]orm.Params), nil
- }
- sql := "select groupid,groupname from t_data_mp_group where deviceid=? group by groupid ORDER BY groupid"
- rowset := []orm.Params{}
- _, err := orm.NewOrm().Raw(sql, deviceid).Values(&rowset)
- if err != nil {
- logger.Logger.Error(err)
- return nil, err
- }
- global.GoCahce.Set(key, rowset, -1)
- return rowset, nil
- }
- //根据设备查询分组中的测点列表
- func (t *MpinfoService) GroupMpList(deviceid int32, groupid int64) ([]orm.Params, error) {
- key := fmt.Sprintf("GroupList_mp_%d_%d", deviceid, groupid)
- if v, h := global.GoCahce.Get(key); h {
- return v.([]orm.Params), nil
- }
- sql := "select * from t_data_mp_group where deviceid=? and groupid=?"
- rowset := []orm.Params{}
- _, err := orm.NewOrm().Raw(sql, deviceid, groupid).Values(&rowset)
- if err != nil {
- logger.Logger.Error(err)
- return nil, err
- }
- global.GoCahce.Set(key, rowset, -1)
- return rowset, nil
- }
- // 根据测点id判断该测点是否在分组中
- func (t *MpinfoService) MpidInGroup(mpid int64) (bool, error) {
- db := orm.NewOrm()
- lst := []orm.Params{}
- var sql = "select id from t_data_mp_group where mpid=?"
- _, err := db.Raw(sql, mpid).Values(&lst)
- if err != nil {
- logger.Logger.Error(err)
- logger.Logger.Println(fmt.Sprintf("****************Error is:%s.", err.Error()))
- return false, err
- }
- if len(lst) == 0 {
- return false, nil
- } else {
- return true, nil
- }
- }
|