Company.go 11 KB

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