truck_enterprise.go 9.1 KB

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