caipin 4 年之前
父節點
當前提交
4fbbd82299

+ 23 - 0
dao/contract_dao.go

@@ -39,6 +39,19 @@ func (d *ContractDao) Get(id int) *models.CmContracts {
 	return data
 	return data
 }
 }
 
 
+// 合同
+func (d *ContractDao) GetInProjectAndBidsection(id int, projectId int, bidsectionId int) *models.CmContracts {
+	data := &models.CmContracts{}
+	_, err := d.engine.
+		Where("id=? and project_id=? and bidsection_id=? ", id, projectId, bidsectionId).
+		Get(data)
+	if err != nil {
+		data.Id = 0
+		return data
+	}
+	return data
+}
+
 // 新增合同
 // 新增合同
 // contractData *models.CmContracts
 // contractData *models.CmContracts
 // contractTotal 合同总数
 // contractTotal 合同总数
@@ -144,6 +157,16 @@ func (d *ContractDao) Delete(projectId int, bidsectionId int, treeId int, id int
 		return errors.New("编辑合同出错-项目节更新失败")
 		return errors.New("编辑合同出错-项目节更新失败")
 	}
 	}
 
 
+	// 3.删除回款信息
+	_, err = session.Exec("DELETE FROM `cm_contracts_return` WHERE contracts_id=? and project_id=? and bidsection_id=? ",
+		id, projectId, bidsectionId)
+	if err != nil {
+		session.Rollback()
+		return errors.New("编辑合同出错-项目节更新失败")
+	}
+
+	// 4.删除附件-TODO
+
 	err = session.Commit()
 	err = session.Commit()
 	if err != nil {
 	if err != nil {
 		session.Rollback()
 		session.Rollback()

+ 137 - 0
dao/contract_return_dao.go

@@ -0,0 +1,137 @@
+/*
+ * @description: 回款相关数据操作
+ * @Author: CP
+ * @Date: 2020-11-30 11:19:14
+ * @FilePath: \construction_management\dao\contract_return_dao.go
+ */
+package dao
+
+import (
+	"errors"
+	"fmt"
+	"strconv"
+
+	"github.com/go-xorm/xorm"
+	"go.mod/models"
+)
+
+//数据库操作引擎
+type ContractReturnDao struct {
+	engine *xorm.Engine
+}
+
+//获得一个DAO对象
+func NewContractReturnDao(engine *xorm.Engine) *ContractReturnDao {
+	return &ContractReturnDao{
+		engine: engine,
+	}
+}
+
+// 获得回款
+func (d *ContractReturnDao) Get(id int, contractsId int, bidsectionId int) *models.CmContractsReturn {
+	data := &models.CmContractsReturn{Id: id, ContractsId: contractsId, BidsectionId: bidsectionId}
+	ok, err := d.engine.Get(data)
+	if ok && err == nil {
+		return data
+	} else {
+		data.Id = 0
+		return data
+	}
+
+}
+
+func (d *ContractReturnDao) GetAll(projectId int, bidsectionId int, contractsId int) []models.CmContractsReturn {
+	datalist := make([]models.CmContractsReturn, 0)
+
+	err := d.engine.
+		Where("project_id = ? and bidsection_id =? and contracts_id=?", projectId, bidsectionId, contractsId).
+		Desc("id").
+		Find(&datalist)
+	if err != nil {
+		return datalist
+	} else {
+		return datalist
+	}
+}
+
+// 创建回款
+func (d *ContractReturnDao) Add(contractsReturn *models.CmContractsReturn) error {
+	_, err := d.engine.Insert(contractsReturn)
+	return err
+}
+
+// 更新回款
+func (d *ContractReturnDao) Update(contractsReturn *models.CmContractsReturn, contracts_id int, bidsectionId int) error {
+
+	is, err := d.engine.Where("id = ? and contracts_id = ? and bidsection_id=? ", contractsReturn.Id, contracts_id, bidsectionId).Update(contractsReturn)
+	if is == 0 {
+		return errors.New("未找到回款信息")
+	}
+	return err
+}
+
+// 删除回款
+func (d *ContractReturnDao) Delete(id int, contractsId int, bidsectionId int, projectId int) error {
+	data := &models.CmContractsReturn{}
+	is, err := d.engine.Where("id = ? and contracts_id = ? and project_id =? and bidsection_id = ? ", id, contractsId, projectId, bidsectionId).Delete(data)
+	if is == 0 {
+		return errors.New("未找到回款")
+	}
+	return err
+}
+
+// 更新回款总金额
+func (d *ContractReturnDao) UpdateTotalPrice(projectId int, bidsectionId int, contractsId int) error {
+	session := d.engine.NewSession()
+	defer session.Close()
+	err := session.Begin()
+	if err != nil {
+		return errors.New("session出错-db")
+	}
+
+	// 1.获得合同回款总金额
+	datalist := make([]models.CmContractsReturn, 0)
+	err = d.engine.Where(" project_id =? and bidsection_id = ? ", projectId, bidsectionId).Find(&datalist)
+	if err != nil {
+		session.Rollback()
+		return errors.New("编辑合同出错-项目节更新失败")
+	}
+	priceTotal := 0.00
+	contractsPrice := 0.00
+	for _, item := range datalist {
+		price, _ := strconv.ParseFloat(item.Price, 64)
+		priceTotal = priceTotal + price
+		if item.ContractsId == contractsId {
+			contractsPrice = contractsPrice + price
+		}
+	}
+	priceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", priceTotal), 64)
+	contractsPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", contractsPrice), 64)
+
+	// 2.更新合同表 合同下回款总金额
+	_, err = session.Exec("UPDATE  cm_contracts SET `returned` = ? where id = ? ", contractsPrice, contractsId)
+	if err != nil {
+		session.Rollback()
+		return errors.New("金额更新失败")
+	}
+	// 3.更新项目节 合同下回款总金额
+	_, err = session.Exec("UPDATE  cm_tree_contracts SET `contract_returned` = ? where project_id = ? and bidsection_id=? and contract_id=? ",
+		contractsPrice, projectId, bidsectionId, contractsId)
+	if err != nil {
+		session.Rollback()
+		return errors.New("金额更新失败")
+	}
+	// 4.更新标段树 整个标段下回款总金额
+	_, err = session.Exec("UPDATE  cm_tree SET `contracts_returned` = ? where project_id = ? and bidsection_id=? ", priceTotal, projectId, bidsectionId)
+	if err != nil {
+		session.Rollback()
+		return errors.New("金额更新失败")
+	}
+
+	err = session.Commit()
+	if err != nil {
+		session.Rollback()
+		return errors.New("session出错-db")
+	}
+	return nil
+}

+ 7 - 1
models/cm_contracts_return.go

@@ -1,3 +1,9 @@
+/*
+ * @description:
+ * @Author: CP
+ * @Date: 2020-11-26 11:30:27
+ * @FilePath: \construction_management\models\cm_contracts_return.go
+ */
 package models
 package models
 
 
 import (
 import (
@@ -14,7 +20,7 @@ type CmContractsReturn struct {
 	Price        string    `xorm:"default 0.00 comment('回款金额') DECIMAL(12,2)"`
 	Price        string    `xorm:"default 0.00 comment('回款金额') DECIMAL(12,2)"`
 	Way          string    `xorm:"comment('回款方式') VARCHAR(32)"`
 	Way          string    `xorm:"comment('回款方式') VARCHAR(32)"`
 	CreateUser   string    `xorm:"comment('创建人') VARCHAR(32)"`
 	CreateUser   string    `xorm:"comment('创建人') VARCHAR(32)"`
-	AccountId    string    `xorm:"not null default '0' comment('项目用户ID') VARCHAR(32)"`
+	AccountId    int       `xorm:"not null default '0' comment('项目用户ID') VARCHAR(32)"`
 	Remarks      string    `xorm:"comment('备注') VARCHAR(512)"`
 	Remarks      string    `xorm:"comment('备注') VARCHAR(512)"`
 	Annexes      int       `xorm:"default 0 comment('附件数量') TINYINT(2)"`
 	Annexes      int       `xorm:"default 0 comment('附件数量') TINYINT(2)"`
 	CreateTime   time.Time `xorm:"comment('创建时间') DATETIME"`
 	CreateTime   time.Time `xorm:"comment('创建时间') DATETIME"`

+ 240 - 0
services/contract_return_service.go

@@ -0,0 +1,240 @@
+/*
+ * @description: 合同回款 相关业务操作
+ * @Author: CP
+ * @Date: 2020-12-01 10:21:30
+ * @FilePath: \construction_management\services\contract_return_service.go
+ */
+
+package services
+
+import (
+	"errors"
+	"log"
+	"strconv"
+	"time"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/comm"
+	"go.mod/conf"
+	"go.mod/models"
+	"go.mod/web/viewmodels"
+)
+
+func (s *contractService) makeContractRetrunVM(data *models.CmContractsReturn) *viewmodels.ContractsReturn {
+	viewContractsReturn := &viewmodels.ContractsReturn{}
+	id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
+	contractsId, _ := comm.AesEncrypt(strconv.Itoa(data.ContractsId), conf.SignSecret)
+	projectId, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
+	bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(data.BidsectionId), conf.SignSecret)
+
+	viewContractsReturn.Id = id
+	viewContractsReturn.ContractsId = contractsId
+	viewContractsReturn.ProjectId = projectId
+	viewContractsReturn.BidsectionId = bidsectionId
+	viewContractsReturn.Time = data.Time.Format(conf.SysTimeform)
+	viewContractsReturn.Price = data.Price
+
+	viewContractsReturn.Way = data.Way
+	viewContractsReturn.CreateUser = data.CreateUser
+	viewContractsReturn.Remarks = data.Remarks
+	viewContractsReturn.Annexes = data.Annexes
+	viewContractsReturn.CreateTime = data.CreateTime.Format(conf.SysTimeform)
+
+	return viewContractsReturn
+}
+
+// 校验回款参数
+func (s *contractService) ValidRuleContractRetrunAdd(ctx iris.Context) (*viewmodels.ContractsReturn, error) {
+
+	// 创建一个存放前端传过来参数
+	contractsVaild := &viewmodels.ContractsReturn{}
+	// 存放raw的值,放入到contractsVaild
+	err := ctx.ReadJSON(contractsVaild)
+	if err != nil {
+		log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
+		return contractsVaild, err
+	}
+	// 验证合同传参
+	err = contractsVaild.ValidateAdd()
+	if err != nil {
+		log.Println("参数验证错误, error=", err)
+		return contractsVaild, err
+	}
+
+	return contractsVaild, nil
+}
+
+func (s *contractService) ValidRuleContractRetrun(ctx iris.Context) (*viewmodels.ContractsReturn, error) {
+	// 创建一个存放前端传过来参数
+	contractsVaild := &viewmodels.ContractsReturn{}
+	// 存放raw的值,放入到contractsVaild
+	err := ctx.ReadForm(contractsVaild)
+	if err != nil {
+		log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
+		return contractsVaild, err
+	}
+	// 验证合同传参
+	err = contractsVaild.Validate()
+	if err != nil {
+		log.Println("参数验证错误, error=", err)
+		return contractsVaild, err
+	}
+
+	return contractsVaild, nil
+}
+
+//
+func (s *contractService) ValidRuleContractRetrunDel(ctx iris.Context) (*viewmodels.ContractsReturn, error) {
+	// 创建一个存放前端传过来参数
+	contractsVaild := &viewmodels.ContractsReturn{}
+	// 存放raw的值,放入到contractsVaild
+	err := ctx.ReadForm(contractsVaild)
+	if err != nil {
+		log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
+		return contractsVaild, err
+	}
+	// 验证合同传参
+	err = contractsVaild.ValidateDel()
+	if err != nil {
+		log.Println("参数验证错误, error=", err)
+		return contractsVaild, err
+	}
+
+	return contractsVaild, nil
+}
+
+// 获得合同下回款列表
+func (s *contractService) ReturnAll(projectId int, bidsectionId int, contractsId int) []*viewmodels.ContractsReturn {
+	// 1.获得合同回款列表
+	data := s.contractReturnDao.GetAll(projectId, bidsectionId, contractsId)
+
+	contractsReturnVM := make([]*viewmodels.ContractsReturn, 0)
+	for _, item := range data {
+		cr := s.makeContractRetrunVM(&item)
+		contractsReturnVM = append(contractsReturnVM, cr)
+	}
+
+	return contractsReturnVM
+}
+
+// 创建回款信息
+func (s *contractService) ReturnCreate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, projectAccountId int) error {
+	// 1.合同存在
+	contract := s.contractDao.GetInProjectAndBidsection(contractsId, projectId, bidsectionId)
+	if contract.Id == 0 {
+		return errors.New("未找到合同")
+	}
+
+	// 2.回款信息
+	contractsReturnCm := &models.CmContractsReturn{}
+	contractsReturnCm.ContractsId = contractsId
+	contractsReturnCm.ProjectId = projectId
+	contractsReturnCm.BidsectionId = bidsectionId
+	contractsReturnCm.Way = returnData.Way
+	contractsReturnCm.Remarks = returnData.Remarks
+	contractsReturnCm.CreateTime = time.Now()
+	contractsReturnCm.UpdateTime = time.Now()
+
+	loc, _ := time.LoadLocation("Local")
+	time, err := time.ParseInLocation(conf.SysTimeform, returnData.Time, loc)
+	if err != nil {
+		return errors.New("签约时间填写异常")
+	}
+	contractsReturnCm.Time = time
+	contractsReturnCm.CreateUser = returnData.CreateUser
+	contractsReturnCm.AccountId = projectAccountId
+
+	_, err = strconv.ParseFloat(returnData.Price, 64)
+	if err != nil {
+		return errors.New("金额填写有误")
+	}
+	contractsReturnCm.Price = returnData.Price
+
+	// 3.新增回款
+	err = s.contractReturnDao.Add(contractsReturnCm)
+	if err != nil {
+		return err
+	}
+
+	// 4. 更新回款总金额 -项目节树 标段树 合同表
+	err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, contractsId)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// 编辑回款信息
+func (s *contractService) ReturnUpdate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, id int) error {
+
+	// 1.合同存在
+	contract := s.contractDao.GetInProjectAndBidsection(contractsId, projectId, bidsectionId)
+	if contract.Id == 0 {
+		return errors.New("未找到合同")
+	}
+	// 1-1 回款是否存在
+	contractReturn := s.contractReturnDao.Get(id, contractsId, bidsectionId)
+	if contractReturn.Id == 0 {
+		return errors.New("未找到回款")
+	}
+	// 2.回款信息
+	contractsReturnCm := &models.CmContractsReturn{}
+	contractsReturnCm.Id = id
+	contractsReturnCm.Way = returnData.Way
+	contractsReturnCm.Remarks = returnData.Remarks
+
+	loc, _ := time.LoadLocation("Local")
+	time, err := time.ParseInLocation("2006-01-02", returnData.Time, loc)
+	if err != nil {
+		return errors.New("回款时间填写异常")
+	}
+	contractsReturnCm.Time = time
+
+	_, err = strconv.ParseFloat(returnData.Price, 64)
+	if err != nil {
+		return errors.New("金额填写有误")
+	}
+	contractsReturnCm.Price = returnData.Price
+
+	// 3.更新回款信息
+	err = s.contractReturnDao.Update(contractsReturnCm, contractsId, bidsectionId)
+	if err != nil {
+		return err
+	}
+
+	// 4. 更新回款总金额 -项目节树 标段树 合同表
+	err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, contractsId)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// 删除回款
+func (s *contractService) ReturnDelete(projectId int, bidsectionId int, contractsId int, id int) error {
+	// 1.合同存在
+	contract := s.contractDao.GetInProjectAndBidsection(contractsId, projectId, bidsectionId)
+	if contract.Id == 0 {
+		return errors.New("未找到合同")
+	}
+	// 1-1 回款是否存在
+	contractReturn := s.contractReturnDao.Get(id, contractsId, bidsectionId)
+	if contractReturn.Id == 0 {
+		return errors.New("未找到回款")
+	}
+
+	// 1-2. 删除回款
+	err := s.contractReturnDao.Delete(id, contractsId, bidsectionId, projectId)
+	if err != nil {
+		return err
+	}
+
+	// 2. 更新回款总金额 -项目节树 标段树 合同表
+	err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, contractsId)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

+ 26 - 8
services/contract_service.go

@@ -34,6 +34,9 @@ type ContractService interface {
 	ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error)
 	ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error)
 	ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error)
 	ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error)
 	ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error)
 	ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error)
