Company.go 11 KB

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