tree_service.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. /*
  2. * @description:层级文件夹数据操作相关
  3. * @Author: CP
  4. * @Date: 2020-09-11 14:43:58
  5. * @FilePath: \construction_management\services\tree_service.go
  6. */
  7. package services
  8. import (
  9. "encoding/json"
  10. "errors"
  11. "fmt"
  12. "log"
  13. "strconv"
  14. "time"
  15. "github.com/kataras/iris/v12"
  16. "go.mod/comm"
  17. "go.mod/conf"
  18. "go.mod/dao"
  19. "go.mod/datasource"
  20. "go.mod/models"
  21. "go.mod/web/viewmodels"
  22. )
  23. //定义项目Service接口
  24. type TreeService interface {
  25. //ValidManager(code string, account string, password string) error
  26. ValidRule(ctx iris.Context) (viewmodels.Tree, error)
  27. ValidRuleBidsectionType(ctx iris.Context) (viewmodels.Permission, error)
  28. Create(data viewmodels.Tree) error
  29. GetAllProject(projectId int) *viewmodels.Tree
  30. GetAllContract(projectId int, account *models.CmProjectAccount, bidsectionType int) *viewmodels.FolderContract
  31. Rename(treevm viewmodels.Tree, projectId int) error
  32. GetFolderAndBid(id int, projectId int) ([]models.CmTree, error)
  33. DeleteFolderAndBid(id int, projectId int) error
  34. Move(id int, moveId int, projectId int) error
  35. }
  36. //返回service操作类
  37. type treeService struct {
  38. dao *dao.TreeDao
  39. permissionAccountDao *dao.PermissionAccountDao
  40. }
  41. //创建项目service
  42. func NewTreeService() TreeService {
  43. return &treeService{
  44. dao: dao.NewTreeDao(datasource.InstanceDbMaster()),
  45. permissionAccountDao: dao.NewPermissionAccountDao(datasource.InstanceDbMaster()),
  46. }
  47. }
  48. // 文件夹规则验证
  49. func (s *treeService) ValidRule(ctx iris.Context) (viewmodels.Tree, error) {
  50. folderVaild := viewmodels.Tree{}
  51. err := ctx.ReadJSON(&folderVaild)
  52. if err != nil {
  53. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  54. return folderVaild, err
  55. }
  56. err = folderVaild.Validate()
  57. if err != nil {
  58. log.Println("文件夹验证, error=", err)
  59. return folderVaild, err
  60. }
  61. return folderVaild, nil
  62. }
  63. // 文件夹规则验证
  64. func (s *treeService) ValidRuleBidsectionType(ctx iris.Context) (viewmodels.Permission, error) {
  65. folderVaild := viewmodels.Permission{}
  66. err := ctx.ReadForm(&folderVaild)
  67. if err != nil {
  68. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  69. return folderVaild, err
  70. }
  71. err = folderVaild.ValidateType()
  72. if err != nil {
  73. log.Println("请求标段类型验证, error=", err)
  74. return folderVaild, err
  75. }
  76. return folderVaild, nil
  77. }
  78. // 获得项目下 相关文件夹-整个树结构
  79. func (s *treeService) GetAllProject(projectId int) *viewmodels.Tree {
  80. datalist := s.dao.GetAllTree(projectId)
  81. folderlist := make([]*viewmodels.Tree, 0)
  82. // 生成根
  83. folder := &viewmodels.Tree{}
  84. id, _ := comm.AesEncrypt(strconv.Itoa(0), conf.SignSecret)
  85. parentId, _ := comm.AesEncrypt(strconv.Itoa(-1), conf.SignSecret)
  86. folder.Id = id
  87. folder.Name = "根目录"
  88. folder.Isfolder = 1
  89. folder.ParentId = parentId
  90. folder.Children = make([]*viewmodels.Tree, 0)
  91. folderlist = append(folderlist, folder)
  92. // 加入数据
  93. for _, data := range datalist {
  94. folder := &viewmodels.Tree{}
  95. //folder.Id = comm.Encrypt([]byte(conf.SignSecret), []byte(strconv.Itoa(data.Id)))
  96. id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
  97. parentId, _ := comm.AesEncrypt(strconv.Itoa(data.ParentId), conf.SignSecret)
  98. projectId, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
  99. serial, _ := comm.AesEncrypt(strconv.Itoa(data.Serial), conf.SignSecret)
  100. bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(data.BidsectionId), conf.SignSecret)
  101. folder.Id = id
  102. folder.Name = data.Name
  103. folder.ParentId = parentId
  104. folder.ProjectId = projectId
  105. folder.BidsectionId = bidsectionId
  106. folder.Depth = data.Depth + 1
  107. folder.Serial = serial
  108. folder.Accounts = data.Accounts
  109. folder.Isfolder = data.Isfolder
  110. folder.IsEnd = false
  111. //folder.Leaf = true
  112. folder.HasFolder = false
  113. folder.IsBid = false
  114. folder.CreateTime = data.CreateTime.Format(conf.SysTimeform)
  115. folderlist = append(folderlist, folder)
  116. }
  117. //fmt.Println(folderlist)
  118. //var data []*viewmodels.Tree
  119. // data := make([]*viewmodels.Tree, 0)
  120. // for i, _ := range folderlist {
  121. // var a *viewmodels.Tree
  122. // a = &folderlist[i]
  123. // data = append(data, a)
  124. // }
  125. node := folderlist[0] //父节点
  126. maketree(folderlist, node) //调用生成tree
  127. //transformjson(node) //转化为json
  128. return node
  129. }
  130. // 获得合同管理的目录
  131. func (s *treeService) GetAllContract(projectId int, account *models.CmProjectAccount, bidsectionType int) *viewmodels.FolderContract {
  132. datalist := s.dao.GetAllTree(projectId)
  133. folderlist := make([]viewmodels.FolderContract, 0)
  134. // 2.获得该账号的权限
  135. permissionData := s.permissionAccountDao.GetProjectIdAccountId(projectId, account.Id)
  136. // 生成根
  137. folder := viewmodels.FolderContract{}
  138. id, _ := comm.AesEncrypt(strconv.Itoa(0), conf.SignSecret)
  139. parentId, _ := comm.AesEncrypt(strconv.Itoa(-1), conf.SignSecret)
  140. folder.Id = id
  141. folder.Name = "root"
  142. folder.ParentId = parentId
  143. folder.Isfolder = 1
  144. // folder.Children = make([]*viewmodels.FolderContract, 0)
  145. folderlist = append(folderlist, folder)
  146. // 加入数据
  147. for _, data := range datalist {
  148. flag := true
  149. // 标段过滤开始
  150. if data.BidsectionId != 0 && account.IsAdmin != 1 {
  151. flag = false
  152. }
  153. // 过滤没有权限访问的标段-管理员不需要过滤
  154. if data.BidsectionId != 0 && account.IsAdmin != 1 {
  155. permission := map[string]int{}
  156. for _, item := range permissionData {
  157. if data.BidsectionId == item.BidsectionId {
  158. // 区别合同,安全,质量
  159. if bidsectionType == 1 {
  160. json.Unmarshal([]byte(item.SafePermission), &permission)
  161. } else if bidsectionType == 2 {
  162. json.Unmarshal([]byte(item.QualityPermission), &permission)
  163. } else if bidsectionType == 0 {
  164. json.Unmarshal([]byte(item.ContractPermission), &permission)
  165. // fmt.Println(permission)
  166. // if permission["access"] == 1 {
  167. // flag = true
  168. // break
  169. // }
  170. } else {
  171. return nil
  172. }
  173. if permission["access"] == 1 {
  174. flag = true
  175. break
  176. }
  177. }
  178. }
  179. }
  180. // 标段过滤结束
  181. if flag {
  182. folder := viewmodels.FolderContract{}
  183. id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
  184. parentId, _ := comm.AesEncrypt(strconv.Itoa(data.ParentId), conf.SignSecret)
  185. projectId, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
  186. bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(data.BidsectionId), conf.SignSecret)
  187. folder.Id = id
  188. folder.Name = data.Name
  189. folder.ParentId = parentId
  190. folder.ProjectId = projectId
  191. folder.BidsectionId = bidsectionId
  192. // 合同数据
  193. folder.Contracts = data.Contracts
  194. contractsIncome, _ := strconv.ParseFloat(data.ContractsIncome, 64)
  195. contractsReturned, _ := strconv.ParseFloat(data.ContractsReturned, 64)
  196. folder.ContractsIncome = fmt.Sprintf("%G", contractsIncome)
  197. folder.ContractsReturned = fmt.Sprintf("%G", contractsReturned)
  198. // 汇款进度
  199. ContractsIncome, err := strconv.ParseFloat(data.ContractsIncome, 64)
  200. if err != nil {
  201. ContractsIncome = 0
  202. }
  203. ContractsReturned, err := strconv.ParseFloat(data.ContractsReturned, 64)
  204. if err != nil || ContractsReturned == 0 {
  205. ContractsReturned = 0
  206. folder.ContractsIncomeProgress = "0%"
  207. } else {
  208. folder.ContractsIncomeProgress = fmt.Sprintf("%.0f", (ContractsReturned/ContractsIncome)*100) + "%"
  209. }
  210. contractsPay, _ := strconv.ParseFloat(data.ContractsPay, 64)
  211. contractsPaid, _ := strconv.ParseFloat(data.ContractsPaid, 64)
  212. folder.ContractsPay = fmt.Sprintf("%G", contractsPay)
  213. folder.ContractsPaid = fmt.Sprintf("%G", contractsPaid)
  214. // 支付进度
  215. ContractsPay, err := strconv.ParseFloat(data.ContractsPay, 64)
  216. if err != nil {
  217. ContractsPay = 0
  218. }
  219. ContractsPaid, err := strconv.ParseFloat(data.ContractsPaid, 64)
  220. if err != nil || ContractsPaid == 0 {
  221. ContractsPaid = 0
  222. folder.ContractsPayProgress = "0%"
  223. } else {
  224. folder.ContractsPayProgress = fmt.Sprintf("%.0f", (ContractsPaid/ContractsPay)*100) + "%"
  225. }
  226. // 安全
  227. folder.SafeTotal = data.SafeTotal
  228. folder.SafeRectification = data.SafeRectification
  229. folder.SafeRectificationFinish = data.SafeRectificationFinish
  230. folder.SafeRectificationIn = data.SafeRectificationIn
  231. folder.SafeApproval = data.SafeApproval
  232. folder.SafeClose = data.SafeClose
  233. // 质量
  234. folder.QualityTotal = data.QualityTotal
  235. folder.QualityApproval = data.QualityApproval
  236. folder.QualityRectification = data.QualityRectification
  237. folder.QualityRectificationFinish = data.QualityRectificationFinish
  238. folder.QualityRectificationIn = data.QualityRectificationIn
  239. folder.QualityClose = data.QualityClose
  240. folder.Isfolder = data.Isfolder
  241. folder.IsEnd = false
  242. folder.HasFolder = false
  243. folder.IsBid = false
  244. folderlist = append(folderlist, folder)
  245. }
  246. }
  247. var data []*viewmodels.FolderContract
  248. data = make([]*viewmodels.FolderContract, 0)
  249. for i, _ := range folderlist {
  250. var a *viewmodels.FolderContract
  251. a = &folderlist[i]
  252. data = append(data, a)
  253. }
  254. node := &folderlist[0] //父节点
  255. comm.MakeFolderContract(data, node)
  256. // 求和
  257. // dataLenght := len(data) + 4
  258. s.filterFolder(node)
  259. // 删除空目录
  260. ChildrenShow := make([]*viewmodels.FolderContract, 0)
  261. for _, item := range node.Children {
  262. if item.IsHidden == 0 {
  263. ChildrenShow = append(ChildrenShow, item)
  264. }
  265. }
  266. node.Children = ChildrenShow
  267. // node.Children = s.copyShowFolder(node.Children)
  268. // fmt.Println(node)
  269. return node
  270. }
  271. // 复制出需要展示的目录
  272. // func (s *treeService) copyShowFolder(children []*viewmodels.FolderContract) []*viewmodels.FolderContract {
  273. // ChildrenShow := make([]*viewmodels.FolderContract, 0)
  274. // for _, item := range children {
  275. // if item.IsHidden == 0 {
  276. // ChildrenShow = append(ChildrenShow, item)
  277. // }
  278. // }
  279. // return ChildrenShow
  280. // }
  281. func (s *treeService) filterFolder(node *viewmodels.FolderContract) {
  282. if node == nil {
  283. return
  284. }
  285. // 目录下是否为空目录 1空目录
  286. isEmptyFolder := 1
  287. length := len(node.Children)
  288. // 如果length为0叶子节点---为目录才需要遍历
  289. if length == 0 {
  290. // 1.如果是目录-已经为叶子目录不需要遍历
  291. // 2.是标段 目录不为空
  292. if node.Isfolder == 0 {
  293. isEmptyFolder = 0
  294. }
  295. } else {
  296. // 1.遍历目录下
  297. for i := 0; i < length; i++ {
  298. // 2.该节点下子对象 从0-length 依次进入
  299. s.filterFolder(node.Children[i])
  300. // 后序-父节点逻辑 处理完0 ... -length
  301. // 2-1 是标段 设置目录不为空
  302. if node.Children[i].Isfolder == 0 {
  303. // 有标段
  304. isEmptyFolder = 0
  305. } else {
  306. // 2-2 是目录 ----后序遍历,最后一层下的孩子们是否能删除 走完三个点后返回到父亲
  307. // 2-2-1 可展示目录 集合
  308. ChildrenShow := make([]*viewmodels.FolderContract, 0)
  309. // 2-2-2 目录下内容
  310. if len(node.Children[i].Children) != 0 {
  311. // 2-2-3 内容中是否有需要显示的目录
  312. for _, item := range node.Children[i].Children {
  313. // 2-2-4 有 设置为需要显示并拷贝显示内容
  314. if item.IsHidden == 0 {
  315. ChildrenShow = append(ChildrenShow, item)
  316. node.Children[i].IsHidden = 0
  317. }
  318. }
  319. }
  320. // 2-2-5 覆盖父亲节点的显示内容
  321. node.Children[i].Children = ChildrenShow
  322. // s.copyShowFolder(node.Children[i].Children)
  323. // fmt.Println("==========filterFolder执行完成")
  324. // fmt.Println(node.Children[i].Name)
  325. // fmt.Println(fmt.Sprintf("删除:%d", node.Children[i].IsHidden))
  326. // fmt.Println(node.Children[i].Children)
  327. }
  328. }
  329. }
  330. // fmt.Println("=========================进入")
  331. // fmt.Println(node.Name)
  332. // fmt.Println(fmt.Sprintf("空目录:%d", isEmptyFolder))
  333. // 后序的第一位叶子节点 如果目录为空,设置不显示
  334. if isEmptyFolder == 1 {
  335. node.IsHidden = 1
  336. }
  337. }
  338. // 新增一个文件夹
  339. func (s *treeService) Create(data viewmodels.Tree) error {
  340. // 类型校验
  341. folder := models.CmTree{}
  342. folder.Name = data.Name
  343. // 项目ID
  344. ProjectId, err := strconv.Atoi(data.ProjectId)
  345. if err != nil {
  346. return err
  347. }
  348. // 获得该目录ID
  349. Id, err := comm.AesDecrypt(data.Id, conf.SignSecret)
  350. if err != nil {
  351. return err
  352. }
  353. IdInt, err1 := strconv.Atoi(Id)
  354. if err1 != nil {
  355. return err1
  356. }
  357. // 该目录中是否有标段
  358. bidlist := s.dao.GetBidsection(IdInt)
  359. if len(bidlist) > 0 {
  360. return errors.New("该文件夹已存在标段,不能在新增目录")
  361. }
  362. // 获得该深度的文件夹最大序号
  363. serial := 0
  364. depth := data.Depth + 1
  365. if data.Depth == -1 {
  366. // 1-创建顶级目录--获得最大序号
  367. datalist := s.dao.GetAllDepth(depth, ProjectId)
  368. maxIndex := len(datalist)
  369. if maxIndex != 0 {
  370. serial = datalist[maxIndex-1].Serial + 1
  371. }
  372. } else {
  373. // 1-创建次目录-获得次级目录最大序号
  374. treeNode := s.dao.Get(IdInt, ProjectId)
  375. // 去除前端depth作用-在这里获得下级目录的深度
  376. depth = treeNode.Depth + 1
  377. if treeNode.Id == 0 {
  378. return errors.New("上级目录不正确")
  379. }
  380. attribution := fmt.Sprintf("%s%d-", treeNode.Attribution, treeNode.Serial)
  381. datalist := s.dao.GetALLDepthByAttribution(depth, ProjectId, attribution)
  382. maxIndex := len(datalist)
  383. if maxIndex != 0 {
  384. serial = datalist[maxIndex-1].Serial + 1
  385. }
  386. // 设置归属
  387. folder.Attribution = attribution //treeNode.Attribution + strconv.Itoa(treeNode.Serial) + "-"
  388. folder.ParentId = IdInt
  389. }
  390. folder.ProjectId = ProjectId
  391. folder.Serial = serial
  392. folder.Depth = depth
  393. folder.Isfolder = 1
  394. folder.CreateTime = time.Now()
  395. folder.UpdateTime = time.Now()
  396. folder.ContractsIncome = "0"
  397. folder.ContractsPaid = "0"
  398. folder.ContractsPay = "0"
  399. folder.ContractsReturned = "0"
  400. err = s.dao.Create(&folder)
  401. if err != nil {
  402. log.Println("添加目录出错, error=", err)
  403. return errors.New("添加目录出错")
  404. }
  405. return nil
  406. }
  407. // 重命名
  408. func (s *treeService) Rename(data viewmodels.Tree, projectId int) error {
  409. // 获得该目录ID
  410. Id, err := comm.AesDecrypt(data.Id, conf.SignSecret)
  411. if err != nil {
  412. return err
  413. }
  414. IdInt, err1 := strconv.Atoi(Id)
  415. if err1 != nil {
  416. return err1
  417. }
  418. // 获得树信息
  419. treeData := s.dao.Get(IdInt, projectId)
  420. if treeData.Id == 0 {
  421. return errors.New("修改的目录不合法")
  422. }
  423. treeNode := models.CmTree{}
  424. treeNode.Id = IdInt
  425. treeNode.Name = data.Name
  426. if treeData.Isfolder == 1 {
  427. // 目录
  428. err = s.dao.Update(&treeNode, []string{"Name"})
  429. } else {
  430. // 标段
  431. treeNode.BidsectionId = treeData.BidsectionId
  432. err = s.dao.Rename(&treeNode, []string{"Name"})
  433. }
  434. if err != nil {
  435. return err
  436. }
  437. return nil
  438. }
  439. // 获得该目录下所有的目录和标段
  440. func (s *treeService) GetFolderAndBid(id int, projectId int) ([]models.CmTree, error) {
  441. // 获得该目录ID
  442. // id, err := comm.AesDecrypt(id, conf.SignSecret)
  443. // if err != nil {
  444. // return nil, errors.New("目录解析错误")
  445. // }
  446. // IdInt, err := strconv.Atoi(id)
  447. // if err != nil {
  448. // return nil, errors.New("目录解析错误")
  449. // }
  450. // 获得该目录下所有数据
  451. folder := s.dao.Get(id, projectId)
  452. if folder.Id == 0 {
  453. return nil, errors.New("目录不合法")
  454. }
  455. attribution := fmt.Sprintf("%s%d-", folder.Attribution, folder.Serial)
  456. // 获得目录归属
  457. dataList := s.dao.GetFolderAndBid(folder.ProjectId, attribution)
  458. return dataList, nil
  459. }
  460. // 删除该目录和所属的目录和标段
  461. func (s *treeService) DeleteFolderAndBid(id int, projectId int) error {
  462. // 获得该目录ID
  463. // id, err := comm.AesDecrypt(id, conf.SignSecret)
  464. // if err != nil {
  465. // return errors.New("目录解析错误")
  466. // }
  467. // IdInt, err := strconv.Atoi(id)
  468. // if err != nil {
  469. // return errors.New("目录解析错误")
  470. // }
  471. // 获得该目录下 归属关系
  472. folder := s.dao.Get(id, projectId)
  473. if folder.Id == 0 {
  474. return errors.New("目录不合法")
  475. }
  476. attribution := fmt.Sprintf("%s%d-", folder.Attribution, folder.Serial)
  477. // --逻辑删除 目录和数据
  478. err := s.dao.DeleteFolderAndBid(folder.Id, folder.ProjectId, attribution)
  479. if err != nil {
  480. return err
  481. }
  482. // TODO -加入堆栈 物理删除数据
  483. return nil
  484. }
  485. // 移动目录
  486. func (s *treeService) Move(id int, moveId int, projectId int) error {
  487. // 获得项目目录
  488. treeNode := s.dao.Get(id, projectId)
  489. if treeNode.Id == 0 {
  490. return errors.New("目录或标段解析错误")
  491. }
  492. targetFolder := &models.CmTree{}
  493. // id为0是跟目录
  494. if moveId == 0 {
  495. // id
  496. targetFolder.Id = 0
  497. // 1.获得最大序号
  498. // seriallist := s.dao.GetALLDepthByAttribution(0, projectId, "")
  499. // maxIndex := len(seriallist)
  500. // serial := 0
  501. // if maxIndex != 0 {
  502. // serial = seriallist[maxIndex-1].Serial + 1
  503. // }
  504. // targetFolder.Serial = serial
  505. targetFolder.Serial = 0
  506. // 2.归属
  507. targetFolder.Attribution = ""
  508. // 3.深度depth-根目录为-1
  509. targetFolder.Depth = -1
  510. // 4.为目录
  511. targetFolder.Isfolder = 1
  512. // 5.项目ID
  513. targetFolder.ProjectId = projectId
  514. // fmt.Println(targetFolder)
  515. // if targetFolder.Id == 0 {
  516. // return errors.New("目录解析错误-测试")
  517. // }
  518. } else {
  519. targetFolder = s.dao.Get(moveId, projectId)
  520. if targetFolder.Id == 0 {
  521. return errors.New("目录解析错误")
  522. }
  523. }
  524. // 目录必须是目录
  525. if targetFolder.Isfolder == 0 {
  526. return errors.New("目标不是文件夹")
  527. }
  528. // 目录的目标不能是自己
  529. if id == moveId {
  530. return errors.New("目标目录是原目录-不能移动")
  531. }
  532. // 移动的是目录
  533. if treeNode.Isfolder == 1 {
  534. // 1.目录下不能有标段
  535. // 被移动的目录存在标段
  536. moveBidList := s.dao.GetBidsection(moveId)
  537. if len(moveBidList) > 0 {
  538. return errors.New("该目录中存在标段,不能移动")
  539. }
  540. } else {
  541. // 标段
  542. // 1.移动的目录是否为叶子节点
  543. moveBidList := s.dao.GetChildFolder(moveId)
  544. if len(moveBidList) > 0 {
  545. return errors.New("该目录中存在其他目录,不能移动")
  546. }
  547. }
  548. err := s.dao.Move(treeNode, targetFolder)
  549. if err != nil {
  550. return err
  551. }
  552. return nil
  553. }
  554. // 创建一颗树...interface{}
  555. func maketree(Data []*viewmodels.Tree, node *viewmodels.Tree) { //参数为父节点,添加父节点的子节点指针切片
  556. childs, _ := havechild(Data, node) //判断节点是否有子节点并返回
  557. if childs != nil {
  558. // fmt.Printf("\n")
  559. // fmt.Println(*node)
  560. // fmt.Println("子节点:")
  561. // for _, v := range childs {
  562. // fmt.Println(*v)
  563. // } //打印
  564. // 子节点总数
  565. Total := len(childs)
  566. node.ChildsTotal = Total
  567. // 标记最后一个元素
  568. end := Total - 1
  569. childs[end].IsEnd = true
  570. // 往父节点添加子节点
  571. node.Children = append(node.Children, childs[0:]...) //添加子节点
  572. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  573. _, has := havechild(Data, v)
  574. if has {
  575. // 递归添加节点
  576. maketree(Data, v)
  577. }
  578. // else {
  579. // // 叶子节点
  580. // node.Leaf = false
  581. // }
  582. // 目录下是否包含标段
  583. if v.Isfolder == 0 {
  584. node.IsBid = true
  585. } else {
  586. node.HasFolder = true
  587. }
  588. }
  589. }
  590. }
  591. // 是否有子树
  592. func havechild(Data []*viewmodels.Tree, node *viewmodels.Tree) (child []*viewmodels.Tree, yes bool) {
  593. for _, v := range Data {
  594. if v.ParentId == node.Id {
  595. child = append(child, v)
  596. }
  597. }
  598. if child != nil {
  599. yes = true
  600. }
  601. return
  602. }
  603. func transformjson(Data *viewmodels.Tree) { //转为json
  604. Jsondata, _ := json.Marshal(Data)
  605. fmt.Println(string(Jsondata))
  606. }
  607. //now := comm.NowUnix()
  608. //comm.FormatFromUnixTime(now)
  609. // ParentIdInt := 0
  610. // if data.ParentId != "" {
  611. // ParentId, err := comm.AesDecrypt(data.ParentId, conf.SignSecret)
  612. // if err != nil {
  613. // return err
  614. // }
  615. // ParentIdInt, err = strconv.Atoi(ParentId)
  616. // if err != nil {
  617. // ParentIdInt = 0
  618. // }
  619. // }