tree_service.go 7.3 KB

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