material.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. package materialService
  2. import (
  3. "eta/eta_api/models"
  4. "eta/eta_api/models/data_manage"
  5. "eta/eta_api/models/data_manage/excel"
  6. "eta/eta_api/models/material"
  7. "eta/eta_api/models/sandbox"
  8. "eta/eta_api/models/system"
  9. "eta/eta_api/services"
  10. _interface "eta/eta_api/services/interface"
  11. "eta/eta_api/utils"
  12. "fmt"
  13. "github.com/rdlucklib/rdluck_tools/http"
  14. "os"
  15. "path"
  16. "strconv"
  17. "strings"
  18. "time"
  19. )
  20. func materialClassifyHaveChild(allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) (childs []*material.MaterialClassifyItems, yes bool) {
  21. for _, v := range allNode {
  22. if v.ParentId == node.ClassifyId {
  23. childs = append(childs, v)
  24. }
  25. }
  26. if len(childs) > 0 {
  27. yes = true
  28. }
  29. return
  30. }
  31. func MaterialClassifyItemsMakeTree(sysUser *system.Admin, allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) {
  32. childs, _ := materialClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
  33. if len(childs) > 0 {
  34. node.Children = append(node.Children, childs[0:]...) //添加子节点
  35. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  36. _, has := materialClassifyHaveChild(allNode, v)
  37. if has {
  38. MaterialClassifyItemsMakeTree(sysUser, allNode, v) //递归添加节点
  39. } else {
  40. childrenArr := make([]*material.MaterialClassifyItems, 0)
  41. v.Children = childrenArr
  42. }
  43. }
  44. } else {
  45. childrenArr := make([]*material.MaterialClassifyItems, 0)
  46. node.Children = childrenArr
  47. }
  48. }
  49. // GetMaterialClassifyListForMe 获取我创建的素材
  50. func GetMaterialClassifyListForMe(adminInfo system.Admin, resp *material.MaterialClassifyListResp, classifyId int) (errMsg string, err error) {
  51. classifyAll, err := material.GetMaterialClassifyByParentId(classifyId)
  52. if err != nil && err.Error() != utils.ErrNoRow() {
  53. errMsg = "获取失败"
  54. return
  55. }
  56. nodeAll := make([]*material.MaterialClassifyItems, 0)
  57. for k := range classifyAll {
  58. rootNode := classifyAll[k]
  59. MaterialClassifyItemsMakeTree(&adminInfo, classifyAll, rootNode)
  60. nodeAll = append(nodeAll, rootNode)
  61. }
  62. resp.AllNodes = nodeAll
  63. return
  64. }
  65. func BatchAddMaterial(materialList []material.BatchAddMaterialItem, classifyId, opUserId int, opUserName string) (err error) {
  66. addList := make([]*material.Material, 0)
  67. sort, err := material.GetMaterialMaxSort()
  68. if err != nil {
  69. return
  70. }
  71. for _, v := range materialList {
  72. sort = sort + 1
  73. addList = append(addList, &material.Material{
  74. MaterialName: v.MaterialName,
  75. MaterialNameEn: v.MaterialName,
  76. ImgUrl: v.ImgUrl,
  77. SysUserId: opUserId,
  78. SysUserRealName: opUserName,
  79. ModifyTime: time.Now(),
  80. CreateTime: time.Now(),
  81. ClassifyId: classifyId,
  82. Sort: sort,
  83. })
  84. }
  85. if len(addList) > 0 {
  86. err = material.AddMultiMaterial(addList)
  87. }
  88. return
  89. }
  90. // AddToMaterial 将图库等封面上传至素材库
  91. func AddToMaterial(req material.SaveAsMaterialReq, opUserId int, opUserName string) (err error, errMsg string) {
  92. // 判断出对应的类型,得倒最终的资源地址
  93. oldRsourceUrl := ""
  94. switch req.ObjectType {
  95. case "chart":
  96. // 获取图表封面地址
  97. chartInfo, e := data_manage.GetChartInfoById(req.ObjectId)
  98. if e != nil {
  99. if e.Error() == utils.ErrNoRow() {
  100. errMsg = "图表不存在"
  101. err = fmt.Errorf("图表不存在")
  102. return
  103. }
  104. errMsg = "获取图表信息失败"
  105. err = e
  106. return
  107. }
  108. if chartInfo.ChartImage == "" {
  109. errMsg = "图表封面为空"
  110. err = fmt.Errorf("图表封面为空")
  111. return
  112. }
  113. oldRsourceUrl = chartInfo.ChartImage
  114. case "sandbox":
  115. // 获取逻辑图
  116. sandboxInfo, e := sandbox.GetSandboxById(req.ObjectId)
  117. if e != nil {
  118. if e.Error() == utils.ErrNoRow() {
  119. errMsg = "逻辑图不存在"
  120. err = fmt.Errorf("逻辑图不存在")
  121. return
  122. }
  123. errMsg = "获取逻辑图信息失败"
  124. err = e
  125. return
  126. }
  127. if sandboxInfo.PicUrl == "" { // 获取逻辑图封面地址
  128. errMsg = "逻辑图封面为空"
  129. err = fmt.Errorf("逻辑图封面为空")
  130. return
  131. }
  132. oldRsourceUrl = sandboxInfo.PicUrl
  133. case "excel":
  134. // 获取表格封面地址
  135. excelInfo, e := excel.GetExcelViewInfoByExcelInfoId(req.ObjectId)
  136. if e != nil {
  137. if e.Error() == utils.ErrNoRow() {
  138. errMsg = "表格不存在"
  139. err = fmt.Errorf("表格不存在")
  140. return
  141. }
  142. errMsg = "获取表格信息失败"
  143. err = e
  144. return
  145. }
  146. if excelInfo.ExcelImage == "" {
  147. errMsg = "表格封面为空"
  148. err = fmt.Errorf("表格封面为空")
  149. return
  150. }
  151. oldRsourceUrl = excelInfo.ExcelImage
  152. default:
  153. errMsg = "不支持的类型"
  154. err = fmt.Errorf("不支持的类型")
  155. return
  156. }
  157. // 下载资源地址内容,并上传至存储空间得倒最终的素材地址
  158. urlFileName := path.Base(oldRsourceUrl)
  159. uploadDir := utils.STATIC_DIR + "hongze/" + time.Now().Format("20060102")
  160. if e := os.MkdirAll(uploadDir, utils.DIR_MOD); e != nil {
  161. errMsg = "存储目录创建失败"
  162. err = fmt.Errorf("存储目录创建失败, Err:" + e.Error())
  163. return
  164. }
  165. var content []byte
  166. content, err = http.Get(oldRsourceUrl)
  167. if err != nil {
  168. errMsg = "操作失败"
  169. err = fmt.Errorf("资源获取失败, Err: " + err.Error())
  170. return
  171. }
  172. filePath := uploadDir + "/" + urlFileName
  173. ioWriter, err := os.Create(filePath)
  174. if err != nil {
  175. errMsg = "操作失败"
  176. err = fmt.Errorf("文件创建失败, Err: " + err.Error())
  177. return
  178. }
  179. n, err := ioWriter.Write(content)
  180. fmt.Println("n", n)
  181. if err != nil {
  182. errMsg = "操作失败"
  183. err = fmt.Errorf("压缩文件写入失败, Err: " + err.Error())
  184. return
  185. }
  186. ext := path.Ext(urlFileName)
  187. randStr := utils.GetRandStringNoSpecialChar(28)
  188. newFileName := randStr + ext
  189. // 上传到阿里云
  190. ossDir := utils.RESOURCE_DIR + "material_dir/"
  191. savePath := ossDir + time.Now().Format("200601/20060102/") + newFileName
  192. // 上传文件
  193. ossClient := services.NewOssClient()
  194. if ossClient == nil {
  195. err = fmt.Errorf("初始化OSS服务失败")
  196. return
  197. }
  198. resourceUrl, err := ossClient.UploadFile(newFileName, filePath, savePath)
  199. if err != nil {
  200. err = fmt.Errorf("文件上传失败, Err: %s", err.Error())
  201. return
  202. }
  203. defer func() {
  204. os.Remove(filePath)
  205. }()
  206. // 新增素材库
  207. sort, err := material.GetMaterialMaxSort()
  208. //素材主表信息
  209. materialInfo := &material.Material{
  210. MaterialName: utils.TrimStr(req.MaterialName),
  211. MaterialNameEn: utils.TrimStr(req.MaterialName),
  212. ImgUrl: utils.TrimStr(resourceUrl),
  213. SysUserId: opUserId,
  214. SysUserRealName: opUserName,
  215. ModifyTime: time.Now(),
  216. CreateTime: time.Now(),
  217. ClassifyId: req.ClassifyId,
  218. Sort: sort + 1,
  219. }
  220. //新增素材
  221. id, err := material.AddMaterial(materialInfo)
  222. if err != nil {
  223. return
  224. }
  225. materialInfo.MaterialId = int(id)
  226. return
  227. }
  228. func MaterialItemsMakeTree(allNode []*material.MaterialClassifyItems, sandListMap map[int][]*material.MaterialClassifyItems, classifyId int) (nodeAll []*material.MaterialClassifyItems) {
  229. for k := range allNode {
  230. if len(allNode[k].Children) > 0 {
  231. MaterialItemsMakeTree(allNode[k].Children, sandListMap, classifyId)
  232. allNode = append(allNode, sandListMap[allNode[k].ParentId]...)
  233. nodeAll = allNode
  234. } else if k == len(allNode)-1 {
  235. allNode = append(allNode, sandListMap[allNode[k].ParentId]...)
  236. nodeAll = allNode
  237. }
  238. }
  239. if len(allNode) == 0 {
  240. nodeAll = append(nodeAll, sandListMap[classifyId]...)
  241. }
  242. return
  243. }
  244. func MaterialClassifyHaveChild(allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) (childs []*material.MaterialClassifyItems, yes bool) {
  245. for _, v := range allNode {
  246. if v.ParentId == node.ClassifyId {
  247. childs = append(childs, v)
  248. }
  249. }
  250. if len(childs) > 0 {
  251. yes = true
  252. }
  253. return
  254. }
  255. func MaterialClassifyItemsMakeTreeV2(sysUser *system.Admin, allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) {
  256. childs, _ := materialClassifyHaveChildV2(allNode, node) //判断节点是否有子节点并返回
  257. if len(childs) > 0 {
  258. node.Children = append(node.Children, childs[0:]...) //添加子节点
  259. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  260. _, has := materialClassifyHaveChildV2(allNode, v)
  261. if has {
  262. MaterialClassifyItemsMakeTreeV2(sysUser, allNode, v) //递归添加节点
  263. }
  264. }
  265. }
  266. }
  267. func materialClassifyHaveChildV2(allNode []*material.MaterialClassifyItems, node *material.MaterialClassifyItems) (childs []*material.MaterialClassifyItems, yes bool) {
  268. for _, v := range allNode {
  269. if v.ParentId == node.ClassifyId && node.ClassifyId == 0 {
  270. childs = append(childs, v)
  271. }
  272. }
  273. if len(childs) > 0 {
  274. yes = true
  275. }
  276. return
  277. }
  278. func MoveMaterialClassify(classifyInfo *material.MaterialClassify, req *material.MoveMaterialClassifyReq) (err error, errMsg string) {
  279. nodeMove := models.SingleMoveNodeReq{}
  280. nodeMove.NodeId = req.ClassifyId
  281. nodeMove.ParentNodeId = req.ParentClassifyId
  282. nodeMove.PrevNodeId = req.PrevClassifyId
  283. nodeMove.NextNodeId = req.NextClassifyId
  284. materialClassifyMove := new(ClassifyMove)
  285. nodeInfo, updateCol, err, errMsg := _interface.MoveSingleNode(materialClassifyMove, nodeMove)
  286. if err != nil {
  287. return
  288. }
  289. oldParentId := classifyInfo.ParentId
  290. oldLevelPath := classifyInfo.LevelPath
  291. if len(updateCol) > 0 {
  292. classifyInfo.Sort = nodeInfo.Sort
  293. classifyInfo.ModifyTime = nodeInfo.ModifyTime
  294. classifyInfo.ParentId = nodeInfo.ParentId
  295. levelPath := classifyInfo.LevelPath
  296. if classifyInfo.ParentId != oldParentId {
  297. //查找父级分类
  298. parentClassify, e := material.GetMaterialClassifyById(classifyInfo.ParentId)
  299. if e != nil {
  300. errMsg = "获取父级分类失败"
  301. err = fmt.Errorf("获取父级分类失败,Err:" + e.Error())
  302. return
  303. }
  304. levelPath = fmt.Sprintf("%s,%d", parentClassify.LevelPath, classifyInfo.ClassifyId)
  305. classifyInfo.LevelPath = levelPath
  306. updateCol = append(updateCol, "LevelPath")
  307. }
  308. err = classifyInfo.Update(updateCol)
  309. if err != nil {
  310. err = fmt.Errorf("修改失败,Err:" + err.Error())
  311. return
  312. }
  313. if classifyInfo.ParentId != oldParentId {
  314. tmpList, e := material.GetMaterialClassifyByLevelPath(oldLevelPath)
  315. if e != nil {
  316. err = fmt.Errorf("保存分类失败,Err:" + e.Error())
  317. return
  318. }
  319. // 把原先的父级levePath,替换成最新的父级序列
  320. for _, tmp := range tmpList {
  321. //获取字符串前缀的位置
  322. after, _ := strings.CutPrefix(tmp.LevelPath, oldLevelPath)
  323. fmt.Println("after", after)
  324. // 拼接字符串
  325. if after != "" {
  326. tmp.LevelPath = levelPath + after
  327. tmp.ModifyTime = time.Now()
  328. e = tmp.Update([]string{"LevelPath", "ModifyTime"})
  329. if e != nil {
  330. err = fmt.Errorf("修改子分类,Err:" + e.Error())
  331. return
  332. }
  333. }
  334. }
  335. }
  336. }
  337. return
  338. }
  339. type ClassifyMove struct{}
  340. func (m *ClassifyMove) GetNodeInfoById(nodeId int) (nodeInfo *models.NodeInfo, err error) {
  341. classifyInfo, err := material.GetMaterialClassifyById(nodeId)
  342. if err != nil {
  343. return
  344. }
  345. nodeInfo = &models.NodeInfo{
  346. NodeId: classifyInfo.ClassifyId,
  347. NodeName: classifyInfo.ClassifyName,
  348. ParentId: classifyInfo.ParentId,
  349. Level: classifyInfo.Level,
  350. Sort: classifyInfo.Sort,
  351. ModifyTime: classifyInfo.ModifyTime,
  352. }
  353. return
  354. }
  355. func (m *ClassifyMove) UpdateNodeInfoSortByParentIdAndSource(parentNodeId, nodeId, prevNodeSort int, updateSortStr string, nodeType int) (err error) {
  356. err = material.UpdateMaterialClassifySortByParentId(parentNodeId, nodeId, prevNodeSort, updateSortStr)
  357. return
  358. }
  359. func (m *ClassifyMove) GetNodeMaxSort(parentId, nodeType int) (maxSort int, err error) {
  360. maxSort, err = material.GetMaterialClassifyMaxSort(parentId)
  361. return
  362. }
  363. func (m *ClassifyMove) GetFirstNodeInfoByParentId(parentId int) (nodeInfo *models.NodeInfo, err error) {
  364. classifyInfo, err := material.GetFirstMaterialClassifyByParentId(parentId)
  365. if err != nil {
  366. return
  367. }
  368. nodeInfo = &models.NodeInfo{
  369. NodeId: classifyInfo.ClassifyId,
  370. NodeName: classifyInfo.ClassifyName,
  371. ParentId: classifyInfo.ParentId,
  372. Level: classifyInfo.Level,
  373. Sort: classifyInfo.Sort,
  374. ModifyTime: classifyInfo.ModifyTime,
  375. }
  376. return
  377. }
  378. func GetBatchSelectedMaterialList(classifyId int, keyword string, isShowMe bool, sysUser *system.Admin) (list []*material.MaterialListItems, err error, errMsg string) {
  379. var condition string
  380. var pars []interface{}
  381. if classifyId <= 0 {
  382. errMsg = "请选择分类"
  383. err = fmt.Errorf(errMsg)
  384. return
  385. }
  386. // 查询当前的分类
  387. classifyInfo, e := material.GetMaterialClassifyById(classifyId)
  388. if e != nil {
  389. errMsg = "分类不存在"
  390. err = fmt.Errorf("获取分类信息失败,Err:" + e.Error())
  391. return
  392. }
  393. // 获取所有子分类
  394. childList, e := material.GetMaterialClassifyByLevelPath(classifyInfo.LevelPath)
  395. if e != nil {
  396. errMsg = "获取分类失败"
  397. err = fmt.Errorf("获取子分类失败,Err:" + e.Error())
  398. return
  399. }
  400. // 把原先的父级levePath,替换成最新的父级序列
  401. classifyIdMap := make(map[string]struct{})
  402. classifyIds := make([]string, 0)
  403. childClassifyMap := make(map[int]*material.MaterialClassify)
  404. for _, tmp := range childList {
  405. childClassifyMap[tmp.ClassifyId] = tmp
  406. //获取字符串前缀的位置
  407. after, _ := strings.CutPrefix(tmp.LevelPath, classifyInfo.LevelPath)
  408. fmt.Println("after", after)
  409. // 拼接字符串
  410. if after != "" {
  411. ids := strings.Split(after, ",")
  412. for _, v := range ids {
  413. if _, ok := classifyIdMap[v]; !ok {
  414. classifyIds = append(classifyIds, v)
  415. classifyIdMap[v] = struct{}{}
  416. }
  417. }
  418. }
  419. }
  420. classifyIds = append(classifyIds, strconv.Itoa(classifyId))
  421. if len(classifyIds) > 0 {
  422. condition += " AND classify_id IN(" + utils.GetOrmInReplace(len(classifyIds)) + ") "
  423. pars = append(pars, classifyIds)
  424. }
  425. if keyword != "" {
  426. condition += ` AND ( material_name LIKE '%` + keyword + `%' )`
  427. }
  428. //只看我的
  429. if isShowMe {
  430. condition += ` AND sys_user_id = ? `
  431. pars = append(pars, sysUser.AdminId)
  432. }
  433. //获取图表信息
  434. list, err = material.GetMaterialListByCondition(condition, pars)
  435. if err != nil && err.Error() != utils.ErrNoRow() {
  436. errMsg = "获取素材库信息失败"
  437. err = fmt.Errorf("获取素材库信息失败,Err:" + err.Error())
  438. return
  439. }
  440. return
  441. }