Files
jx-callback/business/elm/controller/order.go
2018-06-28 12:38:45 +08:00

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
}