134 lines
4.1 KiB
Go
134 lines
4.1 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/business/controllers"
|
|
"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 {
|
|
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)
|
|
}
|
|
}, orderID)
|
|
|
|
return retVal
|
|
}
|
|
|
|
func OnNewOrder(orderID string, userMobile string) {
|
|
controllers.OnNewOrder(orderID, controllers.ELM_VENDERID, userMobile, 0, nil, func(acceptIt bool) {
|
|
if acceptIt {
|
|
globals2.ElmAPI.ConfirmOrder(orderID)
|
|
} else {
|
|
globals2.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 := globals2.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 = globals2.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) *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 = 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
|
|
}
|