Company.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. package Account
  2. import (
  3. "Cold_Api/conf"
  4. "Cold_Api/controllers/lib"
  5. "Cold_Api/logs"
  6. "encoding/json"
  7. "fmt"
  8. "github.com/astaxie/beego/cache"
  9. _ "github.com/astaxie/beego/cache/redis"
  10. "github.com/beego/beego/v2/adapter/orm"
  11. orm2 "github.com/beego/beego/v2/client/orm"
  12. _ "github.com/go-sql-driver/mysql"
  13. "strconv"
  14. "sync"
  15. "time"
  16. )
  17. type Company struct {
  18. Id int `orm:"column(ID);size(11);auto;pk"`
  19. T_mid int `orm:"size(200);null"` // 上一级 ID
  20. T_name string `orm:"size(256);null"` // 公司名称
  21. T_key string `orm:"size(256);index;null"` // 公司密钥
  22. T_plan string `orm:"type(text);null"` // 平面图
  23. T_data string `orm:"type(text);null"` // 大数据
  24. T_v3d string `orm:"type(text);null"` // 3D 视图
  25. T_path string `orm:"size(256);null"` // 公司路径 /0/1/5/
  26. T_money float32 `orm:"digits(12);decimals(2)"`
  27. T_State int `orm:"size(200);default(1)"` // 0删除 1正常
  28. T_warning int `orm:"size(20);default(1)"` // 是否处理报警信息 1处理 2不处理
  29. T_Charging int `orm:"size(11);default(0)"` // 记账扣费 公司ID 默认为:0 (自己)
  30. CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` // auto_now 每次 model 保存时都会对时间自动更新
  31. UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"` // auto_now_add 第一次保存时才设置时间
  32. Children []Company `orm:"-"`
  33. }
  34. type Company_R struct {
  35. Id int
  36. T_mid int // 上一级 ID
  37. T_name string // 公司名称
  38. T_plan string // 平面图
  39. T_data string // 大数据
  40. T_v3d string // 3D 视图
  41. T_money float32 // 余额
  42. T_warning int // 报警统计
  43. T_key string
  44. T_Charging int
  45. Children []Company_R
  46. }
  47. func CompanyToCompany_R(r Company) (v Company_R) {
  48. v.Id = r.Id
  49. v.T_mid = r.T_mid
  50. v.T_name = r.T_name
  51. v.T_plan = r.T_plan
  52. v.T_data = r.T_data
  53. v.T_v3d = r.T_v3d
  54. v.T_money = r.T_money
  55. v.T_warning = r.T_warning
  56. v.T_key = r.T_key
  57. v.T_Charging = r.T_Charging
  58. return v
  59. }
  60. func (t *Company) TableName() string {
  61. return "company" // 数据库名称 // ************** 替换 FormulaList **************
  62. }
  63. var redisCache_Company cache.Cache
  64. var Company_map *sync.Map // 泛型
  65. func init() {
  66. //注册模型
  67. Company_map = new(sync.Map)
  68. //注册模型
  69. orm.RegisterModel(new(Company))
  70. config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
  71. "redis_User_Company", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
  72. fmt.Println(config)
  73. var err error
  74. redisCache_Company, err = cache.NewCache("redis", config)
  75. if err != nil || redisCache_Company == nil {
  76. errMsg := "failed to init redis"
  77. logs.Error(errMsg, err)
  78. panic(errMsg)
  79. }
  80. }
  81. // ---------------- Redis -------------------
  82. func Redis_Company_Set(key string, r Company) (err error) {
  83. //json序列化
  84. str, err := json.Marshal(r)
  85. if err != nil {
  86. logs.Error(lib.FuncName(), err)
  87. return
  88. }
  89. err = redisCache_Company.Put(key, str, 24*time.Hour)
  90. if err != nil {
  91. logs.Error("set key:", key, ",value:", str, err)
  92. }
  93. return
  94. }
  95. func Redis_Company_Get(key string) (r Company, is bool) {
  96. if redisCache_Company.IsExist(key) {
  97. //println("找到key:",key)
  98. v := redisCache_Company.Get(key)
  99. err := json.Unmarshal(v.([]byte), &r)
  100. if err != nil {
  101. logs.Error(lib.FuncName(), err)
  102. return Company{}, false
  103. }
  104. return r, true
  105. }
  106. //println("没有 找到key:",key)
  107. return Company{}, false
  108. }
  109. func Redis_Company_DelK(key string) (err error) {
  110. err = redisCache_Company.Delete(key)
  111. if err != nil {
  112. logs.Error(lib.FuncName(), err)
  113. }
  114. return
  115. }
  116. // ---------------- 特殊方法 -------------------
  117. // 添加
  118. func Add_Company(var_ Company) (id int64, err error) {
  119. o := orm.NewOrm()
  120. o.Begin()
  121. var rand_x int64
  122. for true {
  123. var_.T_key = lib.GetRandstring(16, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", rand_x)
  124. err = o.Read(&var_, "T_key") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
  125. if err != nil {
  126. break
  127. }
  128. rand_x++
  129. }
  130. id, err = o.Insert(&var_)
  131. if err != nil {
  132. o.Rollback()
  133. logs.Error(lib.FuncName(), err)
  134. return id, err
  135. }
  136. T_Path := "/0/" + strconv.Itoa(int(id)) + "/"
  137. if var_.T_mid != 0 {
  138. Company_r, err := Read_Company_ById(var_.T_mid)
  139. if err != nil {
  140. o.Rollback()
  141. logs.Error(lib.FuncName(), err)
  142. return id, err
  143. }
  144. T_Path = Company_r.T_path + strconv.Itoa(int(id)) + "/"
  145. }
  146. var_.Id = int(id)
  147. var_.T_path = T_Path
  148. _, err = o.Update(&var_, "T_path")
  149. if err != nil {
  150. o.Rollback()
  151. logs.Error(lib.FuncName(), err)
  152. return id, err
  153. }
  154. o.Commit()
  155. Redis_Company_Set(strconv.Itoa(var_.Id), var_)
  156. return id, err
  157. }
  158. // 修改
  159. func Update_Company(m Company, cols ...string) bool {
  160. o := orm.NewOrm()
  161. num, err := o.Update(&m, cols...)
  162. if err != nil {
  163. logs.Error(lib.FuncName(), err)
  164. return false
  165. }
  166. fmt.Println("Number of records updated in database:", num)
  167. Redis_Company_Set(strconv.Itoa(m.Id), m) // Redis 更新缓存
  168. return true
  169. }
  170. // 删除
  171. func Delete_Company(orm orm.Ormer, id int) bool {
  172. var m = Company{
  173. Id: id,
  174. T_State: 0,
  175. }
  176. num, err := orm.Update(&m, "T_State")
  177. if err != nil {
  178. logs.Error(lib.FuncName(), err)
  179. return false
  180. }
  181. fmt.Println("Number of records updated in database:", num)
  182. Redis_Company_DelK(strconv.Itoa(m.Id))
  183. return true
  184. }
  185. // 获取 ById
  186. func Read_Company_ById(Id int) (r Company, e error) {
  187. if r, is := Redis_Company_Get(strconv.Itoa(Id)); is {
  188. //println("Redis_Get OK")
  189. return r, nil
  190. }
  191. o := orm.NewOrm()
  192. qs := o.QueryTable(new(Company))
  193. e = qs.Filter("Id", Id).Filter("T_State", 1).One(&r)
  194. if e != nil {
  195. logs.Error(lib.FuncName(), e)
  196. return
  197. }
  198. Redis_Company_Set(strconv.Itoa(r.Id), r) // Redis 更新缓存
  199. return r, e
  200. }
  201. func Read_Company_ByKey(key string) (r Company, e error) {
  202. if r, is := Redis_Company_Get(key); is {
  203. //println("Redis_Get OK")
  204. return r, nil
  205. }
  206. o := orm.NewOrm()
  207. qs := o.QueryTable(new(Company))
  208. e = qs.Filter("T_key", key).Filter("T_State", 1).One(&r)
  209. if e != nil {
  210. logs.Error(lib.FuncName(), e)
  211. return
  212. }
  213. Redis_Company_Set(key, r) // Redis 更新缓存
  214. return r, e
  215. }
  216. // 获取列表
  217. func Read_Company_Tree(admin_r Admin, T_name string) (CompanyList []Company_R) {
  218. // 内部用户未绑定公司
  219. if admin_r.T_pid == 0 && len(admin_r.T_pids) == 0 {
  220. return CompanyList
  221. }
  222. o := orm.NewOrm()
  223. // 也可以直接使用 Model 结构体作为表名
  224. qs := o.QueryTable(new(Company))
  225. var maps []Company
  226. cond := orm.NewCondition()
  227. cond1 := cond.And("T_State", 1)
  228. if admin_r.T_pid > 0 {
  229. cond1 = cond1.And("T_path__icontains", fmt.Sprintf("/%d/", admin_r.T_pid))
  230. }
  231. // 内部用户已绑定公司,* 绑定所有公司
  232. if len(admin_r.T_pids) > 0 && admin_r.T_pids != "*" {
  233. T_pids := lib.SplitStringToIntIds(admin_r.T_pids, "P")
  234. if len(T_pids) > 0 {
  235. cond1 = cond1.And("Id__in", ReadCompanyIds_T_pids(T_pids))
  236. }
  237. }
  238. if len(T_name) > 0 {
  239. cond1 = cond1.And("T_name__icontains", T_name)
  240. }
  241. _, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
  242. if err != nil {
  243. logs.Error(lib.FuncName(), err)
  244. return CompanyList
  245. }
  246. parentMap, flag := getCompanyParent(maps)
  247. if flag {
  248. for i := 0; i < len(maps); i++ {
  249. if parentMap[maps[i].T_mid] {
  250. continue
  251. }
  252. r := Company_R{
  253. Id: maps[i].Id,
  254. T_mid: maps[i].T_mid,
  255. T_name: maps[i].T_name,
  256. T_plan: maps[i].T_plan,
  257. T_data: maps[i].T_data,
  258. T_v3d: maps[i].T_v3d,
  259. T_money: maps[i].T_money,
  260. T_warning: maps[i].T_warning,
  261. T_Charging: maps[i].T_Charging,
  262. T_key: maps[i].T_key,
  263. Children: nil,
  264. }
  265. info := CompanyCall(maps, r)
  266. CompanyList = append(CompanyList, info)
  267. }
  268. } else {
  269. for i := 0; i < len(maps); i++ {
  270. r := Company_R{
  271. Id: maps[i].Id,
  272. T_mid: maps[i].T_mid,
  273. T_name: maps[i].T_name,
  274. T_plan: maps[i].T_plan,
  275. T_data: maps[i].T_data,
  276. T_v3d: maps[i].T_v3d,
  277. T_money: maps[i].T_money,
  278. T_warning: maps[i].T_warning,
  279. T_Charging: maps[i].T_Charging,
  280. T_key: maps[i].T_key,
  281. Children: nil,
  282. }
  283. info := CompanyCall(maps, r)
  284. CompanyList = append(CompanyList, info)
  285. }
  286. }
  287. return CompanyList
  288. }
  289. func ReadCompanyIds_T_pids(T_pids []int) []int {
  290. var companyIds []int
  291. if len(T_pids) == 0 {
  292. return companyIds
  293. }
  294. var companyList []Company
  295. o := orm.NewOrm()
  296. qs := o.QueryTable(new(Company))
  297. _, err := qs.Filter("Id__in", T_pids).Filter("T_State", 1).All(&companyList)
  298. if err != nil {
  299. logs.Error(lib.FuncName(), err)
  300. return companyIds
  301. }
  302. for _, company := range companyList {
  303. subIds := ReadCompanyIds_T_path(company.T_path)
  304. companyIds = append(companyIds, subIds...)
  305. }
  306. return lib.IntIdsDistinct(companyIds)
  307. }
  308. // 通过T_pid查询所有子id
  309. func ReadCompanyIds_T_path(T_path string) (companyIds []int) {
  310. o := orm.NewOrm()
  311. qs := o.QueryTable(new(Company))
  312. var CompanyList []Company
  313. _, err := qs.Filter("T_path__startswith", T_path).Filter("T_State", 1).All(&CompanyList)
  314. if err != nil {
  315. logs.Error(lib.FuncName(), err)
  316. return companyIds
  317. }
  318. for _, v := range CompanyList {
  319. companyIds = append(companyIds, v.Id)
  320. }
  321. return companyIds
  322. }
  323. func ReadCompanyWarningIds_T_pids(T_pids []int) []int {
  324. var companyList []Company
  325. var companyIds []int
  326. o := orm.NewOrm()
  327. qs := o.QueryTable(new(Company))
  328. if len(T_pids) == 0 {
  329. return companyIds
  330. }
  331. _, err := qs.Filter("Id__in", T_pids).Filter("T_State", 1).Filter("T_warning", 1).All(&companyList)
  332. if err != nil {
  333. logs.Error(lib.FuncName(), err)
  334. return companyIds
  335. }
  336. for _, company := range companyList {
  337. subIds := ReadCompanyWarningIds_T_path(company.T_path)
  338. companyIds = append(companyIds, subIds...)
  339. }
  340. return lib.IntIdsDistinct(companyIds)
  341. }
  342. // 通过T_pid查询所有子id
  343. func ReadCompanyWarningIds_T_path(T_path string) (companyIds []int) {
  344. o := orm.NewOrm()
  345. qs := o.QueryTable(new(Company))
  346. var CompanyList []Company
  347. _, err := qs.Filter("T_path__startswith", T_path).Filter("T_State", 1).Filter("T_warning", 1).All(&CompanyList)
  348. if err != nil {
  349. logs.Error(lib.FuncName(), err)
  350. return companyIds
  351. }
  352. for _, v := range CompanyList {
  353. companyIds = append(companyIds, v.Id)
  354. }
  355. return companyIds
  356. }
  357. func Read_Company_List(T_name string) (CompanyList []Company_R) {
  358. o := orm.NewOrm()
  359. // 也可以直接使用 Model 结构体作为表名
  360. qs := o.QueryTable(new(Company))
  361. var maps []Company
  362. cond := orm.NewCondition()
  363. cond1 := cond.And("T_State", 1)
  364. if len(T_name) > 0 {
  365. cond1 = cond1.And("T_name__icontains", T_name)
  366. }
  367. _, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
  368. if err != nil {
  369. logs.Error(lib.FuncName(), err)
  370. return CompanyList
  371. }
  372. parentMap, flag := getCompanyParent(maps)
  373. if flag {
  374. for i := 0; i < len(maps); i++ {
  375. if parentMap[maps[i].T_mid] {
  376. continue
  377. }
  378. r := Company_R{
  379. Id: maps[i].Id,
  380. T_mid: maps[i].T_mid,
  381. T_name: maps[i].T_name,
  382. T_plan: maps[i].T_plan,
  383. T_data: maps[i].T_data,
  384. T_v3d: maps[i].T_v3d,
  385. T_money: maps[i].T_money,
  386. T_warning: maps[i].T_warning,
  387. Children: nil,
  388. }
  389. info := CompanyCall(maps, r)
  390. CompanyList = append(CompanyList, info)
  391. }
  392. } else {
  393. for i := 0; i < len(maps); i++ {
  394. r := Company_R{
  395. Id: maps[i].Id,
  396. T_mid: maps[i].T_mid,
  397. T_name: maps[i].T_name,
  398. T_plan: maps[i].T_plan,
  399. T_data: maps[i].T_data,
  400. T_v3d: maps[i].T_v3d,
  401. T_money: maps[i].T_money,
  402. T_warning: maps[i].T_warning,
  403. Children: nil,
  404. }
  405. info := CompanyCall(maps, r)
  406. CompanyList = append(CompanyList, info)
  407. }
  408. }
  409. return CompanyList
  410. }
  411. func CompanyCall(CompanyList []Company, company Company_R) Company_R {
  412. list := CompanyList
  413. min := make([]Company_R, 0)
  414. for j := 0; j < len(list); j++ {
  415. if company.Id != list[j].T_mid {
  416. continue
  417. }
  418. mi := Company_R{}
  419. mi.Id = list[j].Id
  420. mi.T_mid = list[j].T_mid
  421. mi.T_name = list[j].T_name
  422. mi.T_plan = list[j].T_plan
  423. mi.T_data = list[j].T_data
  424. mi.T_v3d = list[j].T_v3d
  425. mi.T_money = list[j].T_money
  426. mi.T_warning = list[j].T_warning
  427. mi.T_Charging = list[j].T_Charging
  428. mi.T_key = list[j].T_key
  429. mi.Children = []Company_R{}
  430. ms := CompanyCall(CompanyList, mi)
  431. min = append(min, ms)
  432. }
  433. company.Children = min
  434. return company
  435. }
  436. func getCompanyParent(CompanyList []Company) (map[int]bool, bool) {
  437. list := CompanyList
  438. var flag = false
  439. var parentMap = map[int]bool{}
  440. for j := 0; j < len(list); j++ {
  441. parentMap[list[j].T_mid] = false
  442. }
  443. for j := 0; j < len(list); j++ {
  444. if _, ok := parentMap[list[j].Id]; !ok {
  445. continue
  446. }
  447. parentMap[list[j].Id] = true
  448. flag = true
  449. }
  450. return parentMap, flag
  451. }
  452. func Read_Company_List_All_ByT_name(T_name string) (maps []Company) {
  453. o := orm.NewOrm()
  454. // 也可以直接使用 Model 结构体作为表名
  455. qs := o.QueryTable(new(Company))
  456. cond := orm.NewCondition()
  457. if len(T_name) > 0 {
  458. cond = cond.And("T_name__icontains", T_name)
  459. }
  460. _, err := qs.SetCond((*orm2.Condition)(cond)).All(&maps)
  461. if err != nil {
  462. logs.Error(lib.FuncName(), err)
  463. return maps
  464. }
  465. return maps
  466. }
  467. // 获取内部用户绑定的公司列表
  468. func Read_Company_List_ByT_pids(T_pids string) (CompanyList []Company_R) {
  469. o := orm.NewOrm()
  470. // 也可以直接使用 Model 结构体作为表名
  471. qs := o.QueryTable(new(Company))
  472. var maps []Company
  473. cond := orm.NewCondition()
  474. cond1 := cond.And("T_State", 1)
  475. if len(T_pids) == 0 {
  476. return
  477. }
  478. if T_pids == "*" {
  479. _, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
  480. if err != nil {
  481. logs.Error(lib.FuncName(), err)
  482. return CompanyList
  483. }
  484. } else {
  485. list := lib.SplitStringIds(T_pids, "P")
  486. cond1 = cond1.And("Id__in", list)
  487. _, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
  488. if err != nil {
  489. logs.Error(lib.FuncName(), err)
  490. return CompanyList
  491. }
  492. }
  493. parentMap, flag := getCompanyParent(maps)
  494. if flag {
  495. for i := 0; i < len(maps); i++ {
  496. if parentMap[maps[i].T_mid] {
  497. continue
  498. }
  499. r := Company_R{
  500. Id: maps[i].Id,
  501. T_mid: maps[i].T_mid,
  502. T_name: maps[i].T_name,
  503. Children: nil,
  504. }
  505. info := CompanyCall(maps, r)
  506. CompanyList = append(CompanyList, info)
  507. }
  508. } else {
  509. for i := 0; i < len(maps); i++ {
  510. r := Company_R{
  511. Id: maps[i].Id,
  512. T_mid: maps[i].T_mid,
  513. T_name: maps[i].T_name,
  514. Children: nil,
  515. }
  516. info := CompanyCall(maps, r)
  517. CompanyList = append(CompanyList, info)
  518. }
  519. }
  520. return CompanyList
  521. }
  522. func Read_Company_All_Maps() {
  523. o := orm.NewOrm()
  524. var r []Company
  525. qs := o.QueryTable(new(Company))
  526. _, err := qs.All(&r)
  527. if err != nil {
  528. logs.Error(lib.FuncName(), err)
  529. }
  530. for _, v := range r {
  531. Company_map.Store(v.Id, v.T_name)
  532. }
  533. }
  534. func Read_Company_Get(id int) string {
  535. v, ok := Company_map.Load(id) /*如果确定是真实的,则存在,否则不存在 */
  536. if ok {
  537. return v.(string)
  538. } else {
  539. return ""
  540. }
  541. }