BasecArea.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. package bo
  2. import (
  3. "fmt"
  4. "scd_check_tools/logger"
  5. "scd_check_tools/models/enum"
  6. "scd_check_tools/tools"
  7. "strconv"
  8. "strings"
  9. "sync"
  10. "github.com/astaxie/beego/orm"
  11. _ "github.com/astaxie/beego/orm"
  12. )
  13. type BasicArea struct {
  14. Model T_data_area
  15. DeviceBaseModel
  16. AreaTypeDefined map[string]string
  17. }
  18. //伴随分析主表模型
  19. type T_data_area struct {
  20. Id int `orm:"pk;auto"`
  21. Pid int
  22. AreaName string
  23. AreaCode string
  24. AreaType string
  25. AreaKind string
  26. Jd float64
  27. Wd float64
  28. LiveNum int
  29. AreaAddr string
  30. AreaLevel int
  31. IsLeaf int
  32. AreaSort int
  33. Apmac string
  34. Cr int
  35. Ct string
  36. }
  37. var AreaTypeDefined = map[string]string{}
  38. var areatypeLock = sync.RWMutex{}
  39. func init() {
  40. orm.RegisterModel(new(T_data_area))
  41. }
  42. func (c *BasicArea) initAreaTypeDict() {
  43. areatypeLock.Lock()
  44. if len(AreaTypeDefined) == 0 {
  45. typelst, _ := (new(Global)).GetCategoryTree()
  46. AreaTypeDefined = make(map[string]string)
  47. for _, r := range typelst {
  48. AreaTypeDefined[tools.IsEmpty(r["parentcode"])] = tools.IsEmpty(r["title"])
  49. }
  50. }
  51. areatypeLock.Unlock()
  52. }
  53. func (c *BasicArea) One(id string) (*T_data_area, error) {
  54. db := orm.NewOrm()
  55. idInt, err := strconv.Atoi(id)
  56. if err != nil {
  57. return nil, err
  58. }
  59. areaM := T_data_area{Id: idInt}
  60. err = db.Read(&areaM)
  61. if err == nil {
  62. return &areaM, nil
  63. }
  64. return nil, err
  65. }
  66. //查询区域信息表
  67. func (c *BasicArea) SearchArea(pageIndex, pageSize int) ([]orm.Params, int, error) {
  68. o := orm.NewOrm()
  69. var totalSql string
  70. var sqlCondition []string
  71. var sqlParameter []interface{}
  72. var sqlCommandText string
  73. if c.Model.Id == 0 {
  74. sqlCommandText = "select a.id,pid,area_name,area_code,area_type,area_kind area_kind_code," +
  75. " 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 " +
  76. " left join global_const_code b on a.area_type=b.code and b.parentcode='pstype' " +
  77. " left join global_const_code b2 on a.area_level=b2.id and b2.parentcode='voltage_level' "
  78. } else {
  79. 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' "
  80. }
  81. if c.Model.AreaName != "" {
  82. sqlCondition = append(sqlCondition, "area_name like concat('%',?,'%')")
  83. sqlParameter = append(sqlParameter, c.Model.AreaName)
  84. }
  85. if c.Model.Pid >= 0 {
  86. sqlCondition = append(sqlCondition, "pid=?")
  87. sqlParameter = append(sqlParameter, c.Model.Pid)
  88. }
  89. if c.Model.AreaType != "" {
  90. sqlCondition = append(sqlCondition, "area_type=?")
  91. sqlParameter = append(sqlParameter, c.Model.AreaType)
  92. }
  93. if c.Model.AreaKind != "" {
  94. sqlCondition = append(sqlCondition, "area_kind=?")
  95. sqlParameter = append(sqlParameter, c.Model.AreaKind)
  96. }
  97. if c.Model.AreaLevel != 0 {
  98. sqlCondition = append(sqlCondition, "area_level=?")
  99. sqlParameter = append(sqlParameter, c.Model.AreaLevel)
  100. }
  101. if c.Model.Id > 0 {
  102. sqlCondition = append(sqlCondition, "a.id=?")
  103. sqlParameter = append(sqlParameter, c.Model.Id)
  104. } else {
  105. uaObj := new(UserAreaRelationObject)
  106. uaObj.SetUserInfo(c.GetUserInfo())
  107. areaFilerWhere := uaObj.MakeAreaFilerIds("a.id", "")
  108. if areaFilerWhere != "" {
  109. sqlCondition = append(sqlCondition, areaFilerWhere)
  110. }
  111. }
  112. if len(sqlCondition) > 0 {
  113. sqlCommandText += " where " + strings.Join(sqlCondition, " and ")
  114. totalSql = "select count(1) number from t_data_area a where " + strings.Join(sqlCondition, " and ")
  115. } else {
  116. totalSql = "select count(1) number from t_data_area a "
  117. }
  118. var limit = " limit " + strconv.Itoa((pageIndex-1)*pageSize) + "," + strconv.Itoa(pageSize)
  119. sqlCommandText += " order by a.AREA_SORT asc " + limit
  120. var tableData []orm.Params
  121. var number int
  122. _, err := o.Raw(sqlCommandText, sqlParameter).Values(&tableData)
  123. dblog := new(SystemLog)
  124. dblog.SetUserInfo(c.GetUserInfo())
  125. dblog.Audittype = enum.AuditType_admin_station
  126. dblog.Logtype = enum.LogType_Query
  127. dblog.Eventtype = enum.OptEventType_Bus
  128. dblog.Eventlevel = enum.OptEventLevel_Low
  129. dblog.Description = fmt.Sprintf("SQL:%s 参数:%+v", sqlCommandText, sqlParameter)
  130. if err == nil {
  131. dblog.Success2()
  132. var totalData []orm.Params
  133. _, err = o.Raw(totalSql, sqlParameter).Values(&totalData)
  134. if err == nil {
  135. number, _ = strconv.Atoi(totalData[0]["number"].(string))
  136. }
  137. } else {
  138. logger.Logger.Error(err, dblog.Description)
  139. dblog.Fail2()
  140. }
  141. return tableData, number, err
  142. }
  143. func (c *BasicArea) GetAreaTree() ([]interface{}, error) {
  144. c.initAreaTypeDict()
  145. o := orm.NewOrm()
  146. xrootcode, _ := GetSysParamValue("xrootcode", "pstype01")
  147. orgname, _ := GetSysParamValue("orgname", "单位名称")
  148. 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"
  149. result := []orm.Params{}
  150. _, err := o.Raw(sql, xrootcode).Values(&result)
  151. runsqlinfo := fmt.Sprintf("SQL:%s 参数:%+v", sql, xrootcode)
  152. dblog := new(SystemLog)
  153. dblog.SetUserInfo(c.GetUserInfo())
  154. dblog.Audittype = enum.AuditType_admin_station
  155. dblog.Logtype = enum.LogType_Query
  156. dblog.Eventtype = enum.OptEventType_Bus
  157. dblog.Eventlevel = enum.OptEventLevel_Low
  158. dblog.Description = runsqlinfo
  159. if err != nil {
  160. logger.Logger.Error(err, runsqlinfo)
  161. dblog.Fail2()
  162. return nil, err
  163. }
  164. dblog.Success2()
  165. for _, row := range result {
  166. id := tools.IsEmpty(row["id"])
  167. chilrenlist, err2 := c.GetAreaChildrens(id)
  168. if err != nil {
  169. return nil, err2
  170. }
  171. row["typename"] = AreaTypeDefined[tools.IsEmpty(row["type"])]
  172. row["children"] = chilrenlist
  173. }
  174. t := []interface{}{}
  175. t = append(t, map[string]interface{}{"id": "0", "pid": "0", "title": orgname, "type": xrootcode, "spread": true, "typename": AreaTypeDefined[xrootcode], "children": result})
  176. return t, nil
  177. }
  178. //查询指定节点的所有下级节点
  179. func (c *BasicArea) GetAreaAllChildrens(pid string) ([]orm.Params, error) {
  180. c.initAreaTypeDict()
  181. o := orm.NewOrm()
  182. 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"
  183. result := []orm.Params{}
  184. _, err := o.Raw(sql, pid).Values(&result)
  185. if err != nil {
  186. return nil, err
  187. }
  188. for _, row := range result {
  189. id := tools.IsEmpty(row["id"])
  190. chilrenlist, err2 := c.GetAreaChildrens(id)
  191. if err != nil {
  192. return nil, err2
  193. }
  194. row["typename"] = AreaTypeDefined[tools.IsEmpty(row["type"])]
  195. row["children"] = chilrenlist
  196. }
  197. return result, nil
  198. }
  199. //查询指定节点的直接下级节点
  200. //如果pid为空时,则返回根节点及直接下级节点
  201. func (c *BasicArea) GetAreaChildrens(pid string) ([]orm.Params, error) {
  202. c.initAreaTypeDict()
  203. o := orm.NewOrm()
  204. uaObj := new(UserAreaRelationObject)
  205. uaObj.SetUserInfo(c.GetUserInfo())
  206. areaFilerWhere := uaObj.MakeAreaFilerWhere("a.id")
  207. if pid == "" {
  208. xrootcode, _ := GetSysParamValue("xrootcode", "pstype01")
  209. orgname, _ := GetSysParamValue("orgname", "单位名称")
  210. root := orm.Params{"id": "0", "area_code": "", "pid": "0", "title": orgname, "type": xrootcode, "spread": true, "typename": AreaTypeDefined[xrootcode], "isParent": "false"}
  211. 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"
  212. result := []orm.Params{}
  213. _, err := o.Raw(sql, 0).Values(&result)
  214. if err != nil {
  215. return nil, err
  216. }
  217. if len(result) == 0 {
  218. result = append(result, root)
  219. return result, nil
  220. }
  221. result = append(result, root)
  222. for _, row := range result {
  223. row["typename"] = AreaTypeDefined[tools.IsEmpty(row["type"])]
  224. }
  225. return result, nil
  226. }
  227. 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"
  228. result := []orm.Params{}
  229. _, err := o.Raw(sql, pid).Values(&result)
  230. if err != nil {
  231. return nil, err
  232. }
  233. for _, row := range result {
  234. row["typename"] = AreaTypeDefined[tools.IsEmpty(row["type"])]
  235. }
  236. return result, nil
  237. }
  238. //添加或修改区域表信息
  239. func (c *BasicArea) SaveArea(unit, room_color string) (int64, error) {
  240. o := orm.NewOrm()
  241. c.Model.Cr, _ = strconv.Atoi(c.GetUserId())
  242. c.Model.Ct = tools.NowTime()
  243. var err error
  244. var AreaId int64
  245. var isAdd = true
  246. dblog := new(SystemLog)
  247. dblog.SetUserInfo(c.GetUserInfo())
  248. dblog.Audittype = enum.AuditType_admin_station
  249. dblog.Logtype = enum.LogType_Insert
  250. dblog.Eventtype = enum.OptEventType_Bus
  251. dblog.Eventlevel = enum.OptEventLevel_Hight
  252. if c.Model.Id == 0 {
  253. if unit == "" {
  254. AreaId, err = o.Insert(&c.Model)
  255. } else {
  256. isAdd = false
  257. total, _ := strconv.Atoi(c.Model.AreaName)
  258. index := 1
  259. totals, _ := c.GetAreaTotal(c.Model.Pid)
  260. for index <= total {
  261. c.Model.Id = 0
  262. c.Model.AreaName = strconv.Itoa(totals+index) + " " + unit
  263. c.Model.AreaSort = totals + index
  264. c.Model.Ct = tools.NowTime()
  265. AreaId, err = o.Insert(&c.Model)
  266. if err == nil {
  267. SetAreaCode(AreaId, c.Model.Pid)
  268. dblog.Description = "保存区域信息成功"
  269. dblog.Success2()
  270. } else {
  271. dblog.Description = "保存区域信息出错:" + err.Error()
  272. dblog.Fail2()
  273. }
  274. index++
  275. }
  276. }
  277. } else {
  278. AreaId = int64(c.Model.Id)
  279. _, err = o.Update(&c.Model)
  280. }
  281. var msg = ""
  282. if c.Model.Id == 0 {
  283. msg = "新增变电站信息"
  284. dblog.Logtype = enum.LogType_Insert
  285. } else {
  286. msg = "修改变电站信息"
  287. dblog.Logtype = enum.LogType_Update
  288. }
  289. if err != nil {
  290. if strings.Contains(err.Error(), "Dup") {
  291. dblog.Description = msg + "出错:名称" + c.Model.AreaName + "已存在!"
  292. } else {
  293. dblog.Description = msg + "出错:" + err.Error()
  294. }
  295. dblog.Fail2()
  296. return 0, err
  297. }
  298. if isAdd {
  299. SetAreaCode(AreaId, c.Model.Pid)
  300. dblog.Description = msg + "成功"
  301. dblog.Success2()
  302. }
  303. return AreaId, err
  304. }
  305. //根据pid获取记录总条数据
  306. func (c *BasicArea) GetAreaTotal(pid int) (int, error) {
  307. o := orm.NewOrm()
  308. number := 0
  309. var sqlCommandText = "select count(1) t from t_data_area where pid=?"
  310. var tableData []orm.Params
  311. _, err := o.Raw(sqlCommandText, pid).Values(&tableData)
  312. if err == nil {
  313. number, _ = strconv.Atoi(tableData[0]["t"].(string))
  314. }
  315. return number, err
  316. }
  317. //根据路径删除区域记录
  318. func (c *BasicArea) DelAreaInfo(pid int) error {
  319. o := orm.NewOrm()
  320. var SqlCommandText = "select area_code from t_data_area where id=?;"
  321. var sqlParameter = []interface{}{pid}
  322. var tableDta []orm.Params
  323. _, err := o.Raw(SqlCommandText, sqlParameter).Values(&tableDta)
  324. if err == nil {
  325. c.Model.Id = pid
  326. c.DeleteArea()
  327. for _, val := range tableDta {
  328. areaCode := val["area_code"]
  329. SqlCommandText = "select id from t_data_area where area_code like concat(?,'%');"
  330. o.Raw(SqlCommandText, areaCode).Values(&tableDta)
  331. for _, row := range tableDta {
  332. c.Model.Id, _ = strconv.Atoi(tools.IsEmpty(row["id"]))
  333. c.DeleteArea()
  334. }
  335. break
  336. }
  337. }
  338. return err
  339. }
  340. //设置区域code
  341. func SetAreaCode(AreaId int64, ParentId int) {
  342. o := orm.NewOrm()
  343. var sqlCommandText = ""
  344. var sqlParameter []interface{}
  345. if ParentId == 0 {
  346. sqlCommandText = "update t_data_area set area_code=concat(area_type,'/',id),fullpath=area_name where id=?"
  347. sqlParameter = append(sqlParameter, AreaId)
  348. } else {
  349. sqlCommandText = "update t_data_area a,(select area_code,ifnull(fullpath,'') fullpath from t_data_area where id=?) b " +
  350. "set a.area_code=concat(b.area_code,'/',id),a.fullpath=concat(b.fullpath,'/',a.area_name) where a.id=?"
  351. sqlParameter = append(sqlParameter, ParentId, AreaId)
  352. }
  353. _, err := o.Raw(sqlCommandText, sqlParameter).Exec()
  354. if err != nil {
  355. logger.Logger.Error(err)
  356. }
  357. }
  358. //删除区域信息表
  359. func (c *BasicArea) DeleteArea() error {
  360. o := orm.NewOrm()
  361. var sqlCommandText = "delete from t_data_area where id=?;"
  362. var parameter = []interface{}{c.Model.Id}
  363. _, err := o.Raw(sqlCommandText, parameter).Exec()
  364. if err != nil {
  365. //SaveSyslog("删除区域信息出错!", "区域管理", false, tools.IsEmpty(c.UserInfo["name"]), tools.IsEmpty(c.UserInfo["ip"]))
  366. new(SystemLog).Fail(enum.AuditType_admin_station, enum.LogType_Delete, enum.OptEventType_Bus, enum.OptEventLevel_Hight, "删除区域信息出错:"+err.Error(), c.GetUserInfo())
  367. return err
  368. }
  369. //删除该区域的关联信息
  370. usArea := new(UserAreaRelationObject)
  371. usArea.SetUserInfo(c.GetUserInfo())
  372. usArea.Model.Id = c.Model.Id
  373. usArea.Delete()
  374. //SaveSyslog("删除区域信息成功", "区域管理", true, tools.IsEmpty(c.UserInfo["name"]), tools.IsEmpty(c.UserInfo["ip"]))
  375. new(SystemLog).Success(enum.AuditType_admin_station, enum.LogType_Delete, enum.OptEventType_Bus, enum.OptEventLevel_Hight, "删除区域信息成功", c.GetUserInfo())
  376. //删除该区域下的所有业务数据
  377. go func(id int) {
  378. scdMgr := new(ScdMgr)
  379. scdlist, _, err := scdMgr.List(map[string]interface{}{
  380. "stationid": id,
  381. })
  382. if err != nil {
  383. logger.Logger.Error(err)
  384. return
  385. }
  386. for _, row := range scdlist {
  387. //删除scd的全部数据及文件
  388. scdMgr.DeleteScd(tools.IsEmpty(row["id"]), true)
  389. }
  390. //清除所有附件
  391. new(AttachmentMgr).ClearAllFile(int32(id))
  392. //清除通知消息
  393. new(NoticeMgr).Clear(id)
  394. }(c.Model.Id)
  395. return nil
  396. }
  397. //获取区域下的所有id(包括本级)
  398. func (c *BasicArea) GetPidChildren(areaId int) (string, error) {
  399. o := orm.NewOrm()
  400. var result string = ""
  401. 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=?),'%')"
  402. var sqlParameter = []interface{}{areaId}
  403. var tableData []orm.Params
  404. _, err := o.Raw(sqlCommandText, sqlParameter).Values(&tableData)
  405. if err == nil && len(tableData) > 0 {
  406. result = tableData[0]["ids"].(string)
  407. }
  408. return result, err
  409. }