121 lines
4.2 KiB
Go
121 lines
4.2 KiB
Go
package orderman
|
||
|
||
import (
|
||
"time"
|
||
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
"github.com/astaxie/beego/orm"
|
||
)
|
||
|
||
func (w *OrderManager) LoadPendingWaybills() []*model.Waybill {
|
||
db := orm.NewOrm()
|
||
var bills []*model.Waybill
|
||
tillTime := time.Now().Add(-pendingOrderGapMax)
|
||
_, 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 t1.waybill_created_at >= ?
|
||
AND t1.status < ?
|
||
`, tillTime, model.OrderStatusEndBegin, tillTime, model.WaybillStatusEndBegin).QueryRows(&bills)
|
||
if err != nil {
|
||
globals.SugarLogger.Warnf("LoadPendingWaybills load pending waybills error:%v", err)
|
||
return nil
|
||
}
|
||
return bills
|
||
}
|
||
|
||
func (w *OrderManager) onWaybillNew(bill2 *model.Waybill, db orm.Ormer) (isDuplicated bool, err error) {
|
||
globals.SugarLogger.Debugf("onWaybillNew bill:%v", bill2)
|
||
isDuplicated, err = addOrderOrWaybillStatus(model.Waybill2Status(bill2), db)
|
||
if err == nil && !isDuplicated {
|
||
bill2.ID = 0
|
||
bill2.WaybillCreatedAt = bill2.StatusTime
|
||
bill2.WaybillFinishedAt = utils.DefaultTimeValue
|
||
billCopied := *bill2
|
||
bill := &billCopied
|
||
created, _, err2 := db.ReadOrCreate(bill, "VendorWaybillID", "WaybillVendorID")
|
||
if err = err2; err == nil {
|
||
if !created {
|
||
bill.DuplicatedCount++
|
||
if bill2.VendorOrderID == bill2.VendorWaybillID { // 购物平台(比如京东)重新建的运单,单号始终是与订单相同的
|
||
bill2.ID = bill.ID
|
||
bill2.DuplicatedCount = bill.DuplicatedCount
|
||
db.Update(bill2) //更新所有字段
|
||
} else {
|
||
db.Update(bill, "DuplicatedCount")
|
||
isDuplicated = true
|
||
globals.SugarLogger.Infof("onWaybillNew duplicated bill:%v msg received", bill2)
|
||
}
|
||
} else {
|
||
*bill2 = *bill
|
||
}
|
||
} else {
|
||
globals.SugarLogger.Warnf("onWaybillNew create bill:%v, error:%v", bill2, err)
|
||
}
|
||
}
|
||
return isDuplicated, err
|
||
}
|
||
|
||
func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
|
||
var isDuplicated bool
|
||
db := orm.NewOrm()
|
||
if bill.Status == model.WaybillStatusNew {
|
||
isDuplicated, err = w.onWaybillNew(bill, db)
|
||
} else {
|
||
addParams := orm.Params{}
|
||
if bill.Status >= model.WaybillStatusAccepted && bill.Status < model.WaybillStatusEndBegin {
|
||
if bill.Status == model.WaybillStatusAccepted {
|
||
addParams["desired_fee"] = bill.DesiredFee
|
||
}
|
||
addParams["courier_name"] = bill.CourierName
|
||
addParams["courier_mobile"] = bill.CourierMobile
|
||
} else if bill.Status >= model.WaybillStatusEndBegin {
|
||
addParams["waybill_finished_at"] = bill.StatusTime
|
||
}
|
||
isDuplicated, err = w.addWaybillStatus(bill, db, addParams)
|
||
}
|
||
if err == nil && !isDuplicated {
|
||
scheduler.CurrentScheduler.OnWaybillStatusChanged(bill, false)
|
||
}
|
||
return err
|
||
}
|
||
|
||
func (w *OrderManager) 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.WaybillStatusUnknown { // todo 这里应该和addOrderStatus一样的改法,状态不能回绕
|
||
params := utils.MergeMaps(orm.Params{
|
||
"status": bill.Status,
|
||
"vendor_status": bill.VendorStatus,
|
||
"status_time": bill.StatusTime,
|
||
}, addParams)
|
||
utils.CallFuncLogError(func() error {
|
||
_, err = db.QueryTable("waybill").Filter("vendor_waybill_id", bill.VendorWaybillID).Filter("waybill_vendor_id", bill.WaybillVendorID).Update(params)
|
||
return err
|
||
}, "addWaybillStatus update waybill status, bill:%v", bill)
|
||
}
|
||
return isDuplicated, err
|
||
}
|
||
|
||
func (c *OrderManager) LoadWaybill(vendorWaybillID string, waybillVendorID int) (bill *model.Waybill, err error) {
|
||
db := orm.NewOrm()
|
||
bill = &model.Waybill{
|
||
VendorWaybillID: vendorWaybillID,
|
||
WaybillVendorID: waybillVendorID,
|
||
}
|
||
if err = db.Read(bill, "VendorWaybillID", "WaybillVendorID"); err != nil {
|
||
if err == orm.ErrNoRows {
|
||
err = ErrCanNotFindWaybill
|
||
}
|
||
globals.SugarLogger.Infof("LoadWaybill vendorWaybillID:%s failed with error:%v", vendorWaybillID, err)
|
||
}
|
||
return bill, err
|
||
}
|