github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/server/repo/field.go (about)

     1  package serverRepo
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/easysoft/zendata/internal/pkg/model"
     7  	"gorm.io/gorm"
     8  )
     9  
    10  type FieldRepo struct {
    11  	DB *gorm.DB `inject:""`
    12  }
    13  
    14  func (r *FieldRepo) GetDefFieldTree(defId uint) (root *model.ZdField, err error) {
    15  	fields, err := r.ListByDef(defId)
    16  
    17  	if err != nil {
    18  		return nil, err
    19  	}
    20  	if len(fields) == 0 {
    21  		return nil, fmt.Errorf("no fields")
    22  	}
    23  
    24  	root = fields[0]
    25  	children := make([]*model.ZdField, 0)
    26  	if len(fields) > 1 {
    27  		children = fields[1:]
    28  	}
    29  
    30  	r.makeTree(children, root)
    31  	return
    32  }
    33  
    34  func (r *FieldRepo) CreateTreeNode(defId, targetId uint, name string, mode string) (field *model.ZdField, err error) {
    35  	field = &model.ZdField{DefID: defId}
    36  	field.Field = name
    37  	if mode == "root" {
    38  		field.DefID = defId
    39  		field.ParentID = 0
    40  	} else {
    41  		var target model.ZdField
    42  
    43  		err = r.DB.Where("id=?", targetId).First(&target).Error
    44  		field.DefID = target.DefID
    45  
    46  		if mode == "child" {
    47  			field.ParentID = target.ID
    48  		} else {
    49  			field.ParentID = target.ParentID
    50  		}
    51  		field.Ord = r.GetMaxOrder(field.ParentID)
    52  	}
    53  
    54  	err = r.DB.Save(field).Error
    55  	return
    56  }
    57  
    58  func (r *FieldRepo) GetMaxOrder(parentId uint) (ord int) {
    59  	var preChild model.ZdField
    60  	err := r.DB.
    61  		Where("parentID=?", parentId).
    62  		Order("ord DESC").Limit(1).
    63  		First(&preChild).Error
    64  
    65  	if err != nil {
    66  		ord = 1
    67  	}
    68  	ord = preChild.Ord + 1
    69  
    70  	return
    71  }
    72  
    73  func (r *FieldRepo) ListByDef(defId uint) (fields []*model.ZdField, err error) {
    74  	err = r.DB.Where("defID=?", defId).Order("parentID ASC ,ord ASC").Find(&fields).Error
    75  	return
    76  }
    77  
    78  func (r *FieldRepo) Get(fieldId uint) (field model.ZdField, err error) {
    79  	err = r.DB.Where("id=?", fieldId).First(&field).Error
    80  	return
    81  }
    82  
    83  func (r *FieldRepo) Save(field *model.ZdField) (err error) {
    84  	err = r.DB.Save(field).Error
    85  	return
    86  }
    87  func (r *FieldRepo) UpdateRange(rang string, id uint) (err error) {
    88  	err = r.DB.Model(&model.ZdField{}).Where("id=?", id).Update("range", rang).Error
    89  
    90  	return
    91  }
    92  
    93  func (r *FieldRepo) makeTree(Data []*model.ZdField, node *model.ZdField) { //参数为父节点,添加父节点的子节点指针切片
    94  	children, _ := r.haveChild(Data, node) //判断节点是否有子节点并返回
    95  	if children != nil {
    96  		node.Fields = append(node.Fields, children[0:]...) //添加子节点
    97  		for _, v := range children {                       //查询子节点的子节点,并添加到子节点
    98  			_, has := r.haveChild(Data, v)
    99  			if has {
   100  				r.makeTree(Data, v) //递归添加节点
   101  			}
   102  		}
   103  	}
   104  }
   105  
   106  func (r *FieldRepo) haveChild(Data []*model.ZdField, node *model.ZdField) (child []*model.ZdField, yes bool) {
   107  	for _, v := range Data {
   108  		if v.ParentID == node.ID {
   109  			child = append(child, v)
   110  		}
   111  	}
   112  	if child != nil {
   113  		yes = true
   114  	}
   115  	return
   116  }
   117  
   118  func (r *FieldRepo) Remove(id uint) (err error) {
   119  	field := model.ZdField{}
   120  	field.ID = id
   121  	err = r.DB.Delete(field).Error
   122  
   123  	return
   124  }
   125  
   126  func (r *FieldRepo) GetChildren(defId, fieldId uint) (children []*model.ZdField, err error) {
   127  	err = r.DB.Where("defID=? AND parentID=?", defId, fieldId).Find(&children).Error
   128  	return
   129  }
   130  
   131  func (r *FieldRepo) SetIsRange(fieldId uint, b bool) (err error) {
   132  	err = r.DB.Model(&model.ZdField{}).
   133  		Where("id = ?", fieldId).Update("isRange", b).Error
   134  
   135  	return
   136  }
   137  
   138  func (r *FieldRepo) AddOrderForTargetAndNextCases(srcID uint, targetOrder int, targetParentID uint) (err error) {
   139  	sql := fmt.Sprintf(`update %s set ord = ord + 1 where ord >= %d and parentID = %d and id!=%d`,
   140  		(&model.ZdField{}).TableName(), targetOrder, targetParentID, srcID)
   141  	err = r.DB.Exec(sql).Error
   142  
   143  	return
   144  }
   145  
   146  func (r *FieldRepo) AddOrderForNextCases(srcID uint, targetOrder int, targetParentID uint) (err error) {
   147  	sql := fmt.Sprintf(`update %s set ord = ord + 1 where ord > %d and parentID = %d and id!=%d`,
   148  		(&model.ZdField{}).TableName(), targetOrder, targetParentID, srcID)
   149  	err = r.DB.Exec(sql).Error
   150  
   151  	return
   152  }
   153  
   154  func (r *FieldRepo) UpdateOrdAndParent(field model.ZdField) (err error) {
   155  	err = r.DB.Model(&field).UpdateColumns(model.ZdField{Ord: field.Ord, ParentID: field.ParentID}).Error
   156  
   157  	return
   158  }
   159  
   160  func NewFieldRepo(db *gorm.DB) *FieldRepo {
   161  	return &FieldRepo{DB: db}
   162  }