117 lines
3.7 KiB
Go
117 lines
3.7 KiB
Go
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
|
||
}
|