+	ValidRuleContractRetrunAdd(ctx iris.Context) (*viewmodels.ContractsReturn, error)
+	ValidRuleContractRetrun(ctx iris.Context) (*viewmodels.ContractsReturn, error)
+	ValidRuleContractRetrunDel(ctx iris.Context) (*viewmodels.ContractsReturn, error)
 
 
 	Get(treeId int, bidsectionId int, projectId int) *viewmodels.TreeSectionContract
 	Get(treeId int, bidsectionId int, projectId int) *viewmodels.TreeSectionContract
 	GetSectionTreeContract(attribution string, bidsectionId int, projectId int) []*viewmodels.Contracts
 	GetSectionTreeContract(attribution string, bidsectionId int, projectId int) []*viewmodels.Contracts
@@ -52,21 +55,28 @@ type ContractService interface {
 	Delete(projectId int, bidsectionId int, treeId int, id int) error
 	Delete(projectId int, bidsectionId int, treeId int, id int) error
 	Close(projectId int, bidsectionId int, treeId int, id int) error
 	Close(projectId int, bidsectionId int, treeId int, id int) error
 	Unlock(projectId int, bidsectionId int, treeId int, id int) error
 	Unlock(projectId int, bidsectionId int, treeId int, id int) error
+
+	ReturnCreate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, projectAccountId int) error
+	ReturnUpdate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, id int) error
+	ReturnAll(projectId int, bidsectionId int, contractsId int) []*viewmodels.ContractsReturn
+	ReturnDelete(projectId int, bidsectionId int, contractsId int, id int) error
 }
 }
 
 
 //返回service操作类
 //返回service操作类
 type contractService struct {
 type contractService struct {
-	treeContractDao *dao.TreeContractDao
-	contractDao     *dao.ContractDao
-	treeDao         *dao.TreeDao
+	treeContractDao   *dao.TreeContractDao
+	contractDao       *dao.ContractDao
+	contractReturnDao *dao.ContractReturnDao
+	treeDao           *dao.TreeDao
 }
 }
 
 
 //创建项目用户service
 //创建项目用户service
 func NewContractService() ContractService {
 func NewContractService() ContractService {
 	return &contractService{
 	return &contractService{
-		treeContractDao: dao.NewTreeContractDao(datasource.InstanceDbMaster()),
-		contractDao:     dao.NewContractDao(datasource.InstanceDbMaster()),
-		treeDao:         dao.NewTreeDao(datasource.InstanceDbMaster()),
+		treeContractDao:   dao.NewTreeContractDao(datasource.InstanceDbMaster()),
+		contractDao:       dao.NewContractDao(datasource.InstanceDbMaster()),
+		contractReturnDao: dao.NewContractReturnDao(datasource.InstanceDbMaster()),
+		treeDao:           dao.NewTreeDao(datasource.InstanceDbMaster()),
 	}
 	}
 }
 }
 
 
