From c549900b66691959771edf7c6526de69a1d8f3cc Mon Sep 17 00:00:00 2001
From: wangpengfei <274878379@qq.com>
Date: 星期五, 18 八月 2023 20:19:41 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
model/product.go | 3
/dev/null | 22 --
service/salesDetails.go | 56 ++++--
model/salesDetails.go | 2
model/salesDetailsProduct.go | 4
service/products.go | 10 +
model/SalesReturnProduct.go | 130 ++++++++++++++++
service/salesReturn.go | 46 +++++
service/serviceContract.go | 50 +++++-
model/salesContractProduct.go | 130 ++++++++++++++++
10 files changed, 395 insertions(+), 58 deletions(-)
diff --git a/model/SalesReturnProduct.go b/model/SalesReturnProduct.go
new file mode 100644
index 0000000..355c096
--- /dev/null
+++ b/model/SalesReturnProduct.go
@@ -0,0 +1,130 @@
+package model
+
+import (
+ "aps_crm/pkg/mysqlx"
+ "fmt"
+ "gorm.io/gorm"
+)
+
+type (
+ // SalesReturnProduct 鏈嶅姟鍚堝悓鍜屼骇鍝佸叧鑱�
+ SalesReturnProduct struct {
+ SalesReturnId int `json:"id" gorm:"column:sales_details_id;type:int;primary_key;not null;default:0"`
+ ProductId uint `json:"name" gorm:"primary_key;column:product_id;type:int;not null;default:0;comment:浜у搧id"`
+ }
+
+ // SalesReturnProductSearch 閿�鍞槑缁嗗拰浜у搧鍏宠仈鎼滅储鏉′欢
+ SalesReturnProductSearch struct {
+ SalesReturnProduct
+ Orm *gorm.DB
+ Keyword string
+ PageNum int
+ PageSize int
+ }
+)
+
+func (SalesReturnProduct) TableName() string {
+ return "service_contract_product"
+}
+
+func NewSalesReturnProductSearch() *SalesReturnProductSearch {
+ return &SalesReturnProductSearch{
+ Orm: mysqlx.GetDB(),
+ }
+}
+
+func (slf *SalesReturnProductSearch) build() *gorm.DB {
+ var db = slf.Orm.Model(&SalesReturnProduct{})
+
+ return db
+}
+
+func (slf *SalesReturnProductSearch) Create(record *SalesReturnProduct) error {
+ var db = slf.build()
+ return db.Create(record).Error
+}
+
+func (slf *SalesReturnProductSearch) CreateBatch(records []*SalesReturnProduct) error {
+ var db = slf.build()
+ return db.Create(records).Error
+}
+
+func (slf *SalesReturnProductSearch) Delete() error {
+ var db = slf.build()
+ return db.Delete(&SalesReturnProduct{}).Error
+}
+
+func (slf *SalesReturnProductSearch) Update(record *SalesReturnProduct) error {
+ var db = slf.build()
+ return db.Updates(record).Error
+}
+
+func (slf *SalesReturnProductSearch) FindAll() ([]*SalesReturnProduct, error) {
+ var db = slf.build()
+ var record = make([]*SalesReturnProduct, 0)
+ err := db.Find(&record).Error
+ return record, err
+}
+
+func (slf *SalesReturnProductSearch) SetPage(page, size int) *SalesReturnProductSearch {
+ slf.PageNum, slf.PageSize = page, size
+ return slf
+}
+
+func (slf *SalesReturnProductSearch) SetOrm(tx *gorm.DB) *SalesReturnProductSearch {
+ slf.Orm = tx
+ return slf
+}
+
+func (slf *SalesReturnProductSearch) First() (*SalesReturnProduct, error) {
+ var db = slf.build()
+ var record = new(SalesReturnProduct)
+ err := db.First(record).Error
+ return record, err
+}
+
+func (slf *SalesReturnProductSearch) Updates(values interface{}) error {
+ var db = slf.build()
+ return db.Updates(values).Error
+}
+
+func (slf *SalesReturnProductSearch) Save(record *SalesReturnProduct) error {
+ var db = slf.build()
+
+ if err := db.Save(record).Error; err != nil {
+ return fmt.Errorf("save err: %v, record: %+v", err, record)
+ }
+
+ return nil
+}
+
+func (slf *SalesReturnProductSearch) Find() ([]*SalesReturnProduct, int64, error) {
+ var db = slf.build()
+ var records = make([]*SalesReturnProduct, 0)
+ var total int64
+ if err := db.Count(&total).Error; err != nil {
+ return records, total, err
+ }
+ if slf.PageNum > 0 && slf.PageSize > 0 {
+ db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
+ }
+
+ err := db.Find(&records).Error
+ return records, total, err
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *SalesReturnProductSearch) InitDefaultData() error {
+ var (
+ db = slf.Orm.Table(slf.TableName())
+ total int64 = 0
+ )
+ if err := db.Count(&total).Error; err != nil {
+ return err
+ }
+ if total != 0 {
+ return nil
+ }
+ records := []*SalesReturnProduct{}
+ return slf.CreateBatch(records)
+}
diff --git a/model/product.go b/model/product.go
index 7ec7b6b..e88a323 100644
--- a/model/product.go
+++ b/model/product.go
@@ -47,6 +47,9 @@
if slf.Name != "" {
db = db.Where("name = ?", slf.Name)
}
+ if len(slf.Ids) != 0 {
+ db = db.Where("id in ?", slf.Ids)
+ }
return db
}
diff --git a/model/request/salesDetailsProduct.go b/model/request/salesDetailsProduct.go
deleted file mode 100644
index b494989..0000000
--- a/model/request/salesDetailsProduct.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package request
-
-import (
- "aps_crm/constvar"
- "aps_crm/model"
-)
-
-type AddSalesDetailsProduct struct {
- model.SalesDetailsProduct
-}
-
-type UpdateSalesDetailsProduct struct {
- Id int `json:"id"`
- model.SalesDetailsProduct
-}
-
-type GetSalesDetailsProductList struct {
- PageInfo
- QueryClass constvar.SalesDetailsProductQueryClass `json:"queryClass" form:"queryClass"`
- KeywordType constvar.SalesDetailsProductKeywordType `json:"keywordType" form:"keywordType"`
- Keyword string `json:"keyword" form:"keyword"`
-}
diff --git a/model/salesContractProduct.go b/model/salesContractProduct.go
new file mode 100644
index 0000000..89f1215
--- /dev/null
+++ b/model/salesContractProduct.go
@@ -0,0 +1,130 @@
+package model
+
+import (
+ "aps_crm/pkg/mysqlx"
+ "fmt"
+ "gorm.io/gorm"
+)
+
+type (
+ // ServiceContractProduct 鏈嶅姟鍚堝悓鍜屼骇鍝佸叧鑱�
+ ServiceContractProduct struct {
+ ServiceContractId int `json:"id" gorm:"column:sales_details_id;type:int;primary_key;not null;default:0"`
+ ProductId uint `json:"name" gorm:"primary_key;column:product_id;type:int;not null;default:0;comment:浜у搧id"`
+ }
+
+ // ServiceContractProductSearch 閿�鍞槑缁嗗拰浜у搧鍏宠仈鎼滅储鏉′欢
+ ServiceContractProductSearch struct {
+ ServiceContractProduct
+ Orm *gorm.DB
+ Keyword string
+ PageNum int
+ PageSize int
+ }
+)
+
+func (ServiceContractProduct) TableName() string {
+ return "service_contract_product"
+}
+
+func NewServiceContractProductSearch() *ServiceContractProductSearch {
+ return &ServiceContractProductSearch{
+ Orm: mysqlx.GetDB(),
+ }
+}
+
+func (slf *ServiceContractProductSearch) build() *gorm.DB {
+ var db = slf.Orm.Model(&ServiceContractProduct{})
+
+ return db
+}
+
+func (slf *ServiceContractProductSearch) Create(record *ServiceContractProduct) error {
+ var db = slf.build()
+ return db.Create(record).Error
+}
+
+func (slf *ServiceContractProductSearch) CreateBatch(records []*ServiceContractProduct) error {
+ var db = slf.build()
+ return db.Create(records).Error
+}
+
+func (slf *ServiceContractProductSearch) Delete() error {
+ var db = slf.build()
+ return db.Delete(&ServiceContractProduct{}).Error
+}
+
+func (slf *ServiceContractProductSearch) Update(record *ServiceContractProduct) error {
+ var db = slf.build()
+ return db.Updates(record).Error
+}
+
+func (slf *ServiceContractProductSearch) FindAll() ([]*ServiceContractProduct, error) {
+ var db = slf.build()
+ var record = make([]*ServiceContractProduct, 0)
+ err := db.Find(&record).Error
+ return record, err
+}
+
+func (slf *ServiceContractProductSearch) SetPage(page, size int) *ServiceContractProductSearch {
+ slf.PageNum, slf.PageSize = page, size
+ return slf
+}
+
+func (slf *ServiceContractProductSearch) SetOrm(tx *gorm.DB) *ServiceContractProductSearch {
+ slf.Orm = tx
+ return slf
+}
+
+func (slf *ServiceContractProductSearch) First() (*ServiceContractProduct, error) {
+ var db = slf.build()
+ var record = new(ServiceContractProduct)
+ err := db.First(record).Error
+ return record, err
+}
+
+func (slf *ServiceContractProductSearch) Updates(values interface{}) error {
+ var db = slf.build()
+ return db.Updates(values).Error
+}
+
+func (slf *ServiceContractProductSearch) Save(record *ServiceContractProduct) error {
+ var db = slf.build()
+
+ if err := db.Save(record).Error; err != nil {
+ return fmt.Errorf("save err: %v, record: %+v", err, record)
+ }
+
+ return nil
+}
+
+func (slf *ServiceContractProductSearch) Find() ([]*ServiceContractProduct, int64, error) {
+ var db = slf.build()
+ var records = make([]*ServiceContractProduct, 0)
+ var total int64
+ if err := db.Count(&total).Error; err != nil {
+ return records, total, err
+ }
+ if slf.PageNum > 0 && slf.PageSize > 0 {
+ db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
+ }
+
+ err := db.Find(&records).Error
+ return records, total, err
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *ServiceContractProductSearch) InitDefaultData() error {
+ var (
+ db = slf.Orm.Table(slf.TableName())
+ total int64 = 0
+ )
+ if err := db.Count(&total).Error; err != nil {
+ return err
+ }
+ if total != 0 {
+ return nil
+ }
+ records := []*ServiceContractProduct{}
+ return slf.CreateBatch(records)
+}
diff --git a/model/salesDetails.go b/model/salesDetails.go
index a2659d8..ed81fab 100644
--- a/model/salesDetails.go
+++ b/model/salesDetails.go
@@ -30,7 +30,7 @@
Conditions string `json:"conditions" gorm:"column:conditions;type:text;comment:鏉′欢"`
CreatorId int `json:"creatorId" gorm:"column:creator_id;type:int;comment:鍒涘缓浜篿d"`
Remark string `json:"remark" gorm:"column:remark;type:text;comment:澶囨敞"`
- Products []*Product `json:"products" gorm:"many2many:sales_details_product;"`
+ Products []*Product `json:"products" gorm:"many2many:SalesDetails_Product;"`
LogisticCompany string `json:"logisticCompany" gorm:"column:logistic_company;type:varchar(255);comment:鐗╂祦鍏徃"`
LogisticNumber string `json:"logisticNumber" gorm:"column:logistic_number;type:varchar(255);comment:鐗╂祦鍗曞彿"`
LogisticCost float64 `json:"logisticCost" gorm:"column:logistic_cost;type:decimal(10,2);comment:鐗╂祦璐圭敤"`
diff --git a/model/salesDetailsProduct.go b/model/salesDetailsProduct.go
index 467b869..a803e83 100644
--- a/model/salesDetailsProduct.go
+++ b/model/salesDetailsProduct.go
@@ -10,8 +10,8 @@
type (
// SalesDetailsProduct 閿�鍞槑缁嗗拰浜у搧鍏宠仈
SalesDetailsProduct struct {
- SalesDetailsId int `json:"id" gorm:"column:id;type:int;primary_key;AUTO_INCREMENT"`
- ProductId uint `json:"name" gorm:"primary_key;column:name;type:varchar(255);not null;default:'';comment:鍚嶇О"`
+ SalesDetailsId int `json:"id" gorm:"column:sales_details_id;type:int;primary_key;not null;default:0"`
+ ProductId uint `json:"name" gorm:"primary_key;column:product_id;type:int;not null;default:0;comment:浜у搧id"`
}
// SalesDetailsProductSearch 閿�鍞槑缁嗗拰浜у搧鍏宠仈鎼滅储鏉′欢
diff --git a/service/products.go b/service/products.go
index e8d46e5..249cc9c 100644
--- a/service/products.go
+++ b/service/products.go
@@ -28,6 +28,9 @@
for _, product := range products {
if productIdMap[product.Id] == nil && productNumberMap[product.Number] == nil {
newProducts = append(newProducts, product)
+ } else if productIdMap[product.Id] != nil && slf.CheckProductChanged(productIdMap[product.Id], product) || productNumberMap[product.Number] != nil && slf.CheckProductChanged(productNumberMap[product.Number], product) {
+ removedProducts = append(removedProducts, product)
+ newProducts = append(newProducts, product)
}
productNumberMap2[product.Number] = product
}
@@ -39,6 +42,13 @@
return
}
+func (slf ProductsService) CheckProductChanged(originProduct, newProduct *model.Product) bool {
+ return originProduct.Number != newProduct.Number ||
+ !originProduct.Amount.Equal(newProduct.Amount) ||
+ !originProduct.Price.Equal(newProduct.Price) ||
+ !originProduct.Total.Equal(newProduct.Total)
+}
+
func (slf ProductsService) getMappedProducts(sourceProducts []*model.Product) (map[uint]*model.Product, map[string]*model.Product) {
productIdMap := make(map[uint]*model.Product, len(sourceProducts))
productNumberMap := make(map[string]*model.Product, len(sourceProducts))
diff --git a/service/salesDetails.go b/service/salesDetails.go
index a2e5ad8..fa497bf 100644
--- a/service/salesDetails.go
+++ b/service/salesDetails.go
@@ -53,46 +53,58 @@
func (SalesDetailsService) UpdateSalesDetails(salesDetails *model.SalesDetails) int {
// check salesDetails exist
- old, err := model.NewSalesDetailsSearch().SetId(salesDetails.Id).First()
+ old, err := model.NewSalesDetailsSearch().SetId(salesDetails.Id).SetPreload(true).First()
if err != nil {
return ecode.SalesDetailsNotExist
}
var totalAmount decimal.Decimal
totalAmount = salesDetails.AmountTotal
- newProducts, removedProducts := NewProductsService().PickDiffProducts(salesDetails.Products, old.Products)
- for _, product := range newProducts {
+ for _, product := range salesDetails.Products {
totalAmount = totalAmount.Add(product.Amount.Mul(product.Price))
- }
- removedProductIds := make([]uint, 0, len(removedProducts))
- for _, product := range removedProducts {
- totalAmount = totalAmount.Sub(product.Amount.Mul(product.Price))
- removedProductIds = append(removedProductIds, product.Id)
}
salesDetails.AmountTotal = totalAmount.Round(2)
salesDetails.AmountReceivable = salesDetails.AmountTotal.Sub(salesDetails.AmountReceived)
salesDetails.AmountUnInvoiced = salesDetails.AmountTotal.Sub(salesDetails.AmountInvoiced)
+ newProducts, removedProducts := NewProductsService().PickDiffProducts(salesDetails.Products, old.Products)
err = model.WithTransaction(func(db *gorm.DB) error {
err = model.NewSalesDetailsSearch().SetId(salesDetails.Id).Update(salesDetails)
if err != nil {
return err
}
- err = model.NewProductSearch(db).SetIds(removedProductIds).Delete()
- if err != nil {
- return err
+ if len(removedProducts) > 0 {
+ removedProductIds := make([]uint, 0, len(removedProducts))
+ for _, product := range removedProducts {
+ totalAmount = totalAmount.Sub(product.Amount.Mul(product.Price))
+ removedProductIds = append(removedProductIds, product.Id)
+ }
+ err = model.NewProductSearch(db).SetIds(removedProductIds).Delete()
+ if err != nil {
+ return err
+ }
}
- err = model.NewProductSearch(db).CreateBatch(newProducts)
- if err != nil {
- return err
+ if len(newProducts) > 0 {
+ for _, p := range newProducts {
+ p.Id = 0
+ }
+ err = model.NewProductSearch(db).CreateBatch(newProducts)
+ if err != nil {
+ return err
+ }
+ var rel []*model.SalesDetailsProduct
+ for _, p := range newProducts {
+ rel = append(rel, &model.SalesDetailsProduct{
+ SalesDetailsId: salesDetails.Id,
+ ProductId: p.Id,
+ })
+ }
+ err = model.NewSalesDetailsProductSearch().CreateBatch(rel)
+ if err != nil {
+ return err
+ }
}
- var rel []*model.SalesDetailsProduct
- for _, p := range newProducts {
- rel = append(rel, &model.SalesDetailsProduct{
- SalesDetailsId: salesDetails.Id,
- ProductId: p.Id,
- })
- }
- return model.NewSalesDetailsProductSearch().CreateBatch(rel)
+ return nil
+
})
if err != nil {
diff --git a/service/salesReturn.go b/service/salesReturn.go
index 231d7d3..6ffec28 100644
--- a/service/salesReturn.go
+++ b/service/salesReturn.go
@@ -73,9 +73,51 @@
}
salesReturn.AmountShouldRefund = salesReturn.AmountTotal
- err = model.NewSalesReturnSearch().SetId(salesReturn.Id).Update(salesReturn)
+ old, err := model.NewSalesReturnSearch().SetId(salesReturn.Id).SetPreload(true).First()
if err != nil {
- return ecode.SalesReturnSetErr
+ return ecode.DBErr
+ }
+ newProducts, removedProducts := NewProductsService().PickDiffProducts(salesReturn.Products, old.Products)
+ err = model.WithTransaction(func(db *gorm.DB) error {
+ err := model.NewSalesReturnSearch().SetId(salesReturn.Id).Update(salesReturn)
+ if err != nil {
+ return err
+ }
+ if len(removedProducts) > 0 {
+ removedProductIds := make([]uint, 0, len(removedProducts))
+ for _, product := range removedProducts {
+ removedProductIds = append(removedProductIds, product.Id)
+ }
+ err = model.NewProductSearch(db).SetIds(removedProductIds).Delete()
+ if err != nil {
+ return err
+ }
+ }
+ if len(newProducts) > 0 {
+ for _, p := range newProducts {
+ p.Id = 0
+ }
+ err = model.NewProductSearch(db).CreateBatch(newProducts)
+ if err != nil {
+ return err
+ }
+ var rel []*model.SalesReturnProduct
+ for _, p := range newProducts {
+ rel = append(rel, &model.SalesReturnProduct{
+ SalesReturnId: salesReturn.Id,
+ ProductId: p.Id,
+ })
+ }
+ err = model.NewSalesReturnProductSearch().CreateBatch(rel)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+ })
+
+ if err != nil {
+ return ecode.DBErr
}
return ecode.OK
diff --git a/service/serviceContract.go b/service/serviceContract.go
index 93b7b3a..cdf87b7 100644
--- a/service/serviceContract.go
+++ b/service/serviceContract.go
@@ -5,6 +5,7 @@
"aps_crm/model"
"aps_crm/pkg/ecode"
"github.com/shopspring/decimal"
+ "gorm.io/gorm"
)
type SContractService struct{}
@@ -32,28 +33,59 @@
func (SContractService) UpdateServiceContract(serviceContract *model.ServiceContract) int {
// check serviceContract exist
- old, err := model.NewServiceContractSearch().SetId(serviceContract.Id).First()
+ old, err := model.NewServiceContractSearch().SetId(serviceContract.Id).SetPreload(true).First()
if err != nil {
return ecode.SContractNotExist
}
var totalAmount decimal.Decimal
totalAmount = serviceContract.AmountTotal
newProducts, removedProducts := NewProductsService().PickDiffProducts(serviceContract.Products, old.Products)
- for _, product := range newProducts {
+ for _, product := range serviceContract.Products {
totalAmount = totalAmount.Add(product.Amount.Mul(product.Price))
- }
- removedProductIds := make([]uint, 0, len(removedProducts))
- for _, product := range removedProducts {
- totalAmount = totalAmount.Sub(product.Amount.Mul(product.Price))
- removedProductIds = append(removedProductIds, product.Id)
}
serviceContract.AmountTotal = totalAmount.Round(2)
serviceContract.AmountReceivable = serviceContract.AmountTotal.Sub(serviceContract.AmountReceived)
serviceContract.AmountUnInvoiced = serviceContract.AmountTotal.Sub(serviceContract.AmountInvoiced)
+ err = model.WithTransaction(func(db *gorm.DB) error {
+ err := model.NewServiceContractSearch().Create(serviceContract)
+ if err != nil {
+ return err
+ }
+ if len(removedProducts) > 0 {
+ removedProductIds := make([]uint, 0, len(removedProducts))
+ for _, product := range removedProducts {
+ removedProductIds = append(removedProductIds, product.Id)
+ }
+ err = model.NewProductSearch(db).SetIds(removedProductIds).Delete()
+ if err != nil {
+ return err
+ }
+ }
+ if len(newProducts) > 0 {
+ for _, p := range newProducts {
+ p.Id = 0
+ }
+ err = model.NewProductSearch(db).CreateBatch(newProducts)
+ if err != nil {
+ return err
+ }
+ var rel []*model.ServiceContractProduct
+ for _, p := range newProducts {
+ rel = append(rel, &model.ServiceContractProduct{
+ ServiceContractId: serviceContract.Id,
+ ProductId: p.Id,
+ })
+ }
+ err = model.NewServiceContractProductSearch().CreateBatch(rel)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+ })
- err = model.NewServiceContractSearch().SetId(serviceContract.Id).Update(serviceContract)
if err != nil {
- return ecode.SContractSetErr
+ return ecode.DBErr
}
return ecode.OK
--
Gitblit v1.8.0