package controller import ( "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg" "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) LoadPendingWaybills() []*model.Waybill { db := orm.NewOrm() var bills []*model.Waybill _, err := db.Raw(` SELECT t1.* FROM waybill t1 JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.order_vendor_id AND t2.order_created_at >= ? AND t2.status < ? WHERE waybill_created_at >= ? AND t1.status < ? ORDER by waybill_created_at `, time.Now().Add(-pendingOrderGapMax), model.WaybillStatusEndBegin, time.Now().Add(-pendingOrderGapMax), model.WaybillStatusEndBegin).QueryRows(&bills) if err != nil { globals.SugarLogger.Warnf("init load pending waybills error:%v", err) return nil } return bills } func (w *WaybillController) onWaybillNew(bill *model.Waybill, db orm.Ormer) (isDuplicated bool, err error) { isDuplicated, err = addOrderOrWaybillStatus(model.Waybill2Status(bill), db) if err == nil && !isDuplicated { bill.ID = 0 bill.WaybillCreatedAt = bill.StatusTime bill.WaybillFinishedAt = utils.DefaultTimeValue 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) } } else { globals.SugarLogger.Warnf("create bill:%v, error:%v", bill, err) } } return isDuplicated, err } func (w *WaybillController) OnWaybillStatusChanged(bill *model.Waybill) (err error) { var isDuplicated bool db := orm.NewOrm() if bill.Status == model.WaybillStatusNew { isDuplicated, err = w.onWaybillNew(bill, db) } else { var addParams orm.Params if bill.Status == model.WaybillStatusAccepted { addParams = orm.Params{ "courier_name": bill.CourierName, "courier_mobile": bill.CourierMobile, "desired_fee": bill.DesiredFee, } } isDuplicated, err = w.addWaybillStatus(bill, db, addParams) } if err == nil && !isDuplicated { scheduler.CurrentScheduler.OnWaybillStatusChanged(bill) if bill.Status == model.WaybillStatusAccepted || bill.Status == model.WaybillStatusDelivered { if order, err2 := OrderManager.LoadOrder(bill.VendorOrderID, bill.OrderVendorID); err2 == nil { weixinmsg.NotifyWaybillStatus(bill, order) } } if globals.GenerateLegacyJxOrder { w.legacyWaybillStatusChanged(bill, db) } } return err } func (w *WaybillController) addWaybillStatus(bill *model.Waybill, db orm.Ormer, addParams orm.Params) (isDuplicated bool, err error) { waybillStatus := model.Waybill2Status(bill) isDuplicated, err = addOrderOrWaybillStatus(waybillStatus, db) if err == nil && !isDuplicated && waybillStatus.Status > model.WaybillStatusNew { params := utils.MergeMaps(orm.Params{ "status": bill.Status, "vendor_status": bill.VendorStatus, "status_time": bill.StatusTime, }, addParams) if bill.Status >= model.WaybillStatusEndBegin { params["waybill_finished_at"] = bill.StatusTime } 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, bill:%v", bill) } return isDuplicated, err }