package bo import ( "scd_check_tools/logger" "scd_check_tools/tools" "errors" "log" "sync" "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql" ) //设备模型基类对象 //所有设备对象均应从本对象继承 //实例化对象时需要指定ModelTableName属性值,它表示当前模型对应的数据表名称 type DeviceBaseModel struct { //当前登录用户对象.主要信息key键:userid|name|account|ip userInfo *sync.Map //模型对应数据表名称 ModelTableName string Idseq int64 u_ip string u_name string u_account string u_roleid string u_userid string } var GetLock = sync.RWMutex{} var GetULock = sync.RWMutex{} var ReadKey = func(k string, u map[string]interface{}) interface{} { GetLock.RLock() defer GetLock.RUnlock() return u[k] } //设置当前用户 func (c *DeviceBaseModel) SetUserInfo(u map[string]interface{}) { defer func() { err := recover() //未发生宕机级别异常时,recover返回nil if err != nil { logger.Logger.Error(err) } }() c.userInfo = new(sync.Map) c.userInfo.Store("u", u) c.u_ip = tools.IsEmpty(ReadKey("ip", u)) c.u_name = tools.IsEmpty(ReadKey("name", u)) c.u_account = tools.IsEmpty(ReadKey("account", u)) c.u_roleid = tools.IsEmpty(ReadKey("roleid", u)) c.u_userid = tools.IsEmpty(ReadKey("userid", u)) } //获取当前用户 func (c *DeviceBaseModel) GetUserInfo() map[string]interface{} { if c.userInfo == nil { return nil } GetULock.RLock() defer func() { GetULock.RUnlock() err := recover() //未发生宕机级别异常时,recover返回nil if err != nil { logger.Logger.Error(err) } }() vobj, _ := c.userInfo.Load("u") newObj := make(map[string]interface{}) //拷贝一个新对象 for k, v := range vobj.(map[string]interface{}) { newObj[k] = v } return newObj } //获取当前用户角色ID func (c *DeviceBaseModel) GetUserRoleId() string { return c.u_roleid } //获取当前用户ID func (c *DeviceBaseModel) GetUserId() string { return c.u_userid } //获取当前用户名称 func (c *DeviceBaseModel) GetUserName() string { return c.u_name } //获取当前用户IP func (c *DeviceBaseModel) GetIP() string { return c.u_ip } //获取当前用户帐号 func (c *DeviceBaseModel) GetAccount() string { return c.u_account } func (c *DeviceBaseModel) GetID() int64 { c.Idseq = c.Idseq + 1 return c.Idseq } /** * @description:模型初始化 * @param 初始化参数 * @return void */ func (c *DeviceBaseModel) Init(param ...map[string]interface{}) { c.GetTableName() } /** * @description: 返回设备表名称 * @return {设备表名称} */ func (c *DeviceBaseModel) GetTableName() string { return c.ModelTableName } //根据区域统计所有下级区域的设备数量 func (c *DeviceBaseModel) StatCountByParentArea(id string) ([]orm.Params, error) { if c.GetTableName() == "" { return nil, errors.New("未指定模型表名称!") } o := orm.NewOrm() var sqlCommandText = "select b.area_id,count(1) cnt,case when count(1)>0 then 'true' else 'true' end isParent from t_data_area a ," + c.ModelTableName + " b where a.id=b.area_id and a.pid=? GROUP BY b.area_id;" var tableData []orm.Params _, err := o.Raw(sqlCommandText, id).Values(&tableData) if err != nil { log.Println(err) } return tableData, err }