store.go 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  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. "math/rand"
  12. "time"
  13. "gorm.io/gorm"
  14. "gorm.io/gorm/clause"
  15. "gas-cylinder-api/app/admin/model"
  16. "gas-cylinder-api/app/admin/service/dto"
  17. "gogs.baozhida.cn/zoie/OAuth-core/pkg"
  18. )
  19. type Store struct {
  20. service.Service
  21. }
  22. func InDeptIdScopes(deptId int) func(db *gorm.DB) *gorm.DB {
  23. return func(db *gorm.DB) *gorm.DB {
  24. if deptId == 0 {
  25. return db
  26. }
  27. ids, err := model.GetParentIds(deptId)
  28. if err != nil {
  29. return db
  30. }
  31. return db.Where("dept_id in (?)", ids)
  32. }
  33. }
  34. // Get 获取SysDept对象
  35. func (e *Store) Get(d *dto.StoreGetReq, deptModel *model.SysDept) error {
  36. err := e.Orm.
  37. First(deptModel, d.GetId()).Error
  38. if err != nil {
  39. e.Log.Errorf("db error: %s", err)
  40. if errors.Is(err, gorm.ErrRecordNotFound) {
  41. return global.GetNotFoundOrNoPermissionErr
  42. }
  43. return global.GetFailedErr
  44. }
  45. return nil
  46. }
  47. // Insert 创建SysDept对象
  48. func (e *Store) Insert(c *dto.StoreInsertReq, deptId int) error {
  49. var err error
  50. var data model.SysDept
  51. tx := e.Orm.Debug().Begin()
  52. defer func() {
  53. if err != nil {
  54. tx.Rollback()
  55. } else {
  56. tx.Commit()
  57. }
  58. }()
  59. // TODO 上传省平台-1.1.1.4新增销售门店信息 addStore
  60. //storeCode = res.StoreCode
  61. rand.New(rand.NewSource(time.Now().UnixNano()))
  62. // 生成随机数后八位
  63. randomSuffix := rand.Intn(9999999999999999)
  64. // 组合成16位随机数
  65. storeCode := fmt.Sprintf("%16d", randomSuffix)
  66. data.CmpCode = storeCode
  67. c.Generate(&data)
  68. data.UploadTime = model2.Time(time.Now())
  69. if deptId != 0 && c.ParentId == 0 {
  70. data.ParentId = deptId
  71. }
  72. err = tx.Create(&data).Error
  73. if err != nil {
  74. e.Log.Errorf("db error: %s", err)
  75. return global.CreateFailedErr
  76. }
  77. c.Id = data.Id
  78. deptPath := pkg.IntToString(data.Id) + "/"
  79. if data.ParentId != 0 {
  80. var deptP model.SysDept
  81. tx.First(&deptP, data.ParentId)
  82. deptPath = deptP.Path + deptPath
  83. } else {
  84. deptPath = "/0/" + deptPath
  85. }
  86. var mp = map[string]string{}
  87. mp["path"] = deptPath
  88. err = tx.Model(&data).Update("path", deptPath).Error
  89. if err != nil {
  90. e.Log.Errorf("db error: %s", err)
  91. return global.CreateFailedErr
  92. }
  93. return nil
  94. }
  95. // Update 修改SysDept对象
  96. func (e *Store) Update(c *dto.StoreUpdateReq) error {
  97. var err error
  98. var deptModel = model.SysDept{}
  99. tx := e.Orm.Debug().Begin()
  100. defer func() {
  101. if err != nil {
  102. tx.Rollback()
  103. } else {
  104. tx.Commit()
  105. }
  106. }()
  107. err = tx.First(&deptModel, c.GetId()).Error
  108. if err != nil {
  109. e.Log.Errorf("db error: %s", err)
  110. if errors.Is(err, gorm.ErrRecordNotFound) {
  111. return global.UpdateNotFoundOrNoPermissionErr
  112. }
  113. return global.UpdateFailedErr
  114. }
  115. c.Generate(&deptModel)
  116. DeptPath := pkg.IntToString(deptModel.Id) + "/"
  117. if deptModel.ParentId != 0 {
  118. var DeptP model.SysDept
  119. tx.First(&DeptP, deptModel.ParentId)
  120. DeptPath = DeptP.Path + DeptPath
  121. } else {
  122. DeptPath = "/0/" + DeptPath
  123. }
  124. deptModel.Path = DeptPath
  125. db := tx.Save(&deptModel)
  126. if err = db.Error; err != nil {
  127. e.Log.Errorf("UpdateSysDept error: %s", err)
  128. return err
  129. }
  130. return nil
  131. }
  132. // Remove 删除SysDept
  133. // 删除部门 同时删除其子部门、部门下的用户
  134. func (e *Store) Remove(d *dto.StoreDeleteReq, p *actions.DataPermission) error {
  135. var err error
  136. tx := e.Orm.Begin()
  137. defer func() {
  138. if err != nil {
  139. tx.Rollback()
  140. } else {
  141. tx.Commit()
  142. }
  143. }()
  144. var dept model.SysDept
  145. err = e.Orm.
  146. First(&dept, d.GetId()).Error
  147. if err != nil {
  148. e.Log.Errorf("db error: %s", err)
  149. if errors.Is(err, gorm.ErrRecordNotFound) {
  150. return global.GetNotFoundOrNoPermissionErr
  151. }
  152. return global.DeleteFailedErr
  153. }
  154. var deptList = make([]model.SysDept, 0)
  155. var deptIds = make([]int, 0)
  156. tx.Where("path like ?", dept.Path+"%").Find(&deptList)
  157. // 获取部门及其子部门下ID
  158. for _, v := range deptList {
  159. deptIds = append(deptIds, v.Id)
  160. }
  161. db := tx.Select(clause.Associations).Delete(&deptList)
  162. if err = db.Error; err != nil {
  163. e.Log.Errorf("Delete error: %s", err)
  164. return global.DeleteFailedErr
  165. }
  166. if db.RowsAffected == 0 {
  167. return global.DeleteNotFoundOrNoPermissionErr
  168. }
  169. // 删除部门下的用户
  170. dbUser := tx.Where("dept_id in (?)", deptIds).Delete(&model.SysUser{})
  171. if err = dbUser.Error; err != nil {
  172. e.Log.Errorf("Delete User error: %s", err)
  173. return global.DeleteFailedErr
  174. }
  175. return nil
  176. }
  177. // getList 获取组织数据
  178. func (e Store) getList(c *dto.StoreGetPageReq, list *[]model.SysDept, p *actions.DataPermission) error {
  179. var err error
  180. var data model.SysDept
  181. if len(c.Name) == 0 && c.DeptId == 0 {
  182. err = e.Orm.Model(&data).
  183. Scopes(
  184. cDto.MakeCondition(c.GetNeedSearch()),
  185. ).
  186. Find(list).Error
  187. if err != nil {
  188. e.Log.Errorf("db error:%s", err)
  189. return err
  190. }
  191. return nil
  192. }
  193. var tempList []model.SysDept
  194. err = e.Orm.Model(&data).Where("id in (select id from sys_dept where path like ? )", "%/"+pkg.IntToString(p.DeptId)+"/%").
  195. Scopes(
  196. cDto.MakeCondition(c.GetNeedSearch()),
  197. ).
  198. Find(&tempList).Error
  199. if err != nil {
  200. e.Log.Errorf("db error: %s", err)
  201. return global.GetFailedErr
  202. }
  203. // 获取部门及其子部门下ID
  204. for _, dept := range tempList {
  205. var deptList = make([]model.SysDept, 0)
  206. err = e.Orm.Where("path like ?", dept.Path+"%").Order(fmt.Sprintf("sort %s", c.SortOrder)).Find(&deptList).Error
  207. *list = append(*list, deptList...)
  208. }
  209. if err != nil {
  210. e.Log.Errorf("db error: %s", err)
  211. return global.GetFailedErr
  212. }
  213. *list = DeduplicateStore(*list)
  214. return nil
  215. }
  216. func StoreDistrictScopes(area string) func(db *gorm.DB) *gorm.DB {
  217. return func(db *gorm.DB) *gorm.DB {
  218. if len(area) == 0 {
  219. return db
  220. }
  221. return db.Where("JSON_EXTRACT(prov_store, '$.district') = ? ", area)
  222. }
  223. }
  224. func StoreCityScopes(city string) func(db *gorm.DB) *gorm.DB {
  225. return func(db *gorm.DB) *gorm.DB {
  226. if len(city) == 0 {
  227. return db
  228. }
  229. return db.Where("JSON_EXTRACT(prov_store, '$.city') = ? ", city)
  230. }
  231. }
  232. func (e Store) getAppletList(c *dto.AppletStoreGetPageReq, list *[]model.SysDept) error {
  233. var err error
  234. var data model.SysDept
  235. var tempList []model.SysDept
  236. err = e.Orm.Model(&data).
  237. Scopes(
  238. cDto.MakeCondition(c.GetNeedSearch()),
  239. StoreDistrictScopes(c.District),
  240. StoreCityScopes(c.City),
  241. ).
  242. Find(&tempList).Error
  243. if err != nil {
  244. e.Log.Errorf("db error: %s", err)
  245. return global.GetFailedErr
  246. }
  247. // 获取部门及其子部门下ID
  248. for _, dept := range tempList {
  249. var deptList = make([]model.SysDept, 0)
  250. err = e.Orm.Where("path like ?", dept.Path+"%").Order(fmt.Sprintf("sort %s", c.SortOrder)).Find(&deptList).Error
  251. *list = append(*list, deptList...)
  252. }
  253. if err != nil {
  254. e.Log.Errorf("db error: %s", err)
  255. return global.GetFailedErr
  256. }
  257. *list = DeduplicateStore(*list)
  258. return nil
  259. }
  260. // SetStorePage 设置Dept页面数据
  261. func (e *Store) SetStorePage(c *dto.StoreGetPageReq, p *actions.DataPermission) (m []model.SysDept, err error) {
  262. var list []model.SysDept
  263. err = e.getList(c, &list, p)
  264. for i := 0; i < len(list); i++ {
  265. if list[i].ParentId != 0 {
  266. continue
  267. }
  268. info := e.StorePageCall(&list, list[i])
  269. m = append(m, info)
  270. }
  271. if len(m) == 0 {
  272. parentMap, flag := getStoreParent(list)
  273. if flag {
  274. for i := 0; i < len(list); i++ {
  275. if parentMap[list[i].ParentId] {
  276. continue
  277. }
  278. info := e.StorePageCall(&list, list[i])
  279. m = append(m, info)
  280. }
  281. } else {
  282. for i := 0; i < len(list); i++ {
  283. info := e.StorePageCall(&list, list[i])
  284. m = append(m, info)
  285. }
  286. }
  287. }
  288. return
  289. }
  290. func (e *Store) SetAppletStorePage(c *dto.AppletStoreGetPageReq) (m []model.SysDept, err error) {
  291. var list []model.SysDept
  292. err = e.getAppletList(c, &list)
  293. for i := 0; i < len(list); i++ {
  294. if list[i].ParentId != 0 {
  295. continue
  296. }
  297. info := e.StorePageCall(&list, list[i])
  298. m = append(m, info)
  299. }
  300. if len(m) == 0 {
  301. parentMap, flag := getStoreParent(list)
  302. if flag {
  303. for i := 0; i < len(list); i++ {
  304. if parentMap[list[i].ParentId] {
  305. continue
  306. }
  307. info := e.StorePageCall(&list, list[i])
  308. m = append(m, info)
  309. }
  310. } else {
  311. for i := 0; i < len(list); i++ {
  312. info := e.StorePageCall(&list, list[i])
  313. m = append(m, info)
  314. }
  315. }
  316. }
  317. return
  318. }
  319. func getStoreParent(deptList []model.SysDept) (map[int]bool, bool) {
  320. list := deptList
  321. var flag = false
  322. var parentMap = map[int]bool{}
  323. for j := 0; j < len(list); j++ {
  324. parentMap[list[j].ParentId] = false
  325. }
  326. for j := 0; j < len(list); j++ {
  327. if _, ok := parentMap[list[j].Id]; !ok {
  328. continue
  329. }
  330. parentMap[list[j].Id] = true
  331. flag = true
  332. }
  333. return parentMap, flag
  334. }
  335. func (e *Store) StorePageCall(deptList *[]model.SysDept, menu model.SysDept) model.SysDept {
  336. list := *deptList
  337. min := make([]model.SysDept, 0)
  338. for j := 0; j < len(list); j++ {
  339. if menu.Id != list[j].ParentId {
  340. continue
  341. }
  342. mi := model.SysDept{}
  343. mi.Id = list[j].Id
  344. mi.ParentId = list[j].ParentId
  345. mi.Path = list[j].Path
  346. mi.Name = list[j].Name
  347. mi.Sort = list[j].Sort
  348. mi.Status = list[j].Status
  349. mi.CreatedAt = list[j].CreatedAt
  350. mi.ProvStore = list[j].ProvStore
  351. mi.CmpCode = list[j].CmpCode
  352. mi.Children = []model.SysDept{}
  353. ms := e.StorePageCall(deptList, mi)
  354. min = append(min, ms)
  355. }
  356. menu.Children = min
  357. return menu
  358. }
  359. func DeduplicateStore(list []model.SysDept) []model.SysDept {
  360. seen := make(map[string]bool)
  361. deduplicated := []model.SysDept{}
  362. for _, v := range list {
  363. // 将结构体编码为 JSON 字符串
  364. key, err := json.Marshal(v)
  365. if err != nil {
  366. // 处理错误
  367. continue
  368. }
  369. // 将 JSON 字符串作为键插入到 map 中
  370. if _, ok := seen[string(key)]; !ok {
  371. seen[string(key)] = true
  372. deduplicated = append(deduplicated, v)
  373. }
  374. }
  375. return deduplicated
  376. }