97 lines
2.7 KiB
Go
97 lines
2.7 KiB
Go
package controller
|
|
|
|
import (
|
|
"git.rosy.net.cn/baseapi/platformapi/elmapi"
|
|
"git.rosy.net.cn/baseapi/utils"
|
|
"git.rosy.net.cn/jx-callback/business/elm/models"
|
|
"git.rosy.net.cn/jx-callback/globals"
|
|
"git.rosy.net.cn/jx-callback/globals/globals2"
|
|
"github.com/astaxie/beego/orm"
|
|
)
|
|
|
|
var (
|
|
errResponseInternal = &elmapi.CallbackResponse{Message: "internal error"}
|
|
errResponseDataError = &elmapi.CallbackResponse{Message: "elm data error"}
|
|
errResponseDBError = &elmapi.CallbackResponse{Message: "DB error"}
|
|
errResponseCallELMAPIError = &elmapi.CallbackResponse{Message: "call ELM API error"}
|
|
)
|
|
|
|
type OrderController struct {
|
|
}
|
|
|
|
func (o *OrderController) OrderMessage(msg *elmapi.CallbackMsg) (retVal *elmapi.CallbackResponse) {
|
|
var innerMsg map[string]interface{}
|
|
err := utils.UnmarshalUseNumber([]byte(msg.Message), &innerMsg)
|
|
if err != nil {
|
|
return errResponseDataError
|
|
}
|
|
|
|
retVal = elmapi.SuccessResponse
|
|
orderID := innerMsg["orderId"].(string)
|
|
globals2.RoutinePool.CallFun(func() {
|
|
if msg.Type == elmapi.MsgTypeOrderValid {
|
|
retVal = o.NewOrder(msg, orderID)
|
|
} else if msg.Type >= elmapi.MsgTypeMerchantValid && msg.Type <= elmapi.MsgTypeOrderFinished {
|
|
retVal = o.OrderStatusChanged(msg, orderID)
|
|
}
|
|
}, orderID)
|
|
|
|
return retVal
|
|
}
|
|
|
|
func (o *OrderController) NewOrder(msg *elmapi.CallbackMsg, orderId string) *elmapi.CallbackResponse {
|
|
db := orm.NewOrm()
|
|
rec := &models.ELMOrder{
|
|
OrderId: orderId,
|
|
Type: msg.Type,
|
|
}
|
|
|
|
created, _, err := db.ReadOrCreate(rec, "OrderId")
|
|
if err != nil {
|
|
globals.SugarLogger.Warnf("error when calling ReadOrCreate, error:%v", err)
|
|
return errResponseDBError
|
|
}
|
|
if created || rec.Type != msg.Type {
|
|
result, err := globals2.ElmAPI.GetOrder(orderId)
|
|
if err != nil {
|
|
return errResponseCallELMAPIError
|
|
}
|
|
err = globals2.FreshFoodAPI.NewELMOrder(result)
|
|
if err != nil {
|
|
return errResponseInternal
|
|
}
|
|
} else {
|
|
globals.SugarLogger.Infof("duplicate elm msg received:%v", msg)
|
|
}
|
|
return elmapi.SuccessResponse
|
|
}
|
|
|
|
func (o *OrderController) OrderStatusChanged(msg *elmapi.CallbackMsg, orderId string) *elmapi.CallbackResponse {
|
|
db := orm.NewOrm()
|
|
rec := &models.ELMOrder{
|
|
OrderId: orderId,
|
|
}
|
|
|
|
err := db.Read(rec, "OrderId")
|
|
if err != nil {
|
|
globals.SugarLogger.Warnf("error when calling ReadOrCreate, error:%v", err)
|
|
} else {
|
|
if rec.Type != msg.Type {
|
|
err = globals2.FreshFoodAPI.ELMOrderStatus(orderId, msg.Type, utils.GetCurTimeStr())
|
|
if err == nil {
|
|
rec.Type = msg.Type
|
|
err = utils.CallFuncLogError(func() error {
|
|
_, err := db.Update(rec, "Type")
|
|
return err
|
|
}, globals2.ErrStrAccessDB)
|
|
}
|
|
} else {
|
|
globals.SugarLogger.Infof("duplicate elm msg received:%v", msg)
|
|
}
|
|
}
|
|
if err != nil {
|
|
return errResponseInternal
|
|
}
|
|
return elmapi.SuccessResponse
|
|
}
|