Company.go 11 KB

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