From c5a0eb549cba2cd358a2d0496c44f3a289f15d9c Mon Sep 17 00:00:00 2001 From: wangpengfei <274878379@qq.com> Date: 星期一, 28 八月 2023 14:22:06 +0800 Subject: [PATCH] fix --- service/salesReturn.go | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 106 insertions(+), 11 deletions(-) diff --git a/service/salesReturn.go b/service/salesReturn.go index 6d4a7e3..b7362f4 100644 --- a/service/salesReturn.go +++ b/service/salesReturn.go @@ -1,13 +1,23 @@ package service import ( + "aps_crm/constvar" "aps_crm/model" "aps_crm/pkg/ecode" + "github.com/shopspring/decimal" + "gorm.io/gorm" ) type SalesReturnService struct{} -func (SalesReturnService) AddSalesReturn(salesReturn *model.SalesReturn) int { +func (slf SalesReturnService) AddSalesReturn(salesReturn *model.SalesReturn) int { + salesReturn.AmountShouldRefund = decimal.Zero + salesReturn.AmountHasRefund = decimal.Zero + salesReturn.AmountTotal = decimal.Zero + for _, product := range salesReturn.Products { + salesReturn.AmountTotal = salesReturn.AmountTotal.Add(product.Amount.Mul(product.Price)) + } + salesReturn.AmountShouldRefund = salesReturn.AmountTotal err := model.NewSalesReturnSearch().Create(salesReturn) if err != nil { return ecode.SalesReturnExist @@ -16,39 +26,124 @@ return ecode.OK } -func (SalesReturnService) DeleteSalesReturn(id int) int { - _, err := model.NewSalesReturnSearch().SetId(id).Find() +func (slf SalesReturnService) DeleteSalesReturn(id int) int { + _, err := model.NewSalesReturnSearch().SetId(id).First() if err != nil { return ecode.SalesReturnNotExist } - - err = model.NewSalesReturnSearch().SetId(id).Delete() + err = model.WithTransaction(func(db *gorm.DB) error { + err = model.NewSalesReturnSearch().SetOrm(db).SetId(id).Delete() + if err != nil { + return err + } + err = model.NewSalesRefundSearch().SetOrm(db).SetSourceType(constvar.RefundSourceTypeSalesReturn).SetSourceId(id).Delete() + if err != nil { + return err + } + return nil + }) if err != nil { return ecode.SalesReturnNotExist } return ecode.OK +} + +func (slf SalesReturnService) BatchDeleteSalesReturn(ids []int) (failIds []int, code int) { + for _, id := range ids { + code = slf.DeleteSalesReturn(id) + if code != ecode.OK { + failIds = append(failIds, id) + } + } + return failIds, code } func (SalesReturnService) UpdateSalesReturn(salesReturn *model.SalesReturn) int { // check salesReturn exist - _, err := model.NewSalesReturnSearch().SetId(salesReturn.Id).Find() + _, err := model.NewSalesReturnSearch().SetId(salesReturn.Id).First() if err != nil { return ecode.SalesReturnNotExist } - err = model.NewSalesReturnSearch().SetId(salesReturn.Id).Update(salesReturn) + salesReturn.AmountShouldRefund = decimal.Zero + salesReturn.AmountHasRefund = decimal.Zero + salesReturn.AmountTotal = decimal.Zero + for _, product := range salesReturn.Products { + salesReturn.AmountTotal = salesReturn.AmountTotal.Add(product.Amount.Mul(product.Price)) + } + salesReturn.AmountShouldRefund = salesReturn.AmountTotal + + 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 } -func (SalesReturnService) GetSalesReturnList(page, pageSize int, keyword string) ([]*model.SalesReturn, int) { +func (SalesReturnService) GetSalesReturnList(page, pageSize int, keywordType constvar.SalesReturnKeywordType, keyword string) ([]*model.SalesReturn, int64, int) { // get contact list - contacts, err := model.NewSalesReturnSearch().SetKeyword(keyword).SetPage(page, pageSize).FindAll() + contacts, total, err := model.NewSalesReturnSearch(). + SetKeywordType(keywordType). + SetKeyword(keyword). + SetPage(page, pageSize). + SetPreload(true). + FindAll() + if err != nil { + return nil, 0, ecode.SalesReturnListErr + } + return contacts, total, ecode.OK +} + +func (SalesReturnService) GetSalesReturnListByIds(ids []int) ([]*model.SalesReturn, int) { + // get contact list + salesReturns, err := model.NewSalesReturnSearch(). + SetIds(ids). + Find() if err != nil { return nil, ecode.SalesReturnListErr } - return contacts, ecode.OK + return salesReturns, ecode.OK } -- Gitblit v1.8.0