|  | @@ -8,15 +8,11 @@ package services
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  |  	"errors"
 | 
	
		
			
				|  |  | -	"fmt"
 | 
	
		
			
				|  |  |  	"html"
 | 
	
		
			
				|  |  |  	"log"
 | 
	
		
			
				|  |  | -	"strconv"
 | 
	
		
			
				|  |  |  	"time"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"github.com/kataras/iris/v12"
 | 
	
		
			
				|  |  | -	"go.mod/comm"
 | 
	
		
			
				|  |  | -	"go.mod/conf"
 | 
	
		
			
				|  |  |  	"go.mod/dao"
 | 
	
		
			
				|  |  |  	"go.mod/datasource"
 | 
	
		
			
				|  |  |  	"go.mod/models"
 | 
	
	
		
			
				|  | @@ -32,56 +28,16 @@ type ContractService interface {
 | 
	
		
			
				|  |  |  	ValidRuleSectionNot(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
 | 
	
		
			
				|  |  |  	ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
 | 
	
		
			
				|  |  |  	ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
 | 
	
		
			
				|  |  | -	ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error)
 | 
	
		
			
				|  |  | -	ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error)
 | 
	
		
			
				|  |  | -	ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error)
 | 
	
		
			
				|  |  | -	ValidRuleContractClose(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)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	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, treeType int) *viewmodels.TreeSectionContract
 | 
	
		
			
				|  |  | -	GetSectionTreeContract(attribution string, bidsectionId int, projectId int, treeType int) []*viewmodels.Contracts
 | 
	
		
			
				|  |  | -	GetSecionTree(bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract
 | 
	
		
			
				|  |  | -	SetSection(templateNumber int, bidsectionId int, projectIdInt int, treeType int) error
 | 
	
		
			
				|  |  | -	SectionAdd(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) (*models.CmTreeContracts, error)
 | 
	
		
			
				|  |  | -	ContractSectionAdd(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) (*models.CmTreeContracts, error)
 | 
	
		
			
				|  |  | -	SectionSave(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
 | 
	
		
			
				|  |  | -	UpdateSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
 | 
	
		
			
				|  |  | -	SectionDelete(treeId int, bidsectionId int, projectId int, treeType int) error
 | 
	
		
			
				|  |  | -	MoveDepth(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
 | 
	
		
			
				|  |  | -	MoveSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int, treeType int) error
 | 
	
		
			
				|  |  | -	GetSecionTreeNotContract(bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	GetContract(contractId int) *viewmodels.Contracts
 | 
	
		
			
				|  |  | -	Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
 | 
	
		
			
				|  |  | -	Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
 | 
	
		
			
				|  |  | -	Delete(projectId int, bidsectionId int, treeId int, id int) error
 | 
	
		
			
				|  |  | -	Close(projectId int, bidsectionId int, treeId int, id int, treeType int) error
 | 
	
		
			
				|  |  | -	Unlock(projectId int, bidsectionId int, treeId int, id int, treeType int) error
 | 
	
		
			
				|  |  | -	GetSurvey(bidsectionId int, projectId int, contractsType int) map[string]interface{}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	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, page int) []*viewmodels.ContractsReturn
 | 
	
		
			
				|  |  | -	ReturnDelete(projectId int, bidsectionId int, contractsId int, id int) error
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	//支出合同
 | 
	
		
			
				|  |  | -	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
 | 
	
		
			
				|  |  | +	GetSecionTree() *viewmodels.TreeSectionContract
 | 
	
		
			
				|  |  | +	SetSection(templateNumber int) error
 | 
	
		
			
				|  |  | +	SectionAdd(sectionData *viewmodels.TreeSectionContract) (*models.CmTreeContracts, error)
 | 
	
		
			
				|  |  | +	SectionSave(sectionData *viewmodels.TreeSectionContract) error
 | 
	
		
			
				|  |  | +	UpdateSerial(sectionData *viewmodels.TreeSectionContract) error
 | 
	
		
			
				|  |  | +	SectionDelete(treeId int) error
 | 
	
		
			
				|  |  | +	MoveDepth(sectionData *viewmodels.TreeSectionContract) error
 | 
	
		
			
				|  |  | +	MoveSerial(sectionData *viewmodels.TreeSectionContract) error
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  //返回service操作类
 | 
	
	
		
			
				|  | @@ -253,107 +209,10 @@ func (s *contractService) ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Co
 | 
	
		
			
				|  |  |  	return contractsVaild, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// 校验编辑接口
 | 
	
		
			
				|  |  | -func (s *contractService) ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error) {
 | 
	
		
			
				|  |  | -	// 创建一个存放前端传过来参数
 | 
	
		
			
				|  |  | -	contractsVaild := &viewmodels.Contracts{}
 | 
	
		
			
				|  |  | -	// 存放raw的值,放入到contractsVaild
 | 
	
		
			
				|  |  | -	err := ctx.ReadJSON(contractsVaild)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
 | 
	
		
			
				|  |  | -		return contractsVaild, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	// 验证合同传参
 | 
	
		
			
				|  |  | -	err = contractsVaild.ValidateEdi()
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		log.Println("参数验证错误, error=", err)
 | 
	
		
			
				|  |  | -		return contractsVaild, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	contractsVaild.Content = html.EscapeString(contractsVaild.Content)
 | 
	
		
			
				|  |  | -	contractsVaild.Name = html.EscapeString(contractsVaild.Name)
 | 
	
		
			
				|  |  | -	contractsVaild.Price = html.EscapeString(contractsVaild.Price)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	contractsVaild.PartyA = html.EscapeString(contractsVaild.PartyA)
 | 
	
		
			
				|  |  | -	contractsVaild.PartyASigner = html.EscapeString(contractsVaild.PartyASigner)
 | 
	
		
			
				|  |  | -	contractsVaild.PartyB = html.EscapeString(contractsVaild.PartyB)
 | 
	
		
			
				|  |  | -	contractsVaild.PartyBSigner = html.EscapeString(contractsVaild.PartyBSigner)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return contractsVaild, nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 校验删除合同参数
 | 
	
		
			
				|  |  | -func (s *contractService) ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error) {
 | 
	
		
			
				|  |  | -	// 创建一个存放前端传过来参数
 | 
	
		
			
				|  |  | -	contractsVaild := &viewmodels.Contracts{}
 | 
	
		
			
				|  |  | -	// 存放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) ValidRuleContractClose(ctx iris.Context) (*viewmodels.Contracts, error) {
 | 
	
		
			
				|  |  | -	// 创建一个存放前端传过来参数
 | 
	
		
			
				|  |  | -	contractsVaild := &viewmodels.Contracts{}
 | 
	
		
			
				|  |  | -	// 存放raw的值,放入到contractsVaild
 | 
	
		
			
				|  |  | -	err := ctx.ReadJSON(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) Get(treeId int, bidsectionId int, projectId int, treeType int) *viewmodels.TreeSectionContract {
 | 
	
		
			
				|  |  | -	// 1.获得项目节
 | 
	
		
			
				|  |  | -	section := s.treeContractDao.Get(treeId, bidsectionId, projectId, treeType)
 | 
	
		
			
				|  |  | -	// 2.构造数据
 | 
	
		
			
				|  |  | -	sectionVM := s.makeSectionView(section)
 | 
	
		
			
				|  |  | -	// 3.更新 上移和下一的限制
 | 
	
		
			
				|  |  | -	youngerBrotherList := s.treeContractDao.GetYoungerBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId, treeType)
 | 
	
		
			
				|  |  | -	if len(youngerBrotherList) == 0 {
 | 
	
		
			
				|  |  | -		sectionVM.IsEnd = true
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	sectionVM.ElderBrother = true
 | 
	
		
			
				|  |  | -	elderBrotherList := s.treeContractDao.GetElderBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId, treeType)
 | 
	
		
			
				|  |  | -	if len(elderBrotherList) == 0 {
 | 
	
		
			
				|  |  | -		sectionVM.ElderBrother = false
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return sectionVM
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 获得合同详情
 | 
	
		
			
				|  |  | -func (s *contractService) GetContract(contractId int) *viewmodels.Contracts {
 | 
	
		
			
				|  |  | -	contract := s.contractDao.Get(contractId)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	contractsVM := s.makeContractVM(contract)
 | 
	
		
			
				|  |  | -	return &contractsVM
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  // 新增合同
 | 
	
		
			
				|  |  | -func (s *contractService) Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
 | 
	
		
			
				|  |  | +func (s *contractService) Add(contractData *viewmodels.Contracts, treeId int) error {
 | 
	
		
			
				|  |  |  	// 1. 项目节存在
 | 
	
		
			
				|  |  | -	contracts := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
 | 
	
		
			
				|  |  | +	contracts := s.treeContractDao.Get(treeId)
 | 
	
		
			
				|  |  |  	if contracts.Id == 0 {
 | 
	
		
			
				|  |  |  		return errors.New("未找到项目节")
 | 
	
		
			
				|  |  |  	}
 | 
	
	
		
			
				|  | @@ -363,12 +222,6 @@ func (s *contractService) Add(contractData *viewmodels.Contracts, projectId int,
 | 
	
		
			
				|  |  |  		return errors.New("该项目节上已经存在合同")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	// 2-1.查找合同编号是否存在
 | 
	
		
			
				|  |  | -	codeData := s.contractDao.GetByCode(projectId, bidsectionId, contractData.Code, 1)
 | 
	
		
			
				|  |  | -	if len(codeData) != 0 {
 | 
	
		
			
				|  |  | -		return errors.New("该合同编号已经存在")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	// 3.新增合同 --合计标段上的金额
 | 
	
		
			
				|  |  |  	contractsCm := &models.CmContracts{}
 | 
	
		
			
				|  |  |  	contractsCm.Code = contractData.Code
 | 
	
	
		
			
				|  | @@ -378,8 +231,6 @@ func (s *contractService) Add(contractData *viewmodels.Contracts, projectId int,
 | 
	
		
			
				|  |  |  	contractsCm.Returned = "0"
 | 
	
		
			
				|  |  |  	contractsCm.Paid = "0"
 | 
	
		
			
				|  |  |  	contractsCm.TreeId = treeId
 | 
	
		
			
				|  |  | -	contractsCm.ProjectId = projectId
 | 
	
		
			
				|  |  | -	contractsCm.BidsectionId = bidsectionId
 | 
	
		
			
				|  |  |  	contractsCm.Status = 0
 | 
	
		
			
				|  |  |  	contractsCm.CreateTime = time.Now()
 | 
	
		
			
				|  |  |  	contractsCm.UpdateTime = time.Now()
 | 
	
	
		
			
				|  | @@ -389,289 +240,5 @@ func (s *contractService) Add(contractData *viewmodels.Contracts, projectId int,
 | 
	
		
			
				|  |  |  		return err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	// 3.获得该标段下合同总数 - 总收入金额
 | 
	
		
			
				|  |  | -	contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
 | 
	
		
			
				|  |  | -	// 更新标段目录上合同金额和总数
 | 
	
		
			
				|  |  | -	err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	return nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 更新合同
 | 
	
		
			
				|  |  | -func (s *contractService) Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
 | 
	
		
			
				|  |  | -	// 1. 项目节存在
 | 
	
		
			
				|  |  | -	contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
 | 
	
		
			
				|  |  | -	if contractsTree.Id == 0 {
 | 
	
		
			
				|  |  | -		return errors.New("未找到项目节")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	// 2.项目节是没有合同
 | 
	
		
			
				|  |  | -	if contractsTree.ContractId == 0 {
 | 
	
		
			
				|  |  | -		return errors.New("该项目节上没有找到合同")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 3.合同锁定 不能删除
 | 
	
		
			
				|  |  | -	if contractsTree.ContractLocking == 1 {
 | 
	
		
			
				|  |  | -		return errors.New("该合同已锁定")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	contractsCm := &models.CmContracts{}
 | 
	
		
			
				|  |  | -	contractsCm.Id = contractsTree.ContractId
 | 
	
		
			
				|  |  | -	contractsCm.Content = contractData.Content
 | 
	
		
			
				|  |  | -	contractsCm.Name = contractData.Name
 | 
	
		
			
				|  |  | -	contractsCm.Price = contractData.Price
 | 
	
		
			
				|  |  | -	contractsCm.PartyA = contractData.PartyA
 | 
	
		
			
				|  |  | -	contractsCm.PartyASigner = contractData.PartyASigner
 | 
	
		
			
				|  |  | -	contractsCm.PartyB = contractData.PartyB
 | 
	
		
			
				|  |  | -	contractsCm.PartyBSigner = contractData.PartyBSigner
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	loc, _ := time.LoadLocation("Local")
 | 
	
		
			
				|  |  | -	SignerTime, err := time.ParseInLocation(conf.SysTimeform, contractData.SignerTime, loc)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return errors.New("签约时间填写异常")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	contractsCm.SignerTime = SignerTime
 | 
	
		
			
				|  |  | -	contractsCm.Remarks = contractData.Remarks
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	columns := []string{"Content", "Name", "Price", "PartyA", "PartyASigner", "PartyB", "PartyBSigner"}
 | 
	
		
			
				|  |  | -	err = s.contractDao.Update(contractsCm, columns, projectId, bidsectionId, treeId)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	// 3.获得该标段下合同总数 - 总收入金额
 | 
	
		
			
				|  |  | -	contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
 | 
	
		
			
				|  |  | -	// 更新标段目录上合同金额和总数
 | 
	
		
			
				|  |  | -	err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 删除合同
 | 
	
		
			
				|  |  | -func (s *contractService) Delete(projectId int, bidsectionId int, treeId int, id int) error {
 | 
	
		
			
				|  |  | -	// 1. 项目节存在
 | 
	
		
			
				|  |  | -	contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, 0)
 | 
	
		
			
				|  |  | -	if contractsTree.Id == 0 {
 | 
	
		
			
				|  |  | -		return errors.New("未找到项目节")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	// 2.项目节是没有合同
 | 
	
		
			
				|  |  | -	if contractsTree.ContractId == 0 {
 | 
	
		
			
				|  |  | -		return errors.New("该项目节上没有找到合同")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 3.合同锁定 不能删除
 | 
	
		
			
				|  |  | -	if contractsTree.ContractLocking == 1 {
 | 
	
		
			
				|  |  | -		return errors.New("该合同已锁定")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 删除合同
 | 
	
		
			
				|  |  | -	err := s.contractDao.Delete(projectId, bidsectionId, treeId, id)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	// 3.获得该标段下合同总数 - 总收入金额
 | 
	
		
			
				|  |  | -	contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId, 0)
 | 
	
		
			
				|  |  | -	// 更新标段目录上合同金额和总数
 | 
	
		
			
				|  |  | -	err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 4.更新回款总金额
 | 
	
		
			
				|  |  | -	err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, id)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 关闭合同
 | 
	
		
			
				|  |  | -func (s *contractService) Close(projectId int, bidsectionId int, treeId int, id int, treeType int) error {
 | 
	
		
			
				|  |  | -	// 1. 项目节存在
 | 
	
		
			
				|  |  | -	contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, treeType)
 | 
	
		
			
				|  |  | -	if contractsTree.Id == 0 {
 | 
	
		
			
				|  |  | -		return errors.New("未找到项目节")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	// 2.项目节是没有合同
 | 
	
		
			
				|  |  | -	if contractsTree.ContractId == 0 {
 | 
	
		
			
				|  |  | -		return errors.New("该项目节上没有找到合同")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 3.合同锁定 不能删除
 | 
	
		
			
				|  |  | -	if contractsTree.ContractLocking == 1 {
 | 
	
		
			
				|  |  | -		return errors.New("该合同已锁定")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 关闭合同
 | 
	
		
			
				|  |  | -	err := s.contractDao.Close(projectId, bidsectionId, treeId, id)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 解锁合同
 | 
	
		
			
				|  |  | -func (s *contractService) Unlock(projectId int, bidsectionId int, treeId int, id int, treeType int) error {
 | 
	
		
			
				|  |  | -	// 1. 项目节存在
 | 
	
		
			
				|  |  | -	contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId, treeType)
 | 
	
		
			
				|  |  | -	if contractsTree.Id == 0 {
 | 
	
		
			
				|  |  | -		return errors.New("未找到项目节")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	// 2.项目节是没有合同
 | 
	
		
			
				|  |  | -	if contractsTree.ContractId == 0 {
 | 
	
		
			
				|  |  | -		return errors.New("该项目节上没有找到合同")
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 解锁合同
 | 
	
		
			
				|  |  | -	err := s.contractDao.Unlock(projectId, bidsectionId, treeId, id)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -//获得合同收入概况
 | 
	
		
			
				|  |  | -func (s *contractService) GetSurvey(bidsectionId int, projectId int, contractsType int) map[string]interface{} {
 | 
	
		
			
				|  |  | -	// 1.获得收入合同
 | 
	
		
			
				|  |  | -	year := time.Now().Year()
 | 
	
		
			
				|  |  | -	incomeList := s.contractDao.GetTypeYear(bidsectionId, projectId, contractsType, year)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 2.初始化
 | 
	
		
			
				|  |  | -	totalContractPrice := 0.00
 | 
	
		
			
				|  |  | -	totalTypePrice := 0.00
 | 
	
		
			
				|  |  | -	performNumber := 0
 | 
	
		
			
				|  |  | -	closeNumber := 0
 | 
	
		
			
				|  |  | -	uncloseNumber := 0
 | 
	
		
			
				|  |  | -	// 3.当年数据初始化
 | 
	
		
			
				|  |  | -	returnDate := map[string]float64{
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-01", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-02", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-03", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-04", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-05", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-06", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-07", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-08", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-09", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-10", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-11", year): 0.00,
 | 
	
		
			
				|  |  | -		fmt.Sprintf("%d-12", year): 0.00,
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for _, item := range incomeList {
 | 
	
		
			
				|  |  | -		contractPrice, _ := strconv.ParseFloat(item.Price, 64)
 | 
	
		
			
				|  |  | -		totalContractPrice = totalContractPrice + contractPrice
 | 
	
		
			
				|  |  | -		typePrice := 0.00
 | 
	
		
			
				|  |  | -		if contractsType == 1 {
 | 
	
		
			
				|  |  | -			typePrice, _ = strconv.ParseFloat(item.Returned, 64)
 | 
	
		
			
				|  |  | -			totalTypePrice = totalTypePrice + typePrice
 | 
	
		
			
				|  |  | -		} else {
 | 
	
		
			
				|  |  | -			typePrice, _ = strconv.ParseFloat(item.Paid, 64)
 | 
	
		
			
				|  |  | -			totalTypePrice = totalTypePrice + typePrice
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		if item.Status == 0 {
 | 
	
		
			
				|  |  | -			performNumber = performNumber + 1
 | 
	
		
			
				|  |  | -		} else if item.Status == 1 {
 | 
	
		
			
				|  |  | -			uncloseNumber = uncloseNumber + 1
 | 
	
		
			
				|  |  | -		} else if item.Status == 2 {
 | 
	
		
			
				|  |  | -			closeNumber = closeNumber + 1
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		returnDate[item.CreateTime.Format(conf.SysTimeformMonth)] = returnDate[item.CreateTime.Format(conf.SysTimeformMonth)] + typePrice
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	totalContractPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", totalContractPrice), 64)
 | 
	
		
			
				|  |  | -	totalTypePrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", totalTypePrice), 64)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// ac := accounting.Accounting{Symbol: "", Precision: 2}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	surveryData := map[string]interface{}{
 | 
	
		
			
				|  |  | -		"totalContractPrice":     totalContractPrice,
 | 
	
		
			
				|  |  | -		"totalContractPriceShow": totalContractPrice,
 | 
	
		
			
				|  |  | -		// "totalReturnPrice":   ac.FormatMoney(totalReturnPrice),
 | 
	
		
			
				|  |  | -		"performNumber": performNumber,
 | 
	
		
			
				|  |  | -		"closeNumber":   closeNumber,
 | 
	
		
			
				|  |  | -		"uncloseNumber": uncloseNumber,
 | 
	
		
			
				|  |  | -		"returnDate":    returnDate,
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if contractsType == 1 {
 | 
	
		
			
				|  |  | -		surveryData["totalReturnPriceShow"] = totalTypePrice
 | 
	
		
			
				|  |  | -	} else {
 | 
	
		
			
				|  |  | -		surveryData["totalPaidPriceShow"] = totalTypePrice
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return surveryData
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 获得合同总数量和总金额
 | 
	
		
			
				|  |  | -func (s *contractService) getContractTotalAndPrice(bidsectionId int, projectId int, treeType int) (contractTotal int, priceTotal float64) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	contractListAll := s.treeContractDao.GetContractAll(bidsectionId, projectId)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 获得收入合同
 | 
	
		
			
				|  |  | -	contractList := s.treeContractDao.GetContract(bidsectionId, projectId, treeType)
 | 
	
		
			
				|  |  | -	priceTotal = 0.00
 | 
	
		
			
				|  |  | -	for _, item := range contractList {
 | 
	
		
			
				|  |  | -		contractPrice, _ := strconv.ParseFloat(item.ContractPrice, 64)
 | 
	
		
			
				|  |  | -		priceTotal = priceTotal + contractPrice
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	// 合同总数
 | 
	
		
			
				|  |  | -	// contractTotal = len(contractList) + 1
 | 
	
		
			
				|  |  | -	contractTotal = len(contractListAll)
 | 
	
		
			
				|  |  | -	// 合同收入总金额
 | 
	
		
			
				|  |  | -	// price, _ := strconv.ParseFloat(priceString, 64)
 | 
	
		
			
				|  |  | -	// priceTotal = priceTotal + price
 | 
	
		
			
				|  |  | -	// 保留2位小数
 | 
	
		
			
				|  |  | -	priceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", priceTotal), 64)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return contractTotal, priceTotal
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 构建合同详情视图
 | 
	
		
			
				|  |  | -func (s *contractService) makeContractVM(contract *models.CmContracts) viewmodels.Contracts {
 | 
	
		
			
				|  |  | -	contractsVM := viewmodels.Contracts{}
 | 
	
		
			
				|  |  | -	if contract.Id == 0 {
 | 
	
		
			
				|  |  | -		return contractsVM
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	id, _ := comm.AesEncrypt(strconv.Itoa(contract.Id), conf.SignSecret)
 | 
	
		
			
				|  |  | -	treeId, _ := comm.AesEncrypt(strconv.Itoa(contract.TreeId), conf.SignSecret)
 | 
	
		
			
				|  |  | -	bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(contract.BidsectionId), conf.SignSecret)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	contractsVM.Id = id
 | 
	
		
			
				|  |  | -	contractsVM.TreeId = treeId
 | 
	
		
			
				|  |  | -	contractsVM.ContractsType = contract.ContractsType
 | 
	
		
			
				|  |  | -	contractsVM.BidsectionId = bidsectionId
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	contractsVM.Name = contract.Name
 | 
	
		
			
				|  |  | -	contractsVM.Content = contract.Content
 | 
	
		
			
				|  |  | -	contractsVM.Code = contract.Code
 | 
	
		
			
				|  |  | -	contractsVM.PartyA = contract.PartyA
 | 
	
		
			
				|  |  | -	contractsVM.PartyASigner = contract.PartyASigner
 | 
	
		
			
				|  |  | -	contractsVM.PartyB = contract.PartyB
 | 
	
		
			
				|  |  | -	contractsVM.PartyBSigner = contract.PartyBSigner
 | 
	
		
			
				|  |  | -	contractsVM.Remarks = contract.Remarks
 | 
	
		
			
				|  |  | -	contractsVM.Price = contract.Price
 | 
	
		
			
				|  |  | -	contractsVM.Returned = contract.Returned
 | 
	
		
			
				|  |  | -	contractsVM.Paid = contract.Paid
 | 
	
		
			
				|  |  | -	contractsVM.Status = contract.Status
 | 
	
		
			
				|  |  | -	contractsVM.Locking = contract.Locking
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	contractsVM.CreateTime = contract.CreateTime.Format(conf.SysTimeform)
 | 
	
		
			
				|  |  | -	contractsVM.UpdateTime = contract.UpdateTime.Format(conf.SysTimeform)
 | 
	
		
			
				|  |  | -	// nilTime := time.Time{}
 | 
	
		
			
				|  |  | -	// contract.SignerTime != nilTime
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if !contract.SignerTime.IsZero() {
 | 
	
		
			
				|  |  | -		contractsVM.SignerTime = contract.SignerTime.Format(conf.SysTimeform)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return contractsVM
 | 
	
		
			
				|  |  | -}
 |