@@ -229,6 +239,7 @@ func (s *contractService) ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Co
 	return contractsVaild, nil
 	return contractsVaild, nil
 }
 }
 
 
+// 校验删除合同参数
 func (s *contractService) ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error) {
 func (s *contractService) ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error) {
 	// 创建一个存放前端传过来参数
 	// 创建一个存放前端传过来参数
 	contractsVaild := &viewmodels.Contracts{}
 	contractsVaild := &viewmodels.Contracts{}
@@ -404,6 +415,13 @@ func (s *contractService) Delete(projectId int, bidsectionId int, treeId int, id
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
+
+	// 4.更新回款总金额
+	err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, id)
+	if err != nil {
+		return err
+	}
+
 	return nil
 	return nil
 }
 }
 
 
@@ -419,7 +437,7 @@ func (s *contractService) Close(projectId int, bidsectionId int, treeId int, id
 		return errors.New("该项目节上没有找到合同")
 		return errors.New("该项目节上没有找到合同")
 	}
 	}
 
 
-	// 删除合同
+	// 关闭合同
 	err := s.contractDao.Close(projectId, bidsectionId, treeId, id)
 	err := s.contractDao.Close(projectId, bidsectionId, treeId, id)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
@@ -440,7 +458,7 @@ func (s *contractService) Unlock(projectId int, bidsectionId int, treeId int, id
 		return errors.New("该项目节上没有找到合同")
 		return errors.New("该项目节上没有找到合同")
 	}
 	}
 
 
