store.go 9.3 KB

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