caipin 4 vuotta sitten
vanhempi
commit
d4f053ecae

+ 1 - 0
.gitignore

@@ -2,3 +2,4 @@
 /web/web.exe
 /go.sum
 /go.mod
+docs

+ 8 - 0
comm/account_group.go

@@ -1,3 +1,9 @@
+/*
+ * @description:账号组相关
+ * @Author: CP
+ * @Date: 2020-10-10 16:00:05
+ * @FilePath: \construction_management\comm\account_group.go
+ */
 package comm
 
 import "errors"
@@ -33,6 +39,8 @@ func (a *AccountGroup) ValidRule(index int) error {
 	}
 }
 
+// ID转文字描述
+
 // const AccountGroup:=map[string]int{
 // 	"JSDW": 1,
 //     "JLDW": 2,

+ 39 - 0
dao/bid_account_dao.go

@@ -0,0 +1,39 @@
+/*
+ * @description: 标段账号的-数据库操作
+ * @Author: CP
+ * @Date: 2020-10-21 11:54:10
+ * @FilePath: \construction_management\dao\bid_account_dao.go
+ */
+package dao
+
+import (
+	"github.com/go-xorm/xorm"
+	"go.mod/models"
+)
+
+//数据库操作引擎
+type BidAccountDao struct {
+	engine *xorm.Engine
+}
+
+//获得一个DAO对象
+func NewBidAccountDao(engine *xorm.Engine) *BidAccountDao {
+	return &BidAccountDao{
+		engine: engine,
+	}
+}
+
+//获得标段下的账号数据
+func (d *BidAccountDao) GetBidAccount(bidsectionId int, projectId int) []models.CmBidAccount {
+	datalist := make([]models.CmBidAccount, 0)
+
+	err := d.engine.
+		Where("bidsection_id = ? and project_id=?", bidsectionId, projectId).
+		Desc("id").
+		Find(&datalist)
+	if err != nil {
+		return datalist
+	} else {
+		return datalist
+	}
+}

+ 2 - 2
dao/bidsection_dao.go

@@ -28,8 +28,8 @@ func NewBidsectionDao(engine *xorm.Engine) *BidsectionDao {
 }
 
 //id获得数据
