tree_service.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. Create(data viewmodels.Tree) error
  28. GetAllProject(int) *viewmodels.Tree
  29. Rename(data viewmodels.Tree) error
  30. }
  31. //返回service操作类
  32. type foldertService struct {
  33. dao *dao.TreeDao
  34. }
  35. //创建项目service
  36. func NewTreeService() TreeService {
  37. return &foldertService{
  38. dao: dao.NewTreeDao(datasource.InstanceDbMaster()),
  39. }
  40. }
  41. // 文件夹规则验证
  42. func (s *foldertService) ValidRule(ctx iris.Context) (viewmodels.Tree, error) {
  43. folderVaild := viewmodels.Tree{}
  44. err := ctx.ReadForm(&folderVaild)
  45. if err != nil {
  46. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  47. return folderVaild, err
  48. }
  49. err = folderVaild.Validate()
  50. if err != nil {
  51. log.Println("文件夹验证, error=", err)
  52. return folderVaild, err
  53. }
  54. return folderVaild, nil
  55. }
  56. // 获得项目文件夹相关
  57. func (s *foldertService) GetAllProject(projectId int) *viewmodels.Tree {
  58. datalist := s.dao.GetAllTree(projectId)
  59. folderlist := make([]viewmodels.Tree, 0)
  60. // 生成根
  61. folder := viewmodels.Tree{}
  62. id, _ := comm.AesEncrypt(strconv.Itoa(0), conf.SignSecret)
  63. parentId, _ := comm.AesEncrypt(strconv.Itoa(-1), conf.SignSecret)
  64. folder.Id = id
  65. folder.Name = "root"
  66. folder.ParentId = parentId
  67. folderlist = append(folderlist, folder)
  68. // 加入数据
  69. for _, data := range datalist {
  70. folder := viewmodels.Tree{}
  71. //folder.Id = comm.Encrypt([]byte(conf.SignSecret), []byte(strconv.Itoa(data.Id)))
  72. id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
  73. parentId, _ := comm.AesEncrypt(strconv.Itoa(data.ParentId), conf.SignSecret)
  74. projectId, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
  75. serial, _ := comm.AesEncrypt(strconv.Itoa(data.Serial), conf.SignSecret)
  76. folder.Id = id
  77. folder.Name = data.Name
  78. folder.ParentId = parentId
  79. folder.ProjectId = projectId
  80. folder.Depth = data.Depth + 1
  81. folder.Serial = serial
  82. folder.Leaf = true
  83. folder.CreateTime = data.CreateTime.Format(conf.SysTimeform)
  84. folderlist = append(folderlist, folder)
  85. }
  86. var data []*viewmodels.Tree
  87. data = make([]*viewmodels.Tree, 0)
  88. for i, _ := range folderlist {
  89. var a *viewmodels.Tree
  90. a = &folderlist[i]
  91. data = append(data, a)
  92. }
  93. node := &folderlist[0] //父节点
  94. maketree(data, node) //调用生成tree
  95. //transformjson(node) //转化为json
  96. return node
  97. }
  98. // 新增一个文件夹
  99. func (s *foldertService) Create(data viewmodels.Tree) error {
  100. // 类型校验
  101. folder := models.CmTree{}
  102. folder.Name = data.Name
  103. ProjectId, err := strconv.Atoi(data.ProjectId)
  104. if err != nil {
  105. return err
  106. }
  107. // 获得该目录ID
  108. Id, err := comm.AesDecrypt(data.Id, conf.SignSecret)
  109. if err != nil {
  110. return err
  111. }
  112. IdInt, err1 := strconv.Atoi(Id)
  113. if err1 != nil {
  114. return err1
  115. }
  116. // 该目录中是否有标段
  117. bidlist := s.dao.GetBidsection(IdInt)
  118. if len(bidlist) > 0 {
  119. return errors.New("该文件夹已存在标段,不能在新增目录")
  120. }
  121. // 获得该深度的文件夹最大序号
  122. datalist := s.dao.GetAllDepth(data.Depth, ProjectId)
  123. maxIndex := len(datalist)
  124. serial := 0
  125. if maxIndex != 0 {
  126. serial = datalist[maxIndex-1].Serial + 1
  127. }
  128. // 设置归属
  129. if data.Depth != 0 {
  130. treeNode := s.dao.Get(IdInt)
  131. if treeNode.Id == 0 {
  132. return errors.New("上级目录不正确")
  133. }
  134. folder.Attribution = treeNode.Attribution + strconv.Itoa(treeNode.Serial) + "-"
  135. folder.ParentId = IdInt
  136. }
  137. folder.ProjectId = ProjectId
  138. folder.Serial = serial
  139. folder.Depth = data.Depth
  140. folder.Isfolder = 1
  141. folder.CreateTime = time.Now()
  142. folder.UpdateTime = time.Now()
  143. err = s.dao.Create(&folder)
  144. if err != nil {
  145. return errors.New("添加目录出错")
  146. }
  147. return nil
  148. }
  149. // 重命名
  150. func (s *foldertService) Rename(data viewmodels.Tree) error {
  151. // 获得该目录ID
  152. Id, err := comm.AesDecrypt(data.Id, conf.SignSecret)
  153. if err != nil {
  154. return err
  155. }
  156. IdInt, err1 := strconv.Atoi(Id)
  157. if err1 != nil {
  158. return err1
  159. }
  160. // 装配需要更新的数据
  161. folder := models.CmTree{}
  162. folder.Id = IdInt
  163. folder.Name = data.Name
  164. err = s.dao.Update(&folder, []string{"Name"})
  165. if err != nil {
  166. return errors.New("目录重命名出错")
  167. }
  168. return nil
  169. }
  170. // 创建一颗树
  171. func maketree(Data []*viewmodels.Tree, node *viewmodels.Tree) { //参数为父节点,添加父节点的子节点指针切片
  172. childs, _ := havechild(Data, node) //判断节点是否有子节点并返回
  173. if childs != nil {
  174. // fmt.Printf("\n")
  175. // fmt.Println(*node)
  176. // fmt.Println("子节点:")
  177. // for _, v := range childs {
  178. // fmt.Println(*v)
  179. // } //打印
  180. // 往父节点添加子节点
  181. node.Children = append(node.Children, childs[0:]...) //添加子节点
  182. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  183. _, has := havechild(Data, v)
  184. if has {
  185. // 递归添加节点
  186. maketree(Data, v)
  187. } else {
  188. // 叶子节点
  189. node.Leaf = false
  190. }
  191. }
  192. }
  193. }
  194. // 是否有子树
  195. func havechild(Data []*viewmodels.Tree, node *viewmodels.Tree) (child []*viewmodels.Tree, yes bool) {
  196. for _, v := range Data {
  197. if v.ParentId == node.Id {
  198. child = append(child, v)
  199. }
  200. }
  201. if child != nil {
  202. yes = true
  203. }
  204. return
  205. }
  206. func transformjson(Data *viewmodels.Tree) { //转为json
  207. Jsondata, _ := json.Marshal(Data)
  208. fmt.Println(string(Jsondata))
  209. }
  210. //now := comm.NowUnix()
  211. //comm.FormatFromUnixTime(now)
  212. // ParentIdInt := 0
  213. // if data.ParentId != "" {
  214. // ParentId, err := comm.AesDecrypt(data.ParentId, conf.SignSecret)
  215. // if err != nil {
  216. // return err
  217. // }
  218. // ParentIdInt, err = strconv.Atoi(ParentId)
  219. // if err != nil {
  220. // ParentIdInt = 0
  221. // }
  222. // }