|
|
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
|
|
|
})
|
|
|
}
|