package controller import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) // 所有公共接口调用前,要求在order里或status中设置合适的Status type WaybillController struct { WaybillMap SyncMapWithTimeout } 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 { w.WaybillMap.Store(ComposeUniversalOrderID(bill.VendorWaybillID, bill.WaybillVendorID), bill.ID) if !created { bill.DuplicatedCount++ db.Update(bill, "DuplicatedCount") globals.SugarLogger.Infof("duplicated bill:%v vendorID:%d, msg received", bill.VendorWaybillID, bill.WaybillVendorID) } err = OrderManager.OnWaybillStatusChanged(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 = OrderManager.OnWaybillStatusChanged(bill, db) } } return err } func (w *WaybillController) onWaybillAccepted(bill *model.Waybill) (err error) { db := orm.NewOrm() isDuplicated, err := w.addWaybillStatus(bill, db) if !isDuplicated { if err = w.updateWaybillPKID(bill, db); err == nil { utils.CallFuncLogError(func() error { _, err = db.Update(bill, "CourierName", "CourierMobile") return err }, "update waybill info") if err == nil { err = OrderManager.OnWaybillStatusChanged(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.WaybillStatusUnknown { if err = w.updateWaybillPKID(bill, db); err == nil { bill.Status = waybillStatus.Status bill.VendorStatus = waybillStatus.VendorStatus utils.CallFuncLogError(func() error { columns := []string{"Status", "VendorStatus"} if waybillStatus.Status >= model.OrderStatusEndBegin { bill.WaybillFinishedAt = waybillStatus.StatusTime columns = append(columns, "WaybillFinishedAt") } _, err = db.Update(bill, columns...) return err }, "update waybill") } } 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, Status: bill.Status, VendorStatus: bill.VendorStatus, StatusTime: bill.WaybillCreatedAt, } return retVal } func (w *WaybillController) updateWaybillPKID(bill *model.Waybill, db orm.Ormer) (err error) { if value, ok := w.WaybillMap.Load(ComposeUniversalOrderID(bill.VendorWaybillID, bill.WaybillVendorID)); !ok { err = db.Read(bill, "VendorWaybillID", "WaybillVendorID") // todo 这里应该要报警,但测试阶段先去掉 // utils.CallFuncLogError(func() error { // err = db.Read(bill, "VendorWaybillID", "WaybillVendorID") // return err // }, "can not get waybill info from db") } else { bill.ID = value.(int64) } return err }