123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- /*
- * @description:层级文件夹数据操作相关
- * @Author: CP
- * @Date: 2020-09-11 14:43:58
- * @FilePath: \construction_management\services\tree_service.go
- */
- package services
- import (
- "encoding/json"
- "errors"
- "fmt"
- "log"
- "strconv"
- "time"
- "github.com/kataras/iris/v12"
- "go.mod/comm"
- "go.mod/conf"
- "go.mod/dao"
- "go.mod/datasource"
- "go.mod/models"
- "go.mod/web/viewmodels"
- )
- //定义项目Service接口
- type TreeService interface {
- //ValidManager(code string, account string, password string) error
- ValidRule(ctx iris.Context) (viewmodels.Tree, error)
- Create(data viewmodels.Tree) error
- GetAllProject(int) *viewmodels.Tree
- Rename(data viewmodels.Tree) error
- }
- //返回service操作类
- type foldertService struct {
- dao *dao.TreeDao
- }
- //创建项目service
- func NewTreeService() TreeService {
- return &foldertService{
- dao: dao.NewTreeDao(datasource.InstanceDbMaster()),
- }
- }
- // 文件夹规则验证
- func (s *foldertService) ValidRule(ctx iris.Context) (viewmodels.Tree, error) {
- folderVaild := viewmodels.Tree{}
- err := ctx.ReadForm(&folderVaild)
- if err != nil {
- log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
- return folderVaild, err
- }
- err = folderVaild.Validate()
- if err != nil {
- log.Println("文件夹验证, error=", err)
- return folderVaild, err
- }
- return folderVaild, nil
- }
- // 获得项目文件夹相关
- func (s *foldertService) GetAllProject(projectId int) *viewmodels.Tree {
- datalist := s.dao.GetAllTree(projectId)
- folderlist := make([]viewmodels.Tree, 0)
- // 生成根
- folder := viewmodels.Tree{}
- id, _ := comm.AesEncrypt(strconv.Itoa(0), conf.SignSecret)
- parentId, _ := comm.AesEncrypt(strconv.Itoa(-1), conf.SignSecret)
- folder.Id = id
- folder.Name = "root"
- folder.ParentId = parentId
- folderlist = append(folderlist, folder)
- // 加入数据
- for _, data := range datalist {
- folder := viewmodels.Tree{}
- //folder.Id = comm.Encrypt([]byte(conf.SignSecret), []byte(strconv.Itoa(data.Id)))
- id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
- parentId, _ := comm.AesEncrypt(strconv.Itoa(data.ParentId), conf.SignSecret)
- projectId, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
- serial, _ := comm.AesEncrypt(strconv.Itoa(data.Serial), conf.SignSecret)
- folder.Id = id
- folder.Name = data.Name
- folder.ParentId = parentId
- folder.ProjectId = projectId
- folder.Depth = data.Depth + 1
- folder.Serial = serial
- folder.Leaf = true
- folder.CreateTime = data.CreateTime.Format(conf.SysTimeform)
- folderlist = append(folderlist, folder)
- }
- var data []*viewmodels.Tree
- data = make([]*viewmodels.Tree, 0)
- for i, _ := range folderlist {
- var a *viewmodels.Tree
- a = &folderlist[i]
- data = append(data, a)
- }
- node := &folderlist[0] //父节点
- maketree(data, node) //调用生成tree
- //transformjson(node) //转化为json
- return node
- }
- // 新增一个文件夹
- func (s *foldertService) Create(data viewmodels.Tree) error {
- // 类型校验
- folder := models.CmTree{}
- folder.Name = data.Name
- ProjectId, err := strconv.Atoi(data.ProjectId)
- if err != nil {
- return err
- }
- // 获得该目录ID
- Id, err := comm.AesDecrypt(data.Id, conf.SignSecret)
- if err != nil {
- return err
- }
- IdInt, err1 := strconv.Atoi(Id)
- if err1 != nil {
- return err1
- }
- // 该目录中是否有标段
- bidlist := s.dao.GetBidsection(IdInt)
- if len(bidlist) > 0 {
- return errors.New("该文件夹已存在标段,不能在新增目录")
- }
- // 获得该深度的文件夹最大序号
- datalist := s.dao.GetAllDepth(data.Depth, ProjectId)
- maxIndex := len(datalist)
- serial := 0
- if maxIndex != 0 {
- serial = datalist[maxIndex-1].Serial + 1
- }
- // 设置归属
- if data.Depth != 0 {
- treeNode := s.dao.Get(IdInt)
- if treeNode.Id == 0 {
- return errors.New("上级目录不正确")
- }
- folder.Attribution = treeNode.Attribution + strconv.Itoa(treeNode.Serial) + "-"
- folder.ParentId = IdInt
- }
- folder.ProjectId = ProjectId
- folder.Serial = serial
- folder.Depth = data.Depth
- folder.Isfolder = 1
- folder.CreateTime = time.Now()
- folder.UpdateTime = time.Now()
- err = s.dao.Create(&folder)
- if err != nil {
- return errors.New("添加目录出错")
- }
- return nil
- }
- // 重命名
- func (s *foldertService) Rename(data viewmodels.Tree) error {
- // 获得该目录ID
- Id, err := comm.AesDecrypt(data.Id, conf.SignSecret)
- if err != nil {
- return err
- }
- IdInt, err1 := strconv.Atoi(Id)
- if err1 != nil {
- return err1
- }
- // 装配需要更新的数据
- folder := models.CmTree{}
- folder.Id = IdInt
- folder.Name = data.Name
- err = s.dao.Update(&folder, []string{"Name"})
- if err != nil {
- return errors.New("目录重命名出错")
- }
- return nil
- }
- // 创建一颗树
- func maketree(Data []*viewmodels.Tree, node *viewmodels.Tree) { //参数为父节点,添加父节点的子节点指针切片
- childs, _ := havechild(Data, node) //判断节点是否有子节点并返回
- if childs != nil {
- // fmt.Printf("\n")
- // fmt.Println(*node)
- // fmt.Println("子节点:")
- // for _, v := range childs {
- // fmt.Println(*v)
- // } //打印
- // 往父节点添加子节点
- node.Children = append(node.Children, childs[0:]...) //添加子节点
- for _, v := range childs { //查询子节点的子节点,并添加到子节点
- _, has := havechild(Data, v)
- if has {
- // 递归添加节点
- maketree(Data, v)
- } else {
- // 叶子节点
- node.Leaf = false
- }
- }
- }
- }
- // 是否有子树
- func havechild(Data []*viewmodels.Tree, node *viewmodels.Tree) (child []*viewmodels.Tree, yes bool) {
- for _, v := range Data {
- if v.ParentId == node.Id {
- child = append(child, v)
- }
- }
- if child != nil {
- yes = true
- }
- return
- }
- func transformjson(Data *viewmodels.Tree) { //转为json
- Jsondata, _ := json.Marshal(Data)
- fmt.Println(string(Jsondata))
- }
- //now := comm.NowUnix()
- //comm.FormatFromUnixTime(now)
- // ParentIdInt := 0
- // if data.ParentId != "" {
- // ParentId, err := comm.AesDecrypt(data.ParentId, conf.SignSecret)
- // if err != nil {
- // return err
- // }
- // ParentIdInt, err = strconv.Atoi(ParentId)
- // if err != nil {
- // ParentIdInt = 0
- // }
- // }
|