material.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. package materialService
  2. import (
  3. "eta/eta_api/models"
  4. "eta/eta_api/models/material"
  5. "eta/eta_api/models/system"
  6. _interface "eta/eta_api/services/interface"
  7. "eta/eta_api/utils"
  8. "fmt"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. func materialClassifyHaveChild(allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) (childs []*material.MaterialClassifyItems, yes bool) {
  14. for _, v := range allNode {
  15. if v.ParentId == node.ClassifyId {
  16. childs = append(childs, v)
  17. }
  18. }
  19. if len(childs) > 0 {
  20. yes = true
  21. }
  22. return
  23. }
  24. func MaterialClassifyItemsMakeTree(sysUser *system.Admin, allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) {
  25. childs, _ := materialClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
  26. if len(childs) > 0 {
  27. node.Children = append(node.Children, childs[0:]...) //添加子节点
  28. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  29. _, has := materialClassifyHaveChild(allNode, v)
  30. if has {
  31. MaterialClassifyItemsMakeTree(sysUser, allNode, v) //递归添加节点
  32. } else {
  33. childrenArr := make([]*material.MaterialClassifyItems, 0)
  34. v.Children = childrenArr
  35. }
  36. }
  37. } else {
  38. childrenArr := make([]*material.MaterialClassifyItems, 0)
  39. node.Children = childrenArr
  40. }
  41. }
  42. // GetMaterialClassifyListForMe 获取我创建的素材
  43. func GetMaterialClassifyListForMe(adminInfo system.Admin, resp *material.MaterialClassifyListResp, classifyId int) (errMsg string, err error) {
  44. classifyAll, err := material.GetMaterialClassifyByParentId(classifyId)
  45. if err != nil && err.Error() != utils.ErrNoRow() {
  46. errMsg = "获取失败"
  47. return
  48. }
  49. nodeAll := make([]*material.MaterialClassifyItems, 0)
  50. for k := range classifyAll {
  51. rootNode := classifyAll[k]
  52. MaterialClassifyItemsMakeTree(&adminInfo, classifyAll, rootNode)
  53. nodeAll = append(nodeAll, rootNode)
  54. }
  55. resp.AllNodes = nodeAll
  56. return
  57. }
  58. func BatchAddMaterial(materialList []material.BatchAddMaterialItem, classifyId, opUserId int, opUserName string) (err error) {
  59. addList := make([]*material.Material, 0)
  60. sort, err := material.GetMaterialMaxSort()
  61. if err != nil {
  62. return
  63. }
  64. for _, v := range materialList {
  65. sort = sort + 1
  66. addList = append(addList, &material.Material{
  67. MaterialName: v.MaterialName,
  68. ImgUrl: v.ImgUrl,
  69. SysUserId: opUserId,
  70. SysUserRealName: opUserName,
  71. ModifyTime: time.Now(),
  72. CreateTime: time.Now(),
  73. ClassifyId: classifyId,
  74. Sort: sort,
  75. })
  76. }
  77. if len(addList) > 0 {
  78. err = material.AddMultiMaterial(addList)
  79. }
  80. return
  81. }
  82. // AddMaterial 新增素材
  83. func AddMaterial(req material.AddAndEditMaterial, opUserId int, opUserName string) (resp *material.MaterialSaveResp, err error) {
  84. resp = new(material.MaterialSaveResp)
  85. //素材主表信息
  86. materialInfo := &material.Material{
  87. MaterialName: utils.TrimStr(req.MaterialName),
  88. ImgUrl: utils.TrimStr(req.ImgUrl),
  89. SysUserId: opUserId,
  90. SysUserRealName: opUserName,
  91. ModifyTime: time.Now(),
  92. CreateTime: time.Now(),
  93. ClassifyId: req.ClassifyId,
  94. Sort: 0,
  95. }
  96. //新增素材
  97. id, err := material.AddMaterial(materialInfo)
  98. if err != nil {
  99. return
  100. }
  101. materialInfo.MaterialId = int(id)
  102. resp.Material = materialInfo
  103. return
  104. }
  105. func MaterialItemsMakeTree(allNode []*material.MaterialClassifyItems, sandListMap map[int][]*material.MaterialClassifyItems, classifyId int) (nodeAll []*material.MaterialClassifyItems) {
  106. for k := range allNode {
  107. if len(allNode[k].Children) > 0 {
  108. MaterialItemsMakeTree(allNode[k].Children, sandListMap, classifyId)
  109. allNode = append(allNode, sandListMap[allNode[k].ParentId]...)
  110. nodeAll = allNode
  111. } else if k == len(allNode)-1 {
  112. allNode = append(allNode, sandListMap[allNode[k].ParentId]...)
  113. nodeAll = allNode
  114. }
  115. }
  116. if len(allNode) == 0 {
  117. nodeAll = append(nodeAll, sandListMap[classifyId]...)
  118. }
  119. return
  120. }
  121. func MaterialClassifyHaveChild(allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) (childs []*material.MaterialClassifyItems, yes bool) {
  122. for _, v := range allNode {
  123. if v.ParentId == node.ClassifyId {
  124. childs = append(childs, v)
  125. }
  126. }
  127. if len(childs) > 0 {
  128. yes = true
  129. }
  130. return
  131. }
  132. func MaterialClassifyItemsMakeTreeV2(sysUser *system.Admin, allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) {
  133. childs, _ := materialClassifyHaveChildV2(allNode, node) //判断节点是否有子节点并返回
  134. if len(childs) > 0 {
  135. node.Children = append(node.Children, childs[0:]...) //添加子节点
  136. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  137. _, has := materialClassifyHaveChildV2(allNode, v)
  138. if has {
  139. MaterialClassifyItemsMakeTreeV2(sysUser, allNode, v) //递归添加节点
  140. }
  141. }
  142. }
  143. }
  144. func materialClassifyHaveChildV2(allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) (childs []*material.MaterialClassifyItems, yes bool) {
  145. for _, v := range allNode {
  146. if v.ParentId == node.ClassifyId && node.ClassifyId == 0 {
  147. childs = append(childs, v)
  148. }
  149. }
  150. if len(childs) > 0 {
  151. yes = true
  152. }
  153. return
  154. }
  155. func MoveMaterialClassify(classifyInfo *material.MaterialClassify, req *material.MoveMaterialClassifyReq) (err error, errMsg string) {
  156. nodeMove := models.SingleMoveNodeReq{}
  157. nodeMove.NodeId = req.ClassifyId
  158. nodeMove.ParentNodeId = req.ParentClassifyId
  159. nodeMove.PrevNodeId = req.PrevClassifyId
  160. nodeMove.NextNodeId = req.NextClassifyId
  161. materialClassifyMove := new(ClassifyMove)
  162. nodeInfo, updateCol, err, errMsg := _interface.MoveSingleNode(materialClassifyMove, nodeMove)
  163. if err != nil {
  164. return
  165. }
  166. oldParentId := classifyInfo.ParentId
  167. oldLevelPath := classifyInfo.LevelPath
  168. if len(updateCol) > 0 {
  169. classifyInfo.Sort = nodeInfo.Sort
  170. classifyInfo.ModifyTime = nodeInfo.ModifyTime
  171. classifyInfo.ParentId = nodeInfo.ParentId
  172. levelPath := ""
  173. if classifyInfo.ParentId != oldParentId {
  174. //查找父级分类
  175. parentClassify, e := material.GetMaterialClassifyById(classifyInfo.ParentId)
  176. if e != nil {
  177. errMsg = "获取父级分类失败"
  178. err = fmt.Errorf("获取父级分类失败,Err:" + e.Error())
  179. return
  180. }
  181. levelPath = fmt.Sprintf("%s,%d", parentClassify.LevelPath, classifyInfo.ClassifyId)
  182. }
  183. classifyInfo.LevelPath = levelPath
  184. updateCol = append(updateCol, "LevelPath")
  185. err = classifyInfo.Update(updateCol)
  186. if err != nil {
  187. err = fmt.Errorf("修改失败,Err:" + err.Error())
  188. return
  189. }
  190. if classifyInfo.ParentId != oldParentId {
  191. tmpList, e := material.GetMaterialClassifyByLevelPath(oldLevelPath)
  192. if e != nil {
  193. err = fmt.Errorf("保存分类失败,Err:" + e.Error())
  194. return
  195. }
  196. // 把原先的父级levePath,替换成最新的父级序列
  197. for _, tmp := range tmpList {
  198. //获取字符串前缀的位置
  199. after, _ := strings.CutPrefix(tmp.LevelPath, oldLevelPath)
  200. fmt.Println("after", after)
  201. // 拼接字符串
  202. if after != "" {
  203. tmp.LevelPath = levelPath + after
  204. tmp.ModifyTime = time.Now()
  205. e = tmp.Update([]string{"LevelPath", "ModifyTime"})
  206. if e != nil {
  207. err = fmt.Errorf("修改子分类,Err:" + e.Error())
  208. return
  209. }
  210. }
  211. }
  212. }
  213. }
  214. return
  215. }
  216. type ClassifyMove struct{}
  217. func (m *ClassifyMove) GetNodeInfoById(nodeId int) (nodeInfo *models.NodeInfo, err error) {
  218. classifyInfo, err := material.GetMaterialClassifyById(nodeId)
  219. if err != nil {
  220. return
  221. }
  222. nodeInfo = &models.NodeInfo{
  223. NodeId: classifyInfo.ClassifyId,
  224. NodeName: classifyInfo.ClassifyName,
  225. ParentId: classifyInfo.ParentId,
  226. Level: classifyInfo.Level,
  227. Sort: classifyInfo.Sort,
  228. ModifyTime: classifyInfo.ModifyTime,
  229. }
  230. return
  231. }
  232. func (m *ClassifyMove) UpdateNodeInfoSortByParentIdAndSource(parentNodeId, nodeId, prevNodeSort int, updateSortStr string, nodeType int) (err error) {
  233. err = material.UpdateMaterialClassifySortByParentId(parentNodeId, nodeId, prevNodeSort, updateSortStr)
  234. return
  235. }
  236. func (m *ClassifyMove) GetNodeMaxSort(parentId, nodeType int) (maxSort int, err error) {
  237. maxSort, err = material.GetMaterialClassifyMaxSort(parentId)
  238. return
  239. }
  240. func (m *ClassifyMove) GetFirstNodeInfoByParentId(parentId int) (nodeInfo *models.NodeInfo, err error) {
  241. classifyInfo, err := material.GetFirstMaterialClassifyByParentId(parentId)
  242. if err != nil {
  243. return
  244. }
  245. nodeInfo = &models.NodeInfo{
  246. NodeId: classifyInfo.ClassifyId,
  247. NodeName: classifyInfo.ClassifyName,
  248. ParentId: classifyInfo.ParentId,
  249. Level: classifyInfo.Level,
  250. Sort: classifyInfo.Sort,
  251. ModifyTime: classifyInfo.ModifyTime,
  252. }
  253. return
  254. }
  255. func GetBatchSelectedMaterialList(classifyId int, keyword string, isShowMe bool, sysUser *system.Admin) (list []*material.MaterialListItems, err error, errMsg string) {
  256. var condition string
  257. var pars []interface{}
  258. if classifyId <= 0 {
  259. errMsg = "请选择分类"
  260. err = fmt.Errorf(errMsg)
  261. return
  262. }
  263. // 查询当前的分类
  264. classifyInfo, e := material.GetMaterialClassifyById(classifyId)
  265. if e != nil {
  266. errMsg = "分类不存在"
  267. err = fmt.Errorf("获取分类信息失败,Err:" + e.Error())
  268. return
  269. }
  270. // 获取所有子分类
  271. childList, e := material.GetMaterialClassifyByLevelPath(classifyInfo.LevelPath)
  272. if e != nil {
  273. errMsg = "获取分类失败"
  274. err = fmt.Errorf("获取子分类失败,Err:" + e.Error())
  275. return
  276. }
  277. // 把原先的父级levePath,替换成最新的父级序列
  278. classifyIdMap := make(map[string]struct{})
  279. classifyIds := make([]string, 0)
  280. childClassifyMap := make(map[int]*material.MaterialClassify)
  281. for _, tmp := range childList {
  282. childClassifyMap[tmp.ClassifyId] = tmp
  283. //获取字符串前缀的位置
  284. after, _ := strings.CutPrefix(tmp.LevelPath, classifyInfo.LevelPath)
  285. fmt.Println("after", after)
  286. // 拼接字符串
  287. if after != "" {
  288. ids := strings.Split(after, ",")
  289. for _, v := range ids {
  290. if _, ok := classifyIdMap[v]; !ok {
  291. classifyIds = append(classifyIds, v)
  292. classifyIdMap[v] = struct{}{}
  293. }
  294. }
  295. }
  296. }
  297. classifyIds = append(classifyIds, strconv.Itoa(classifyId))
  298. if len(classifyIds) > 0 {
  299. condition += " AND classify_id IN(" + utils.GetOrmInReplace(len(classifyIds)) + ") "
  300. pars = append(pars, classifyIds)
  301. }
  302. if keyword != "" {
  303. condition += ` AND ( material_name LIKE '%` + keyword + `%' )`
  304. }
  305. //只看我的
  306. if isShowMe {
  307. condition += ` AND sys_user_id = ? `
  308. pars = append(pars, sysUser.AdminId)
  309. }
  310. //获取图表信息
  311. list, err = material.GetMaterialListByCondition(condition, pars)
  312. if err != nil && err.Error() != utils.ErrNoRow() {
  313. errMsg = "获取素材库信息失败"
  314. err = fmt.Errorf("获取素材库信息失败,Err:" + err.Error())
  315. return
  316. }
  317. return
  318. }