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