package controller import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/scheduler" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) // 所有公共接口调用前,要求在order里或status中设置合适的Status type WaybillController struct { } func NewWaybillManager() *WaybillController { return &WaybillController{} } func (w *WaybillController) onWaybillNew(bill *model.Waybill) (err error) { db := orm.NewOrm() isDuplicated, err := addOrderOrWaybillStatus(w.waybill2Status(bill), db) if !isDuplicated { bill.WaybillFinishedAt = utils.DefaultTimeValue bill.ID = 0 created, _, err2 := db.ReadOrCreate(bill, "VendorWaybillID", "WaybillVendorID") if err = err2; err == nil { if !created { bill.DuplicatedCount++ db.Update(bill, "DuplicatedCount") globals.SugarLogger.Infof("duplicated bill:%v vendorID:%d, msg received", bill.VendorWaybillID, bill.WaybillVendorID) } err = scheduler.CurrentScheduler.OnWaybillStatusChanged(bill) if globals.HandleLegacyJxOrder { w.legacyWaybillStatusChanged(bill, db) } } else { globals.SugarLogger.Warnf("create bill:%v, error:%v", bill, err) } } return err } func (w *WaybillController) OnWaybillStatusChanged(bill *model.Waybill) (err error) { if bill.Status == model.WaybillStatusNew { err = w.onWaybillNew(bill) } else if bill.Status == model.WaybillStatusAccepted { err = w.onWaybillAccepted(bill) } else { db := orm.NewOrm() isDuplicated, err2 := w.addWaybillStatus(bill, db) if err = err2; err == nil && !isDuplicated { err = scheduler.CurrentScheduler.OnWaybillStatusChanged(bill) if globals.HandleLegacyJxOrder { w.legacyWaybillStatusChanged(bill, db) } } } return err } func (w *WaybillController) onWaybillAccepted(bill *model.Waybill) (err error) { db := orm.NewOrm() isDuplicated, err := w.addWaybillStatus(bill, db) if !isDuplicated { params := orm.Params{ "courier_name": bill.CourierName, "courier_mobile": bill.CourierMobile, "desired_fee": bill.DesiredFee, } utils.CallFuncLogError(func() error { _, err = db.QueryTable("waybill").Filter("vendor_waybill_id", bill.VendorWaybillID).Filter("waybill_vendor_id", bill.WaybillVendorID).Update(params) return err }, "update waybill courier info") err = scheduler.CurrentScheduler.OnWaybillStatusChanged(bill) if globals.HandleLegacyJxOrder { w.legacyWaybillStatusChanged(bill, db) } } return err } func (w *WaybillController) addWaybillStatus(bill *model.Waybill, db orm.Ormer) (isDuplicated bool, err error) { if db == nil { db = orm.NewOrm() } waybillStatus := w.waybill2Status(bill) isDuplicated, err = addOrderOrWaybillStatus(waybillStatus, db) if !isDuplicated && waybillStatus.Status > model.WaybillStatusNew { params := orm.Params{ "status": bill.Status, "vendor_status": bill.VendorStatus, } if bill.Status >= model.WaybillStatusEndBegin { params["waybill_finished_at"] = bill.WaybillCreatedAt } utils.CallFuncLogError(func() error { _, err = db.QueryTable("waybill").Filter("vendor_waybill_id", bill.VendorWaybillID).Filter("waybill_vendor_id", bill.WaybillVendorID).Update(params) return err }, "update waybill status") } return isDuplicated, err } func (w *WaybillController) waybill2Status(bill *model.Waybill) (retVal *model.OrderStatus) { retVal = &model.OrderStatus{ VendorOrderID: bill.VendorWaybillID, VendorID: bill.WaybillVendorID, OrderType: model.OrderTypeWaybill, RefVendorOrderID: bill.VendorOrderID, RefVendorID: bill.OrderVendorID, Status: bill.Status, VendorStatus: bill.VendorStatus, StatusTime: bill.WaybillCreatedAt, } return retVal }