From 3c2ab50d6b1ac67da76043b1f7408b808a774de3 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期三, 16 八月 2023 11:54:37 +0800 Subject: [PATCH] 销售退货单批量删除接口 --- api/v1/salesRefund.go | 42 +++++++ model/salesReturn.go | 2 model/salesRefund.go | 22 ++++ model/index.go | 2 service/salesRefund.go | 96 ++++++++++++++++++- model/request/salesRefund.go | 4 docs/swagger.yaml | 27 ++++ docs/docs.go | 38 ++++++ docs/swagger.json | 38 ++++++ router/salesRefund.go | 9 + 10 files changed, 249 insertions(+), 31 deletions(-) diff --git a/api/v1/salesRefund.go b/api/v1/salesRefund.go index fcc02e1..866b9dc 100644 --- a/api/v1/salesRefund.go +++ b/api/v1/salesRefund.go @@ -8,13 +8,14 @@ "aps_crm/pkg/ecode" "github.com/gin-gonic/gin" "strconv" + "strings" ) type SalesRefundApi struct{} // Add // -// @Tags SalesRefund +// @Tags 閿�鍞��娆惧崟 // @Summary 娣诲姞閿�鍞��娆� // @Produce application/json // @Param object body request.AddSalesRefundRequest true "鏌ヨ鍙傛暟" @@ -44,7 +45,7 @@ // Delete // -// @Tags SalesRefund +// @Tags 閿�鍞��娆惧崟 // @Summary 鍒犻櫎閿�鍞��娆� // @Produce application/json // @Param id path int true "鏌ヨ鍙傛暟" @@ -66,9 +67,40 @@ ctx.Ok() } +// BatchDelete +// @Tags 閿�鍞��娆惧崟 +// @Summary 鎵归噺鍒犻櫎閿�鍞��娆惧崟 +// @Produce application/json +// @Param object body request.CommonIds true "鍙傛暟" +// @Success 200 {object} contextx.Response{} +// @Router /api/salesRefund/delete [delete] +func (s *SalesRefundApi) BatchDelete(c *gin.Context) { + var params request.CommonIds + ctx, ok := contextx.NewContext(c, ¶ms) + if !ok { + return + } + + failIds, _ := salesRefundService.BatchDeleteSalesRefund(params.Ids) + if len(failIds) == 0 { + ctx.Ok() + return + } + salesReturns, code := salesRefundService.GetSalesRefundListByIds(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 // -// @Tags SalesRefund +// @Tags 閿�鍞��娆惧崟 // @Summary 鏇存柊閿�鍞��娆� // @Produce application/json // @Param object body request.UpdateSalesRefundRequest true "鏌ヨ鍙傛暟" @@ -108,13 +140,15 @@ salesRefundRes.IsInvoice = salesRefund.IsInvoice salesRefundRes.Reason = salesRefund.Reason salesRefundRes.Products = salesRefund.Products + salesRefundRes.SourceType = salesRefund.SourceType + salesRefundRes.SourceId = salesRefund.SourceId return ecode.OK, salesRefundRes } // List // -// @Tags SalesRefund +// @Tags 閿�鍞��娆惧崟 // @Summary 閿�鍞��娆惧崟鍒楄〃 // @Produce application/json // @Param object body request.GetSalesRefundList true "鍙傛暟" diff --git a/docs/docs.go b/docs/docs.go index 3cc0e8f..e34db9e 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -7075,7 +7075,7 @@ "application/json" ], "tags": [ - "SalesRefund" + "閿�鍞��娆惧崟" ], "summary": "娣诲姞閿�鍞��娆�", "parameters": [ @@ -7099,13 +7099,43 @@ } } }, + "/api/salesRefund/delete": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "閿�鍞��娆惧崟" + ], + "summary": "鎵归噺鍒犻櫎閿�鍞��娆惧崟", + "parameters": [ + { + "description": "鍙傛暟", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.CommonIds" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/contextx.Response" + } + } + } + } + }, "/api/salesRefund/delete/{id}": { "delete": { "produces": [ "application/json" ], "tags": [ - "SalesRefund" + "閿�鍞��娆惧崟" ], "summary": "鍒犻櫎閿�鍞��娆�", "parameters": [ @@ -7133,7 +7163,7 @@ "application/json" ], "tags": [ - "SalesRefund" + "閿�鍞��娆惧崟" ], "summary": "閿�鍞��娆惧崟鍒楄〃", "parameters": [ @@ -7175,7 +7205,7 @@ "application/json" ], "tags": [ - "SalesRefund" + "閿�鍞��娆惧崟" ], "summary": "鏇存柊閿�鍞��娆�", "parameters": [ diff --git a/docs/swagger.json b/docs/swagger.json index ce9b963..c945592 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -7063,7 +7063,7 @@ "application/json" ], "tags": [ - "SalesRefund" + "閿�鍞��娆惧崟" ], "summary": "娣诲姞閿�鍞��娆�", "parameters": [ @@ -7087,13 +7087,43 @@ } } }, + "/api/salesRefund/delete": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "閿�鍞��娆惧崟" + ], + "summary": "鎵归噺鍒犻櫎閿�鍞��娆惧崟", + "parameters": [ + { + "description": "鍙傛暟", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.CommonIds" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/contextx.Response" + } + } + } + } + }, "/api/salesRefund/delete/{id}": { "delete": { "produces": [ "application/json" ], "tags": [ - "SalesRefund" + "閿�鍞��娆惧崟" ], "summary": "鍒犻櫎閿�鍞��娆�", "parameters": [ @@ -7121,7 +7151,7 @@ "application/json" ], "tags": [ - "SalesRefund" + "閿�鍞��娆惧崟" ], "summary": "閿�鍞��娆惧崟鍒楄〃", "parameters": [ @@ -7163,7 +7193,7 @@ "application/json" ], "tags": [ - "SalesRefund" + "閿�鍞��娆惧崟" ], "summary": "鏇存柊閿�鍞��娆�", "parameters": [ diff --git a/docs/swagger.yaml b/docs/swagger.yaml index e1cb595..f631977 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -10307,7 +10307,26 @@ $ref: '#/definitions/contextx.Response' summary: 娣诲姞閿�鍞��娆� tags: - - SalesRefund + - 閿�鍞��娆惧崟 + /api/salesRefund/delete: + delete: + parameters: + - description: 鍙傛暟 + in: body + name: object + required: true + schema: + $ref: '#/definitions/request.CommonIds' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/contextx.Response' + summary: 鎵归噺鍒犻櫎閿�鍞��娆惧崟 + tags: + - 閿�鍞��娆惧崟 /api/salesRefund/delete/{id}: delete: parameters: @@ -10325,7 +10344,7 @@ $ref: '#/definitions/contextx.Response' summary: 鍒犻櫎閿�鍞��娆� tags: - - SalesRefund + - 閿�鍞��娆惧崟 /api/salesRefund/list: post: parameters: @@ -10349,7 +10368,7 @@ type: object summary: 閿�鍞��娆惧崟鍒楄〃 tags: - - SalesRefund + - 閿�鍞��娆惧崟 /api/salesRefund/update: put: parameters: @@ -10368,7 +10387,7 @@ $ref: '#/definitions/contextx.Response' summary: 鏇存柊閿�鍞��娆� tags: - - SalesRefund + - 閿�鍞��娆惧崟 /api/salesReturn/add: post: parameters: diff --git a/model/index.go b/model/index.go index 340ce2b..8ea162c 100644 --- a/model/index.go +++ b/model/index.go @@ -85,6 +85,8 @@ Currency{}, CollectionProjection{}, ContactInformation{}, + SalesReturn{}, + SalesRefund{}, ) return err } diff --git a/model/request/salesRefund.go b/model/request/salesRefund.go index d8fd5b5..0f132db 100644 --- a/model/request/salesRefund.go +++ b/model/request/salesRefund.go @@ -13,8 +13,8 @@ ClientId int `json:"clientId"` Number string `json:"number"` MemberId int `json:"memberId"` - 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" binding:"required"` // 鏉ユ簮绫诲瀷锛�1閿�鍞��娆惧崟锛� + SourceId int `gorm:"column:source_id;type:int;not null;default 0;comment:婧愬崟id " json:"sourceId" binding:"required"` // 婧愬崟id RefundDate string `json:"refundDate"` PaymentTypeId int `gorm:"column:payment_type_id;type:int;not null;default 0;comment:鏀舵鏂瑰紡ID" json:"paymentTypeId"` // 鏀舵鏂瑰紡ID BankAccountId int `gorm:"column:bank_account_id;type:int;not null;default 0;comment:璐︽埛id" json:"bankAccountId"` // 璐︽埛id diff --git a/model/salesRefund.go b/model/salesRefund.go index 2a3fe92..233aa72 100644 --- a/model/salesRefund.go +++ b/model/salesRefund.go @@ -19,7 +19,7 @@ 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:閫�娆炬棩鏈�"` + RefundDate string `json:"refundDate" gorm:"column:refund_date;type:varchar(255);comment:閫�娆炬棩鏈�"` PaymentTypeId int `gorm:"column:payment_type_id;type:int;not null;default 0;comment:鏀舵鏂瑰紡ID" json:"paymentTypeId"` // 鏀舵鏂瑰紡ID PaymentType PaymentType `gorm:"foreignKey:PaymentTypeId" json:"paymentType"` BankAccountId int `gorm:"column:bank_account_id;type:int;not null;default 0;comment:璐︽埛id" json:"bankAccountId"` // 璐︽埛id @@ -40,6 +40,7 @@ PageNum int PageSize int Preload bool + Ids []int } ) @@ -57,6 +58,10 @@ var db = slf.Orm.Model(&SalesRefund{}) 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 { @@ -107,11 +112,19 @@ return db.Updates(record).Error } -func (slf *SalesRefundSearch) Find() (*SalesRefund, error) { +func (slf *SalesRefundSearch) First() (*SalesRefund, error) { var db = slf.build() var record = new(SalesRefund) err := db.First(record).Error return record, err +} + +func (slf *SalesRefundSearch) Find() ([]*SalesRefund, error) { + var db = slf.build() + var records = make([]*SalesRefund, 0) + + err := db.Find(&records).Error + return records, err } func (slf *SalesRefundSearch) FindAll() ([]*SalesRefund, int64, error) { @@ -138,6 +151,11 @@ return slf } +func (slf *SalesRefundSearch) SetIds(id []int) *SalesRefundSearch { + slf.Ids = id + return slf +} + func (slf *SalesRefundSearch) SetSourceType(sourceType constvar.RefundSourceType) *SalesRefundSearch { slf.SourceType = sourceType return slf diff --git a/model/salesReturn.go b/model/salesReturn.go index 8012443..5149d5f 100644 --- a/model/salesReturn.go +++ b/model/salesReturn.go @@ -20,7 +20,7 @@ Repository string `json:"repository" gorm:"column:repository;type:varchar(255);comment:浠撳簱"` MemberId int `json:"memberId" gorm:"column:member_id;type:int;comment:璐熻矗浜篿d"` Member User `json:"Member" gorm:"foreignKey:MemberId"` - ReturnDate string `json:"returnDate" gorm:"column:return_date;type:datetime(3);comment:閫�璐ф棩鏈�"` //閫�璐ф棩鏈� + ReturnDate string `json:"returnDate" gorm:"column:return_date;type:varchar(255);comment:閫�璐ф棩鏈�"` //閫�璐ф棩鏈� SalesReturnStatusId int `json:"salesReturnStatusId" gorm:"column:sales_return_status;type:int;comment:閫�璐х姸鎬�"` //閫�璐х姸鎬乮d SalesReturnStatus SalesReturnStatus `json:"SalesReturnStatus" gorm:"foreignKey:SalesReturnStatusId"` //閫�璐х姸鎬� CreatorId int `json:"-" gorm:"column:creator_id;type:int;comment:鍒涘缓浜篿d"` //鍒涘缓浜篒D diff --git a/router/salesRefund.go b/router/salesRefund.go index c017d70..3410876 100644 --- a/router/salesRefund.go +++ b/router/salesRefund.go @@ -11,9 +11,10 @@ salesRefundRouter := router.Group("salesRefund") salesRefundApi := v1.ApiGroup.SalesRefundApi { - salesRefundRouter.POST("add", salesRefundApi.Add) // 娣诲姞閿�鍞��娆� - salesRefundRouter.DELETE("delete/:id", salesRefundApi.Delete) // 鍒犻櫎閿�鍞��娆� - salesRefundRouter.PUT("update", salesRefundApi.Update) // 鏇存柊閿�鍞��娆� + salesRefundRouter.POST("add", salesRefundApi.Add) // 娣诲姞閿�鍞��娆� + salesRefundRouter.DELETE("delete/:id", salesRefundApi.Delete) // 鍒犻櫎閿�鍞��娆� + salesRefundRouter.DELETE("delete", salesRefundApi.BatchDelete) // 鎵归噺鍒犻櫎閿�鍞��娆惧崟 + salesRefundRouter.PUT("update", salesRefundApi.Update) // 鏇存柊閿�鍞��娆� salesRefundRouter.POST("list", salesRefundApi.List) // 鑾峰彇閿�鍞��娆惧崟鍒楄〃 } -} \ No newline at end of file +} diff --git a/service/salesRefund.go b/service/salesRefund.go index 1c90148..cf548d9 100644 --- a/service/salesRefund.go +++ b/service/salesRefund.go @@ -4,6 +4,8 @@ "aps_crm/constvar" "aps_crm/model" "aps_crm/pkg/ecode" + "github.com/shopspring/decimal" + "gorm.io/gorm" ) type SalesRefundService struct{} @@ -17,8 +19,25 @@ if code := CheckProduct(salesReturnRecord.Products, salesRefund.Products); code != ecode.OK { return code } + var amount decimal.Decimal + for _, product := range salesRefund.Products { + amount = amount.Add(product.Amount.Mul(product.Price)) + } - err = model.NewSalesRefundSearch().Create(salesRefund) + err = model.WithTransaction(func(db *gorm.DB) error { + err = model.NewSalesRefundSearch().Create(salesRefund) + if err != nil { + return err + } + salesReturnRecord.AmountHasRefund = salesReturnRecord.AmountHasRefund.Add(amount).Round(2) + salesReturnRecord.AmountShouldRefund = salesReturnRecord.AmountTotal.Sub(salesReturnRecord.AmountHasRefund).Round(2) + err = model.NewSalesReturnSearch().SetId(salesRefund.SourceId).Update(salesReturnRecord) + if err != nil { + return err + } + return nil + }) + if err != nil { return ecode.SalesRefundExist } @@ -42,22 +61,54 @@ return ecode.OK } -func (SalesRefundService) DeleteSalesRefund(id int) int { - _, err := model.NewSalesRefundSearch().SetId(id).Find() +func (slf SalesRefundService) DeleteSalesRefund(id int) int { + refund, err := model.NewSalesRefundSearch().SetId(id).First() if err != nil { return ecode.SalesRefundNotExist } + salesReturnRecord, err := model.NewSalesReturnSearch().SetId(refund.SourceId).SetPreload(true).First() + if err != nil { + return ecode.SalesReturnNotExist + } - err = model.NewSalesRefundSearch().SetId(id).Delete() + var amount decimal.Decimal + for _, product := range refund.Products { + amount = amount.Add(product.Amount.Mul(product.Price)) + } + + err = model.WithTransaction(func(db *gorm.DB) error { + err = model.NewSalesRefundSearch().SetId(id).Delete() + if err != nil { + return err + } + salesReturnRecord.AmountHasRefund = salesReturnRecord.AmountHasRefund.Sub(amount).Round(2) + salesReturnRecord.AmountShouldRefund = salesReturnRecord.AmountTotal.Sub(salesReturnRecord.AmountHasRefund).Round(2) + err = model.NewSalesReturnSearch().SetId(refund.SourceId).Update(salesReturnRecord) + if err != nil { + return err + } + return nil + }) + if err != nil { return ecode.SalesRefundNotExist } return ecode.OK } +func (slf SalesRefundService) BatchDeleteSalesRefund(ids []int) (failIds []int, code int) { + for _, id := range ids { + code = slf.DeleteSalesRefund(id) + if code != ecode.OK { + failIds = append(failIds, id) + } + } + return failIds, code +} + func (SalesRefundService) UpdateSalesRefund(salesRefund *model.SalesRefund) int { // check salesRefund exist - _, err := model.NewSalesRefundSearch().SetId(salesRefund.Id).Find() + oldRefund, err := model.NewSalesRefundSearch().SetId(salesRefund.Id).First() if err != nil { return ecode.SalesRefundNotExist } @@ -71,7 +122,29 @@ return code } - err = model.NewSalesRefundSearch().SetId(salesRefund.Id).Update(salesRefund) + var diffAmount decimal.Decimal + + for _, product := range salesRefund.Products { + diffAmount = diffAmount.Add(product.Amount.Mul(product.Price)) + } + for _, product := range oldRefund.Products { + diffAmount = diffAmount.Sub(product.Amount.Mul(product.Price)) + } + + err = model.WithTransaction(func(db *gorm.DB) error { + err = model.NewSalesRefundSearch().SetId(salesRefund.Id).Update(salesRefund) + if err != nil { + return err + } + salesReturnRecord.AmountHasRefund = salesReturnRecord.AmountHasRefund.Sub(diffAmount).Round(2) + salesReturnRecord.AmountShouldRefund = salesReturnRecord.AmountTotal.Sub(salesReturnRecord.AmountHasRefund).Round(2) + err = model.NewSalesReturnSearch().SetId(salesRefund.SourceId).Update(salesReturnRecord) + if err != nil { + return err + } + return nil + }) + if err != nil { return ecode.SalesRefundSetErr } @@ -91,3 +164,14 @@ } return contacts, total, ecode.OK } + +func (SalesRefundService) GetSalesRefundListByIds(ids []int) ([]*model.SalesRefund, int) { + // get contact list + salesRefunds, err := model.NewSalesRefundSearch(). + SetIds(ids). + Find() + if err != nil { + return nil, ecode.SalesReturnListErr + } + return salesRefunds, ecode.OK +} -- Gitblit v1.8.0