package bo import ( "fmt" "scd_check_tools/logger" "scd_check_tools/models/enum" "scd_check_tools/tools" "strconv" "strings" "sync" "github.com/astaxie/beego/orm" _ "github.com/astaxie/beego/orm" ) type BasicArea struct { Model T_data_area DeviceBaseModel AreaTypeDefined map[string]string } //伴随分析主表模型 type T_data_area struct { Id int `orm:"pk;auto"` Pid int AreaName string AreaCode string AreaType string AreaKind string Jd float64 Wd float64 LiveNum int AreaAddr string AreaLevel int IsLeaf int AreaSort int Apmac string Cr int Ct string } var AreaTypeDefined = map[string]string{} var areatypeLock = sync.RWMutex{} func init() { orm.RegisterModel(new(T_data_area)) } func (c *BasicArea) initAreaTypeDict() { areatypeLock.Lock() if len(AreaTypeDefined) == 0 { typelst, _ := (new(Global)).GetCategoryTree() AreaTypeDefined = make(map[string]string) for _, r := range typelst { AreaTypeDefined[tools.IsEmpty(r["parentcode"])] = tools.IsEmpty(r["title"]) } } areatypeLock.Unlock() } func (c *BasicArea) One(id string) (*T_data_area, error) { db := orm.NewOrm() idInt, err := strconv.Atoi(id) if err != nil { return nil, err } areaM := T_data_area{Id: idInt} err = db.Read(&areaM) if err == nil { return &areaM, nil } return nil, err } //查询区域信息表 func (c *BasicArea) SearchArea(pageIndex, pageSize int) ([]orm.Params, int, error) { o := orm.NewOrm() var totalSql string var sqlCondition []string var sqlParameter []interface{} var sqlCommandText string if c.Model.Id == 0 { sqlCommandText = "select a.id,pid,area_name,area_code,area_type,area_kind area_kind_code," + " jd,wd,live_num,area_level,is_leaf,area_sort,cr,ct,b.name type_name,apmac,b2.name voltage_name from t_data_area a " + " left join global_const_code b on a.area_type=b.code and b.parentcode='pstype' " + " left join global_const_code b2 on a.area_level=b2.id and b2.parentcode='voltage_level' " } else { sqlCommandText = "select a.id,pid,area_name,area_code,area_type,area_kind,jd,wd,live_num,area_level,is_leaf,area_sort,cr,ct ,b2.name voltage_name from t_data_area a left join global_const_code b2 on a.area_level=b2.id and b2.parentcode='voltage_level' " } if c.Model.AreaName != "" { sqlCondition = append(sqlCondition, "area_name like concat('%',?,'%')") sqlParameter = append(sqlParameter, c.Model.AreaName) } if c.Model.Pid >= 0 { sqlCondition = append(sqlCondition, "pid=?") sqlParameter = append(sqlParameter, c.Model.Pid) } if c.Model.AreaType != "" { sqlCondition = append(sqlCondition, "area_type=?") sqlParameter = append(sqlParameter, c.Model.AreaType) } if c.Model.AreaKind != "" { sqlCondition = append(sqlCondition, "area_kind=?") sqlParameter = append(sqlParameter, c.Model.AreaKind) } if c.Model.AreaLevel != 0 { sqlCondition = append(sqlCondition, "area_level=?") sqlParameter = append(sqlParameter, c.Model.AreaLevel) } if c.Model.Id > 0 { sqlCondition = append(sqlCondition, "a.id=?") sqlParameter = append(sqlParameter, c.Model.Id) } else { uaObj := new(UserAreaRelationObject) uaObj.SetUserInfo(c.GetUserInfo()) areaFilerWhere := uaObj.MakeAreaFilerIds("a.id", "") if areaFilerWhere != "" { sqlCondition = append(sqlCondition, areaFilerWhere) } } if len(sqlCondition) > 0 { sqlCommandText += " where " + strings.Join(sqlCondition, " and ") totalSql = "select count(1) number from t_data_area a where " + strings.Join(sqlCondition, " and ") } else { totalSql = "select count(1) number from t_data_area a " } var limit = " limit " + strconv.Itoa((pageIndex-1)*pageSize) + "," + strconv.Itoa(pageSize) sqlCommandText += " order by a.AREA_SORT asc " + limit var tableData []orm.Params var number int _, err := o.Raw(sqlCommandText, sqlParameter).Values(&tableData) dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_admin_station dblog.Logtype = enum.LogType_Query dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Low dblog.Description = fmt.Sprintf("SQL:%s 参数:%+v", sqlCommandText, sqlParameter) if err == nil { dblog.Success2() var totalData []orm.Params _, err = o.Raw(totalSql, sqlParameter).Values(&totalData) if err == nil { number, _ = strconv.Atoi(totalData[0]["number"].(string)) } } else { logger.Logger.Error(err, dblog.Description) dblog.Fail2() } return tableData, number, err } func (c *BasicArea) GetAreaTree() ([]interface{}, error) { c.initAreaTypeDict() o := orm.NewOrm() xrootcode, _ := GetSysParamValue("xrootcode", "pstype01") orgname, _ := GetSysParamValue("orgname", "单位名称") sql := "select ID id,PID pid,AREA_NAME title,AREA_TYPE type,'' typename,JD,WD ,'' children,true spread from t_data_area where AREA_type=? order by ID" result := []orm.Params{} _, err := o.Raw(sql, xrootcode).Values(&result) runsqlinfo := fmt.Sprintf("SQL:%s 参数:%+v", sql, xrootcode) dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_admin_station dblog.Logtype = enum.LogType_Query dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Low dblog.Description = runsqlinfo if err != nil { logger.Logger.Error(err, runsqlinfo) dblog.Fail2() return nil, err } dblog.Success2() for _, row := range result { id := tools.IsEmpty(row["id"]) chilrenlist, err2 := c.GetAreaChildrens(id) if err != nil { return nil, err2 } row["typename"] = AreaTypeDefined[tools.IsEmpty(row["type"])] row["children"] = chilrenlist } t := []interface{}{} t = append(t, map[string]interface{}{"id": "0", "pid": "0", "title": orgname, "type": xrootcode, "spread": true, "typename": AreaTypeDefined[xrootcode], "children": result}) return t, nil } //查询指定节点的所有下级节点 func (c *BasicArea) GetAreaAllChildrens(pid string) ([]orm.Params, error) { c.initAreaTypeDict() o := orm.NewOrm() sql := "select id,pid,area_name title,area_type type,'' typename,JD,WD ,'' children,area_code,true spread from t_data_area where PID=? order by AREA_SORT, ID" result := []orm.Params{} _, err := o.Raw(sql, pid).Values(&result) if err != nil { return nil, err } for _, row := range result { id := tools.IsEmpty(row["id"]) chilrenlist, err2 := c.GetAreaChildrens(id) if err != nil { return nil, err2 } row["typename"] = AreaTypeDefined[tools.IsEmpty(row["type"])] row["children"] = chilrenlist } return result, nil } //查询指定节点的直接下级节点 //如果pid为空时,则返回根节点及直接下级节点 func (c *BasicArea) GetAreaChildrens(pid string) ([]orm.Params, error) { c.initAreaTypeDict() o := orm.NewOrm() uaObj := new(UserAreaRelationObject) uaObj.SetUserInfo(c.GetUserInfo()) areaFilerWhere := uaObj.MakeAreaFilerWhere("a.id") if pid == "" { xrootcode, _ := GetSysParamValue("xrootcode", "pstype01") orgname, _ := GetSysParamValue("orgname", "单位名称") root := orm.Params{"id": "0", "area_code": "", "pid": "0", "title": orgname, "type": xrootcode, "spread": true, "typename": AreaTypeDefined[xrootcode], "isParent": "false"} sql := "select id,area_code,pid,area_name title,area_type type,'' typename,JD,WD ,'' children,true spread,(select case count(1) when 0 then 'false' else 'true' end from t_data_area where PID=a.ID) isParent from t_data_area a where a.pid=? " + areaFilerWhere + " order by a.AREA_SORT, a.ID" result := []orm.Params{} _, err := o.Raw(sql, 0).Values(&result) if err != nil { return nil, err } if len(result) == 0 { result = append(result, root) return result, nil } result = append(result, root) for _, row := range result { row["typename"] = AreaTypeDefined[tools.IsEmpty(row["type"])] } return result, nil } sql := "select a.ID id,a.PID pid,area_code,a.AREA_NAME title,a.area_type type,'' typename,JD,WD ,'' children,true spread,(select case count(1) when 0 then 'false' else 'true' end from t_data_area where PID=a.ID) isParent from t_data_area a where a.PID=? " + areaFilerWhere + " order by a.AREA_SORT" result := []orm.Params{} _, err := o.Raw(sql, pid).Values(&result) if err != nil { return nil, err } for _, row := range result { row["typename"] = AreaTypeDefined[tools.IsEmpty(row["type"])] } return result, nil } //添加或修改区域表信息 func (c *BasicArea) SaveArea(unit, room_color string) (int64, error) { o := orm.NewOrm() c.Model.Cr, _ = strconv.Atoi(c.GetUserId()) c.Model.Ct = tools.NowTime() var err error var AreaId int64 var isAdd = true dblog := new(SystemLog) dblog.SetUserInfo(c.GetUserInfo()) dblog.Audittype = enum.AuditType_admin_station dblog.Logtype = enum.LogType_Insert dblog.Eventtype = enum.OptEventType_Bus dblog.Eventlevel = enum.OptEventLevel_Hight if c.Model.Id == 0 { if unit == "" { AreaId, err = o.Insert(&c.Model) } else { isAdd = false total, _ := strconv.Atoi(c.Model.AreaName) index := 1 totals, _ := c.GetAreaTotal(c.Model.Pid) for index <= total { c.Model.Id = 0 c.Model.AreaName = strconv.Itoa(totals+index) + " " + unit c.Model.AreaSort = totals + index c.Model.Ct = tools.NowTime() AreaId, err = o.Insert(&c.Model) if err == nil { SetAreaCode(AreaId, c.Model.Pid) dblog.Description = "保存区域信息成功" dblog.Success2() } else { dblog.Description = "保存区域信息出错:" + err.Error() dblog.Fail2() } index++ } } } else { AreaId = int64(c.Model.Id) _, err = o.Update(&c.Model) } var msg = "" if c.Model.Id == 0 { msg = "新增变电站信息" dblog.Logtype = enum.LogType_Insert } else { msg = "修改变电站信息" dblog.Logtype = enum.LogType_Update } if err != nil { if strings.Contains(err.Error(), "Dup") { dblog.Description = msg + "出错:名称" + c.Model.AreaName + "已存在!" } else { dblog.Description = msg + "出错:" + err.Error() } dblog.Fail2() return 0, err } if isAdd { SetAreaCode(AreaId, c.Model.Pid) dblog.Description = msg + "成功" dblog.Success2() } return AreaId, err } //根据pid获取记录总条数据 func (c *BasicArea) GetAreaTotal(pid int) (int, error) { o := orm.NewOrm() number := 0 var sqlCommandText = "select count(1) t from t_data_area where pid=?" var tableData []orm.Params _, err := o.Raw(sqlCommandText, pid).Values(&tableData) if err == nil { number, _ = strconv.Atoi(tableData[0]["t"].(string)) } return number, err } //根据路径删除区域记录 func (c *BasicArea) DelAreaInfo(pid int) error { o := orm.NewOrm() var SqlCommandText = "select area_code from t_data_area where id=?;" var sqlParameter = []interface{}{pid} var tableDta []orm.Params _, err := o.Raw(SqlCommandText, sqlParameter).Values(&tableDta) if err == nil { c.Model.Id = pid c.DeleteArea() for _, val := range tableDta { areaCode := val["area_code"] SqlCommandText = "select id from t_data_area where area_code like concat(?,'%');" o.Raw(SqlCommandText, areaCode).Values(&tableDta) for _, row := range tableDta { c.Model.Id, _ = strconv.Atoi(tools.IsEmpty(row["id"])) c.DeleteArea() } break } } return err } //设置区域code func SetAreaCode(AreaId int64, ParentId int) { o := orm.NewOrm() var sqlCommandText = "" var sqlParameter []interface{} if ParentId == 0 { sqlCommandText = "update t_data_area set area_code=concat(area_type,'/',id),fullpath=area_name where id=?" sqlParameter = append(sqlParameter, AreaId) } else { sqlCommandText = "update t_data_area a,(select area_code,ifnull(fullpath,'') fullpath from t_data_area where id=?) b " + "set a.area_code=concat(b.area_code,'/',id),a.fullpath=concat(b.fullpath,'/',a.area_name) where a.id=?" sqlParameter = append(sqlParameter, ParentId, AreaId) } _, err := o.Raw(sqlCommandText, sqlParameter).Exec() if err != nil { logger.Logger.Error(err) } } //删除区域信息表 func (c *BasicArea) DeleteArea() error { o := orm.NewOrm() var sqlCommandText = "delete from t_data_area where id=?;" var parameter = []interface{}{c.Model.Id} _, err := o.Raw(sqlCommandText, parameter).Exec() if err != nil { //SaveSyslog("删除区域信息出错!", "区域管理", false, tools.IsEmpty(c.UserInfo["name"]), tools.IsEmpty(c.UserInfo["ip"])) new(SystemLog).Fail(enum.AuditType_admin_station, enum.LogType_Delete, enum.OptEventType_Bus, enum.OptEventLevel_Hight, "删除区域信息出错:"+err.Error(), c.GetUserInfo()) return err } //删除该区域的关联信息 usArea := new(UserAreaRelationObject) usArea.SetUserInfo(c.GetUserInfo()) usArea.Model.Id = c.Model.Id usArea.Delete() //SaveSyslog("删除区域信息成功", "区域管理", true, tools.IsEmpty(c.UserInfo["name"]), tools.IsEmpty(c.UserInfo["ip"])) new(SystemLog).Success(enum.AuditType_admin_station, enum.LogType_Delete, enum.OptEventType_Bus, enum.OptEventLevel_Hight, "删除区域信息成功", c.GetUserInfo()) //删除该区域下的所有业务数据 go func(id int) { scdMgr := new(ScdMgr) scdlist, _, err := scdMgr.List(map[string]interface{}{ "stationid": id, }) if err != nil { logger.Logger.Error(err) return } for _, row := range scdlist { //删除scd的全部数据及文件 scdMgr.DeleteScd(tools.IsEmpty(row["id"]), true) } //清除所有附件 new(AttachmentMgr).ClearAllFile(int32(id)) //清除通知消息 new(NoticeMgr).Clear(id) }(c.Model.Id) return nil } //获取区域下的所有id(包括本级) func (c *BasicArea) GetPidChildren(areaId int) (string, error) { o := orm.NewOrm() var result string = "" var sqlCommandText = "select group_concat(id) ids from t_data_area where area_code like concat((select area_code from t_data_area where id=?),'%')" var sqlParameter = []interface{}{areaId} var tableData []orm.Params _, err := o.Raw(sqlCommandText, sqlParameter).Values(&tableData) if err == nil && len(tableData) > 0 { result = tableData[0]["ids"].(string) } return result, err }