- write legacy jxoder almost ok.
This commit is contained in:
@@ -3,17 +3,17 @@ package controller
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/scheduler"
|
||||
|
||||
"git.rosy.net.cn/baseapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/legacy/models"
|
||||
"github.com/astaxie/beego/orm"
|
||||
)
|
||||
|
||||
// 所有公共接口调用前,要求在order里或status中设置合适的Status
|
||||
type OrderController struct {
|
||||
orderMap SyncMapWithTimeout
|
||||
}
|
||||
|
||||
func NewOrderManager() *OrderController {
|
||||
@@ -22,12 +22,19 @@ func NewOrderManager() *OrderController {
|
||||
|
||||
func (c *OrderController) OnOrderNew(order *model.GoodsOrder) (err error) {
|
||||
db := orm.NewOrm()
|
||||
return c.saveOrder(order, false, db)
|
||||
isDuplicated, err := addOrderOrWaybillStatus(c.order2Status(order), db)
|
||||
if err == nil && !isDuplicated {
|
||||
if err = c.saveOrder(order, false, db); err == nil {
|
||||
err = scheduler.CurrentScheduler.OnOrderNew(order)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder) (err error) {
|
||||
db := orm.NewOrm()
|
||||
isDuplicated, err := addOrderOrWaybillStatus(c.order2Status(order), db)
|
||||
status := c.order2Status(order)
|
||||
isDuplicated, err := addOrderOrWaybillStatus(status, db)
|
||||
if err == nil && !isDuplicated {
|
||||
err = utils.CallFuncLogError(func() error {
|
||||
_, err = db.Raw("DELETE FROM order_sku WHERE vendor_order_id = ? AND vendor_id = ?", order.VendorOrderID, order.VendorID).Exec()
|
||||
@@ -36,7 +43,6 @@ func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder) (err error) {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = utils.CallFuncLogError(func() error {
|
||||
_, err = db.Raw("DELETE FROM goods_order WHERE vendor_order_id = ? AND vendor_id = ?", order.VendorOrderID, order.VendorID).Exec()
|
||||
return err
|
||||
@@ -44,13 +50,17 @@ func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder) (err error) {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = c.saveOrder(order, true, db); err == nil {
|
||||
err = scheduler.CurrentScheduler.OnOrderStatusChanged(status)
|
||||
}
|
||||
}
|
||||
return c.saveOrder(order, true, db)
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *OrderController) OnOrderStatusChanged(orderStatus *model.OrderStatus) (err error) {
|
||||
isDuplicated, err := c.addOrderStatus(orderStatus, nil)
|
||||
if err == nil && !isDuplicated {
|
||||
err = scheduler.CurrentScheduler.OnOrderStatusChanged(orderStatus)
|
||||
if globals.HandleLegacyJxOrder {
|
||||
c.legacyJxOrderStatusChanged(orderStatus, nil)
|
||||
}
|
||||
@@ -60,53 +70,41 @@ func (c *OrderController) OnOrderStatusChanged(orderStatus *model.OrderStatus) (
|
||||
|
||||
// private
|
||||
func (c *OrderController) saveOrder(order *model.GoodsOrder, isAdjust bool, db orm.Ormer) (err error) {
|
||||
isDuplicated, err := addOrderOrWaybillStatus(c.order2Status(order), db)
|
||||
if !isDuplicated {
|
||||
c.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, order.StoreID, db, func(isAccept bool) {
|
||||
// c.purchasePlatformHandlers[order.VendorID].AcceptOrRefuseOrder(order, isAccept)
|
||||
if isAccept {
|
||||
order.Status = model.OrderStatusAccepted
|
||||
} else {
|
||||
order.Status = model.OrderStatusFailed
|
||||
// 忽略查找JX信息错误
|
||||
c.updateOrderOtherInfo(order, db)
|
||||
db.Begin()
|
||||
// globals.SugarLogger.Debugf("new order:%v", order)
|
||||
order.WaybillVendorID = model.VendorIDUnknown
|
||||
order.OrderFinishedAt = utils.DefaultTimeValue
|
||||
order.ID = 0
|
||||
created, _, err2 := db.ReadOrCreate(order, "VendorOrderID", "VendorID")
|
||||
if err = err2; err == nil {
|
||||
if created {
|
||||
sql := "INSERT INTO order_sku(vendor_order_id, vendor_id, count, vendor_sku_id, sku_id, jx_sku_id, sku_name, shop_price, sale_price, weight, order_created_at) VALUES"
|
||||
params := []interface{}{}
|
||||
for _, sku := range order.Skus {
|
||||
sql += "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),"
|
||||
params = append(params, sku.VendorOrderID, sku.VendorID, sku.Count, sku.VendorSkuID, sku.SkuID, sku.JxSkuID, sku.SkuName, sku.ShopPrice, sku.SalePrice, sku.Weight, order.OrderCreatedAt)
|
||||
}
|
||||
})
|
||||
|
||||
// 忽略查找JX信息错误
|
||||
c.updateOrderOtherInfo(order, db)
|
||||
db.Begin()
|
||||
// globals.SugarLogger.Debugf("new order:%v", order)
|
||||
order.OrderFinishedAt = utils.DefaultTimeValue
|
||||
order.ID = 0
|
||||
created, _, err2 := db.ReadOrCreate(order, "VendorOrderID", "VendorID")
|
||||
if err = err2; err == nil {
|
||||
c.orderMap.Store(ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), order.ID)
|
||||
if created {
|
||||
sql := "INSERT INTO order_sku(vendor_order_id, vendor_id, count, vendor_sku_id, sku_id, jx_sku_id, sku_name, shop_price, sale_price, weight, order_created_at) VALUES"
|
||||
params := []interface{}{}
|
||||
for _, sku := range order.Skus {
|
||||
sql += "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),"
|
||||
params = append(params, sku.VendorOrderID, sku.VendorID, sku.Count, sku.VendorSkuID, sku.SkuID, sku.JxSkuID, sku.SkuName, sku.ShopPrice, sku.SalePrice, order.Weight, order.OrderCreatedAt)
|
||||
}
|
||||
sql = sql[:len(sql)-1] + ";"
|
||||
if _, err = db.Raw(sql, params...).Exec(); err != nil {
|
||||
db.Rollback()
|
||||
baseapi.SugarLogger.Infof("insert order_sku error:%v", err)
|
||||
} else {
|
||||
db.Commit()
|
||||
if globals.HandleLegacyJxOrder {
|
||||
c.legacyWriteJxOrder(order, db, isAdjust)
|
||||
}
|
||||
}
|
||||
sql = sql[:len(sql)-1] + ";"
|
||||
if _, err = db.Raw(sql, params...).Exec(); err != nil {
|
||||
db.Rollback()
|
||||
baseapi.SugarLogger.Infof("insert order_sku error:%v", err)
|
||||
} else {
|
||||
order.DuplicatedCount++
|
||||
db.Update(order, "DuplicatedCount")
|
||||
db.Commit()
|
||||
baseapi.SugarLogger.Infof("duplicated order:%s vendorID:%d, msg received", order.VendorOrderID, order.VendorID)
|
||||
if globals.HandleLegacyJxOrder {
|
||||
c.legacyWriteJxOrder(order, db, isAdjust)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
db.Rollback()
|
||||
globals.SugarLogger.Warnf("create order:%v, error:%v", order, err)
|
||||
order.DuplicatedCount++
|
||||
db.Update(order, "DuplicatedCount")
|
||||
db.Commit()
|
||||
baseapi.SugarLogger.Infof("duplicated order:%s vendorID:%d, msg received", order.VendorOrderID, order.VendorID)
|
||||
}
|
||||
} else {
|
||||
db.Rollback()
|
||||
globals.SugarLogger.Warnf("create order:%v, error:%v", order, err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -182,112 +180,50 @@ func (c *OrderController) updateOrderOtherInfo(order *model.GoodsOrder, db orm.O
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *OrderController) handleAutoAcceptOrder(orderID string, vendorID int, userMobile string, jxStoreID int, db orm.Ormer, handler func(accepted bool)) int {
|
||||
handleType := 0
|
||||
if userMobile != "" {
|
||||
if db == nil {
|
||||
db = orm.NewOrm()
|
||||
}
|
||||
user := &models.BlackClient{
|
||||
Mobile: userMobile,
|
||||
}
|
||||
if err := db.Read(user, "Mobile"); err != nil {
|
||||
if err != orm.ErrNoRows {
|
||||
globals.SugarLogger.Errorf("read data error:%v, data:%v, vendorID:%d", err, user, vendorID)
|
||||
}
|
||||
// 在访问数据库出错的情况下,也需要自动接单
|
||||
handleType = 1
|
||||
} else {
|
||||
// 强制拒单
|
||||
globals.SugarLogger.Infof("force reject order:%s, vendorID:%d", orderID, vendorID)
|
||||
handleType = -1
|
||||
}
|
||||
} else {
|
||||
globals.SugarLogger.Infof("order:%s, vendorID:%d, mobile is empty, should accept order", orderID, vendorID)
|
||||
handleType = 1
|
||||
}
|
||||
|
||||
if handleType == 1 {
|
||||
handler(true)
|
||||
} else if handleType == -1 {
|
||||
handler(false)
|
||||
}
|
||||
return handleType
|
||||
}
|
||||
|
||||
func (c *OrderController) addOrderStatus(orderStatus *model.OrderStatus, db orm.Ormer) (isDuplicated bool, err error) {
|
||||
if db == nil {
|
||||
db = orm.NewOrm()
|
||||
}
|
||||
isDuplicated, err = addOrderOrWaybillStatus(orderStatus, db)
|
||||
if !isDuplicated && orderStatus.Status > model.OrderStatusUnknown {
|
||||
order := &model.GoodsOrder{
|
||||
VendorOrderID: orderStatus.VendorOrderID,
|
||||
VendorID: orderStatus.VendorID,
|
||||
if !isDuplicated && orderStatus.Status > model.OrderStatusNew {
|
||||
params := orm.Params{
|
||||
"status": orderStatus.Status,
|
||||
"vendor_status": orderStatus.VendorStatus,
|
||||
}
|
||||
if err = c.updateOrderPKID(order, db); err == nil {
|
||||
order.Status = orderStatus.Status
|
||||
order.VendorStatus = orderStatus.VendorStatus
|
||||
utils.CallFuncLogError(func() error {
|
||||
columns := []string{"Status", "VendorStatus"}
|
||||
if orderStatus.Status >= model.OrderStatusEndBegin {
|
||||
order.OrderFinishedAt = orderStatus.StatusTime
|
||||
columns = append(columns, "OrderFinishedAt")
|
||||
}
|
||||
_, err := db.Update(order, columns...)
|
||||
return err
|
||||
}, "update order")
|
||||
if orderStatus.Status >= model.OrderStatusEndBegin {
|
||||
params["order_finished_at"] = orderStatus.StatusTime
|
||||
}
|
||||
utils.CallFuncLogError(func() error {
|
||||
_, err = db.QueryTable("goods_order").Filter("vendor_order_id", orderStatus.VendorOrderID).Filter("vendor_id", orderStatus.VendorID).Update(params)
|
||||
return err
|
||||
}, "update order")
|
||||
}
|
||||
return isDuplicated, err
|
||||
}
|
||||
|
||||
func (c *OrderController) updateOrderPKID(order *model.GoodsOrder, db orm.Ormer) (err error) {
|
||||
value, ok := c.orderMap.Load(ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
|
||||
if !ok {
|
||||
err = db.Read(order, "VendorOrderID", "VendorID")
|
||||
// todo 这里应该要报警,但测试阶段先去掉
|
||||
// utils.CallFuncLogError(func() error {
|
||||
// err = db.Read(order, "VendorOrderID", "VendorID")
|
||||
// return err
|
||||
// }, "can not get order info from db")
|
||||
} else {
|
||||
order.ID = value.(int64)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *OrderController) order2Status(order *model.GoodsOrder) (retVal *model.OrderStatus) {
|
||||
retVal = &model.OrderStatus{
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
VendorID: order.VendorID,
|
||||
OrderType: model.OrderTypeOrder,
|
||||
Status: order.Status,
|
||||
VendorStatus: order.VendorStatus,
|
||||
StatusTime: order.OrderCreatedAt,
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
VendorID: order.VendorID,
|
||||
OrderType: model.OrderTypeOrder,
|
||||
RefVendorOrderID: order.VendorOrderID,
|
||||
RefVendorID: order.VendorID,
|
||||
Status: order.Status,
|
||||
VendorStatus: order.VendorStatus,
|
||||
StatusTime: order.OrderCreatedAt,
|
||||
}
|
||||
return retVal
|
||||
}
|
||||
|
||||
//Waybill
|
||||
func (c *OrderController) OnWaybillStatusChanged(bill *model.Waybill, db orm.Ormer) (err error) {
|
||||
return c.updateOrderByWaybill(bill, db)
|
||||
}
|
||||
|
||||
func (c *OrderController) updateOrderByWaybill(bill *model.Waybill, db orm.Ormer) (err error) {
|
||||
if db == nil {
|
||||
db = orm.NewOrm()
|
||||
}
|
||||
order := &model.GoodsOrder{
|
||||
VendorOrderID: bill.VendorOrderID,
|
||||
VendorID: bill.OrderVendorID,
|
||||
}
|
||||
if err = db.Read(order, "VendorOrderID", "VendorID"); err == nil {
|
||||
if order.Status < model.OrderStatusEndBegin {
|
||||
order.WaybillStatus = bill.Status
|
||||
order.WaybillVendorStatus = bill.VendorStatus
|
||||
db.Update(order, "WaybillStatus", "WaybillVendorStatus")
|
||||
}
|
||||
func (c *OrderController) UpdateWaybillVendorID(bill *model.Waybill) (err error) {
|
||||
db := orm.NewOrm()
|
||||
params := orm.Params{
|
||||
"waybill_vendor_id": bill.WaybillVendorID,
|
||||
}
|
||||
utils.CallFuncLogError(func() error {
|
||||
_, err = db.QueryTable("goods_order").Filter("vendor_order_id", bill.VendorOrderID).Filter("vendor_id", bill.OrderVendorID).Update(params)
|
||||
return err
|
||||
}, "update order")
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user