package cron import ( "database/sql" "encoding/json" "errors" "fmt" "log" "recook/configs" order3 "recook/internal/api/mobile/order" "recook/internal/dbc" order4 "recook/internal/model/order" "recook/internal/model/user" "recook/internal/mq" "recook/internal/mq/model" "recook/internal/v2/hook" "recook/internal/v2/lib/jcook" "recook/internal/v2/lib/shama" after2 "recook/internal/v2/logic/manage/after" order2 "recook/internal/v2/logic/manage/order" "recook/internal/v2/model/recook/after" goods2 "recook/internal/v2/model/recook/goods" manage2 "recook/internal/v2/model/recook/manage" manage "recook/internal/v2/model/recook/order" "regexp" "strconv" "strings" "time" "git.oa00.com/go/mysql" "github.com/golangkit/formatime" "github.com/robfig/cron/v3" "github.com/shopspring/decimal" gorm2 "gorm.io/gorm" ) // Task 定时任务 func Task(c *cron.Cron) { c.AddFunc("0 */1 * * * ?", func() { fmt.Println("task live") }) c.AddFunc("0 */10 * * * ?", func() { NoticeDelete() }) //_ = c.AddFunc("0 */1 * * * ?", func() { // message.DeliveryTimeOut() //}) c.AddFunc("0 */1 * * * ?", func() { order3.PlanMonitorTradeSucOrderTask() }) c.AddFunc("0 */1 * * * ?", func() { order3.PlanMonitorExpireOrderTask() }) c.AddFunc("0 */1 * * * ?", func() { AfterNotToDoTwo() }) c.AddFunc("*/10 * * * * ?", func() { VipExpired() }) if configs.IsProductionEnv() { go TaskMq() } // 启动供应链任务 if configs.IsProductionEnv() { SupplyTask.run() } if configs.IsProductionEnv() { //go ShaMaMq() } } func VipExpired() { var u1 []user.Information mysql.Db.Find(&u1, "vip_upgrade_end < ?", time.Now()) for _, v := range u1 { mysql.Db.Table((&user.Information{}).TableName()).Where("id = ?", v.ID).Updates(map[string]interface{}{ "level": v.OldLevel, "parent_id": v.OldParentID, "old_level": 0, "old_root_id": 0, "old_parent_id": 0, "is_offline": false, "vip_upgrade_start": sql.NullTime{}, "vip_upgrade_end": sql.NullTime{}, }) } } func ShaMaMq() { go OrderShaMaPay() go OrderShaMaCancel() go OrderShaMaStockOut() go ShaMaSkuPrice() } func TaskMq() { go skuChange() go skuPrice() go orderCreate() go OrderPay() go OrderStockOut() go OrderFinished() go OrderCancel() } const maxRetryNum = 1 func ShaMaSkuPrice() { q := fmt.Sprintf("sku.price.queue.%s", configs.ConfigShaMaAppKey) mq.Conn1.ListenRetry(q, maxRetryNum, func(data []byte) error { client := shama.GetClient() var m model.SkuChange err := json.Unmarshal(data, &m) if err != nil { log.Println(err.Error()) return err } rq := shama.SkuDetailReq{ SkuIDSet: []uint{m.SkuID}, } var res []shama.SkuDetailResp if err := client.Exec(rq, &res); err != nil { log.Println(err.Error()) return err } if len(res) == 0 { return nil } t := res[0] var sku goods2.RecookGoodsSkuModel if err := mysql.Db.Table(sku.TableName()).Where("third_party_sku_id = ? and third_party_type=4", t.SkuDetailBase.SkuID).Updates(map[string]interface{}{ "sale_purchase_price": t.SkuDetailBase.SupplyPrice, }).Error; err != nil { log.Println(err.Error()) return err } return nil }) } func OrderShaMaStockOut() { q := fmt.Sprintf("order.stock.out.queue.%s", configs.ConfigShaMaAppKey) mq.Conn1.ListenRetry(q, maxRetryNum, func(data []byte) error { var m model.OrderStockOutMessage err := json.Unmarshal(data, &m) if err != nil { log.Println(err.Error()) return err } var od manage.RecookOrderInfoModel if err = mysql.Db.First(&od, "shama_order_id = ?", m.OrderID).Error; err != nil { log.Println(err.Error()) return err } if od.OrderType == 2 { return nil } var orderSku []manage.RecookOrderGoodsDetailModel if err = mysql.Db.Find(&orderSku, "order_id =? ", od.Id).Error; err != nil { log.Println(err.Error()) return err } ep := make([]order2.ExpressInfo, 0) for _, v := range m.Packages { ep = append(ep, order2.ExpressInfo{ ExpressCompName: v.LogisticsName, ExpressNo: v.WaybillCode, }) } for index, j := range orderSku { order2.Expresslogic.Express(j.VendorId, "jcook", orderSku[index], ep) } return nil }) } func OrderShaMaPay() { q := fmt.Sprintf("order.pay.queue.%s", configs.ConfigShaMaAppKey) mq.Conn1.ListenRetry(q, maxRetryNum, func(data []byte) error { time.Sleep(time.Second) var m model.OrderPayMessage err := json.Unmarshal(data, &m) if err != nil { log.Println(err.Error()) return err } var od manage.RecookOrderInfoModel if err = mysql.Db.First(&od, "shama_order_id = ?", m.OrderID).Error; err != nil { log.Println(err.Error()) return nil } if od.Status == 0 { return errors.New("订单未支付") } if od.Status == 1 { client := shama.GetClient() req := shama.OrderPushReq{ OrderID: uint(m.OrderID), } var resp jcook.OrderPushResp if err = client.Exec(req, &resp); err != nil { return err } } return nil }) } func OrderShaMaCancel() { q := fmt.Sprintf("order.cancel.queue.%s", configs.ConfigShaMaAppKey) mq.Conn1.ListenRetry(q, maxRetryNum, func(data []byte) error { var m model.OrderCancelMessage err := json.Unmarshal(data, &m) var od manage.RecookOrderInfoModel if err = mysql.Db.First(&od, "shama_order_id = ?", m.OrderID).Error; err != nil { if err != gorm2.ErrRecordNotFound { log.Println(err.Error()) return err } else { return nil } } switch m.Status { case 1: if od.Status == 0 { // 未支付订单直接取消 return nil } else { tx := dbc.DB.Begin() { var asGoods []after.RecookAfterSalesGoodsModel tx.Find(&asGoods, "order_id = ?", od.Id) for _, v := range asGoods { if v.RefundStatus == 1 { continue } t := &after2.UpdateOrderCheckStatusReq{ AsID: v.Id, } if err = after2.Refund(tx, v, od, t, manage2.RecookManageUserInfoModel{}); err != nil { tx.Rollback() return err } } } if err = tx.Model(od).Update("deal_status", 11).Error; err != nil { return err } tx.Commit() } case 2: tx := dbc.DB.Begin() { od.DealStatus = 12 if err = tx.Save(&od).Error; err != nil { return err } var asGoods []after.RecookAfterSalesGoodsModel if err = tx.Find(&asGoods, "order_id = ?", od.Id).Error; err != nil { return err } for _, v := range asGoods { if err = tx.Model(v).Updates(after.RecookAfterSalesGoodsModel{ ReturnStatus: 2, RejectReason: "系统自动拒绝", FinishTime: formatime.NewSecondNow(), }).Error; err != nil { tx.Rollback() return err } if err := tx.Model(&manage.RecookOrderGoodsDetailModel{Id: v.OrderGoodsId}).Updates(map[string]interface{}{ "ass_type": 0, }).Error; err != nil { tx.Rollback() return err } //这里插入日志 Log1 := after.RecookAfterSalesLogsModel{ AsID: v.Id, Title: "平台拒绝退款", Content: "拒绝买家退款申请,如有疑问,请联系客服", CTime: formatime.NewSecondNow(), User: "系统", UserId: 0, } tx.Create(&Log1) Log2 := after.RecookAfterSalesLogsModel{ AsID: v.Id, Title: "退款关闭", Content: "系统自动关闭", CTime: formatime.NewSecondNow(), User: "系统", UserId: 0, } tx.Create(&Log2) } } tx.Commit() } return nil }) } func OrderCancel() { q := fmt.Sprintf("order.cancel.queue.%s", configs.ConfigJCookAppKey) mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error { var m model.OrderCancelMessage err := json.Unmarshal(data, &m) var od manage.RecookOrderInfoModel if err = mysql.Db.First(&od, "jcook_order_id = ?", m.OrderID).Error; err != nil { if err != gorm2.ErrRecordNotFound { log.Println(err.Error()) return err } else { return nil } } switch m.Status { case 1: if od.Status == 0 { // 未支付订单直接取消 return nil } else { tx := dbc.DB.Begin() { var asGoods []after.RecookAfterSalesGoodsModel tx.Find(&asGoods, "order_id = ?", od.Id) for _, v := range asGoods { if v.RefundStatus == 1 { continue } t := &after2.UpdateOrderCheckStatusReq{ AsID: v.Id, } if err = after2.Refund(tx, v, od, t, manage2.RecookManageUserInfoModel{}); err != nil { tx.Rollback() return err } } } if err = tx.Model(od).Update("deal_status", 11).Error; err != nil { return err } tx.Commit() } case 2: tx := dbc.DB.Begin() { od.DealStatus = 12 if err = tx.Save(&od).Error; err != nil { return err } var asGoods []after.RecookAfterSalesGoodsModel if err = tx.Find(&asGoods, "order_id = ?", od.Id).Error; err != nil { return err } for _, v := range asGoods { if err = tx.Model(v).Updates(after.RecookAfterSalesGoodsModel{ ReturnStatus: 2, RejectReason: "系统自动拒绝", FinishTime: formatime.NewSecondNow(), }).Error; err != nil { tx.Rollback() return err } if err := tx.Model(&manage.RecookOrderGoodsDetailModel{Id: v.OrderGoodsId}).Updates(map[string]interface{}{ "ass_type": 0, }).Error; err != nil { tx.Rollback() return err } //这里插入日志 Log1 := after.RecookAfterSalesLogsModel{ AsID: v.Id, Title: "平台拒绝退款", Content: "拒绝买家退款申请,如有疑问,请联系客服", CTime: formatime.NewSecondNow(), User: "系统", UserId: 0, } tx.Create(&Log1) Log2 := after.RecookAfterSalesLogsModel{ AsID: v.Id, Title: "退款关闭", Content: "系统自动关闭", CTime: formatime.NewSecondNow(), User: "系统", UserId: 0, } tx.Create(&Log2) } } tx.Commit() } return nil }) } func OrderFinished() { q := fmt.Sprintf("order.finished.queue.%s", configs.ConfigJCookAppKey) mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error { var m model.OrderFinishMessage err := json.Unmarshal(data, &m) if err != nil { log.Println(err.Error()) return err } var od order4.Information if err = mysql.Db.First(&od, "jcook_order_id = ?", m.OrderID).Error; err != nil { log.Println(err.Error()) return err } od.JCookStatus = 1 if err = mysql.Db.Save(od).Error; err != nil { log.Println(err.Error()) return err } return nil }) } func OrderStockOut() { q := fmt.Sprintf("order.stock.out.queue.%s", configs.ConfigJCookAppKey) mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error { var m model.OrderStockOutMessage err := json.Unmarshal(data, &m) if err != nil { log.Println(err.Error()) return err } var od manage.RecookOrderInfoModel if err = mysql.Db.First(&od, "jcook_order_id = ?", m.OrderID).Error; err != nil { log.Println(err.Error()) return err } var orderSku []manage.RecookOrderGoodsDetailModel if err = mysql.Db.Find(&orderSku, "order_id =? ", od.Id).Error; err != nil { log.Println(err.Error()) return err } ep := make([]order2.ExpressInfo, 0) for _, v := range m.Packages { ep = append(ep, order2.ExpressInfo{ ExpressCompName: v.LogisticsName, ExpressNo: v.WaybillCode, }) } for index, j := range orderSku { if j.ExpressStatus == manage.RecookOrderGoodsDetailExpressStatusTrue { continue } if err := order2.Expresslogic.Express(j.VendorId, "jcook", orderSku[index], ep); err != nil { return err } } return nil }) } func OrderPay() { q := fmt.Sprintf("order.pay.queue.%s", configs.ConfigJCookAppKey) mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error { time.Sleep(time.Second) var m model.OrderPayMessage err := json.Unmarshal(data, &m) if err != nil { log.Println(err.Error()) return err } var od manage.RecookOrderInfoModel if err = mysql.Db.First(&od, "jcook_order_id = ?", m.OrderID).Error; err != nil { log.Println(err.Error()) return nil } if od.Status == 0 { return errors.New("订单未支付") } if od.Status == 1 { client := jcook.GetClient() req := jcook.OrderPushReq{ OrderID: uint(m.OrderID), } var resp jcook.OrderPushResp if err = client.Exec(req, &resp); err != nil { return err } } return nil }) } func orderCreate() { q := fmt.Sprintf("order.create.queue.%s", configs.ConfigJCookAppKey) mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error { var m model.OrderCreateMessage err := json.Unmarshal(data, &m) if err != nil { log.Println(err.Error()) return err } if m.RootOrderID != 0 { // 发生拆单. var rod manage.RecookOrderInfoModel if err := mysql.Db.Preload("OrderSku").First(&rod, "jcook_order_id = ?", m.RootOrderID).Error; err != nil { return err } var pod manage.RecookOrderInfoModel if err := mysql.Db.Preload("OrderSku").First(&pod, "jcook_order_id = ?", m.ParentOrderID).Error; err != nil { return err } if err := mysql.Db.Transaction(func(tx *gorm2.DB) error { rod.IsSplit = true rod.Status = 3 tx.Save(&rod) pod.IsSplit = true pod.Status = 3 tx.Save(&pod) if err := tx.Table((&order4.Profit{}).TableName()).Where("order_id = ?", rod.Id).Update("status", 1).Error; err != nil { return err } if err := tx.Table((&order4.Profit{}).TableName()).Where("order_id = ?", pod.Id).Update("status", 1).Error; err != nil { return err } var ids []uint64 for _, v := range m.SkuList { ids = append(ids, v.SkuID) } var orderSku []manage.RecookOrderGoodsDetailModel var sku []goods2.RecookGoodsSkuModel sub := tx.Select("id").Find(&sku, "third_party_sku_id in (?)", ids) if err := tx.Find(&orderSku, "sku_id in (?) AND order_id = ?", sub, rod.Id).Error; err != nil { log.Println(err.Error()) return err } // 拆分拆单运费 unit := m.FreightFee.Div(decimal.NewFromInt(int64(len(orderSku)))).Round(2) fee := m.FreightFee unitMap := make(map[uint]decimal.Decimal) var orderSkuNew []manage.RecookOrderGoodsDetailModel for i := 0; i < len(orderSku); i++ { if i == len(orderSku)-1 { unitMap[orderSku[i].SkuId] = fee break } fee = fee.Sub(unit) unitMap[orderSku[i].SkuId] = unit } coinTotal := decimal.Zero goodsTotalAmount := decimal.Zero goodsTotalCommission := decimal.Zero actualAmount := decimal.Zero for _, v := range orderSku { actualAmount = actualAmount.Add(v.GoodsAmount).Add(unitMap[v.SkuId]).Sub(v.CoinAmount) coinTotal = coinTotal.Add(v.CoinAmount) goodsTotalAmount = goodsTotalAmount.Add(v.GoodsAmount) } orderNew := manage.RecookOrderInfoModel{ AncestorId: rod.AncestorId, ParentId: rod.ParentId, SharerId: rod.SharerId, LiveId: rod.LiveId, UserId: rod.UserId, UserRole: rod.UserRole, Title: "", CoinTotalAmount: coinTotal, ExpressTotalFee: m.FreightFee, GoodsTotalAmount: goodsTotalAmount, GoodsTotalCommission: goodsTotalCommission, ActualTotalAmount: actualAmount, Channel: rod.Channel, ShippingMethod: rod.ShippingMethod, StoreId: rod.StoreId, BuyerMessage: rod.BuyerMessage, Status: 1, ExpressStatus: rod.ExpressStatus, InvoiceStatus: rod.InvoiceStatus, CreatedAt: rod.CreatedAt, ExpireTime: rod.ExpireTime, PayIP: rod.PayIP, TradeNo: rod.TradeNo, PayTime: rod.PayTime, PayMethod: rod.PayMethod, RbacId: rod.RbacId, IsFirst: rod.IsFirst, VirtualID: rod.VirtualID, PayType: rod.PayType, Kind: rod.Kind, JCookOrderID: uint(m.OrderID), JCookRootID: uint(m.RootOrderID), JCookParentID: uint(m.ParentOrderID), OrderType: rod.OrderType, } var orderAddr manage.RecookOrderAddrModel tx.First(&orderAddr, "order_id = ?", rod.Id) if err := tx.Create(&orderNew).Error; err != nil { log.Println(err.Error()) return err } orderAddr.Id = 0 orderAddr.OrderId = orderNew.Id if err := tx.Create(&orderAddr).Error; err != nil { log.Println(err.Error()) return err } cost := decimal.Zero total := decimal.Zero for _, v := range orderSku { cost = cost.Add(v.PurchasePrice).Mul(decimal.NewFromInt(int64(v.Quantity))) total = total.Add(v.GoodsAmount) v.Id = 0 v.OrderId = orderNew.Id v.ExpressFee = unitMap[v.SkuId] //v.CoinAmount = decimal.Zero v.ActualAmount = v.GoodsAmount.Add(v.ExpressFee).Sub(v.CoinAmount) //coinTotal = decimal.Zero orderSkuNew = append(orderSkuNew, v) } //orderNew.CoinTotalAmount = coinTotal if err = tx.Save(orderNew).Error; err != nil { log.Println(err.Error()) return err } if err = tx.Create(orderSkuNew).Error; err != nil { log.Println(err.Error()) return err } var rp []order4.Profit if err := tx.Table((&order4.Profit{}).TableName()).Find(&rp, "order_id = ?", rod.Id).Error; err != nil { return err } profitNew := make([]*order4.Profit, 0) b2 := decimal.Zero for _, k := range orderSkuNew { b2 = b2.Add(k.GetBase().Mul(decimal.NewFromInt(int64(k.Quantity)))) } for _, v := range rp { temp := order4.CreateProfit(v.UserID, v.Type, b2, orderNew.Id) profitNew = append(profitNew, temp) } if len(profitNew) != 0 { if err = tx.Create(profitNew).Error; err != nil { log.Println(err.Error()) return err } } return nil }); err != nil { return err } } return nil }) } func skuPrice() { q := fmt.Sprintf("sku.price.queue.%s", configs.ConfigJCookAppKey) mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error { client := jcook.GetClient() var m model.SkuChange err := json.Unmarshal(data, &m) if err != nil { log.Println(err.Error()) return err } rq := jcook.SkuPriceReq{ SkuIDSet: []uint{m.SkuID}, } var res []jcook.SkuPriceResp if err := client.Exec(rq, &res); err != nil { log.Println(err.Error()) return err } if len(res) == 0 { return nil } t := res[0] var sku goods2.RecookGoodsSkuModel if err := mysql.Db.Table(sku.TableName()).Where("third_party_sku_id = ? and third_party_type=3", t.SkuID).Updates(map[string]interface{}{ "purchase_price": t.SupplyPrice, }).Error; err != nil { log.Println(err.Error()) return err } return nil }) } func skuChange() { q := fmt.Sprintf("sku.change.queue.%s", configs.ConfigJCookAppKey) mq.Conn.ListenRetry(q, maxRetryNum, func(data []byte) error { client := jcook.GetClient() var m model.SkuChange _ = json.Unmarshal(data, &m) rq := jcook.SkuDetailReq{ SkuIDSet: []uint{m.SkuID}, } var gsk goods2.RecookGoodsSkuModel if err := mysql.Db.First(&gsk, "third_party_sku_id = ? AND third_party_type = 3 ", strconv.Itoa(int(m.SkuID))).Error; err != nil { if err == gorm2.ErrRecordNotFound { return nil } log.Println(err.Error()) return err } var res []jcook.SkuDetailResp if err := client.Exec(rq, &res); err != nil { return err } if len(res) == 0 { return nil } if err := mysql.Db.Transaction(func(tx *gorm2.DB) error { patch := res[0] var pu uint if patch.SkuDetailBase.Yn && patch.SkuDetailBase.Status { pu = 1 } else { pu = 0 } p1 := map[string]interface{}{} p1["inventory"] = 500 if pu == 0 { p1["inventory"] = 0 } name := strings.Trim(strings.Join([]string{patch.SkuDetailBase.Color, patch.SkuDetailBase.Size}, "+"), "+") if name == "" { name = "标准" } if name != gsk.Name { p1["name"] = name combineID := strings.Split(gsk.CombineId, ",") for index, s1 := range combineID { sid, _ := strconv.Atoi(s1) if index == 0 { tx.Model(&goods2.RecookGoodsAttributeModel{Id: uint(sid)}).Update("value", patch.SkuDetailBase.Color) } else { tx.Model(&goods2.RecookGoodsAttributeModel{Id: uint(sid)}).Update("value", patch.SkuDetailBase.Size) } } } if err := tx.Model(&gsk).Updates(p1).Error; err != nil { return err } if p1["inventory"] == 0 { var other []goods2.RecookGoodsSkuModel tx.Find(&other, "goods_id = ?", gsk.GoodsId) flag := 1 for _, v := range other { if v.Inventory != 0 { flag = 0 break } } if flag == 1 { tx.Table((&goods2.RecookGoodsInfoModel{}).TableName()). Where("id = ?", gsk.GoodsId). Update("publish_status", 0) } } else { // tx.Table((&goods2.RecookGoodsInfoModel{}).TableName()).Where("id = ?", gsk.GoodsId).Update("publish_status", 1) } if err := tx.Table((&goods2.RecookGoodsSkuModel{}).TableName()).Where("id = ?", gsk.Id). Update("pic_url", patch.SkuDetailBase.MainPhoto).Error; err != nil { return err } if err := tx.Delete(&goods2.RecookGoodsMainPhotoModel{}, "goods_id = ?", gsk.GoodsId).Error; err != nil { return err } if err := tx.Delete(&goods2.RecookGoodsDetailPhotoModel{}, "goods_id = ?", gsk.GoodsId).Error; err != nil { return err } mp := make([]goods2.RecookGoodsMainPhotoModel, 0) dp := make([]goods2.RecookGoodsDetailPhotoModel, 0) if len(patch.Images) == 1 { mp = append(mp, goods2.RecookGoodsMainPhotoModel{ GoodsId: gsk.GoodsId, Url: patch.Images[0].Url, IsMaster: 0, Name: "api", OrderNo: 1, Width: 0, Height: 0, }) } for ki, k := range patch.Images { master := 0 if k.IsPrimer { master = 1 } mp = append(mp, goods2.RecookGoodsMainPhotoModel{ GoodsId: gsk.GoodsId, Url: k.Url, IsMaster: master, Name: "api", OrderNo: ki, Width: 0, Height: 0, }) } reg := regexp.MustCompile("background-image:url\\((?s:(.*?))\\)|src=\"(?s:(.*?))\"") result := reg.FindAllStringSubmatch(patch.BigInfo.PcWDis, -1) for ki, k := range result { kt := k[1] if len(strings.TrimSpace(kt)) == 0 { if len(k) > 2 { kt = k[2] } } if len(strings.TrimSpace(kt)) == 0 || len(strings.TrimSpace(kt)) > 255 || len(strings.TrimSpace(kt)) < 25 { continue } kt = strings.Trim(kt, "\\") if !strings.HasPrefix(kt, "http") && !strings.HasPrefix(kt, "https") { kt = "http:" + kt } dp = append(dp, goods2.RecookGoodsDetailPhotoModel{ GoodsID: gsk.GoodsId, Url: kt, Name: "api", OrderNo: ki, Width: 0, Height: 0, }) } if len(mp) > 0 { if err := tx.Create(&mp).Error; err != nil { log.Println(err.Error()) return err } } if len(dp) > 0 { if err := tx.Create(&dp).Error; err != nil { log.Println(err.Error()) return err } } return nil }); err != nil { log.Println(err.Error()) return err } return nil }) } func NoticeDelete() { log.Println("清理商详") var data []goods2.RecookGoodsNoticeModel if err := dbc.DB.Table((&goods2.RecookGoodsNoticeModel{}).TableName()).Find(&data).Error; err != nil { log.Println("task error: ", err.Error()) return } for _, v := range data { if v.EndTime.Time.Before(time.Now()) { var temp goods2.RecookGoodsNoticeGoodsModel if err := dbc.DB.Delete(&temp, "notice_id = ?", v.Id).Error; err != nil { log.Println("task error: ", err.Error()) continue } if err := dbc.DB.Delete(&v).Error; err != nil { log.Println("task error: ", err.Error()) continue } } } } //48小时自动关闭未填写单号的售后 var days1 time.Duration = 2 type updateReturnSuccessParam struct { AsID uint `json:"asId" binding:"required"` Opinion uint `json:"opinion"` // 1同意退款退货 2拒绝 RejectReason string `json:"rejectReason"` } // AfterNotToDoTwo 买家没有填写单号 func AfterNotToDoTwo() { t := time.Now().Add(time.Hour * 72 * -days1) var afterSales []after.RecookAfterSalesGoodsModel dbc.DB.Find(&afterSales, "return_status = 3 AND ass_type=2 AND check_time <= ?", t.Format("2006-01-02 15:04:05")) for _, v := range afterSales { var p updateReturnSuccessParam p = updateReturnSuccessParam{ v.Id, 2, "72小时未填写单号,系统自动关闭", } UpdateNotExp(p, v) } } // UpdateNotExp 没有填写单号,退货被拒绝 func UpdateNotExp(p updateReturnSuccessParam, asGoods after.RecookAfterSalesGoodsModel) { var orderInfo manage.RecookOrderInfoModel if err := dbc.DB.First(&orderInfo, asGoods.OrderId).Error; err != nil { return } if p.Opinion == 2 { tx := mysql.Db.Begin() { if err := tx.Model(&asGoods).Updates(&after.RecookAfterSalesGoodsModel{ ReturnStatus: 6, RejectReason: p.RejectReason, FinishTime: formatime.NewSecondNow(), IsClosed: 1, }).Error; err != nil { tx.Rollback() return } if err := tx.Model(&manage.RecookOrderGoodsDetailModel{Id: asGoods.OrderGoodsId}).Updates(map[string]interface{}{ "ass_type": 0, "is_closed": 1, }).Error; err != nil { tx.Rollback() return } if err := hook.AfterHook.Close(&asGoods); err != nil { tx.Rollback() return } } tx.Commit() } }