Files
jx-callback/legacy/elm/controller/order.go
2018-07-08 18:46:32 +08:00

150 lines
4.6 KiB
Go

package controller
import (
"strings"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/platformapi/elmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"git.rosy.net.cn/jx-callback/legacy"
"git.rosy.net.cn/jx-callback/legacy/controllers"
"git.rosy.net.cn/jx-callback/legacy/elm/models"
"git.rosy.net.cn/jx-callback/legacy/freshfood"
"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)
legacy.RoutinePool.CallFun(func() {
if msg.Type == elmapi.MsgTypeOrderValid {
userMobile := ""
if phoneList, ok := innerMsg["phoneList"].([]interface{}); ok && len(phoneList) >= 1 {
userMobile = phoneList[0].(string)
} else {
baseapi.SugarLogger.Warnf("elm can not get mobile info from %v, error:%v", msg, err)
}
retVal = o.NewOrder(msg, orderID, userMobile)
} else if msg.Type >= elmapi.MsgTypeMerchantValid && msg.Type <= elmapi.MsgTypeOrderFinished {
retVal = o.OrderStatusChanged(msg, orderID, innerMsg)
} else {
retVal = o.OrderOtherMsg(msg, orderID, innerMsg)
}
}, orderID)
return retVal
}
func OnNewOrder(orderID string, userMobile string) {
controllers.OnNewOrder(orderID, controllers.ELM_VENDORID, userMobile, 0, nil, func(acceptIt bool) {
if acceptIt {
api.ElmAPI.ConfirmOrder(orderID)
} else {
api.ElmAPI.CancelOrder(orderID, elmapi.CancelOrderTypeOthers, "")
}
})
}
func (o *OrderController) NewOrder(msg *elmapi.CallbackMsg, orderId string, userMobile string) *elmapi.CallbackResponse {
db := orm.NewOrm()
rec := &models.ELMOrder{
OrderId: orderId,
Type: msg.Type,
}
retVal := elmapi.SuccessResponse
created, _, err := db.ReadOrCreate(rec, "OrderId")
if err != nil {
globals.SugarLogger.Warnf("error when calling ReadOrCreate, error:%v, rec:%v", err, rec)
retVal = errResponseDBError
} else {
if created || rec.Type < msg.Type {
// todo 回调消息里已经有详情,这里是否有必要再取一次?
result, err := api.ElmAPI.GetOrder(orderId)
if err != nil {
retVal = errResponseCallELMAPIError
} else {
rec.Data = string(utils.MustMarshal(result))
rec.Consignee = result["consignee"].(string)
rec.Mobile = userMobile
if createdAt, ok := result["createdAt"].(string); ok {
rec.OrderCreatedAt = strings.Replace(createdAt, "T", " ", 1)
}
num, err := db.Update(rec, "Data", "Consignee", "Mobile", "OrderCreatedAt")
if err != nil || num != 1 {
globals.SugarLogger.Warnf("error in updating order data:%v, error:%v, num:%d", msg, err, num)
retVal = errResponseDataError
} else {
err = freshfood.FreshFoodAPI.NewELMOrder(result)
if err != nil {
retVal = errResponseInternal
}
}
}
OnNewOrder(orderId, userMobile)
} else {
globals.SugarLogger.Infof("duplicate elm msg received:%v", msg)
}
}
return retVal
}
func (o *OrderController) OrderStatusChanged(msg *elmapi.CallbackMsg, orderId string, innerMsg map[string]interface{}) *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, rec:%v", err, rec)
} else {
if rec.Type < msg.Type {
err = freshfood.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
}, globals.ErrStrAccessDB)
}
} else {
globals.SugarLogger.Infof("duplicate elm msg received:%v", msg)
}
}
if err != nil {
return errResponseInternal
}
return elmapi.SuccessResponse
}
func (o *OrderController) OrderOtherMsg(msg *elmapi.CallbackMsg, orderId string, innerMsg map[string]interface{}) *elmapi.CallbackResponse {
var err error
if msg.Type == elmapi.MsgTypeClientUrgeOrder {
err = freshfood.FreshFoodAPI.ELMClientUrgeOrder(orderId)
}
if err != nil {
return errResponseInternal
}
return elmapi.SuccessResponse
}