You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.6 KiB

4 years ago
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
})
}