Files
jx-callback/business/controller/waybill.go
gazebo 805925ff58 - mtps, dada create waybill
- create legacy jxorder(not finished).
2018-07-14 14:35:51 +08:00

122 lines
3.8 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/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
}