-	// 删除合同
+	// 解锁合同
 	err := s.contractDao.Unlock(projectId, bidsectionId, treeId, id)
 	err := s.contractDao.Unlock(projectId, bidsectionId, treeId, id)
 	if err != nil {
 	if err != nil {
 		return err
 		return err

+ 1 - 1
services/project_account_service.go

@@ -132,7 +132,7 @@ func (s *projectAccountService) GetAll(projectId int) []viewmodels.ProjectAccoun
 
 
 // 获得标段下的账号
 // 获得标段下的账号
 func (s *projectAccountService) GetBidAccount(bidsectionId int, projectId int, projectAccountId int) []viewmodels.ProjectAccount {
 func (s *projectAccountService) GetBidAccount(bidsectionId int, projectId int, projectAccountId int) []viewmodels.ProjectAccount {
-	// 1获得标段账号ID
+	// 1.获得标段账号ID
 	bidAccountData := s.bidAccountDao.GetBidAccount(bidsectionId, projectId)
 	bidAccountData := s.bidAccountDao.GetBidAccount(bidsectionId, projectId)
 
 
 	// 组合账号ID集合
 	// 组合账号ID集合

+ 1 - 1
services/project_service.go

@@ -70,7 +70,7 @@ func (s *projectService) ValidRule(ctx iris.Context) (viewmodels.Project, error)
 	return projectVaild, nil
 	return projectVaild, nil
 }
 }
 
 
-// 更加ID获得项目信息-TODO
+// ID获得项目信息-TODO
 func (s *projectService) Get(projectId int) *viewmodels.Project {
 func (s *projectService) Get(projectId int) *viewmodels.Project {
 
 
 	return nil
 	return nil

+ 12 - 2
web/api/contract_api.go

@@ -245,7 +245,7 @@ func (c *ContractApi) PostIncomeCreate() {
 // @Param   signerTime     path    string     true        "签约时间"
 // @Param   signerTime     path    string     true        "签约时间"
 // @Param   remarks     path    string     true        "备注"
 // @Param   remarks     path    string     true        "备注"
 // @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
 // @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
-// @Router /api/contract/income/create [post]
+// @Router /api/contract/income/Update [post]
 func (c *ContractApi) PostIncomeUpdate() {
 func (c *ContractApi) PostIncomeUpdate() {
 	// 验证参数
 	// 验证参数
 	contractData, err := c.ServiceContract.ValidRuleContractEdi(c.Ctx)
 	contractData, err := c.ServiceContract.ValidRuleContractEdi(c.Ctx)
@@ -385,7 +385,17 @@ func (c *ContractApi) PostClose() {
 	c.Ctx.JSON(iris.Map{"code": 0, "msg": "关闭成功"})
 	c.Ctx.JSON(iris.Map{"code": 0, "msg": "关闭成功"})
 }
 }
 
 
-// 解锁合同
+// @Summary 解锁合同
+// @Tags 合同管理
+// @Description 解锁合同
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     path    string     true        "合同ID"
+// @Param   treeId     path    string     true        "项目节ID"
+// @Param   bidsectionId     path    string     true        "标段ID"
+// @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
+// @Router /api/contract/unlock [post]
 func (c *ContractApi) PostUnlock() {
 func (c *ContractApi) PostUnlock() {
 	// 验证参数
 	// 验证参数
 	contractData, err := c.ServiceContract.ValidRuleContractDel(c.Ctx)
 	contractData, err := c.ServiceContract.ValidRuleContractDel(c.Ctx)

+ 246 - 0
web/api/contract_return_api.go

@@ -0,0 +1,246 @@
+/*
+ * @description:合同回款相关
+ * @Author: CP
+ * @Date: 2020-11-26 11:32:21
+ * @FilePath: \construction_management\web\api\contract_return_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
+// @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
+// @Router /api/contract/return/way [get]
+func (c *ContractApi) GetReturnWay() {
+
+	way := [8]string{"支票", "现金", "网上转账", "电汇", "邮政汇款", "支付宝", "微信支付", "其他"}
+
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "",
+		"data": way,
+	})
+}
+
+// @Summary 获得回款列表
+// @Tags 合同管理
+// @Description 获得回款列表
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   contractsId     path    string     true        "合同ID"
+// @Param   bidsectionId     path    string     true        "标段ID"
+// @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
+// @Router /api/contract/return/list [get]
+func (c *ContractApi) GetReturnList() {
+	returnData, err := c.ServiceContract.ValidRuleContractRetrun(c.Ctx)
+
+	// 项目ID
+	projectId, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 标段ID
+	bidsectionId, err := utils.GetDecryptId(returnData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 合同ID
+	contractsId, err := utils.GetDecryptId(returnData.ContractsId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	returnList := c.ServiceContract.ReturnAll(projectId, bidsectionId, contractsId)
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "",
+		"data": returnList,
+	})
+}
+
+// @Summary 新增回款内容
+// @Tags 合同管理
+// @Description 新增回款内容
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   contractsId     path    string     true        "合同ID"
+// @Param   bidsectionId     path    string     true        "标段ID"
+// @Param   time     path    string     true        "回款时间"
+// @Param   Price     path    string     true        "回款金额"
+// @Param   Way     path    string     true        "回款方式"
+// @Param   remarks     path    string     true        "备注"
+// @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
+// @Router /api/contract/return/create [post]
+func (c *ContractApi) PostReturnCreate() {
+	// 验证参数
+	returnData, err := c.ServiceContract.ValidRuleContractRetrunAdd(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	// 项目ID
+	projectId, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 标段ID
+	bidsectionId, err := utils.GetDecryptId(returnData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 合同ID
+	contractsId, err := utils.GetDecryptId(returnData.ContractsId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	// 获得项目账号ID
+	projectAccountId, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+
+	account := c.Ctx.Values().Get("account").(*viewmodels.ProjectAccount)
+	returnData.CreateUser = account.Account
+
+	err = c.ServiceContract.ReturnCreate(returnData, projectId, bidsectionId, contractsId, projectAccountId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	c.Ctx.JSON(iris.Map{"code": 0, "msg": "新增成功"})
+}
+
+// @Summary 更新回款内容
+// @Tags 合同管理
+// @Description 更新回款内容
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     path    string     true        "回款ID"
+// @Param   contractsId     path    string     true        "合同ID"
+// @Param   bidsectionId     path    string     true        "标段ID"
+// @Param   time     path    string     true        "回款时间"
+// @Param   Price     path    string     true        "回款金额"
+// @Param   Way     path    string     true        "回款方式"
+// @Param   remarks     path    string     true        "备注"
+// @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
+// @Router /api/contract/return/update [post]
+func (c *ContractApi) PostReturnUpdate() {
+	// 验证参数
+	returnData, err := c.ServiceContract.ValidRuleContractRetrunAdd(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	// 项目ID
+	projectId, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 标段ID
+	bidsectionId, err := utils.GetDecryptId(returnData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 合同ID
+	contractsId, err := utils.GetDecryptId(returnData.ContractsId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	if returnData.Id == "" {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "回款ID不能为空"})
+		return
+	}
+	// 回款ID
+	id, err := utils.GetDecryptId(returnData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	err = c.ServiceContract.ReturnUpdate(returnData, projectId, bidsectionId, contractsId, id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	c.Ctx.JSON(iris.Map{"code": 0, "msg": "编辑成功"})
+}
+
+// @Summary 删除回款
+// @Tags 合同管理
+// @Description 删除回款
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     path    string     true        "回款ID"
+// @Param   contractsId     path    string     true        "合同ID"
+// @Param   bidsectionId     path    string     true        "标段ID"
+// @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
+// @Router /api/contract/return/delete [delete]
+func (c *ContractApi) DeleteReturnDelete() {
+	// 验证参数
+	returnData, err := c.ServiceContract.ValidRuleContractRetrunDel(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	// 项目ID
+	projectId, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 标段ID
+	bidsectionId, err := utils.GetDecryptId(returnData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 合同ID
+	contractsId, err := utils.GetDecryptId(returnData.ContractsId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	// 回款ID
+	id, err := utils.GetDecryptId(returnData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	err = c.ServiceContract.ReturnDelete(projectId, bidsectionId, contractsId, id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	c.Ctx.JSON(iris.Map{"code": 0, "msg": "删除成功"})
+}

+ 52 - 0
web/viewmodels/contracts_return.go

@@ -0,0 +1,52 @@
+/*
+ * @description: 合同回款-视图
+ * @Author: CP
+ * @Date: 2020-11-27 14:51:44
+ * @FilePath: \construction_management\web\viewmodels\contracts_return.go
+ */
+package viewmodels
+
+import validation "github.com/go-ozzo/ozzo-validation/v3"
+
+type ContractsReturn struct {
+	Id           string `form:"id" json:"id" `
+	ContractsId  string `form:"contractsId" json:"contractsId" `
+	ProjectId    string `form:"projectId" json:"projectId" `
+	BidsectionId string `form:"bidsectionId" json:"bidsectionId" `
+	// TreeId       string `form:"treeId" json:"treeId" `
+	Time       string `form:"time" json:"time" `
+	Price      string `form:"price" json:"price" `
+	Way        string `form:"way" json:"way" `
+	CreateUser string `form:"createUser" json:"createUser" `
+	AccountId  string `form:"accountId" json:"accountId" `
+	Remarks    string `form:"remarks" json:"remarks" `
+	Annexes    int    `form:"annexes" json:"annexes" `
+	CreateTime string `form:"createTime" json:"createTime" `
+}
+
+// 验证方法
+func (l ContractsReturn) Validate() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.ContractsId, validation.Required.Error("合同ID不能为空")),
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
+	)
+}
+
+// 验证方法
+func (l ContractsReturn) ValidateAdd() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.ContractsId, validation.Required.Error("合同ID不能为空")),
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
+		validation.Field(&l.Time, validation.Required.Error("回款时间不能为空")),
+		validation.Field(&l.Price, validation.Required.Error("金额不能为空")),
+		validation.Field(&l.Way, validation.Required.Error("合同类型不能为空"), validation.In("支票", "现金", "网上转账", "电汇", "邮政汇款", "支付宝", "微信支付", "其他").Error("未找到相关回款类型")),
+	)
+}
+
+func (l ContractsReturn) ValidateDel() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Id, validation.Required.Error("回款ID不能为空")),
+		validation.Field(&l.ContractsId, validation.Required.Error("合同ID不能为空")),
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
+	)
+}