package hook import ( "errors" "fmt" "git.oa00.com/go/mysql" "github.com/shopspring/decimal" "gopkg.in/gomail.v2" "gorm.io/gorm" "log" "recook/configs" "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" manage "recook/internal/v2/model/recook/order" "strings" ) var OrderHook = &orderHook{} type orderHook struct { } // Express @Title 发货 func (o *orderHook) Express(orderGoodsDetail *manage.RecookOrderGoodsDetailModel) error { enterpriseStateModel := enterprise.GysEnterpriseStateModel{UserId: orderGoodsDetail.VendorId} mysql.Db.Where(&enterpriseStateModel).First(&enterpriseStateModel) sourceModel := gys.GysSourceModel{Id: enterpriseStateModel.Source} mysql.Db.First(&sourceModel) purchasePrice := orderGoodsDetail.PurchasePrice.Mul(sourceModel.Coefficient).Round(2) freezeAmount := purchasePrice.Mul(decimal.NewFromInt(int64(orderGoodsDetail.Quantity))).Add(orderGoodsDetail.ExpressFee) //邮件提醒 EmailEarlyWarning(sourceModel.Id) return mysql.Db.Transaction(func(tx *gorm.DB) error { // 冻结金额 if sourceModel.BillType == gys.GysSourceModelBillTypeDeposit { if err := wallet.DepositLogic.Freeze(tx, enterpriseStateModel.Source, freezeAmount); err != nil { return errors.New("冻结金额") } } // 添加结算信息 if err := finance.BillLogic.Add(tx, enterpriseStateModel.Source, orderGoodsDetail.VendorId, orderGoodsDetail.OrderId, orderGoodsDetail.Id, orderGoodsDetail.GoodsId, orderGoodsDetail.SkuId, purchasePrice); err != nil { log.Println("[express hook] err:", err) return errors.New("发货失败") } return nil }) } // Finish @Title 订单完结 func (o *orderHook) Finish(order *manage.RecookOrderInfoModel) error { return mysql.Db.Transaction(func(tx *gorm.DB) error { // 添加结算信息 if err := finance.BillLogic.Finish(tx, order.Id); err != nil { log.Println("[express hook] err:", err) return errors.New("发货失败") } return nil }) } //邮件提醒预存款不足 func EmailEarlyWarning(sourceId uint) { var sourceDetail gys.GysSourceWallet mysql.Db.Model(&sourceDetail).Where("source_id=?", sourceId).Where("deposit_early_warning_status=?", 1).First(&sourceDetail) sourceName := gys.GysSourceModel{} mysql.Db.Model(&sourceName).First(&sourceName, "id=?", sourceId) if sourceName.BillType == 2 && sourceDetail.DepositEarlyWarningAmount.GreaterThanOrEqual(sourceDetail.DepositAmount) { //get emails var emails []finance2.RecookEmailEarlyWarning mysql.Db.Model(&emails).Find(&emails) var list []string for _, v := range emails { list = append(list, v.Email) } str := strings.Join(list, ",") m := gomail.NewMessage() m.SetHeader("From", configs.Config_Gys_Email_Setting_Mail) m.SetHeader("To", str, "monsoon.zhu@akuhome.com") m.SetHeader("Subject", "运营商预存款不足提醒") body := fmt.Sprintf("%s.预存款临近预警线,请充值,现还有预存款:%v", sourceName.Name, sourceDetail.DepositAmount) m.SetBody("text/html", body) d := gomail.NewDialer(configs.Config_Gys_Email_Setting_Smtp, configs.Config_Gys_Email_Setting_Port, configs.Config_Gys_Email_Setting_User, configs.Config_Gys_Email_Setting_Pass) if err := d.DialAndSend(m); err != nil { fmt.Println(err.Error()) } } }