store.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package service
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "gas-cylinder-api/common/actions"
  7. cDto "gas-cylinder-api/common/dto"
  8. "gas-cylinder-api/common/global"
  9. model2 "gas-cylinder-api/common/model"
  10. "gogs.baozhida.cn/zoie/OAuth-core/service"
  11. "time"
  12. "gorm.io/gorm"
  13. "gorm.io/gorm/clause"
  14. "gas-cylinder-api/app/admin/model"
  15. "gas-cylinder-api/app/admin/service/dto"
  16. "gogs.baozhida.cn/zoie/OAuth-core/pkg"
  17. )
  18. type Store struct {
  19. service.Service
  20. }
  21. // Get 获取SysDept对象
  22. func (e *Store) Get(d *dto.StoreGetReq, deptModel *model.SysDept) error {
  23. err := e.Orm.
  24. First(deptModel, d.GetId()).Error
  25. if err != nil {
  26. e.Log.Errorf("db error: %s", err)
  27. if errors.Is(err, gorm.ErrRecordNotFound) {
  28. return global.GetNotFoundOrNoPermissionErr
  29. }
  30. return global.GetFailedErr
  31. }
  32. return nil
  33. }
  34. // Insert 创建SysDept对象
  35. func (e *Store) Insert(c *dto.StoreInsertReq, deptId int) error {
  36. var err error
  37. var data model.SysDept
  38. tx := e.Orm.Debug().Begin()
  39. defer func() {
  40. if err != nil {
  41. tx.Rollback()
  42. } else {
  43. tx.Commit()
  44. }
  45. }()
  46. // TODO 上传省平台-1.1.1.4新增销售门店信息 addStore
  47. // data.StoreCode = res.StoreCode
  48. c.Generate(&data)
  49. data.UploadTime = model2.Time(time.Now())
  50. if deptId != 0 && c.ParentId == 0 {
  51. data.ParentId = deptId
  52. }
  53. err = tx.Create(&data).Error
  54. if err != nil {
  55. e.Log.Errorf("db error: %s", err)
  56. return global.CreateFailedErr
  57. }
  58. c.Id = data.Id
  59. deptPath := pkg.IntToString(data.Id) + "/"
  60. if data.ParentId != 0 {
  61. var deptP model.SysDept
  62. tx.First(&deptP, data.ParentId)
  63. deptPath = deptP.Path + deptPath
  64. } else {
  65. deptPath = "/0/" + deptPath
  66. }
  67. var mp = map[string]string{}
  68. mp["path"] = deptPath
  69. err = tx.Model(&data).Update("path", deptPath).Error
  70. if err != nil {
  71. e.Log.Errorf("db error: %s", err)
  72. return global.CreateFailedErr
  73. }
  74. return nil
  75. }
  76. // Update 修改SysDept对象
  77. func (e *Store) Update(c *dto.StoreUpdateReq) error {
  78. var err error
  79. var deptModel = model.SysDept{}
  80. tx := e.Orm.Debug().Begin()
  81. defer func() {
  82. if err != nil {
  83. tx.Rollback()
  84. } else {
  85. tx.Commit()
  86. }
  87. }()
  88. err = tx.First(&deptModel, c.GetId()).Error
  89. if err != nil {
  90. e.Log.Errorf("db error: %s", err)
  91. if errors.Is(err, gorm.ErrRecordNotFound) {
  92. return global.UpdateNotFoundOrNoPermissionErr
  93. }
  94. return global.UpdateFailedErr
  95. }
  96. c.Generate(&deptModel)
  97. DeptPath := pkg.IntToString(deptModel.Id) + "/"
  98. if deptModel.ParentId != 0 {
  99. var DeptP model.SysDept
  100. tx.First(&DeptP, deptModel.ParentId)
  101. DeptPath = DeptP.Path + DeptPath
  102. } else {
  103. DeptPath = "/0/" + DeptPath
  104. }
  105. deptModel.Path = DeptPath
  106. db := tx.Save(&deptModel)
  107. if err = db.Error; err != nil {
  108. e.Log.Errorf("UpdateSysDept error: %s", err)
  109. return err
  110. }
  111. return nil
  112. }
  113. // Remove 删除SysDept
  114. // 删除部门 同时删除其子部门、部门下的用户
  115. func (e *Store) Remove(d *dto.StoreDeleteReq, p *actions.DataPermission) error {
  116. var err error
  117. tx := e.Orm.Begin()
  118. defer func() {
  119. if err != nil {
  120. tx.Rollback()
  121. } else {
  122. tx.Commit()
  123. }
  124. }()
  125. var dept model.SysDept
  126. err = e.Orm.
  127. First(&dept, d.GetId()).Error
  128. if err != nil {
  129. e.Log.Errorf("db error: %s", err)
  130. if errors.Is(err, gorm.ErrRecordNotFound) {
  131. return global.GetNotFoundOrNoPermissionErr
  132. }
  133. return global.DeleteFailedErr
  134. }
  135. var deptList = make([]model.SysDept, 0)
  136. var deptIds = make([]int, 0)
  137. tx.Where("path like ?", dept.Path+"%").Find(&deptList)
  138. // 获取部门及其子部门下ID
  139. for _, v := range deptList {
  140. deptIds = append(deptIds, v.Id)
  141. }
  142. db := tx.Select(clause.Associations).Delete(&deptList)
  143. if err = db.Error; err != nil {
  144. e.Log.Errorf("Delete error: %s", err)
  145. return global.DeleteFailedErr
  146. }
  147. if db.RowsAffected == 0 {
  148. return global.DeleteNotFoundOrNoPermissionErr
  149. }
  150. // 删除部门下的用户
  151. dbUser := tx.Where("dept_id in (?)", deptIds).Delete(&model.SysUser{})
  152. if err = dbUser.Error; err != nil {
  153. e.Log.Errorf("Delete User error: %s", err)
  154. return global.DeleteFailedErr
  155. }
  156. return nil
  157. }
  158. // getList 获取组织数据
  159. func (e Store) getList(c *dto.StoreGetPageReq, list *[]model.SysDept, p *actions.DataPermission) error {
  160. var err error
  161. var data model.SysDept
  162. if len(c.Name) == 0 && c.DeptId == 0 {
  163. err = e.Orm.Model(&data).
  164. Scopes(
  165. cDto.MakeCondition(c.GetNeedSearch()),
  166. ).
  167. Find(list).Error
  168. if err != nil {
  169. e.Log.Errorf("db error:%s", err)
  170. return err
  171. }
  172. return nil
  173. }
  174. var tempList []model.SysDept
  175. err = e.Orm.Model(&data).Where("id in (select id from sys_dept where path like ? )", "%/"+pkg.IntToString(p.DeptId)+"/%").
  176. Scopes(
  177. cDto.MakeCondition(c.GetNeedSearch()),
  178. ).
  179. Find(&tempList).Error
  180. if err != nil {
  181. e.Log.Errorf("db error: %s", err)
  182. return global.GetFailedErr
  183. }
  184. // 获取部门及其子部门下ID
  185. for _, dept := range tempList {
  186. var deptList = make([]model.SysDept, 0)
  187. err = e.Orm.Where("path like ?", dept.Path+"%").Order(fmt.Sprintf("sort %s", c.SortOrder)).Find(&deptList).Error
  188. *list = append(*list, deptList...)
  189. }
  190. if err != nil {
  191. e.Log.Errorf("db error: %s", err)
  192. return global.GetFailedErr
  193. }
  194. *list = DeduplicateStore(*list)
  195. return nil
  196. }
  197. // SetStorePage 设置Dept页面数据
  198. func (e *Store) SetStorePage(c *dto.StoreGetPageReq, p *actions.DataPermission) (m []model.SysDept, err error) {
  199. var list []model.SysDept
  200. err = e.getList(c, &list, p)
  201. for i := 0; i < len(list); i++ {
  202. if list[i].ParentId != 0 {
  203. continue
  204. }
  205. info := e.StorePageCall(&list, list[i])
  206. m = append(m, info)
  207. }
  208. if len(m) == 0 {
  209. parentMap, flag := getStoreParent(list)
  210. if flag {
  211. for i := 0; i < len(list); i++ {
  212. if parentMap[list[i].ParentId] {
  213. continue
  214. }
  215. info := e.StorePageCall(&list, list[i])
  216. m = append(m, info)
  217. }
  218. } else {
  219. for i := 0; i < len(list); i++ {
  220. info := e.StorePageCall(&list, list[i])
  221. m = append(m, info)
  222. }
  223. }
  224. }
  225. return
  226. }
  227. func getStoreParent(deptList []model.SysDept) (map[int]bool, bool) {
  228. list := deptList
  229. var flag = false
  230. var parentMap = map[int]bool{}
  231. for j := 0; j < len(list); j++ {
  232. parentMap[list[j].ParentId] = false
  233. }
  234. for j := 0; j < len(list); j++ {
  235. if _, ok := parentMap[list[j].Id]; !ok {
  236. continue
  237. }
  238. parentMap[list[j].Id] = true
  239. flag = true
  240. }
  241. return parentMap, flag
  242. }
  243. func (e *Store) StorePageCall(deptList *[]model.SysDept, menu model.SysDept) model.SysDept {
  244. list := *deptList
  245. min := make([]model.SysDept, 0)
  246. for j := 0; j < len(list); j++ {
  247. if menu.Id != list[j].ParentId {
  248. continue
  249. }
  250. mi := model.SysDept{}
  251. mi.Id = list[j].Id
  252. mi.ParentId = list[j].ParentId
  253. mi.Path = list[j].Path
  254. mi.Name = list[j].Name
  255. mi.Sort = list[j].Sort
  256. mi.Status = list[j].Status
  257. mi.CreatedAt = list[j].CreatedAt
  258. mi.ProvStore = list[j].ProvStore
  259. mi.CmpCode = list[j].CmpCode
  260. mi.Children = []model.SysDept{}
  261. ms := e.StorePageCall(deptList, mi)
  262. min = append(min, ms)
  263. }
  264. menu.Children = min
  265. return menu
  266. }
  267. func DeduplicateStore(list []model.SysDept) []model.SysDept {
  268. seen := make(map[string]bool)
  269. deduplicated := []model.SysDept{}
  270. for _, v := range list {
  271. // 将结构体编码为 JSON 字符串
  272. key, err := json.Marshal(v)
  273. if err != nil {
  274. // 处理错误
  275. continue
  276. }
  277. // 将 JSON 字符串作为键插入到 map 中
  278. if _, ok := seen[string(key)]; !ok {
  279. seen[string(key)] = true
  280. deduplicated = append(deduplicated, v)
  281. }
  282. }
  283. return deduplicated
  284. }