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

+ 23 - 0
dao/contract_dao.go

@@ -39,6 +39,19 @@ func (d *ContractDao) Get(id int) *models.CmContracts {
 	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
 // contractTotal 合同总数
@@ -144,6 +157,16 @@ func (d *ContractDao) Delete(projectId int, bidsectionId int, treeId int, id int
 		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()
 	if err != nil {
 		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
 
 import (
@@ -14,7 +20,7 @@ type CmContractsReturn struct {
 	Price        string    `xorm:"default 0.00 comment('回款金额') DECIMAL(12,2)"`
 	Way          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)"`
 	Annexes      int       `xorm:"default 0 comment('附件数量') TINYINT(2)"`
 	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)
 	ValidRuleContractEdi(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
 	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
 	Close(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操作类
 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
 func NewContractService() 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
 }
 
+// 校验删除合同参数
 func (s *contractService) ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error) {
 	// 创建一个存放前端传过来参数
 	contractsVaild := &viewmodels.Contracts{}
@@ -404,6 +415,13 @@ func (s *contractService) Delete(projectId int, bidsectionId int, treeId int, id
 	if err != nil {
 		return err
 	}
+
+	// 4.更新回款总金额
+	err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, id)
+	if err != nil {
+		return err
+	}
+
 	return nil
 }
 
@@ -419,7 +437,7 @@ func (s *contractService) Close(projectId int, bidsectionId int, treeId int, id
 		return errors.New("该项目节上没有找到合同")
 	}
 
-	// 删除合同
+	// 关闭合同
 	err := s.contractDao.Close(projectId, bidsectionId, treeId, id)
 	if err != nil {
 		return err
@@ -440,7 +458,7 @@ func (s *contractService) Unlock(projectId int, bidsectionId int, treeId int, id
 		return errors.New("该项目节上没有找到合同")
 	}
 
-	// 删除合同
+	// 解锁合同
 	err := s.contractDao.Unlock(projectId, bidsectionId, treeId, id)
 	if err != nil {
 		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 {
-	// 1获得标段账号ID
+	// 1.获得标段账号ID
 	bidAccountData := s.bidAccountDao.GetBidAccount(bidsectionId, projectId)
 
 	// 组合账号ID集合

+ 1 - 1
services/project_service.go

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

+ 12 - 2
web/api/contract_api.go

@@ -245,7 +245,7 @@ func (c *ContractApi) PostIncomeCreate() {
 // @Param   signerTime     path    string     true        "签约时间"
 // @Param   remarks     path    string     true        "备注"
 // @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() {
 	// 验证参数
 	contractData, err := c.ServiceContract.ValidRuleContractEdi(c.Ctx)
@@ -385,7 +385,17 @@ func (c *ContractApi) PostClose() {
 	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() {
 	// 验证参数
 	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不能为空")),
+	)
+}