-func (d *BidsectionDao) Get(id int) *models.CmBidsection {
-	data := &models.CmBidsection{Id: id}
+func (d *BidsectionDao) Get(id int, projectId int) *models.CmBidsection {
+	data := &models.CmBidsection{Id: id, ProjectId: projectId}
 	//Get取到值后,会自动赋值到data中
 	ok, err := d.engine.Get(data)
 	if ok && err == nil {

+ 13 - 0
dao/project_account_dao.go

@@ -64,6 +64,19 @@ func (d *ProjectAccountDao) GetAll(projectId int) []models.CmProjectAccount {
 	}
 }
 
+func (d *ProjectAccountDao) GetInId(ids string) []models.CmProjectAccount {
+	datalist := make([]models.CmProjectAccount, 0)
+	err := d.engine.
+		Where("id in (?) ", ids).
+		Desc("id").
+		Find(&datalist)
+	if err != nil {
+		return datalist
+	} else {
+		return datalist
+	}
+}
+
 // 检索 账号姓名单位手机
 func (d *ProjectAccountDao) Search(name string, projectId int) []models.CmProjectAccount {
 	datalist := make([]models.CmProjectAccount, 0)

+ 3 - 3
dao/tree_dao.go

@@ -29,8 +29,8 @@ func NewTreeDao(engine *xorm.Engine) *TreeDao {
 }
 
 //id获得数据
-func (d *TreeDao) Get(id int) *models.CmTree {
-	data := &models.CmTree{Id: id, Isdelete: 0}
+func (d *TreeDao) Get(id int, projectId int) *models.CmTree {
+	data := &models.CmTree{Id: id, ProjectId: projectId, Isdelete: 0}
 	//Get取到值后,会自动赋值到data中
 	ok, err := d.engine.Get(data)
 	if ok && err == nil {
@@ -76,7 +76,7 @@ func (d *TreeDao) GetChildFolder(id int) []models.CmTree {
 	datalist := make([]models.CmTree, 0)
 	err := d.engine.
 		Asc("serial").
-		Where("parent_id=? and isdelete=0", id).
+		Where("parent_id=? and isfolder=1 and isdelete=0", id).
 		Find(&datalist)
 
 	if err != nil {

+ 1 - 0
models/cm_bid_account.go

@@ -3,5 +3,6 @@ package models
 type CmBidAccount struct {
 	Id           int `xorm:"not null pk autoincr comment('自增ID') INT(11)"`
 	BidsectionId int `xorm:"not null default 0 comment('标段ID') INT(11)"`
+	ProjectId    int `xorm:"not null default 0 comment('标段ID') INT(11)"`
 	AccountId    int `xorm:"not null default 0 comment('账号ID') INT(11)"`
 }

+ 0 - 31
models/cm_tender.go

@@ -1,31 +0,0 @@
-package models
-
-import (
-	"time"
-)
-
-type CmTender struct {
-	Id           int       `xorm:"not null pk autoincr comment('自增ID') INT(11)"`
-	Name         string    `xorm:"comment('名称') VARCHAR(128)"`
-	Status       int       `xorm:"comment('状态') TINYINT(1)"`
-	ProjectId    int       `xorm:"comment('项目id') INT(11)"`
-	UserId       int       `xorm:"comment('用户id') INT(11)"`
-	CreateTime   time.Time `xorm:"comment('创建时间') DATETIME"`
-	Category     string    `xorm:"comment('分类属性') VARCHAR(1024)"`
-	Type         int       `xorm:"comment('标段类型') TINYINT(2)"`
-	LedgerTimes  int       `xorm:"not null default 0 comment('台账审批次数') TINYINT(4)"`
-	LedgerStatus int       `xorm:"not null default 1 comment('台账审批状态') TINYINT(4)"`
-	MRule        string    `xorm:"VARCHAR(1024)"`
-	Times        int       `xorm:"comment('审批次数') TINYINT(4)"`
-	CRule        string    `xorm:"comment('变更令-规则') VARCHAR(1024)"`
-	CConnector   int       `xorm:"comment('变更令-连接符') TINYINT(4)"`
-	CRuleFirst   int       `xorm:"comment('变更令规则第一次出现') TINYINT(1)"`
-	MeasureType  string    `xorm:"VARCHAR(11)"`
-	SImType      string    `xorm:"comment('期,中间计量,模式') VARCHAR(11)"`
-	Cooperation  string    `xorm:"comment('协作人员和功能列表') TEXT"`
-	Valuation    int       `xorm:"comment('计价规范') TINYINT(4)"`
-	TotalPrice   string    `xorm:"comment('0号台账 -- 金额') DECIMAL(12,2)"`
-	DealTp       string    `xorm:"comment('签约 -- 金额') DECIMAL(12,2)"`
-	Uuid         string    `xorm:"comment('更新时间') VARCHAR(64)"`
-	Isdelete     int       `xorm:"default 0 comment('1删除') TINYINT(1)"`
-}

+ 93 - 0
services/bid_account_service.go

@@ -0,0 +1,93 @@
+/*
+ * @description:标段账号相关数据操作
+ * @Author: CP
+ * @Date: 2020-10-22 16:13:32
+ * @FilePath: \construction_management\services\bid_account_service.go
+ */
+package services
+
+import (
+	"errors"
+	"log"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/dao"
+	"go.mod/datasource"
+	"go.mod/web/utils"
+	"go.mod/web/viewmodels"
+)
+
+//定义项目用户Service接口
+type BidAccountService interface {
+	ValidRule(ctx iris.Context) (viewmodels.BidAccount, error)
+	Create(viewBidAccount viewmodels.BidAccount, projectId int) error
+}
+
+//返回service操作类
+type bidAccountService struct {
+	projectAccountDao *dao.ProjectAccountDao
+	projectDao        *dao.ProjectDao
+	bidsectionDao     *dao.BidsectionDao
+	treeDao           *dao.TreeDao
+}
+
+//创建项目用户service
+func NewBidAccountService() BidAccountService {
+	return &bidAccountService{
+		projectAccountDao: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
+		projectDao:        dao.NewProjectDao(datasource.InstanceDbMaster()),
+		bidsectionDao:     dao.NewBidsectionDao(datasource.InstanceDbMaster()),
+		treeDao:           dao.NewTreeDao(datasource.InstanceDbMaster()),
+	}
+}
+
+// 登陆验证
+func (s *bidAccountService) ValidRule(ctx iris.Context) (viewmodels.BidAccount, error) {
+	bidAccountVaild := viewmodels.BidAccount{}
+	err := ctx.ReadJSON(&bidAccountVaild)
+	if err != nil {
+		log.Println("ReadForm转换异常, error=", err)
+		return bidAccountVaild, err
+	}
+
+	err = bidAccountVaild.Validate()
+	if err != nil {
+		log.Println("登录验证, error=", err)
+		return bidAccountVaild, err
+	}
+	return bidAccountVaild, nil
+}
+
+// 新增标段于账号的关系
+func (s *bidAccountService) Create(viewBidAccount viewmodels.BidAccount, projectId int) error {
+	// 写入关系表-标段的成员数量-账号表中标段ID TODO
+	// 1.检查账号合法性
+	accountId, err := utils.GetDecryptId(viewBidAccount.AccountId)
+	if err != nil {
+		return err
+	}
+	accountData := s.projectAccountDao.Get(accountId, projectId)
+	if accountData.Id == 0 {
+		return errors.New("添加的账号不合法")
+	}
+	// 2.检查标段合法性
+	bidsectionId, err := utils.GetDecryptId(viewBidAccount.BidsectionId)
+	if err != nil {
+		return err
+	}
+	bidsection := s.bidsectionDao.Get(bidsectionId, projectId)
+	if bidsection.Id == 0 {
+		return errors.New("标段不合法")
+	}
+	// 3.检查目录的合法性
+	treeId, err := utils.GetDecryptId(viewBidAccount.FolderId)
+	if err != nil {
+		return err
+	}
+	treeData := s.treeDao.Get(treeId, projectId)
+	if treeData.Id == 0 {
+		return errors.New("目录不合法")
+	}
+
+	return nil
+}

+ 2 - 2
services/bidsection_service.go

@@ -84,13 +84,13 @@ func (s *bidsectionService) Create(data viewmodels.Bidsection) error {
 	// 创建在树中的标段
 	// 获得该深度的文件夹最大序号
 	serial := 0
-	treeNode := s.treeDao.Get(Id)
+	treeNode := s.treeDao.Get(Id, ProjectId)
 	if treeNode.Id == 0 {
 		return errors.New("上级目录不正确")
 	}
 	depth := treeNode.Depth + 1
 	attribution := fmt.Sprintf("%s%d-", treeNode.Attribution, treeNode.Serial)
-	fmt.Println(attribution)
+
 	datalist := s.treeDao.GetALLDepthByAttribution(depth, ProjectId, attribution)
 	maxIndex := len(datalist)
 	if maxIndex != 0 {

+ 34 - 2
services/project_account_service.go

@@ -10,6 +10,8 @@ import (
 	"errors"
 	"html"
 	"log"
+	"strconv"
+	"strings"
 	"time"
 
 	"github.com/kataras/iris/v12"
@@ -25,19 +27,21 @@ import (
 //定义项目用户Service接口
 type ProjectAccountService interface {
 	ValidRule(ctx iris.Context) (viewmodels.ProjectAccount, error)
-	Save(viewAccount viewmodels.ProjectAccount, id int, projectId int) error
 	Get(accountId int, projectId int) *viewmodels.ProjectAccount
 	GetAll(projectId int) []viewmodels.ProjectAccount
+	GetBidAccount(bidsectionId int, projectId int, projectAccountId int) []viewmodels.ProjectAccount
 	Search(name string, projectId int) []viewmodels.ProjectAccount
 	Add(viewAccount viewmodels.ProjectAccount, projectId int) error
+	Save(viewAccount viewmodels.ProjectAccount, id int, projectId int) error
 	Enable(id int, projectId int, enable int) error
-	Delete(id int, projectId int) error
 	ChangeAccount(id int, projectId int, viewAccount viewmodels.ProjectAccount) error
+	Delete(id int, projectId int) error
 }
 
 //返回service操作类
 type projectAccountService struct {
 	dao           *dao.ProjectAccountDao
+	bidAccountDao *dao.BidAccountDao
 	validSave     string
 	validAdd      string
 	validPassword string
@@ -47,6 +51,7 @@ type projectAccountService struct {
 func NewProjectAccountService() ProjectAccountService {
 	return &projectAccountService{
 		dao:           dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
+		bidAccountDao: dao.NewBidAccountDao(datasource.InstanceDbMaster()),
 		validSave:     "/api/projectSetting/account/save",
 		validAdd:      "/api/projectSetting/account/add",
 		validPassword: "/api/projectSetting/account/change",
@@ -116,6 +121,33 @@ func (s *projectAccountService) GetAll(projectId int) []viewmodels.ProjectAccoun
 	accountList := s.dao.GetAll(projectId)
 	accountListVM := make([]viewmodels.ProjectAccount, 0)
 	for _, data := range accountList {
+		if data.IsAdmin != 1 {
+			account := comm.MakeProjectAccountVM(&data)
+			accountListVM = append(accountListVM, account)
+		}
+	}
+	return accountListVM
+}
+
+// 获得标段下的账号
+func (s *projectAccountService) GetBidAccount(bidsectionId int, projectId int, projectAccountId int) []viewmodels.ProjectAccount {
+	// 1获得标段账号ID
+	bidAccountData := s.bidAccountDao.GetBidAccount(bidsectionId, projectId)
+
+	// 组合账号ID集合
+	idList := []string{}
+	// 管理员账号-可能不必要
+	// idList = append(idList, strconv.Itoa(projectAccountId))
+	for _, item := range bidAccountData {
+		idList = append(idList, strconv.Itoa(item.BidsectionId))
+	}
+	inId := strings.Join(idList, ",")
+
+	// 获得账号信息
+	accountData := s.dao.GetInId(inId)
+	// 格式化账号数据
+	accountListVM := make([]viewmodels.ProjectAccount, 0)
+	for _, data := range accountData {
 		account := comm.MakeProjectAccountVM(&data)
 		accountListVM = append(accountListVM, account)
 	}

+ 68 - 35
services/tree_service.go

@@ -29,10 +29,10 @@ type TreeService interface {
 	ValidRule(ctx iris.Context) (viewmodels.Tree, error)
 	Create(data viewmodels.Tree) error
 	GetAllProject(int) *viewmodels.Tree
-	Rename(viewmodels.Tree) error
-	GetFolderAndBid(string) ([]models.CmTree, error)
-	DeleteFolderAndBid(string) error
-	Move(int, int) error
+	Rename(treevm viewmodels.Tree, projectId int) error
+	GetFolderAndBid(id int, projectId int) ([]models.CmTree, error)
+	DeleteFolderAndBid(id int, projectId int) error
+	Move(id int, moveId int, projectId int) error
 }
 
 //返回service操作类
@@ -50,7 +50,7 @@ func NewTreeService() TreeService {
 // 文件夹规则验证
 func (s *treeService) ValidRule(ctx iris.Context) (viewmodels.Tree, error) {
 	folderVaild := viewmodels.Tree{}
-	err := ctx.ReadForm(&folderVaild)
+	err := ctx.ReadJSON(&folderVaild)
 	if err != nil {
 		log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
 		return folderVaild, err
@@ -92,11 +92,18 @@ func (s *treeService) GetAllProject(projectId int) *viewmodels.Tree {
 		folder.ProjectId = projectId
 		folder.Depth = data.Depth + 1
 		folder.Serial = serial
-		folder.Leaf = true
+		folder.Ancounts = data.Ancounts
+		folder.Isfolder = data.Isfolder
+		folder.IsEnd = false
+		//folder.Leaf = true
+		folder.HasFolder = false
+		folder.IsBid = false
 		folder.CreateTime = data.CreateTime.Format(conf.SysTimeform)
 		folderlist = append(folderlist, folder)
 	}
 
+	//fmt.Println(folderlist)
+
 	var data []*viewmodels.Tree
 	data = make([]*viewmodels.Tree, 0)
 	for i, _ := range folderlist {
@@ -116,6 +123,7 @@ func (s *treeService) Create(data viewmodels.Tree) error {
 	// 类型校验
 	folder := models.CmTree{}
 	folder.Name = data.Name
+	// 项目ID
 	ProjectId, err := strconv.Atoi(data.ProjectId)
 	if err != nil {
 		return err
@@ -149,7 +157,9 @@ func (s *treeService) Create(data viewmodels.Tree) error {
 		}
 	} else {
 		// 1-创建次目录-获得次级目录最大序号
-		treeNode := s.dao.Get(IdInt)
+		treeNode := s.dao.Get(IdInt, ProjectId)
+		// 去除前端depth作用-在这里获得下级目录的深度
+		depth = treeNode.Depth + 1
 		if treeNode.Id == 0 {
 			return errors.New("上级目录不正确")
 		}
@@ -178,7 +188,7 @@ func (s *treeService) Create(data viewmodels.Tree) error {
 }
 
 // 重命名
-func (s *treeService) Rename(data viewmodels.Tree) error {
+func (s *treeService) Rename(data viewmodels.Tree, projectId int) error {
 	// 获得该目录ID
 	Id, err := comm.AesDecrypt(data.Id, conf.SignSecret)
 	if err != nil {
@@ -190,7 +200,10 @@ func (s *treeService) Rename(data viewmodels.Tree) error {
 	}
 
 	// 获得树信息
-	treeData := s.dao.Get(IdInt)
+	treeData := s.dao.Get(IdInt, projectId)
+	if treeData.Id == 0 {
+		return errors.New("修改的目录不合法")
+	}
 	treeNode := models.CmTree{}
 	treeNode.Id = IdInt
 	treeNode.Name = data.Name
@@ -210,18 +223,21 @@ func (s *treeService) Rename(data viewmodels.Tree) error {
 }
 
 // 获得该目录下所有的目录和标段
-func (s *treeService) GetFolderAndBid(id string) ([]models.CmTree, error) {
+func (s *treeService) GetFolderAndBid(id int, projectId int) ([]models.CmTree, error) {
 	// 获得该目录ID
-	id, err := comm.AesDecrypt(id, conf.SignSecret)
-	if err != nil {
-		return nil, errors.New("目录解析错误")
-	}
-	IdInt, err := strconv.Atoi(id)
-	if err != nil {
-		return nil, errors.New("目录解析错误")
-	}
+	// id, err := comm.AesDecrypt(id, conf.SignSecret)
+	// if err != nil {
+	// 	return nil, errors.New("目录解析错误")
+	// }
+	// IdInt, err := strconv.Atoi(id)
+	// if err != nil {
+	// 	return nil, errors.New("目录解析错误")
+	// }
 	// 获得该目录下所有数据
-	folder := s.dao.Get(IdInt)
+	folder := s.dao.Get(id, projectId)
+	if folder.Id == 0 {
+		return nil, errors.New("目录不合法")
+	}
 	attribution := fmt.Sprintf("%s%d-", folder.Attribution, folder.Serial)
 	// 获得目录归属
 	dataList := s.dao.GetFolderAndBid(folder.ProjectId, attribution)
@@ -229,21 +245,24 @@ func (s *treeService) GetFolderAndBid(id string) ([]models.CmTree, error) {
 }
 
 // 删除该目录和所属的目录和标段
-func (s *treeService) DeleteFolderAndBid(id string) error {
+func (s *treeService) DeleteFolderAndBid(id int, projectId int) error {
 	// 获得该目录ID
-	id, err := comm.AesDecrypt(id, conf.SignSecret)
-	if err != nil {
-		return errors.New("目录解析错误")
-	}
-	IdInt, err := strconv.Atoi(id)
-	if err != nil {
-		return errors.New("目录解析错误")
-	}
+	// id, err := comm.AesDecrypt(id, conf.SignSecret)
+	// if err != nil {
+	// 	return errors.New("目录解析错误")
+	// }
+	// IdInt, err := strconv.Atoi(id)
+	// if err != nil {
+	// 	return errors.New("目录解析错误")
+	// }
 	// 获得该目录下 归属关系
-	folder := s.dao.Get(IdInt)
+	folder := s.dao.Get(id, projectId)
+	if folder.Id == 0 {
+		return errors.New("目录不合法")
+	}
 	attribution := fmt.Sprintf("%s%d-", folder.Attribution, folder.Serial)
 	// --逻辑删除 目录和数据
-	err = s.dao.DeleteFolderAndBid(folder.Id, folder.ProjectId, attribution)
+	err := s.dao.DeleteFolderAndBid(folder.Id, folder.ProjectId, attribution)
 	if err != nil {
 		return err
 	}
@@ -253,13 +272,13 @@ func (s *treeService) DeleteFolderAndBid(id string) error {
 }
 
 // 移动目录
-func (s *treeService) Move(id int, moveId int) error {
+func (s *treeService) Move(id int, moveId int, projectId int) error {
 	// 获得项目目录
-	treeNode := s.dao.Get(id)
+	treeNode := s.dao.Get(id, projectId)
 	if treeNode.Id == 0 {
 		return errors.New("目录或标段解析错误")
 	}
-	moveFolder := s.dao.Get(moveId)
+	moveFolder := s.dao.Get(moveId, projectId)
 	if moveFolder.Id == 0 {
 		return errors.New("目录解析错误")
 	}
@@ -300,6 +319,13 @@ func maketree(Data []*viewmodels.Tree, node *viewmodels.Tree) { //参数为父
 		// 	fmt.Println(*v)
 		// } //打印
 
+		// 子节点总数
+		Total := len(childs)
+		node.ChildsTotal = Total
+		// 标记最后一个元素
+		end := Total - 1
+		childs[end].IsEnd = true
+
 		// 往父节点添加子节点
 		node.Children = append(node.Children, childs[0:]...) //添加子节点
 		for _, v := range childs {                           //查询子节点的子节点,并添加到子节点
@@ -307,9 +333,16 @@ func maketree(Data []*viewmodels.Tree, node *viewmodels.Tree) { //参数为父
 			if has {
 				// 递归添加节点
 				maketree(Data, v)
+			}
+			// else {
+			// 	// 叶子节点
+			// 	node.Leaf = false
+			// }
+			// 目录下是否包含标段
+			if v.Isfolder == 0 {
+				node.IsBid = true
 			} else {
-				// 叶子节点
-				node.Leaf = false
+				node.HasFolder = true
 			}
 		}
 	}

+ 10 - 1
web/api/bidsection_api.go

@@ -27,7 +27,16 @@ func (c *BidsectionApi) Get() {
 
 }
 
-// 添标段结构
+// @Summary 新增标段
+// @Tags 目录相关-管理员
+// @Description 新增标段
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   folderId     body    string     true        "目录ID"
+// @Param   name     body    string     true        "名称"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/bidsection/create [post]
 func (c *BidsectionApi) PostCreate() {
 	ErrMsg := ""
 	// 验证内容

+ 23 - 0
web/api/project_account_api.go

@@ -52,3 +52,26 @@ func (c *ProjectAccountApi) Get() {
 		"data": AccountData,
 	})
 }
+
+// @Summary 获得项目账号列表
+// @Tags 项目账号相关
+// @Description 获得项目账号列表
+// @Security ApiKeyAuth
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/projectAccount/list [get]
+func (c *ProjectAccountApi) GetList() {
+
+	// 获得项目ID
+	projectIdInt, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+
+	AccountData := c.ServiceProjectAccount.GetAll(projectIdInt)
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "",
+		"data": AccountData,
+	})
+}

+ 1 - 1
web/api/project_api.go

@@ -54,7 +54,7 @@ func (c *ProjectApi) Get() {
 	// }
 }
 
-// 获得多个项目信息
+// 获得多个项目信息--暂无使用
 func (c *ProjectApi) GetList() {
 	// 验证内容
 	ProjectData := viewmodels.Project{}

+ 5 - 6
web/api/project_setting.go

@@ -2,7 +2,7 @@
  * @description: 项目设置相关--管理员可访问
  * @Author: CP
  * @Date: 2020-10-09 10:35:38
- * @FilePath: \construction_management\web\api\project_setting.go
+ * @FilePath: \construction_management\web\api\project_setting_api.go
  */
 package api
 
@@ -22,6 +22,7 @@ type ProjectSettingApi struct {
 	// 需要用的service
 	ServiceProjectAccount services.ProjectAccountService
 	ServiceProject        services.ProjectService
+	ServiceBidAccount     services.BidAccountService
 }
 
 // @Summary 获得项目账号列表
@@ -86,9 +87,7 @@ func (c *ProjectSettingApi) GetAccountSearch() {
 		return
 	}
 	c.Ctx.Header("X-CSRF-Token", csrf.Token(c.Ctx))
-	fmt.Println(c.Ctx.GetHeader("X-CSRF-Token"))
 
-	fmt.Println(csrf.Token(c.Ctx))
 	// 获得检索关键字
 	AccountData := viewmodels.ProjectAccount{}
 	err = c.Ctx.ReadJSON(&AccountData)
@@ -105,7 +104,7 @@ func (c *ProjectSettingApi) GetAccountSearch() {
 	})
 }
 
-// @Summary 新增账号
+// @Summary 创建账号
 // @Tags 项目设置-管理员
 // @Description 新增账号
 // @Accept  json
@@ -121,8 +120,8 @@ func (c *ProjectSettingApi) GetAccountSearch() {
 // @Param   accountGroup     body    int     true        "账号组"
 // @Param   X-CSRF-Token      header    string     true        "csrf"
 // @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
-// @Router /api/projectSetting/account/add [post]
-func (c *ProjectSettingApi) PostAccountAdd() {
+// @Router /api/projectSetting/account/create [post]
+func (c *ProjectSettingApi) PostAccountCreate() {
 	ErrMsg := ""
 	// 验证内容
 	AccountData, err := c.ServiceProjectAccount.ValidRule(c.Ctx)

+ 104 - 0
web/api/project_setting_auth_api.go

@@ -0,0 +1,104 @@
+/*
+ * @description:项目设置-权限管理
+ * @Author: CP
+ * @Date: 2020-10-20 15:47:07
+ * @FilePath: \construction_management\web\api\project_setting_auth_api.go
+ */
+
+package api
+
+import (
+	"fmt"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/web/utils"
+	"go.mod/web/viewmodels"
+)
+
+// @Summary 获得标段账号
+// @Tags 项目设置-标段成员权限-管理员
+// @Description 获得标段账号
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   bidsectionId     path    string     false        "标段ID"
+// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /api/projectSetting/bid/account [get]
+func (c *ProjectSettingApi) GetBidAccount() {
+
+	// 获得标段ID
+	TreeData := viewmodels.Tree{}
+	err := c.Ctx.ReadForm(&TreeData)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+	if TreeData.BidsectionId == "" {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "标段ID不能为空"})
+		return
+	}
+	// 解密标段ID
+	bidsectionId, err := utils.GetDecryptId(TreeData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+
+	// 获得项目ID
+	projectIdInt, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	// 获得项目账号ID
+	projectAccountIdInt, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+
+	dataList := c.ServiceProjectAccount.GetBidAccount(bidsectionId, projectIdInt, projectAccountIdInt)
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "",
+		"data": dataList,
+	})
+}
+
+// 标段中添加成员-账号
+// @Summary 获得标段账号
+// @Tags 项目设置-标段成员权限-管理员
+// @Description 获得标段账号
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   bidsectionId     path    string     false        "标段ID"
+// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /api/projectSetting/bid/account [get]
+func (c *ProjectSettingApi) PostBidAccountCreate() {
+	// 账号ID,标段ID,目录ID
+	BidAccountData, err := c.ServiceBidAccount.ValidRule(c.Ctx)
+
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": utils.FormValidError(err)})
+		return
+	}
+
+	// 获得项目ID
+	projectIdInt, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 创建标段和账号的关系
+	err = c.ServiceBidAccount.Create(BidAccountData, projectIdInt)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": ""})
+		return
+	}
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "新增成功",
+	})
+}

+ 61 - 21
web/api/tree_api.go

@@ -29,7 +29,8 @@ type TreeApi struct {
 // @Accept  json
 // @Produce  json
 // @Security ApiKeyAuth
-// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Success 200 {object} viewmodels.Tree "{code:0成功,data:viewmodels.Tree,msg:}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
 // @Router /api/tree [get]
 func (c *TreeApi) Get() {
 
@@ -53,7 +54,17 @@ func (c *TreeApi) Get() {
 	})
 }
 
-// 添加树结构
+// @Summary 新增目录
+// @Tags 目录相关-管理员
+// @Description 新增目录
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     body    string     true        "目录ID"
+// @Param   depth     body    int     true        "目录深度 顶级目录(-1)其他级目录(0)"
+// @Param   name     body    string     true        "目录名称"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/tree/create [post]
 func (c *TreeApi) PostCreate() {
 	ErrMsg := ""
 	// 验证内容
@@ -66,7 +77,6 @@ func (c *TreeApi) PostCreate() {
 		})
 		return
 	} else {
-
 		// 获得项目ID
 		projectIdInt, err := utils.GetProjectId(c.Ctx)
 		if err != nil {
@@ -110,19 +120,18 @@ func (c *TreeApi) PostRename() {
 	FolderData, err := c.ServiceTree.ValidRule(c.Ctx)
 	if err != nil {
 		ErrMsg = utils.FormValidError(err)
-		c.Ctx.JSON(iris.Map{
-			"code": -1,
-			"msg":  ErrMsg,
-		})
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
 		return
 	} else {
 		// 重命名
-		err = c.ServiceTree.Rename(FolderData)
+		projectId, err := utils.GetProjectId(c.Ctx)
 		if err != nil {
-			c.Ctx.JSON(iris.Map{
-				"code": 3,
-				"msg":  fmt.Sprintf("%s", err),
-			})
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+			return
+		}
+		err = c.ServiceTree.Rename(FolderData, projectId)
+		if err != nil {
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
 			return
 		}
 		c.Ctx.JSON(iris.Map{
@@ -132,12 +141,20 @@ func (c *TreeApi) PostRename() {
 	}
 }
 
-// 删除目录,需要删除树结构下的目录以及叶子
+// @Summary 删除目录
+// @Tags 目录相关-管理员
+// @Description 删除目录下的目录以及其他内容
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     body    string     true        "目录ID"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/tree [delete]
 func (c *TreeApi) Delete() {
 	// 获得需要删除数据
 	// api/tree/{id:int min(1)}
 	//id := c.Ctx.Params().Get("id")
-	id := c.Ctx.URLParam("id")
+	//id := c.Ctx.URLParam("id")
 	// 获得该目录下所有的目录和标段
 	// treeData, err := c.ServiceTree.GetFolderAndBid(id)
 	// if err != nil {
@@ -150,8 +167,19 @@ func (c *TreeApi) Delete() {
 	// fmt.Println(treeData)
 	// 添加锁
 
+	id, err := utils.GetDecryptId(c.Ctx.URLParam("id"))
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+	projectId, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+
 	// 删除目录以及标段
-	err := c.ServiceTree.DeleteFolderAndBid(id)
+	err = c.ServiceTree.DeleteFolderAndBid(id, projectId)
 	if err != nil {
 		c.Ctx.JSON(iris.Map{
 			"code": -1,
@@ -165,7 +193,16 @@ func (c *TreeApi) Delete() {
 	})
 }
 
-// 移动文件夹
+// @Summary 移动文件夹
+// @Tags 目录相关-管理员
+// @Description 移动文件夹
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     body    string     true        "目录ID"
+// @Param   moveId     body    string     true        "被放置的目录ID"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/tree/move [post]
 func (c *TreeApi) PostMove() {
 	// 获得目录ID和移动目录ID
 	Tree := viewmodels.Tree{}
@@ -185,13 +222,16 @@ func (c *TreeApi) PostMove() {
 		return
 	}
 
+	projectId, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+
 	// 移动目录
-	err = c.ServiceTree.Move(id, moveId)
+	err = c.ServiceTree.Move(id, moveId, projectId)
 	if err != nil {
-		c.Ctx.JSON(iris.Map{
-			"code": -1,
-			"msg":  fmt.Sprintf("%s", err),
-		})
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
 		return
 	}
 	c.Ctx.JSON(iris.Map{

+ 10 - 8
web/routes/routes.go

@@ -22,6 +22,7 @@ func Configure(b *bootstrap.Bootstrapper) {
 	ProjectService := services.NewProjectService()
 	TreeService := services.NewTreeService()
 	BidsectionService := services.NewBidsectionService()
+	BidAccountService := services.NewBidAccountService()
 	//CSRF相关
 	b.Use(middleware.SetCsrf)
 
@@ -65,6 +66,7 @@ func Configure(b *bootstrap.Bootstrapper) {
 	bidsection.Router.Use(middleware.SessionsAuth)
 	bidsection.Handle(new(controllers.BidsectionController))
 
+	// apiTree.Router.Use(middleware.JwtAuth().Serve)
 	// 接口相关
 	// 登陆接口
 	apiLogin := mvc.New(b.Party("/api/login"))
@@ -73,14 +75,6 @@ func Configure(b *bootstrap.Bootstrapper) {
 	apiLogin.Register(ProjectService)
 	apiLogin.Handle(new(api.LoginApi))
 
-	// TreeNode相关接口
-	// apiTree.Router.Use(middleware.JwtAuth().Serve)
-	apiTree := mvc.New(b.Party("/api/tree"))
-	apiTree.Register(TreeService)
-	apiTree.Router.Use(middleware.SessionsAuth)
-	apiTree.Router.Use(middleware.AccessAuth)
-	apiTree.Handle(new(api.TreeApi))
-
 	// 项目相关接口
 	apiProject := mvc.New(b.Party("/api/project"))
 	apiProject.Register(ProjectService)
@@ -106,7 +100,15 @@ func Configure(b *bootstrap.Bootstrapper) {
 	apiSetting := mvc.New(b.Party("/api/projectSetting"))
 	apiSetting.Register(ProjectAccountService)
 	apiProject.Register(ProjectService)
+	apiProject.Register(BidAccountService)
 	apiSetting.Router.Use(middleware.SessionsAuth)
 	apiSetting.Router.Use(middleware.AccessAuth)
 	apiSetting.Handle(new(api.ProjectSettingApi))
+
+	// TreeNode相关接口
+	apiTree := mvc.New(b.Party("/api/tree"))
+	apiTree.Register(TreeService)
+	apiTree.Router.Use(middleware.SessionsAuth)
+	apiTree.Router.Use(middleware.AccessAuth)
+	apiTree.Handle(new(api.TreeApi))
 }

+ 27 - 0
web/viewmodels/bid_account.go

@@ -0,0 +1,27 @@
+/*
+ * @description:标段用户关系
+ * @Author: CP
+ * @Date: 2020-10-22 16:00:19
+ * @FilePath: \construction_management\web\viewmodels\bid_account.go
+ */
+package viewmodels
+
+import validation "github.com/go-ozzo/ozzo-validation/v3"
+
+type BidAccount struct {
+	Id           string `form:"id"`
+	BidsectionId string `form:"bidsectionId"`
+	ProjectId    string `form:"projectId"`
+	AccountId    string `form:"accountId"`
+
+	FolderId string `form:"folderId"`
+}
+
+func (l BidAccount) Validate() error {
+	return validation.ValidateStruct(&l,
+		// Code cannot be empty, and the length must between 5 and 50
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段不能为空")),
+		validation.Field(&l.AccountId, validation.Required.Error("账号ID不能为空")),
+		//validation.Field(&l.Password, validation.Required.Error("密码不能为空"), validation.Length(6, 50).Error("密码最少要输入 6 个字符")),
+	)
+}

+ 2 - 1
web/viewmodels/bidsection.go

@@ -1,5 +1,5 @@
 /*
- * @description:
+ * @description:标段
  * @Author: CP
  * @Date: 2020-09-28 10:56:55
  * @FilePath: \construction_management\web\viewmodels\bidsection.go
@@ -41,5 +41,6 @@ func (l Bidsection) Validate() error {
 	return validation.ValidateStruct(&l,
 		// Code cannot be empty, and the length must between 5 and 50
 		validation.Field(&l.Name, validation.Required.Error("标段名称不能为空"), validation.Length(2, 128).Error("项目编号最少要输入 2 个字符")),
+		validation.Field(&l.FolderId, validation.Required.Error("目录ID不能为空")),
 	)
 }

+ 22 - 15
web/viewmodels/tree.go

@@ -10,23 +10,30 @@ import (
 	validation "github.com/go-ozzo/ozzo-validation/v3"
 )
 
+// Leaf 叶子节点为true 可以显示创建标段
+// IsBid为true 目录下已包含标段
 type Tree struct {
-	Id          string `form:"id" json:"id"`
-	Name        string `form:"name" json:"name"`
-	ProjectId   string `form:"projectId"`
-	TenderId    int    `form:"tenderId"`
-	ParentId    string `form:"parentId" json:"parentId"`
-	Depth       int    `form:"depth"`
-	Serial      string `form:"serial"`
-	Attribution string `form:"attribution"`
-	Isfolder    int    `form:"isfolder"`
-	CreateTime  string `form:"createTime"`
-	UpdateTime  string `form:"updateTime"`
-	MoveId      string `form:"moveId"`
+	Id           string `form:"id" json:"id" `
+	Name         string `form:"name" json:"name"`
+	ProjectId    string `form:"projectId" json:"projectId"`
+	BidsectionId string `form:"bidsectionId" json:"bidsectionId"`
+	ParentId     string `form:"parentId" json:"parentId"`
+	Depth        int    `form:"depth" json:"depth"`
+	Serial       string `form:"serial" json:"serial"`
+	Attribution  string `form:"attribution" json:"attribution"`
+	Isfolder     int    `form:"isfolder" json:"isfolder"`
+	CreateTime   string `form:"createTime" json:"createTime"`
+	UpdateTime   string `form:"updateTime" json:"updateTime"`
+	MoveId       string `form:"moveId" json:"moveId"`
+	Ancounts     int    `form:"ancounts" json:"ancounts"`
 
-	Csrf     string  `form:"csrf"`
-	Leaf     bool    `json:"leaf"`
-	Children []*Tree `json:"children"`
+	Csrf string `form:"csrf" json:"csrf"`
+	// Leaf        bool    `json:"leaf" `
+	HasFolder   bool    `json:"hasFolder" `
+	IsBid       bool    `json:"isBid" `
+	IsEnd       bool    `json:"isEnd"`
+	ChildsTotal int     `json:"childsTotal"`
+	Children    []*Tree `json:"children"`
 }
 
 func (l Tree) Validate() error {