Company.go 13 KB

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