package hook import ( "errors" "git.oa00.com/go/mysql" "github.com/shopspring/decimal" "gorm.io/gorm" "recook/internal/model/aftersales" "recook/internal/model/order" "recook/internal/v2/logic/finance" "recook/internal/v2/logic/source/wallet" finance2 "recook/internal/v2/model/finance" "recook/internal/v2/model/gys" "recook/internal/v2/model/gys/enterprise" "recook/internal/v2/model/recook/after" manage "recook/internal/v2/model/recook/order" ) var AfterHook = &afterHook{} type afterHook struct { } // Create @Title 创建售后 func (o *afterHook) Create(orderGoods *order.GoodsDetail, after *aftersales.Goods) error { return mysql.Db.Transaction(func(tx *gorm.DB) error { // 结算处理 if err := finance.BillLogic.After(tx, orderGoods.ID, after.ID); err != nil { return errors.New("添加售后失败") } return nil }) } // Close @Title 关闭售后 func (o *afterHook) Close(after *after.RecookAfterSalesGoodsModel) error { return mysql.Db.Transaction(func(tx *gorm.DB) error { // 结算处理 if err := finance.BillLogic.AfterClose(tx, after.Id); err != nil { return errors.New("添加售后失败") } return nil }) } // Finish @Title 售后完结 func (o *afterHook) Finish(after *after.RecookAfterSalesGoodsModel) error { enterpriseStateModel := enterprise.GysEnterpriseStateModel{UserId: after.VendorId} mysql.Db.Where(&enterpriseStateModel).First(&enterpriseStateModel) sourceModel := gys.GysSourceModel{Id: enterpriseStateModel.Source} mysql.Db.First(&sourceModel) orderGoodsDetail := manage.RecookOrderGoodsDetailModel{Id: after.OrderGoodsId} mysql.Db.First(&orderGoodsDetail) purchasePrice := orderGoodsDetail.PurchasePrice.Mul(sourceModel.Coefficient).Round(2) amount := purchasePrice.Mul(decimal.NewFromInt(int64(orderGoodsDetail.Quantity))).Add(orderGoodsDetail.ExpressFee) refundAmount := decimal.Zero compensateAmount := after.SupplierPrice if orderGoodsDetail.AssType == manage.RecookOrderGoodsDetailAssTypeRejected { refundAmount = amount compensateAmount = after.ExpressFree } return mysql.Db.Transaction(func(tx *gorm.DB) error { // 解冻金额 if sourceModel.BillType == gys.GysSourceModelBillTypeDeposit { if err := wallet.DepositLogic.UnFreeze(tx, enterpriseStateModel.Source, refundAmount.Add(compensateAmount)); err != nil { return errors.New("解冻金额") } } //售后完结:bill_source var billOrder finance2.RecookFinanceBillOrder tx.Model(&billOrder).Where("after_id=?", after.Id).First(&billOrder) if err := tx.Model(&billOrder).Where("id=?", billOrder.Id).Update("status", 2).Error; err != nil { return err } return nil }) }