From 6843bdb44b8d5294a21f2ee30886e0c5ad07a150 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期二, 29 八月 2023 18:00:57 +0800
Subject: [PATCH] 价格调整
---
api/v1/purchase/purchase.go | 11 +++
model/purchase/purchase.go | 94 +++++++++++++++++++++++++-----
model/purchase/request/purchase.go | 30 ++++++---
service/purchase/purchase.go | 21 +++++-
4 files changed, 124 insertions(+), 32 deletions(-)
diff --git a/api/v1/purchase/purchase.go b/api/v1/purchase/purchase.go
index 73eafdd..fe6f3ac 100644
--- a/api/v1/purchase/purchase.go
+++ b/api/v1/purchase/purchase.go
@@ -50,6 +50,17 @@
purchaseRecord.Status = purchase.OrderStatusConfirmed
purchaseRecord.HandledBy = "admin"
purchaseRecord.Creator = "admin"
+
+ if !purchaseRecord.WholeDiscountType.IsValid(purchaseRecord.TotalPrice, purchaseRecord.WholeDiscount) {
+ response.FailWithMessage("鏁村崟鎶樻墸鏁板�间笉姝g‘", c)
+ return
+ }
+
+ if !purchaseRecord.PriceAdjustmentType.IsValid(purchaseRecord.TotalPrice, purchaseRecord.PriceAdjustment) {
+ response.FailWithMessage("浠锋牸璋冩暣鏁板�间笉姝g‘", c)
+ return
+ }
+
err = service.NewPurchaseService().CreatePurchase(&purchaseRecord, params.ProductList)
if err != nil {
diff --git a/model/purchase/purchase.go b/model/purchase/purchase.go
index 198fe97..4506751 100644
--- a/model/purchase/purchase.go
+++ b/model/purchase/purchase.go
@@ -8,23 +8,30 @@
type Purchase struct {
global.GVA_MODEL
- PurchaseTypeId int `json:"purchaseTypeId" form:"purchaseType" gorm:"type:int(11);not null;default 0;comment:閲囪喘绫诲瀷id"` // 閲囪喘绫诲瀷id
- PurchaseType PurchaseType `json:"purchaseType" gorm:"foreignKey:PurchaseTypeId"`
- SupplierId int `json:"supplierId" form:"supplierId" gorm:"type:int(11);not null;default 0;comment:渚涘簲鍟唅d"` // 渚涘簲鍟唅d
- Supplier test.Supplier `json:"supplier" gorm:"foreignKey:SupplierId"`
- Number string `json:"number" form:"number" gorm:"unique;type:varchar(255);not null;default '';comment:閲囪喘缂栧彿"` // 閲囪喘缂栧彿
- Name string `json:"name" form:"name" gorm:"type:varchar(255);not null;default '';comment:閲囪喘鍚嶇О"` // 閲囪喘鍚嶇О
- Quantity decimal.Decimal `json:"quantity" form:"quantity" gorm:"type:decimal(12,4);not null;comment:閲囪喘鏁伴噺"` // 閲囪喘鏁伴噺
- Contact string `json:"contact" form:"contact" gorm:"type:varchar(255);not null;default '';comment:鑱旂郴浜�"` // 鑱旂郴浜�
- Phone string `json:"phone" form:"phone" gorm:"type:varchar(255);not null;default '';comment:鑱旂郴浜虹數璇�"` // 鑱旂郴浜虹數璇�
- SigningDate string `json:"signingDate" form:"signingDate" gorm:"type:varchar(255);not null;default '';comment:绛剧害鏃ユ湡"` // 绛剧害鏃ユ湡
- DeliveryDate string `json:"deliveryDate" form:"deliveryDate" gorm:"type:varchar(255);not null;default '';comment:浜や粯鏃ユ湡"` //浜や粯鏃ユ湡
- Remark string `json:"remark" form:"remark" gorm:"type:varchar(1000);not null;default '';comment:澶囨敞"` //澶囨敞
- Status OrderStatus `json:"status" form:"status" gorm:"type:tinyint(1);not null;default 0;comment:鐘舵��"` //鐘舵��
- HandledBy string `json:"handledBy" form:"handledBy" gorm:"type:varchar(255);not null;default '';comment:缁忓姙浜�"` //缁忓姙浜�
- Creator string `json:"creator" form:"creator" gorm:"type:varchar(255);not null;default '';comment:鍒跺崟浜�"` //鍒跺崟浜�
- OrderType string `json:"orderType" form:"orderType" gorm:"type:varchar(255);not null;default '';comment:鍗曟嵁绫诲瀷"` //鍗曟嵁绫诲瀷
- Warehouse string `json:"warehouse" form:"warehouse" gorm:"type:varchar(255);not null;default '';comment:鏀惰揣浠撳簱"` //鏀惰揣浠撳簱
+ PurchaseTypeId int `json:"purchaseTypeId" form:"purchaseType" gorm:"type:int(11);not null;default 0;comment:閲囪喘绫诲瀷id"` // 閲囪喘绫诲瀷id
+ PurchaseType PurchaseType `json:"purchaseType" gorm:"foreignKey:PurchaseTypeId"`
+ OrderSource string `json:"orderSource" gorm:"type:varchar(255);not null;default '';comment:鍗曟嵁鏉ユ簮"` // 鍗曟嵁鏉ユ簮
+ SupplierId int `json:"supplierId" form:"supplierId" gorm:"type:int(11);not null;default 0;comment:渚涘簲鍟唅d"` // 渚涘簲鍟唅d
+ Supplier test.Supplier `json:"supplier" gorm:"foreignKey:SupplierId"`
+ Number string `json:"number" form:"number" gorm:"unique;type:varchar(255);not null;default '';comment:閲囪喘缂栧彿"` // 閲囪喘缂栧彿
+ Name string `json:"name" form:"name" gorm:"type:varchar(255);not null;default '';comment:閲囪喘鍚嶇О"` // 閲囪喘鍚嶇О
+ Contact string `json:"contact" form:"contact" gorm:"type:varchar(255);not null;default '';comment:鑱旂郴浜�"` // 鑱旂郴浜�
+ Phone string `json:"phone" form:"phone" gorm:"type:varchar(255);not null;default '';comment:鑱旂郴浜虹數璇�"` // 鑱旂郴浜虹數璇�
+ SigningDate string `json:"signingDate" form:"signingDate" gorm:"type:varchar(255);not null;default '';comment:绛剧害鏃ユ湡"` // 绛剧害鏃ユ湡
+ DeliveryDate string `json:"deliveryDate" form:"deliveryDate" gorm:"type:varchar(255);not null;default '';comment:浜や粯鏃ユ湡"` //浜や粯鏃ユ湡
+ Remark string `json:"remark" form:"remark" gorm:"type:varchar(1000);not null;default '';comment:澶囨敞"` //澶囨敞
+ Status OrderStatus `json:"status" form:"status" gorm:"type:tinyint(1);not null;default 0;comment:鐘舵��"` //鐘舵��
+ HandledBy string `json:"handledBy" form:"handledBy" gorm:"type:varchar(255);not null;default '';comment:缁忓姙浜�"` //缁忓姙浜�
+ Creator string `json:"creator" form:"creator" gorm:"type:varchar(255);not null;default '';comment:鍒跺崟浜�"` //鍒跺崟浜�
+ OrderType string `json:"orderType" form:"orderType" gorm:"type:varchar(255);not null;default '';comment:鍗曟嵁绫诲瀷"` //鍗曟嵁绫诲瀷
+ Warehouse string `json:"warehouse" form:"warehouse" gorm:"type:varchar(255);not null;default '';comment:鏀惰揣浠撳簱"` //鏀惰揣浠撳簱
+ Quantity decimal.Decimal `json:"quantity" form:"quantity" gorm:"type:decimal(12,4);not null;comment:閲囪喘鏁伴噺"` // 閲囪喘鏁伴噺
+ TotalPrice decimal.Decimal `json:"totalPrice" form:"totalPrice" gorm:"type:decimal(12,2);not null;default '';comment:浠风◣鍚堣"` //浠风◣鍚堣
+ WholeDiscountType WholeDiscountType `json:"wholeDiscountType" form:"wholeDiscountType" gorm:"type:decimal(12,2);not null;default '';comment:鏁村崟鎶樻墸"` //鏁村崟鎶樻墸绫诲瀷
+ WholeDiscount decimal.Decimal `json:"wholeDiscount" form:"wholeDiscount" gorm:"type:decimal(12,2);not null;default '';comment:鏁村崟鎶樻墸"` //鏁村崟鎶樻墸鍊�
+ PriceAdjustmentType PriceAdjustmentType `json:"priceAdjustmentType" form:"priceAdjustmentType" gorm:"type:decimal(12,2);not null;default '';comment:浠锋牸璋冩暣"` //浠锋牸璋冩暣绫诲瀷
+ PriceAdjustment decimal.Decimal `json:"priceAdjustment" form:"priceAdjustment" gorm:"type:decimal(12,2);not null;default '';comment:浠锋牸璋冩暣"` //浠锋牸璋冩暣鍊�
+ RealTotalPrice decimal.Decimal `json:"realTotalPrice" form:"realTotalPrice" gorm:"type:decimal(12,2);not null;default '';comment:鏈�缁堜环鏍�"` //鏈�缁堜环鏍�
}
type OrderStatus int
@@ -35,3 +42,56 @@
OrderStatusStored OrderStatus = 3 //宸插叆搴�
OrderStatusCompleted OrderStatus = 4 //宸插畬鎴�
)
+
+type WholeDiscountType int
+
+const (
+ WholeDiscountTypePercent WholeDiscountType = 1 //鐧惧垎姣旈檷浠�
+ WholeDiscountTypeDiscount WholeDiscountType = 2 //鐩存帴闄嶄环
+)
+
+func (wdt WholeDiscountType) IsValid(totalPrice, value decimal.Decimal) bool {
+ if wdt != WholeDiscountTypePercent && wdt != WholeDiscountTypeDiscount {
+ return false
+ }
+ if wdt == WholeDiscountTypeDiscount && value.GreaterThanOrEqual(totalPrice) {
+ return false
+ }
+ if wdt == WholeDiscountTypePercent && totalPrice.Mul(value).Div(decimal.NewFromInt(100)).GreaterThanOrEqual(totalPrice) {
+ return false
+ }
+ return true
+}
+
+type PriceAdjustmentType int
+
+const (
+ PriceAdjustmentTypeAdd PriceAdjustmentType = 1 //澧炲姞
+ PriceAdjustmentTypeSub PriceAdjustmentType = 2 //鍑忓皯
+)
+
+func (pat PriceAdjustmentType) IsValid(totalPrice, value decimal.Decimal) bool {
+ if pat != PriceAdjustmentTypeAdd && pat != PriceAdjustmentTypeSub {
+ return false
+ }
+ if pat == PriceAdjustmentTypeSub && value.GreaterThanOrEqual(totalPrice) {
+ return false
+ }
+ return true
+}
+
+func (slf Purchase) CalcRealTotalPrice() decimal.Decimal {
+ totalPrice := slf.TotalPrice
+ if slf.WholeDiscountType == WholeDiscountTypePercent {
+ totalPrice = totalPrice.Mul(slf.WholeDiscount).Div(decimal.NewFromInt(100))
+ } else if slf.WholeDiscountType == WholeDiscountTypeDiscount {
+ totalPrice = totalPrice.Sub(slf.WholeDiscount)
+ }
+
+ if slf.PriceAdjustmentType == PriceAdjustmentTypeAdd {
+ totalPrice = totalPrice.Add(slf.PriceAdjustment)
+ } else if slf.PriceAdjustmentType == PriceAdjustmentTypeSub {
+ totalPrice = totalPrice.Sub(slf.PriceAdjustment)
+ }
+ return totalPrice.RoundCeil(2)
+}
diff --git a/model/purchase/request/purchase.go b/model/purchase/request/purchase.go
index a99c0b8..19fe8c0 100644
--- a/model/purchase/request/purchase.go
+++ b/model/purchase/request/purchase.go
@@ -1,6 +1,7 @@
package purchaserequest
import (
+ "github.com/shopspring/decimal"
"srm/model/common/request"
"srm/model/purchase"
"time"
@@ -23,15 +24,22 @@
}
type Purchase struct {
- ID uint `gorm:"primarykey"` // 涓婚敭ID
- PurchaseTypeId int `json:"purchaseTypeId" form:"purchaseType" gorm:"type:int(11);not null;default 0;comment:閲囪喘绫诲瀷id"` // 閲囪喘绫诲瀷id
- SupplierId int `json:"supplierId" form:"supplierId" gorm:"type:int(11);not null;default 0;comment:渚涘簲鍟唅d"` // 渚涘簲鍟唅d
- Number string `json:"number" form:"number" gorm:"unique;type:varchar(255);not null;default '';comment:閲囪喘缂栧彿"` // 閲囪喘缂栧彿
- Name string `json:"name" form:"name" gorm:"type:varchar(255);not null;default '';comment:閲囪喘鍚嶇О"` // 閲囪喘鍚嶇О
- Contact string `json:"contact" form:"contact" gorm:"type:varchar(255);not null;default '';comment:鑱旂郴浜�"` // 鑱旂郴浜�
- Phone string `json:"phone" form:"phone" gorm:"type:varchar(255);not null;default '';comment:鑱旂郴浜虹數璇�"` // 鑱旂郴浜虹數璇�
- SigningDate string `json:"signingDate" form:"signingDate" gorm:"type:varchar(255);not null;default '';comment:绛剧害鏃ユ湡"` // 绛剧害鏃ユ湡
- DeliveryDate string `json:"deliveryDate" form:"deliveryDate" gorm:"type:varchar(255);not null;default '';comment:浜や粯鏃ユ湡"` //浜や粯鏃ユ湡
- Remark string `json:"remark" form:"remark" gorm:"type:varchar(1000);not null;default '';comment:澶囨敞"` //澶囨敞
- Status purchase.OrderStatus `json:"status" form:"status" gorm:"type:tinyint(1);not null;default 0;comment:鐘舵��"` //鐘舵��
+ ID uint `gorm:"primarykey"` // 涓婚敭ID
+ PurchaseTypeId int `json:"purchaseTypeId" form:"purchaseType" gorm:"type:int(11);not null;default 0;comment:閲囪喘绫诲瀷id"` // 閲囪喘绫诲瀷id
+ SupplierId int `json:"supplierId" form:"supplierId" gorm:"type:int(11);not null;default 0;comment:渚涘簲鍟唅d"` // 渚涘簲鍟唅d
+ Number string `json:"number" form:"number" gorm:"unique;type:varchar(255);not null;default '';comment:閲囪喘缂栧彿"` // 閲囪喘缂栧彿
+ Name string `json:"name" form:"name" gorm:"type:varchar(255);not null;default '';comment:閲囪喘鍚嶇О"` // 閲囪喘鍚嶇О
+ Contact string `json:"contact" form:"contact" gorm:"type:varchar(255);not null;default '';comment:鑱旂郴浜�"` // 鑱旂郴浜�
+ Phone string `json:"phone" form:"phone" gorm:"type:varchar(255);not null;default '';comment:鑱旂郴浜虹數璇�"` // 鑱旂郴浜虹數璇�
+ SigningDate string `json:"signingDate" form:"signingDate" gorm:"type:varchar(255);not null;default '';comment:绛剧害鏃ユ湡"` // 绛剧害鏃ユ湡
+ DeliveryDate string `json:"deliveryDate" form:"deliveryDate" gorm:"type:varchar(255);not null;default '';comment:浜や粯鏃ユ湡"` //浜や粯鏃ユ湡
+ Remark string `json:"remark" form:"remark" gorm:"type:varchar(1000);not null;default '';comment:澶囨敞"` //澶囨敞
+ Status purchase.OrderStatus `json:"status" form:"status" gorm:"type:tinyint(1);not null;default 0;comment:鐘舵��"` //鐘舵��
+ Quantity decimal.Decimal `json:"quantity" form:"quantity" gorm:"type:decimal(12,4);not null;comment:閲囪喘鏁伴噺"` // 閲囪喘鏁伴噺
+ TotalPrice decimal.Decimal `json:"totalPrice" form:"totalPrice" gorm:"type:decimal(12,2);not null;default '';comment:浠风◣鍚堣"` //浠风◣鍚堣
+ WholeDiscountType purchase.WholeDiscountType `json:"wholeDiscountType" form:"wholeDiscountType" gorm:"type:decimal(12,2);not null;default '';comment:鏁村崟鎶樻墸"` //鏁村崟鎶樻墸绫诲瀷
+ WholeDiscount decimal.Decimal `json:"wholeDiscount" form:"wholeDiscount" gorm:"type:decimal(12,2);not null;default '';comment:鏁村崟鎶樻墸"` //鏁村崟鎶樻墸鍊�
+ PriceAdjustmentType purchase.PriceAdjustmentType `json:"priceAdjustmentType" form:"priceAdjustmentType" gorm:"type:decimal(12,2);not null;default '';comment:浠锋牸璋冩暣"` //浠锋牸璋冩暣绫诲瀷
+ PriceAdjustment decimal.Decimal `json:"priceAdjustment" form:"priceAdjustment" gorm:"type:decimal(12,2);not null;default '';comment:浠锋牸璋冩暣"` //浠锋牸璋冩暣鍊�
+ RealTotalPrice decimal.Decimal `json:"realTotalPrice" form:"realTotalPrice" gorm:"type:decimal(12,2);not null;default '';comment:鏈�缁堜环鏍�"` //鏈�缁堜环鏍�
}
diff --git a/service/purchase/purchase.go b/service/purchase/purchase.go
index 352395d..257fed3 100644
--- a/service/purchase/purchase.go
+++ b/service/purchase/purchase.go
@@ -2,6 +2,7 @@
import (
"context"
+ "errors"
"github.com/shopspring/decimal"
"github.com/spf13/cast"
"gorm.io/gorm"
@@ -23,19 +24,31 @@
//@param: params *purchaserequest.AddPurchase
//@return: err error
-func (slf *PurchaseService) CreatePurchase(params *purchase.Purchase, productList []*purchase.PurchaseProducts) (err error) {
+func (slf *PurchaseService) CreatePurchase(record *purchase.Purchase, productList []*purchase.PurchaseProducts) (err error) {
err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
var quantity decimal.Decimal
+ var totalPrice decimal.Decimal
+ var realTotalPrice decimal.Decimal
for _, product := range productList {
quantity = quantity.Add(product.Amount)
+ totalPrice = totalPrice.Add(product.Price.Mul(product.Amount))
}
- params.Quantity = quantity
- err = tx.Create(¶ms).Error
+ if !totalPrice.Equal(record.TotalPrice) {
+ return errors.New("浠风◣鎬昏璁$畻閿欒")
+ }
+ if !quantity.Equal(record.Quantity) {
+ return errors.New("浜у搧鏁伴噺璁$畻閿欒")
+ }
+ realTotalPrice = record.CalcRealTotalPrice()
+ if !realTotalPrice.Equal(record.RealTotalPrice) {
+ return errors.New("鏈�缁堜环鏍艰绠楅敊璇�")
+ }
+ err = tx.Create(&record).Error
if err != nil {
return err
}
for _, product := range productList {
- product.PurchaseId = cast.ToInt(params.ID)
+ product.PurchaseId = cast.ToInt(record.ID)
}
return tx.Create(productList).Error
})
--
Gitblit v1.8.0