Files
jx-callback/business/controller/waybill.go
2018-07-19 21:10:26 +08:00

117 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}