123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- 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
- }
|