BasecArea.go 14 KB

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