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