- callLegacyMsgHandler, callNewMsgHandler and generateLegacyJxOrder config - call legacy lefted msg handler in new process(elm urge order and bad comment on jd)
113 lines
3.7 KiB
Go
113 lines
3.7 KiB
Go
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
|
||
}
|