package service
|
|
import (
|
"aps_crm/constvar"
|
"aps_crm/model"
|
"aps_crm/model/request"
|
"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))
|
product.Id = 0
|
}
|
salesReturn.AmountShouldRefund = salesReturn.AmountTotal
|
err := model.NewSalesReturnSearch().Create(salesReturn)
|
if err != nil {
|
return ecode.SalesReturnExist
|
}
|
|
return ecode.OK
|
}
|
|
func (slf SalesReturnService) DeleteSalesReturn(id int) int {
|
_, err := model.NewSalesReturnSearch().SetId(id).First()
|
if err != nil {
|
return ecode.SalesReturnNotExist
|
}
|
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).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
|
|
old, err := model.NewSalesReturnSearch().SetId(salesReturn.Id).SetPreload(true).First()
|
if err != nil {
|
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(params request.GetSalesReturnList, memberIds []int) ([]*model.SalesReturn, int64, int) {
|
// get contact list
|
contacts, total, err := model.NewSalesReturnSearch().
|
SetKeywordType(params.KeywordType).
|
SetKeyword(params.Keyword).
|
SetPage(params.Page, params.PageSize).
|
SetSourceId(params.SourceId).
|
SetSourceType(params.SourceType).
|
SetClientId(params.ClientId).
|
SetPreload(true).
|
SetMemberIds(memberIds).
|
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 salesReturns, ecode.OK
|
}
|