Company.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  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(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(strconv.Itoa(r.Id), str, 24*time.Hour)
  90. if err != nil {
  91. logs.Error("set key:", strconv.Itoa(r.Id), ",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(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(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(r) // Redis 更新缓存
  199. return r, e
  200. }
  201. // 获取列表
  202. func Read_Company_Tree(admin_r Admin, T_name string) (CompanyList []Company_R) {
  203. // 内部用户未绑定公司
  204. if admin_r.T_pid == 0 && len(admin_r.T_pids) == 0 {
  205. return CompanyList
  206. }
  207. o := orm.NewOrm()
  208. // 也可以直接使用 Model 结构体作为表名
  209. qs := o.QueryTable(new(Company))
  210. var maps []Company
  211. cond := orm.NewCondition()
  212. cond1 := cond.And("T_State", 1)
  213. if admin_r.T_pid > 0 {
  214. cond1 = cond1.And("T_path__icontains", fmt.Sprintf("/%d/", admin_r.T_pid))
  215. }
  216. // 内部用户已绑定公司,* 绑定所有公司
  217. if len(admin_r.T_pids) > 0 && admin_r.T_pids != "*" {
  218. T_pids := lib.SplitStringToIntIds(admin_r.T_pids, "P")
  219. if len(T_pids) > 0 {
  220. cond1 = cond1.And("Id__in", ReadCompanyIds_T_pids(T_pids))
  221. }
  222. }
  223. if len(T_name) > 0 {
  224. cond1 = cond1.And("T_name__icontains", T_name)
  225. }
  226. _, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
  227. if err != nil {
  228. logs.Error(lib.FuncName(), err)
  229. return CompanyList
  230. }
  231. parentMap, flag := getCompanyParent(maps)
  232. if flag {
  233. for i := 0; i < len(maps); i++ {
  234. if parentMap[maps[i].T_mid] {
  235. continue
  236. }
  237. r := Company_R{
  238. Id: maps[i].Id,
  239. T_mid: maps[i].T_mid,
  240. T_name: maps[i].T_name,
  241. T_plan: maps[i].T_plan,
  242. T_data: maps[i].T_data,
  243. T_v3d: maps[i].T_v3d,
  244. T_money: maps[i].T_money,
  245. T_warning: maps[i].T_warning,
  246. T_Charging: maps[i].T_Charging,
  247. T_key: maps[i].T_key,
  248. Children: nil,
  249. }
  250. info := CompanyCall(maps, r)
  251. CompanyList = append(CompanyList, info)
  252. }
  253. } else {
  254. for i := 0; i < len(maps); i++ {
  255. r := Company_R{
  256. Id: maps[i].Id,
  257. T_mid: maps[i].T_mid,
  258. T_name: maps[i].T_name,
  259. T_plan: maps[i].T_plan,
  260. T_data: maps[i].T_data,
  261. T_v3d: maps[i].T_v3d,
  262. T_money: maps[i].T_money,
  263. T_warning: maps[i].T_warning,
  264. T_Charging: maps[i].T_Charging,
  265. T_key: maps[i].T_key,
  266. Children: nil,
  267. }
  268. info := CompanyCall(maps, r)
  269. CompanyList = append(CompanyList, info)
  270. }
  271. }
  272. return CompanyList
  273. }
  274. func ReadCompanyIds_T_pids(T_pids []int) []int {
  275. var companyIds []int
  276. if len(T_pids) == 0 {
  277. return companyIds
  278. }
  279. var companyList []Company
  280. o := orm.NewOrm()
  281. qs := o.QueryTable(new(Company))
  282. _, err := qs.Filter("Id__in", T_pids).Filter("T_State", 1).All(&companyList)
  283. if err != nil {
  284. logs.Error(lib.FuncName(), err)
  285. return companyIds
  286. }
  287. for _, company := range companyList {
  288. subIds := ReadCompanyIds_T_path(company.T_path)
  289. companyIds = append(companyIds, subIds...)
  290. }
  291. return lib.IntIdsDistinct(companyIds)
  292. }
  293. // 通过T_pid查询所有子id
  294. func ReadCompanyIds_T_path(T_path string) (companyIds []int) {
  295. o := orm.NewOrm()
  296. qs := o.QueryTable(new(Company))
  297. var CompanyList []Company
  298. _, err := qs.Filter("T_path__startswith", T_path).Filter("T_State", 1).All(&CompanyList)
  299. if err != nil {
  300. logs.Error(lib.FuncName(), err)
  301. return companyIds
  302. }
  303. for _, v := range CompanyList {
  304. companyIds = append(companyIds, v.Id)
  305. }
  306. return companyIds
  307. }
  308. func ReadCompanyWarningIds_T_pids(T_pids []int) []int {
  309. var companyList []Company
  310. var companyIds []int
  311. o := orm.NewOrm()
  312. qs := o.QueryTable(new(Company))
  313. if len(T_pids) == 0 {
  314. return companyIds
  315. }
  316. _, err := qs.Filter("Id__in", T_pids).Filter("T_State", 1).Filter("T_warning", 1).All(&companyList)
  317. if err != nil {
  318. logs.Error(lib.FuncName(), err)
  319. return companyIds
  320. }
  321. for _, company := range companyList {
  322. subIds := ReadCompanyWarningIds_T_path(company.T_path)
  323. companyIds = append(companyIds, subIds...)
  324. }
  325. return lib.IntIdsDistinct(companyIds)
  326. }
  327. // 通过T_pid查询所有子id
  328. func ReadCompanyWarningIds_T_path(T_path string) (companyIds []int) {
  329. o := orm.NewOrm()
  330. qs := o.QueryTable(new(Company))
  331. var CompanyList []Company
  332. _, err := qs.Filter("T_path__startswith", T_path).Filter("T_State", 1).Filter("T_warning", 1).All(&CompanyList)
  333. if err != nil {
  334. logs.Error(lib.FuncName(), err)
  335. return companyIds
  336. }
  337. for _, v := range CompanyList {
  338. companyIds = append(companyIds, v.Id)
  339. }
  340. return companyIds
  341. }
  342. func Read_Company_List(T_name string) (CompanyList []Company_R) {
  343. o := orm.NewOrm()
  344. // 也可以直接使用 Model 结构体作为表名
  345. qs := o.QueryTable(new(Company))
  346. var maps []Company
  347. cond := orm.NewCondition()
  348. cond1 := cond.And("T_State", 1)
  349. if len(T_name) > 0 {
  350. cond1 = cond1.And("T_name__icontains", T_name)
  351. }
  352. _, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
  353. if err != nil {
  354. logs.Error(lib.FuncName(), err)
  355. return CompanyList
  356. }
  357. parentMap, flag := getCompanyParent(maps)
  358. if flag {
  359. for i := 0; i < len(maps); i++ {
  360. if parentMap[maps[i].T_mid] {
  361. continue
  362. }
  363. r := Company_R{
  364. Id: maps[i].Id,
  365. T_mid: maps[i].T_mid,
  366. T_name: maps[i].T_name,
  367. T_plan: maps[i].T_plan,
  368. T_data: maps[i].T_data,
  369. T_v3d: maps[i].T_v3d,
  370. T_money: maps[i].T_money,
  371. T_warning: maps[i].T_warning,
  372. Children: nil,
  373. }
  374. info := CompanyCall(maps, r)
  375. CompanyList = append(CompanyList, info)
  376. }
  377. } else {
  378. for i := 0; i < len(maps); i++ {
  379. r := Company_R{
  380. Id: maps[i].Id,
  381. T_mid: maps[i].T_mid,
  382. T_name: maps[i].T_name,
  383. T_plan: maps[i].T_plan,
  384. T_data: maps[i].T_data,
  385. T_v3d: maps[i].T_v3d,
  386. T_money: maps[i].T_money,
  387. T_warning: maps[i].T_warning,
  388. Children: nil,
  389. }
  390. info := CompanyCall(maps, r)
  391. CompanyList = append(CompanyList, info)
  392. }
  393. }
  394. return CompanyList
  395. }
  396. func CompanyCall(CompanyList []Company, company Company_R) Company_R {
  397. list := CompanyList
  398. min := make([]Company_R, 0)
  399. for j := 0; j < len(list); j++ {
  400. if company.Id != list[j].T_mid {
  401. continue
  402. }
  403. mi := Company_R{}
  404. mi.Id = list[j].Id
  405. mi.T_mid = list[j].T_mid
  406. mi.T_name = list[j].T_name
  407. mi.T_plan = list[j].T_plan
  408. mi.T_data = list[j].T_data
  409. mi.T_v3d = list[j].T_v3d
  410. mi.T_money = list[j].T_money
  411. mi.T_warning = list[j].T_warning
  412. mi.T_Charging = list[j].T_Charging
  413. mi.T_key = list[j].T_key
  414. mi.Children = []Company_R{}
  415. ms := CompanyCall(CompanyList, mi)
  416. min = append(min, ms)
  417. }
  418. company.Children = min
  419. return company
  420. }
  421. func getCompanyParent(CompanyList []Company) (map[int]bool, bool) {
  422. list := CompanyList
  423. var flag = false
  424. var parentMap = map[int]bool{}
  425. for j := 0; j < len(list); j++ {
  426. parentMap[list[j].T_mid] = false
  427. }
  428. for j := 0; j < len(list); j++ {
  429. if _, ok := parentMap[list[j].Id]; !ok {
  430. continue
  431. }
  432. parentMap[list[j].Id] = true
  433. flag = true
  434. }
  435. return parentMap, flag
  436. }
  437. func Read_Company_List_All_ByT_name(T_name string) (maps []Company) {
  438. o := orm.NewOrm()
  439. // 也可以直接使用 Model 结构体作为表名
  440. qs := o.QueryTable(new(Company))
  441. cond := orm.NewCondition()
  442. if len(T_name) > 0 {
  443. cond = cond.And("T_name__icontains", T_name)
  444. }
  445. _, err := qs.SetCond((*orm2.Condition)(cond)).All(&maps)
  446. if err != nil {
  447. logs.Error(lib.FuncName(), err)
  448. return maps
  449. }
  450. return maps
  451. }
  452. // 获取内部用户绑定的公司列表
  453. func Read_Company_List_ByT_pids(T_pids string) (CompanyList []Company_R) {
  454. o := orm.NewOrm()
  455. // 也可以直接使用 Model 结构体作为表名
  456. qs := o.QueryTable(new(Company))
  457. var maps []Company
  458. cond := orm.NewCondition()
  459. cond1 := cond.And("T_State", 1)
  460. if len(T_pids) == 0 {
  461. return
  462. }
  463. if T_pids == "*" {
  464. _, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
  465. if err != nil {
  466. logs.Error(lib.FuncName(), err)
  467. return CompanyList
  468. }
  469. } else {
  470. list := lib.SplitStringIds(T_pids, "P")
  471. cond1 = cond1.And("Id__in", list)
  472. _, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&maps)
  473. if err != nil {
  474. logs.Error(lib.FuncName(), err)
  475. return CompanyList
  476. }
  477. }
  478. parentMap, flag := getCompanyParent(maps)
  479. if flag {
  480. for i := 0; i < len(maps); i++ {
  481. if parentMap[maps[i].T_mid] {
  482. continue
  483. }
  484. r := Company_R{
  485. Id: maps[i].Id,
  486. T_mid: maps[i].T_mid,
  487. T_name: maps[i].T_name,
  488. Children: nil,
  489. }
  490. info := CompanyCall(maps, r)
  491. CompanyList = append(CompanyList, info)
  492. }
  493. } else {
  494. for i := 0; i < len(maps); i++ {
  495. r := Company_R{
  496. Id: maps[i].Id,
  497. T_mid: maps[i].T_mid,
  498. T_name: maps[i].T_name,
  499. Children: nil,
  500. }
  501. info := CompanyCall(maps, r)
  502. CompanyList = append(CompanyList, info)
  503. }
  504. }
  505. return CompanyList
  506. }
  507. func Read_Company_All_Maps() {
  508. o := orm.NewOrm()
  509. var r []Company
  510. qs := o.QueryTable(new(Company))
  511. _, err := qs.All(&r)
  512. if err != nil {
  513. logs.Error(lib.FuncName(), err)
  514. }
  515. for _, v := range r {
  516. Company_map.Store(v.Id, v.T_name)
  517. }
  518. }
  519. func Read_Company_Get(id int) string {
  520. v, ok := Company_map.Load(id) /*如果确定是真实的,则存在,否则不存在 */
  521. if ok {
  522. return v.(string)
  523. } else {
  524. return "未知公司名称"
  525. }
  526. }