zhangqian
2023-08-16 87cad05224d857ec0e113ae03b006d2a52ec3049
Merge branch 'zq'
12个文件已修改
405 ■■■■ 已修改文件
api/v1/salesRefund.go 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/v1/salesReturn.go 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/docs.go 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.json 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.yaml 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/index.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/request/salesRefund.go 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/salesRefund.go 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/salesReturn.go 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/salesRefund.go 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/salesRefund.go 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/salesReturn.go 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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, &params)
    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    "参数"
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
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": [
@@ -12256,7 +12286,7 @@
                    "type": "integer"
                },
                "sourceType": {
                    "description": "来源类型(1销售明细单2服务合同3销售发票4收款计划5出库单)",
                    "description": "来源类型(1销售退货)",
                    "allOf": [
                        {
                            "$ref": "#/definitions/constvar.RefundSourceType"
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": [
@@ -12244,7 +12274,7 @@
                    "type": "integer"
                },
                "sourceType": {
                    "description": "来源类型(1销售明细单2服务合同3销售发票4收款计划5出库单)",
                    "description": "来源类型(1销售退货)",
                    "allOf": [
                        {
                            "$ref": "#/definitions/constvar.RefundSourceType"
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:
@@ -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:
model/index.go
@@ -85,6 +85,8 @@
        Currency{},
        CollectionProjection{},
        ContactInformation{},
        SalesReturn{},
        SalesRefund{},
    )
    return err
}
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
model/salesRefund.go
@@ -15,11 +15,11 @@
        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:负责人id"`
        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,21 @@
    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
}
func (slf *SalesRefundSearch) SetSourceId(id int) *SalesRefundSearch {
    slf.SourceId = id
    return slf
}
func (slf *SalesRefundSearch) SetPreload(preload bool) *SalesRefundSearch {
    slf.Preload = preload
    return slf
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:负责人id"`
        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:退货状态"`            //退货状态id
        SalesReturnStatus   SalesReturnStatus              `json:"SalesReturnStatus" gorm:"foreignKey:SalesReturnStatusId"`                                //退货状态
        CreatorId           int                            `json:"-" gorm:"column:creator_id;type:int;comment:创建人id"`                                      //创建人ID
@@ -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
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)            // 获取销售退款单列表
    }
}
}
service/salesRefund.go
@@ -4,12 +4,14 @@
    "aps_crm/constvar"
    "aps_crm/model"
    "aps_crm/pkg/ecode"
    "github.com/shopspring/decimal"
    "gorm.io/gorm"
)
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
    }
@@ -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,27 +61,59 @@
    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
    }
    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
    }
@@ -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
}
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
}