caipin 4 年 前
コミット
3a0b308f86

+ 12 - 0
services/contract_expenditure_service.go

@@ -9,8 +9,10 @@ package services
 
 import (
 	"errors"
+	"fmt"
 	"time"
 
+	"github.com/shopspring/decimal"
 	"go.mod/conf"
 	"go.mod/models"
 	"go.mod/web/viewmodels"
@@ -82,6 +84,16 @@ func (s *contractService) UpdateExpenditure(contractData *viewmodels.Contracts,
 	if contractsTree.ContractLocking == 1 {
 		return errors.New("该合同已锁定")
 	}
+	// 4.合同金额不能小于回款金额
+	paidPrice, _ := decimal.NewFromString(contractsTree.ContractsPaid)
+	price, err := decimal.NewFromString(contractData.Price)
+	if err != nil {
+		return errors.New("金额填写有误")
+	}
+
+	if paidPrice.GreaterThan(price) {
+		return errors.New(fmt.Sprintf("合同金额不能低于%s", contractsTree.ContractsPaid))
+	}
 
 	contractsCm := &models.CmContracts{}
 	contractsCm.Id = contractsTree.ContractId

+ 21 - 12
services/contract_paid_service.go

@@ -14,6 +14,7 @@ import (
 	"time"
 
 	"github.com/kataras/iris/v12"
+	"github.com/shopspring/decimal"
 	"go.mod/comm"
 	"go.mod/conf"
 	"go.mod/models"
@@ -46,15 +47,17 @@ func (s *contractService) PaidCreate(returnData *viewmodels.ContractsPaid, proje
 	if contract.Status == 2 {
 		return errors.New("合同已关闭")
 	}
+
 	// 1-3已支付的中金额不能超过 合同金额
-	price, err := strconv.ParseFloat(returnData.Price, 64)
+	price, err := decimal.NewFromString(returnData.Price)
 	if err != nil {
 		return errors.New("金额填写有误")
 	}
-	paidPrice, _ := strconv.ParseFloat(contract.Paid, 64)
-	contractPrice, _ := strconv.ParseFloat(contract.Price, 64)
-	resultPrice := contractPrice - paidPrice
-	if price > resultPrice {
+	contractPrice, _ := decimal.NewFromString(contract.Price)
+	paidPrice, _ := decimal.NewFromString(contract.Paid)
+	resultPrice := contractPrice.Sub(paidPrice)
+
+	if price.GreaterThan(resultPrice) {
 		return errors.New("支付金额不能超过合同金额")
 	}
 
@@ -110,17 +113,23 @@ func (s *contractService) PaidUpdate(returnData *viewmodels.ContractsPaid, proje
 	if contract.Status == 2 {
 		return errors.New("合同已关闭")
 	}
+
 	// 1-3已支付的中金额不能超过 合同金额
-	price, err := strconv.ParseFloat(returnData.Price, 64)
+	price, err := decimal.NewFromString(returnData.Price)
 	if err != nil {
 		return errors.New("金额填写有误")
 	}
-	contractPrice, _ := strconv.ParseFloat(contract.Price, 64)
-	paidPrice, _ := strconv.ParseFloat(contract.Paid, 64)
-	// 合同金额-(已支付总金额-当前已支付金额)
-	resultPrice := contractPrice - (paidPrice - price)
-
-	if price > resultPrice {
+	contractPrice, _ := decimal.NewFromString(contract.Price)
+	paidPrice, _ := decimal.NewFromString(contract.Paid)
+	// 当前回款金额
+	returnedPresentPrice, _ := decimal.NewFromString(contractPaid.Price)
+	// 合同金额-(回款总金额-当前回款金额)
+	// 回款总金额-当前回款金额
+	subPrice := paidPrice.Sub(returnedPresentPrice)
+	// 合同金额-subPrice
+	resultPrice := contractPrice.Sub(subPrice)
+
+	if price.GreaterThan(resultPrice) {
 		return errors.New("支付金额不能超过合同金额")
 	}
 

+ 16 - 10
services/contract_return_service.go

@@ -14,6 +14,7 @@ import (
 	"time"
 
 	"github.com/kataras/iris/v12"
+	"github.com/shopspring/decimal"
 	"go.mod/comm"
 	"go.mod/conf"
 	"go.mod/models"
@@ -133,15 +134,15 @@ func (s *contractService) ReturnCreate(returnData *viewmodels.ContractsReturn, p
 	}
 
 	// 1-3已支付的中金额不能超过 合同金额
-	price, err := strconv.ParseFloat(returnData.Price, 64)
+	price, err := decimal.NewFromString(returnData.Price)
 	if err != nil {
 		return errors.New("金额填写有误")
 	}
-	returnedPrice, _ := strconv.ParseFloat(contract.Returned, 64)
-	contractPrice, _ := strconv.ParseFloat(contract.Price, 64)
-	resultPrice := contractPrice - returnedPrice
+	contractPrice, _ := decimal.NewFromString(contract.Price)
+	returnedPrice, _ := decimal.NewFromString(contract.Returned)
+	resultPrice := contractPrice.Sub(returnedPrice)
 
-	if price > resultPrice {
+	if price.GreaterThan(resultPrice) {
 		return errors.New("回款金额不能超过合同金额")
 	}
 
@@ -199,16 +200,21 @@ func (s *contractService) ReturnUpdate(returnData *viewmodels.ContractsReturn, p
 	}
 
 	// 1-3已支付的中金额不能超过 合同金额
-	price, err := strconv.ParseFloat(returnData.Price, 64)
+	price, err := decimal.NewFromString(returnData.Price)
 	if err != nil {
 		return errors.New("金额填写有误")
 	}
-	contractPrice, _ := strconv.ParseFloat(contract.Price, 64)
-	returnedPrice, _ := strconv.ParseFloat(contract.Returned, 64)
+	contractPrice, _ := decimal.NewFromString(contract.Price)
+	returnedPrice, _ := decimal.NewFromString(contract.Returned)
+	// 当前回款金额
+	returnedPresentPrice, _ := decimal.NewFromString(contractReturn.Price)
 	// 合同金额-(回款总金额-当前回款金额)
-	resultPrice := contractPrice - (returnedPrice - price)
+	// 回款总金额-当前回款金额
+	subPrice := returnedPrice.Sub(returnedPresentPrice)
+	// 合同金额-subPrice
+	resultPrice := contractPrice.Sub(subPrice)
 
-	if price > resultPrice {
+	if price.GreaterThan(resultPrice) {
 		return errors.New("回款金额不能超过合同金额")
 	}
 

+ 11 - 0
services/contract_service.go

@@ -15,6 +15,7 @@ import (
 	"time"
 
 	"github.com/kataras/iris/v12"
+	"github.com/shopspring/decimal"
 	"go.mod/comm"
 	"go.mod/conf"
 	"go.mod/dao"
@@ -416,6 +417,16 @@ func (s *contractService) Update(contractData *viewmodels.Contracts, projectId i
 	if contractsTree.ContractLocking == 1 {
 		return errors.New("该合同已锁定")
 	}
+	// 4.合同金额不能小于回款金额
+	returnedPrice, _ := decimal.NewFromString(contractsTree.ContractReturned)
+	price, err := decimal.NewFromString(contractData.Price)
+	if err != nil {
+		return errors.New("金额填写有误")
+	}
+
+	if returnedPrice.GreaterThan(price) {
+		return errors.New(fmt.Sprintf("合同金额不能低于%s", contractsTree.ContractReturned))
+	}
 
 	contractsCm := &models.CmContracts{}
 	contractsCm.Id = contractsTree.ContractId