Files
jx-callback/business/controller/waybill.go
gazebo 0cb34fe089 - all call CallFuncLogError add order info
- callLegacyMsgHandler, callNewMsgHandler and generateLegacyJxOrder config
- call legacy lefted msg handler in new process(elm urge order and bad comment on jd)
2018-07-22 13:45:16 +08:00

113 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 (
"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
}