From d87a424d3e1737a730b4c503ac1dbb74a176fe58 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期三, 16 八月 2023 11:23:39 +0800 Subject: [PATCH] 退货单批量删除返回失败的 --- model/salesReturn.go | 22 ++++++- model/salesRefund.go | 14 ++++ service/salesRefund.go | 4 docs/swagger.yaml | 2 docs/docs.go | 2 service/salesReturn.go | 59 ++++++++++++++++--- api/v1/salesReturn.go | 20 ++++-- docs/swagger.json | 2 8 files changed, 99 insertions(+), 26 deletions(-) diff --git a/api/v1/salesReturn.go b/api/v1/salesReturn.go index b86ac87..5e84ff5 100644 --- a/api/v1/salesReturn.go +++ b/api/v1/salesReturn.go @@ -8,6 +8,7 @@ "aps_crm/pkg/ecode" "github.com/gin-gonic/gin" "strconv" + "strings" ) type SalesReturnApi struct{} @@ -79,14 +80,21 @@ if !ok { return } - - errCode := salesReturnService.BatchDeleteSalesReturn(params.Ids) - if errCode != ecode.OK { - ctx.Fail(errCode) + failIds, _ := salesReturnService.BatchDeleteSalesReturn(params.Ids) + if len(failIds) == 0 { + ctx.Ok() return } - - ctx.Ok() + salesReturns, code := salesReturnService.GetSalesReturnListByIds(failIds) + if code != ecode.OK { + ctx.Ok() + return + } + var numbers []string + for _, salesReturn := range salesReturns { + numbers = append(numbers, salesReturn.Number) + } + ctx.FailWithMsg(ecode.DBErr, strings.Join(numbers, ",")+"鍒犻櫎澶辫触") } // Update diff --git a/docs/docs.go b/docs/docs.go index a533727..3cc0e8f 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -12256,7 +12256,7 @@ "type": "integer" }, "sourceType": { - "description": "鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級", + "description": "鏉ユ簮绫诲瀷锛�1閿�鍞��璐э級", "allOf": [ { "$ref": "#/definitions/constvar.RefundSourceType" diff --git a/docs/swagger.json b/docs/swagger.json index 949d21f..ce9b963 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -12244,7 +12244,7 @@ "type": "integer" }, "sourceType": { - "description": "鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級", + "description": "鏉ユ簮绫诲瀷锛�1閿�鍞��璐э級", "allOf": [ { "$ref": "#/definitions/constvar.RefundSourceType" diff --git a/docs/swagger.yaml b/docs/swagger.yaml index aea633a..e1cb595 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1480,7 +1480,7 @@ sourceType: allOf: - $ref: '#/definitions/constvar.RefundSourceType' - description: 鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級 + description: 鏉ユ簮绫诲瀷锛�1閿�鍞��璐э級 type: object model.SalesReturn: properties: diff --git a/model/salesRefund.go b/model/salesRefund.go index ef9b5ca..2a3fe92 100644 --- a/model/salesRefund.go +++ b/model/salesRefund.go @@ -15,8 +15,8 @@ ClientId int `json:"clientId" gorm:"column:client_id;type:int;comment:瀹㈡埛id"` Client Client `json:"client" gorm:"foreignKey:ClientId"` Number string `json:"number" gorm:"column:number;type:varchar(255);comment:閫�娆惧崟鍙�"` - SourceType constvar.RefundSourceType `gorm:"column:source_type;type:int;not null;default 0;comment:鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級" json:"sourceType"` // 鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級 - SourceId int `gorm:"column:source_id;type:int;not null;default 0;comment:婧愬崟id " json:"sourceId"` // 婧愬崟id + SourceType constvar.RefundSourceType `gorm:"column:source_type;type:int;not null;default 0;comment:鏉ユ簮绫诲瀷锛�1閿�鍞��璐э級" json:"sourceType"` // 鏉ユ簮绫诲瀷锛�1閿�鍞��璐э級 + SourceId int `gorm:"column:source_id;type:int;not null;default 0;comment:婧愬崟id " json:"sourceId"` // 婧愬崟id MemberId int `json:"memberId" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"` Member User `json:"member" gorm:"foreignKey:MemberId"` RefundDate string `json:"refundDate" gorm:"column:refund_date;type:datetime;comment:閫�娆炬棩鏈�"` @@ -138,6 +138,16 @@ return slf } +func (slf *SalesRefundSearch) SetSourceType(sourceType constvar.RefundSourceType) *SalesRefundSearch { + slf.SourceType = sourceType + return slf +} + +func (slf *SalesRefundSearch) SetSourceId(id int) *SalesRefundSearch { + slf.SourceId = id + return slf +} + func (slf *SalesRefundSearch) SetPreload(preload bool) *SalesRefundSearch { slf.Preload = preload return slf diff --git a/model/salesReturn.go b/model/salesReturn.go index c586a7d..8012443 100644 --- a/model/salesReturn.go +++ b/model/salesReturn.go @@ -29,7 +29,7 @@ Products []*Product `json:"products" gorm:"many2many:salesReturn_product;"` //閫�璐т骇鍝� AmountShouldRefund decimal.Decimal `gorm:"column:amount_should_refund;type:decimal(12,2);comment:搴旈��娆鹃噾棰�" json:"amountShouldRefund"` // 搴旈��娆鹃噾棰� AmountHasRefund decimal.Decimal `gorm:"column:amount_has_refund;type:decimal(12,2);comment:宸查��娆鹃噾棰�" json:"amountHasRefund"` // 宸查��娆鹃噾棰� - + AmountTotal decimal.Decimal `gorm:"column:amount_total;type:decimal(12,2);comment:閫�璐т骇鍝佹�婚噾棰�" json:"-"` CrmModel } @@ -43,6 +43,7 @@ PageNum int PageSize int Preload bool + Ids []int } ) @@ -59,6 +60,9 @@ var db = slf.Orm.Model(&SalesReturn{}) if slf.Id != 0 { db = db.Where("id = ?", slf.Id) + } + if len(slf.Ids) != 0 { + db = db.Where("id in ?", slf.Ids) } if slf.Preload { @@ -114,7 +118,7 @@ return db.Updates(record).Error } -func (slf *SalesReturnSearch) Find() (*SalesReturn, error) { +func (slf *SalesReturnSearch) First() (*SalesReturn, error) { var db = slf.build() var record = new(SalesReturn) err := db.First(record).Error @@ -131,16 +135,28 @@ if slf.PageNum > 0 && slf.PageSize > 0 { db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize) } - err := db.Preload("Member").Preload("Client").Preload("Products").Order("id desc").Find(&records).Error return records, total, err } +func (slf *SalesReturnSearch) Find() ([]*SalesReturn, error) { + var db = slf.build() + var records = make([]*SalesReturn, 0) + + err := db.Find(&records).Error + return records, err +} + func (slf *SalesReturnSearch) SetId(id int) *SalesReturnSearch { slf.Id = id return slf } +func (slf *SalesReturnSearch) SetIds(id []int) *SalesReturnSearch { + slf.Ids = id + return slf +} + func (slf *SalesReturnSearch) SetKeyword(keyword string) *SalesReturnSearch { slf.Keyword = keyword return slf diff --git a/service/salesRefund.go b/service/salesRefund.go index 8f7e52b..1c90148 100644 --- a/service/salesRefund.go +++ b/service/salesRefund.go @@ -9,7 +9,7 @@ type SalesRefundService struct{} func (SalesRefundService) AddSalesRefund(salesRefund *model.SalesRefund) int { - salesReturnRecord, err := model.NewSalesReturnSearch().SetId(salesRefund.SourceId).SetPreload(true).Find() + salesReturnRecord, err := model.NewSalesReturnSearch().SetId(salesRefund.SourceId).SetPreload(true).First() if err != nil { return ecode.SalesReturnNotExist } @@ -62,7 +62,7 @@ return ecode.SalesRefundNotExist } - salesReturnRecord, err := model.NewSalesReturnSearch().SetId(salesRefund.SourceId).SetPreload(true).Find() + salesReturnRecord, err := model.NewSalesReturnSearch().SetId(salesRefund.SourceId).SetPreload(true).First() if err != nil { return ecode.SalesReturnNotExist } diff --git a/service/salesReturn.go b/service/salesReturn.go index b6839ea..231d7d3 100644 --- a/service/salesReturn.go +++ b/service/salesReturn.go @@ -4,11 +4,20 @@ "aps_crm/constvar" "aps_crm/model" "aps_crm/pkg/ecode" + "github.com/shopspring/decimal" + "gorm.io/gorm" ) type SalesReturnService struct{} 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 @@ -17,33 +26,52 @@ 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().SetId(id).Delete() + if err != nil { + return err + } + err = model.NewSalesRefundSearch().SetSourceType(constvar.RefundSourceTypeSalesReturn).SetSourceId(id).Delete() + if err != nil { + return err + } + return nil + }) if err != nil { return ecode.SalesReturnNotExist } return ecode.OK } -func (SalesReturnService) BatchDeleteSalesReturn(ids []int) int { - err := model.NewSalesReturnSearch().DeleteByIds(ids) - if err != nil { - return ecode.DBErr +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 ecode.OK + 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 } + + 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().SetId(salesReturn.Id).Update(salesReturn) if err != nil { @@ -66,3 +94,14 @@ } 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 salesReturns, ecode.OK +} -- Gitblit v1.8.0