caipin 4 år sedan
förälder
incheckning
880e55d3f3

+ 151 - 0
dao/contract_paid_dao.go

@@ -0,0 +1,151 @@
+/*
+ * @description:已支付相关数据操作
+ * @Author: CP
+ * @Date: 2020-12-22 14:46:06
+ * @FilePath: \construction_management\dao\contract_paid_dao.go
+ */
+package dao
+
+import (
+	"errors"
+	"fmt"
+	"strconv"
+
+	"github.com/go-xorm/xorm"
+	"go.mod/models"
+)
+
+//数据库操作引擎
+type ContractPaidDao struct {
+	engine *xorm.Engine
+}
+
+//获得一个DAO对象
+func NewContractPaidDao(engine *xorm.Engine) *ContractPaidDao {
+	return &ContractPaidDao{
+		engine: engine,
+	}
+}
+
+// 获得回款
+func (d *ContractPaidDao) Get(id int, contractsId int, bidsectionId int) *models.CmContractsPaid {
+	data := &models.CmContractsPaid{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 *ContractPaidDao) GetAll(projectId int, bidsectionId int, contractsId int) []models.CmContractsPaid {
+	datalist := make([]models.CmContractsPaid, 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 *ContractPaidDao) Add(contractsPaid *models.CmContractsPaid) error {
+	_, err := d.engine.Insert(contractsPaid)
+	return err
+}
+
+// 更新已支付
+func (d *ContractPaidDao) Update(contractsReturn *models.CmContractsPaid, 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 *ContractPaidDao) Delete(id int, contractsId int, bidsectionId int, projectId int) error {
+	data := &models.CmContractsPaid{}
+	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 *ContractPaidDao) UpdatePaidTotalPrice(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")
+	}
+
+	// 0.获得合同金额
+	contractsDetail := &models.CmContracts{}
+	_, err = d.engine.Where(" id = ? ", contractsId).Get(contractsDetail)
+	if err != nil {
+		return errors.New("未找到合同")
+	}
+
+	// 1.获得合同支付总金额
+	datalist := make([]models.CmContractsPaid, 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)
+
+	// 1-1合同状态的判定
+	contractsDetailPrice, _ := strconv.ParseFloat(contractsDetail.Price, 64)
+	// 总回款大于等于合同金额 待关闭
+	contractStatus := 0
+	if contractsPrice >= contractsDetailPrice {
+		contractStatus = 1
+	}
+
+	// 2.更新合同表 合同下回款总金额
+	_, err = session.Exec("UPDATE  cm_contracts SET `paid` = ? , status = ? where id = ? ", contractsPrice, contractStatus, contractsId)
+	if err != nil {
+		session.Rollback()
+		return errors.New("金额更新失败")
+	}
+	// 3.更新项目节 合同下回款总金额
+	_, err = session.Exec("UPDATE  cm_tree_contracts SET `contracts_paid` = ? , contract_status = ? where project_id = ? and bidsection_id=? and contract_id=? ",
+		contractsPrice, contractStatus, projectId, bidsectionId, contractsId)
+	if err != nil {
+		session.Rollback()
+		return errors.New("金额更新失败")
+	}
+	// 4.更新标段树 整个标段下回款总金额
+	_, err = session.Exec("UPDATE  cm_tree SET `contracts_paid` = ? 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
+}

+ 0 - 71
dao/contract_return_dao.go

@@ -167,74 +167,3 @@ func (d *ContractReturnDao) UpdateTotalPrice(projectId int, bidsectionId int, co
 	}
 	return nil
 }
-
-// 更新已支付总金额
-func (d *ContractReturnDao) UpdatePaidTotalPrice(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")
-	}
-
-	// 0.获得合同金额
-	contractsDetail := &models.CmContracts{}
-	_, err = d.engine.Where(" id = ? ", contractsId).Get(contractsDetail)
-	if err != nil {
-		return errors.New("未找到合同")
-	}
-
-	// 1.获得合同支付总金额
-	datalist := make([]models.CmContractsPaid, 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)
-
-	// 1-1合同状态的判定
-	contractsDetailPrice, _ := strconv.ParseFloat(contractsDetail.Price, 64)
-	// 总回款大于等于合同金额 待关闭
-	contractStatus := 0
-	if contractsPrice >= contractsDetailPrice {
-		contractStatus = 1
-	}
-
-	// 2.更新合同表 合同下回款总金额
-	_, err = session.Exec("UPDATE  cm_contracts SET `paid` = ? , status = ? where id = ? ", contractsPrice, contractStatus, contractsId)
-	if err != nil {
-		session.Rollback()
-		return errors.New("金额更新失败")
-	}
-	// 3.更新项目节 合同下回款总金额
-	_, err = session.Exec("UPDATE  cm_tree_contracts SET `contracts_paid` = ? , contract_status = ? where project_id = ? and bidsection_id=? and contract_id=? ",
-		contractsPrice, contractStatus, projectId, bidsectionId, contractsId)
-	if err != nil {
-		session.Rollback()
-		return errors.New("金额更新失败")
-	}
-	// 4.更新标段树 整个标段下回款总金额
-	_, err = session.Exec("UPDATE  cm_tree SET `contracts_paid` = ? 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
-}

+ 1 - 1
services/contract_expenditure_service.go

@@ -141,7 +141,7 @@ func (s *contractService) DeleteExpenditure(projectId int, bidsectionId int, tre
 	}
 
 	// 4.更新回款总金额
-	err = s.contractReturnDao.UpdatePaidTotalPrice(projectId, bidsectionId, id)
+	err = s.contractPaidDao.UpdatePaidTotalPrice(projectId, bidsectionId, id)
 	if err != nil {
 		return err
 	}

+ 248 - 0
services/contract_paid_service.go

@@ -0,0 +1,248 @@
+/*
+ * @description: 合同已支付 相关业务操作
+ * @Author: CP
+ * @Date: 2020-12-22 14:33:43
+ * @FilePath: \construction_management\services\contract_paid_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) PaidAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsPaid {
+	// 1.获得合同回款列表
+	// data := s.contractReturnDao.GetPage(projectId, bidsectionId, contractsId, page)
+	data := s.contractPaidDao.GetAll(projectId, bidsectionId, contractsId)
+
+	contractsReturnVM := make([]*viewmodels.ContractsPaid, 0)
+	for _, item := range data {
+		cr := s.makeContractPaidVM(&item)
+		contractsReturnVM = append(contractsReturnVM, cr)
+	}
+
+	return contractsReturnVM
+}
+
+// 创建回款信息
+func (s *contractService) PaidCreate(returnData *viewmodels.ContractsPaid, 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.CmContractsPaid{}
+	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.contractPaidDao.Add(contractsReturnCm)
+	if err != nil {
+		return err
+	}
+
+	// 4. 更新已支付总金额 -项目节树 标段树 合同表
+	err = s.contractPaidDao.UpdatePaidTotalPrice(projectId, bidsectionId, contractsId)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// 编辑已支付信息
+func (s *contractService) PaidUpdate(returnData *viewmodels.ContractsPaid, 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 已支付是否存在
+	contractPaid := s.contractPaidDao.Get(id, contractsId, bidsectionId)
+	if contractPaid.Id == 0 {
+		return errors.New("未找到已支付")
+	}
+	// 2.已支付信息
+	contractsReturnCm := &models.CmContractsPaid{}
+	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.contractPaidDao.Update(contractsReturnCm, contractsId, bidsectionId)
+	if err != nil {
+		return err
+	}
+
+	// 4. 更新已支付总金额 -项目节树 标段树 合同表
+	err = s.contractPaidDao.UpdatePaidTotalPrice(projectId, bidsectionId, contractsId)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// 删除已支付
+func (s *contractService) PaidDelete(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 已支付是否存在
+	contractPaid := s.contractPaidDao.Get(id, contractsId, bidsectionId)
+	if contractPaid.Id == 0 {
+		return errors.New("未找到已支付")
+	}
+
+	// 3.合同锁定 不能删除
+	if contract.Locking == 1 {
+		return errors.New("该合同已锁定")
+	}
+
+	// 1-2. 删除已支付
+	err := s.contractPaidDao.Delete(id, contractsId, bidsectionId, projectId)
+	if err != nil {
+		return err
+	}
+
+	// 2. 更新回款总金额 -项目节树 标段树 合同表
+	err = s.contractPaidDao.UpdatePaidTotalPrice(projectId, bidsectionId, contractsId)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (s *contractService) makeContractPaidVM(data *models.CmContractsPaid) *viewmodels.ContractsPaid {
+	viewContractsReturn := &viewmodels.ContractsPaid{}
+	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.CreateTime = data.CreateTime.Format(conf.SysTimeform)
+
+	counts, _ := s.annexDao.GetCount(1, data.Id)
+	viewContractsReturn.FileCounts = counts
+
+	return viewContractsReturn
+}
+
+// 校验回款参数
+func (s *contractService) ValidRuleContractPaidAdd(ctx iris.Context) (*viewmodels.ContractsPaid, error) {
+
+	// 创建一个存放前端传过来参数
+	contractsVaild := &viewmodels.ContractsPaid{}
+	// 存放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) ValidRuleContractPaid(ctx iris.Context) (*viewmodels.ContractsPaid, error) {
+	// 创建一个存放前端传过来参数
+	contractsVaild := &viewmodels.ContractsPaid{}
+	// 存放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) ValidRuleContractPaidDel(ctx iris.Context) (*viewmodels.ContractsPaid, error) {
+	// 创建一个存放前端传过来参数
+	contractsVaild := &viewmodels.ContractsPaid{}
+	// 存放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
+}

+ 12 - 0
services/contract_service.go

@@ -38,6 +38,10 @@ type ContractService interface {
 	ValidRuleContractRetrun(ctx iris.Context) (*viewmodels.ContractsReturn, error)
 	ValidRuleContractRetrunDel(ctx iris.Context) (*viewmodels.ContractsReturn, error)
 
+	ValidRuleContractPaidAdd(ctx iris.Context) (*viewmodels.ContractsPaid, error)
+	ValidRuleContractPaid(ctx iris.Context) (*viewmodels.ContractsPaid, error)
+	ValidRuleContractPaidDel(ctx iris.Context) (*viewmodels.ContractsPaid, error)
+
 	Get(treeId int, bidsectionId int, projectId int) *viewmodels.TreeSectionContract
 	GetSectionTreeContract(attribution string, bidsectionId int, projectId int, treeType int) []*viewmodels.Contracts
 	GetSecionTree(bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract
@@ -65,6 +69,12 @@ type ContractService interface {
 	AddExpenditure(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
 	UpdateExpenditure(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
 	DeleteExpenditure(projectId int, bidsectionId int, treeId int, id int) error
+
+	// 已支付
+	PaidAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsPaid
+	PaidCreate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, projectAccountId int) error
+	PaidUpdate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, id int) error
+	PaidDelete(projectId int, bidsectionId int, contractsId int, id int) error
 }
 
 //返回service操作类
@@ -72,6 +82,7 @@ type contractService struct {
 	treeContractDao   *dao.TreeContractDao
 	contractDao       *dao.ContractDao
 	contractReturnDao *dao.ContractReturnDao
+	contractPaidDao   *dao.ContractPaidDao
 	treeDao           *dao.TreeDao
 	annexDao          *dao.AnnexDao
 }
@@ -82,6 +93,7 @@ func NewContractService() ContractService {
 		treeContractDao:   dao.NewTreeContractDao(datasource.InstanceDbMaster()),
 		contractDao:       dao.NewContractDao(datasource.InstanceDbMaster()),
 		contractReturnDao: dao.NewContractReturnDao(datasource.InstanceDbMaster()),
+		contractPaidDao:   dao.NewContractPaidDao(datasource.InstanceDbMaster()),
 		treeDao:           dao.NewTreeDao(datasource.InstanceDbMaster()),
 		annexDao:          dao.NewAnnexDao(datasource.InstanceDbMaster()),
 	}

+ 5 - 5
web/api/contract_expenditure_api.go

@@ -23,8 +23,8 @@ import (
 // @Security ApiKeyAuth
 // @Param   bidsectionId     path    string     true        "标段ID"
 // @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,data:viewmodels.TreeSectionContract,msg:错误信息}"
-// @Router /api/contract/paid/section/all [get]
-func (c *ContractApi) GetPaidSectionAll() {
+// @Router /api/contract/expenditure/section/all [get]
+func (c *ContractApi) GetExpenditureSectionAll() {
 
 	sectionData := viewmodels.TreeSectionContract{}
 	err := c.Ctx.ReadForm(&sectionData)
@@ -80,7 +80,7 @@ func (c *ContractApi) GetPaidSectionAll() {
 	}
 }
 
-// @Summary 单个合同详情和项目节详情
+// @Summary 单个合同和项目节
 // @Tags 合同管理-支出合同
 // @Description 获得合同详情和项目节详情
 // @Accept  json
@@ -89,8 +89,8 @@ func (c *ContractApi) GetPaidSectionAll() {
 // @Param   id     path    string     true        "项目节ID"
 // @Param   bidsectionId     path    string     true        "标段ID"
 // @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,isContract:是否有合同(包含孩子们),section:viewmodels.TreeSectionContract,msg:错误信息}"
-// @Router /api/contract/paid [get]
-func (c *ContractApi) GetPaid() {
+// @Router /api/contract/expenditure [get]
+func (c *ContractApi) GetExpenditure() {
 	// 1.规则验证
 	sectionData, err := c.ServiceContract.ValidRuleGet(c.Ctx)
 	if err != nil {

+ 228 - 0
web/api/contract_paid_api.go

@@ -0,0 +1,228 @@
+/*
+ * @description: 合同已支付相关
+ * @Author: CP
+ * @Date: 2020-12-22 11:45:22
+ * @FilePath: \construction_management\web\api\contract_paid_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   contractsId     path    string     true        "合同ID"
+// @Param   bidsectionId     path    string     true        "标段ID"
+// @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
+// @Router /api/contract/paid/list [get]
+func (c *ContractApi) GetPaidList() {
+	returnData, err := c.ServiceContract.ValidRuleContractPaid(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.PaidAll(projectId, bidsectionId, contractsId, returnData.Page)
+
+	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/paid/create [post]
+func (c *ContractApi) PostPaidCreate() {
+	// 验证参数
+	returnData, err := c.ServiceContract.ValidRuleContractPaidAdd(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.PaidCreate(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/paid/update [post]
+func (c *ContractApi) PostPaidUpdate() {
+	// 验证参数
+	returnData, err := c.ServiceContract.ValidRuleContractPaidAdd(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.PaidUpdate(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/piad/delete [delete]
+func (c *ContractApi) DeletePaidDelete() {
+	// 验证参数
+	returnData, err := c.ServiceContract.ValidRuleContractPaidDel(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.PaidDelete(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": "删除成功"})
+}

+ 54 - 0
web/viewmodels/contracts_paid.go

@@ -0,0 +1,54 @@
+/*
+ * @description:合同已支出-视图
+ * @Author: CP
+ * @Date: 2020-12-22 14:25:47
+ * @FilePath: \construction_management\web\viewmodels\contracts_paid.go
+ */
+package viewmodels
+
+import validation "github.com/go-ozzo/ozzo-validation/v3"
+
+type ContractsPaid 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" `
+	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" `
+	CreateTime   string `form:"createTime" json:"createTime" `
+	FileCounts   int64  `from:"fileCounts" json:"fileCounts"`
+
+	Page int `form:"page" json:"page" `
+}
+
+// 验证方法
+func (l ContractsPaid) Validate() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.ContractsId, validation.Required.Error("合同ID不能为空")),
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
+		validation.Field(&l.Page, validation.Required.Error("页数不能为空")),
+	)
+}
+
+// 验证方法
+func (l ContractsPaid) 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 ContractsPaid) 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不能为空")),
+	)
+}