Sfoglia il codice sorgente

treelist接口完善

huangyh 6 anni fa
parent
commit
91c67caef4
3 ha cambiato i file con 330 aggiunte e 15 eliminazioni
  1. 63 15
      controllers/partial/SystemController.go
  2. 10 0
      db/common.go
  3. 257 0
      db/tree.go

+ 63 - 15
controllers/partial/SystemController.go

@@ -7,9 +7,9 @@ import (
 	"strings"
 	"time"
 
-	"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
-
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/db"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
 	sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
 )
@@ -98,9 +98,9 @@ func System_GetNavTree(c *entitys.CtrlContext) {
 	user_id := c.Ctx.GetString("user_id")
 
 	var menus []sysmodel.SysMenuTree
-	if user_id == "187c50a4-caad-4557-80c8-aca81af9f370"{
+	if user_id == "187c50a4-caad-4557-80c8-aca81af9f370" {
 		c.Db.SQL(sysmodel.Selectall_nav_tree_admin).Find(&menus)
-	}else{
+	} else {
 		c.Db.SQL(sysmodel.Selectall_nav_tree, user_id).Find(&menus)
 	}
 
@@ -289,9 +289,9 @@ func System_AddUser(c *entitys.CtrlContext) {
 
 	var user sysmodel.SysUser
 	err := c.Ctx.ShouldBindJSON(&user)
-	if err != nil{
+	if err != nil {
 		c.Ctx.JSON(500, sysmodel.SysReturn{200, "c.Ctx.ShouldBindJSON error " + err.Error(), nil})
-		return;
+		return
 	}
 
 	fmt.Println(user.LoginId, "-----add user-----", user.Password, " --- ", user.OrgId)
@@ -396,9 +396,9 @@ func System_UpdateUser(c *entitys.CtrlContext) {
 
 	var userInfo sysmodel.UserInfo
 	err := c.Ctx.BindJSON(&userInfo)
-	if err != nil{
+	if err != nil {
 		c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
-		return;
+		return
 	}
 
 	session := c.Db.NewSession()
@@ -433,7 +433,7 @@ func System_UpdateUser(c *entitys.CtrlContext) {
 		userRole.CreateTime = time.Now()
 		userRole.LastUpdateDate = time.Now()
 		userRole.DelFlag = 0
-		userRoles = append(userRoles,userRole)
+		userRoles = append(userRoles, userRole)
 	}
 	_, err = c.Db.Insert(userRoles)
 	if err != nil {
@@ -812,7 +812,7 @@ func System_UpdateMenu(c *entitys.CtrlContext) {
 // @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 func System_AddOrg(c *entitys.CtrlContext) {
-	var sysorg models.SysOrg
+	var sysorg models.SysOrganization
 	c.Ctx.BindJSON(&sysorg)
 
 	user_id := c.Ctx.GetString("user_id")
@@ -857,7 +857,7 @@ func System_DelOrg(c *entitys.CtrlContext) {
 		ids = append(ids, param.Id)
 	}
 
-	_, err := c.Db.Table(new(models.SysOrg)).In("id", ids).Update(map[string]interface{}{"del_flag": 0})
+	_, err := c.Db.Table(new(models.SysOrganization)).In("id", ids).Update(map[string]interface{}{"del_flag": 0})
 	if err != nil {
 		c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
 		return
@@ -878,7 +878,7 @@ func System_DelOrg(c *entitys.CtrlContext) {
 // @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 func System_UpdateOrg(c *entitys.CtrlContext) {
-	var sysorg models.SysOrg
+	var sysorg models.SysOrganization
 	c.Ctx.BindJSON(&sysorg)
 
 	user_id := c.Ctx.GetString("user_id")
@@ -915,8 +915,8 @@ func System_GetOrg(c *entitys.CtrlContext) {
 	c.Ctx.BindJSON(&param)
 	fmt.Println(param, "-----------")
 
-	org := models.SysOrg{}
-	err := c.Db.Table(new(sysmodel.SysOrg)).ID(param.Id).Find(&org)
+	org := models.SysOrganization{}
+	err := c.Db.Table(new(sysmodel.SysOrganization)).ID(param.Id).Find(&org)
 	if err != nil {
 		c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
 		return
@@ -943,7 +943,7 @@ func System_PageOrg(c *entitys.CtrlContext) {
 	ret := __none_func_system__(getpageinfo)
 
 	page := sysmodel.PageResult{}
-	var orgs []sysmodel.SysOrg
+	var orgs []sysmodel.SysOrganization
 	dbSession := c.Db.Table("sys_org")
 	dbSession = dbSession.Select("sys_org.*")
 
@@ -999,6 +999,54 @@ func System_PageOrg(c *entitys.CtrlContext) {
 	}
 }
 
+func System_TreeList(c *entitys.CtrlContext) {
+	tbName := c.Ctx.Query("tb_name")
+	parentFiled := c.Ctx.Query("parent_filed")
+	if parentFiled == "" {
+		parentFiled = c.Ctx.Query("parent_field")
+	}
+	parentValue := c.Ctx.Query("parent_value")
+	textFiled := c.Ctx.Query("text_filed")
+	if textFiled == "" {
+		textFiled = c.Ctx.Query("text_field")
+		if textFiled == "" {
+			textFiled = c.Ctx.Query("name_field")
+		}
+	}
+	valueFiled := c.Ctx.Query("value_filed")
+	if valueFiled == "" {
+		valueFiled = c.Ctx.Query("value_field")
+		if valueFiled == "" {
+			valueFiled = c.Ctx.Query("id_field")
+		}
+	}
+	domainchk := c.Ctx.Query("domainchk")
+	if domainchk == "" {
+		domainchk = "1" // 默认需要domain过滤
+	}
+	cntparent := c.Ctx.Query("cnt_parent")
+	if cntparent == "" {
+		cntparent = "0"
+	}
+	filter := c.Ctx.Query("filters")
+	if filter == "" {
+		filter = c.Ctx.Query("filter")
+	}
+	sord := c.Ctx.Query("sord")
+
+	user, exists := c.Ctx.Get("token")
+	if !exists {
+		c.Ctx.JSON(200, sysmodel.SysReturn{500, "token is not exists", nil})
+		return
+	}
+	nodes, err := sysdb.TreeList(c, user.(*entitys.Token), tbName, parentFiled, parentValue, textFiled, valueFiled, cntparent, domainchk, filter, sord)
+	if err != nil {
+		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nodes})
+	} else {
+		c.Ctx.JSON(200, sysmodel.SysReturn{500, "", nil})
+	}
+}
+
 func __none_func_system__(params ...interface{}) bool {
 	return true
 }

+ 10 - 0
db/common.go

@@ -0,0 +1,10 @@
+package sysdb
+
+import "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+
+func IsSuperUser(user *entitys.Token) bool {
+	if user == nil {
+		return false
+	}
+	return user.UserId == "003bf0c1-f491-43d8-a4f4-1537f168e000"
+}

+ 257 - 0
db/tree.go

@@ -0,0 +1,257 @@
+package sysdb
+
+import (
+	"container/list"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+	"strings"
+)
+
+type TreeNode struct {
+	ID     string      `json:"id"`
+	Text   string      `json:"text"`
+	Parent string      `json:"-"`
+	Nodes  []*TreeNode `json:"nodes"`
+}
+
+type ZTreeNode struct {
+	Id     string `json:"id"`
+	Parent string `json:"parent"`
+	Name   string `json:"name"`
+}
+
+type ZTreeConvertor struct {
+	IdField     string
+	NameField   string
+	ParentField string
+	CntParent   string
+
+	Maps           []map[string]string
+	ZTreeNodeArray []*ZTreeNode
+	TreeNodeArray  []*TreeNode
+}
+
+func TreeList(c *entitys.CtrlContext, user *entitys.Token, tbName, parentField, parentValue, textFiled, valueFiled, cntParent, domainchk, filter, sord string) ([]*TreeNode, error) {
+	ztConvertor := &ZTreeConvertor{}
+	domain := ""
+	if !IsSuperUser(user) {
+		if domainchk == "1" {
+			domain = user.Domain
+		}
+	}
+
+	pv := ""
+	if !IsSuperUser(user) {
+		pv = parentValue
+		if cntParent != "1" {
+			pv = ""
+		}
+	}
+
+	filterObj := &models.Filter{}
+	if len(filter) > 0 {
+		if err := json.Unmarshal([]byte(filter), filterObj); err != nil {
+			return ztConvertor.TreeNodeArray, errors.New(`filters parameter only allows {"groupOp":"AND","rules":[{"field":"org_name","op":"eq","data":"测试"}]}`)
+		}
+	}
+	paramsArr, err := GetTreeList(c, domain, tbName, parentField, textFiled, valueFiled, pv, filterObj, sord)
+	if err != nil {
+		return ztConvertor.TreeNodeArray, err
+	}
+
+	ztConvertor.IdField = valueFiled
+	ztConvertor.NameField = textFiled
+	ztConvertor.ParentField = parentField
+	ztConvertor.CntParent = cntParent
+	ztConvertor.Maps = paramsArr
+
+	if !ztConvertor.BuildTreeArray(strings.TrimSpace(pv)) {
+		return ztConvertor.TreeNodeArray, errors.New("orm.params convert to ztree error")
+	}
+
+	return ztConvertor.TreeNodeArray, nil
+
+}
+
+func GetTreeList(c *entitys.CtrlContext, domain, tbName, parentFiled, textFiled, valueFiled, parentValue string, filter *models.Filter, sord string) ([]map[string]string, error) {
+	sql := fmt.Sprintf("SELECT `%s`, `%s`, `%s` FROM `%s`", valueFiled, textFiled, parentFiled, tbName)
+
+	where := " where ("
+	groupOp := strings.ToLower(filter.GroupOp)
+
+	datas := make([]interface{}, 0)
+	isAnd := true
+	if groupOp == "or" {
+		isAnd = false
+		where += "1 <> 1"
+	} else {
+		isAnd = true
+		where += "1 = 1"
+	}
+	for _, field := range filter.Rules {
+		fData := models.FormatData(field.Op, field.Data)
+		switch fData.(type) {
+		case string:
+			{
+				if len(fData.(string)) >= 0 {
+					datas = append(datas, fData)
+				}
+			}
+		case []string:
+			{
+				fDataArr := fData.([]string)
+				for _, arr := range fDataArr {
+					if len(arr) > 0 {
+						datas = append(datas, arr)
+					}
+				}
+			}
+		}
+
+		whereStr := models.FormatOp(tbName, field.Op, field.Field, field.Data)
+
+		if len(whereStr) > 0 {
+			if isAnd {
+				where += " and "
+			} else {
+				where += " or "
+			}
+			where += whereStr
+		}
+	}
+	where += ")"
+	if domain != "" {
+		where += " and ("
+		where += fmt.Sprintf(" domain = '%s')", domain)
+	}
+
+	sql = sql + where
+
+	if parentValue != "" {
+		sql1 := fmt.Sprintf("select `%s`, `%s`, `%s` from `%s` where `%s` = ?", valueFiled, textFiled, parentFiled, tbName, valueFiled)
+		sql = sql + " union " + sql1
+		datas = append(datas, parentValue)
+	}
+
+	if strings.TrimSpace(sord) == "" {
+		sql = sql + " order by " + parentFiled
+	} else {
+		sql = sql + " order by " + sord
+	}
+
+	if len(datas) > 0 {
+		//result, err := c.Db.QueryInterface(sql, datas)
+		result, err := c.Db.QueryString(sql, datas)
+		return result, err
+	} else {
+		result, err := c.Db.QueryString(sql)
+		return result, err
+	}
+
+}
+
+func (this *ZTreeConvertor) BuildTreeArray(root string) bool {
+	rootArr := []*TreeNode{}
+	if len(this.Maps) <= 0 {
+		this.TreeNodeArray = rootArr
+		return true
+	}
+
+	paramsArr := this.Maps
+	valueFiled := this.IdField
+	parentField := this.ParentField
+	textFiled := this.NameField
+	parentValue := root
+
+	treeNodeList := list.New()
+	originNodeList := list.New()
+
+	if root != "" && this.CntParent == "1" {
+		for _, params := range paramsArr {
+			value := getStringValueByInterface(params[valueFiled], "")
+			parent := getStringValueByInterface(params[parentField], "")
+			text := getStringValueByInterface(params[textFiled], "")
+			//fmt.Println("========" + text + "-----" + value + "======" + parentValue)
+			if value == parentValue {
+				//fmt.Println("root ========" + text + "-----" + value)
+				node := &TreeNode{
+					ID:     value,
+					Text:   text,
+					Parent: parent,
+				}
+				treeNodeList.PushBack(node)
+				rootArr = append(rootArr, node)
+			} else {
+				originNodeList.PushBack(&TreeNode{
+					ID:     value,
+					Text:   text,
+					Parent: parent,
+				})
+			}
+		}
+	} else {
+		for _, params := range paramsArr {
+			value := getStringValueByInterface(params[valueFiled], "")
+			parent := getStringValueByInterface(params[parentField], "")
+			text := getStringValueByInterface(params[textFiled], "")
+			//fmt.Println("========" + text + "-----" + value + "======" + parentValue)
+			if parent == parentValue {
+				//fmt.Println("root ========" + text + "-----" + value)
+				node := &TreeNode{
+					ID:     value,
+					Text:   text,
+					Parent: parent,
+				}
+				treeNodeList.PushBack(node)
+				rootArr = append(rootArr, node)
+			} else {
+				originNodeList.PushBack(&TreeNode{
+					ID:     value,
+					Text:   text,
+					Parent: parent,
+				})
+			}
+		}
+	}
+
+	fmt.Println(len(rootArr))
+
+	for ele := treeNodeList.Front(); ele != nil; ele = ele.Next() {
+		treeNode := ele.Value.(*TreeNode)
+		//fmt.Println("=================" + treeNode.ID + "===========" + treeNode.Text)
+		originEle := originNodeList.Front()
+		if originEle == nil {
+			break
+		}
+		flag := false
+		for originEle != nil {
+			originNextEle := originEle.Next()
+			originNode := originEle.Value.(*TreeNode)
+			//fmt.Println("---------------" + originNode.ID + "------------" + originNode.Text)
+			if originNode.Parent == treeNode.ID {
+				flag = true
+				treeNodeList.InsertAfter(originNode, ele)
+				treeNode.Nodes = append(treeNode.Nodes, originNode)
+
+				originNodeList.Remove(originEle)
+			} else if flag {
+				break
+			}
+			originEle = originNextEle
+		}
+	}
+
+	this.TreeNodeArray = rootArr
+	return true
+}
+
+func getStringValueByInterface(vali interface{}, nilVal string) string {
+	if vali == nil {
+		return nilVal
+	}
+
+	return vali.(string)
+}