diff --git a/business/controllers/business.go b/business/controllers/business.go new file mode 100644 index 000000000..3e06f7e12 --- /dev/null +++ b/business/controllers/business.go @@ -0,0 +1,24 @@ +package controllers + +import ( + "git.rosy.net.cn/jx-callback/business/models" + "git.rosy.net.cn/jx-callback/globals" + "github.com/astaxie/beego/orm" +) + +func IsAutoAcceptOrder(userMobile string, db orm.Ormer) bool { + 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", err, user) + } + // 在访问数据库出错的情况下,也需要自动接单 + return true + } + return false +} diff --git a/business/elm/controller/order.go b/business/elm/controller/order.go index f2204496d..3725ba12f 100644 --- a/business/elm/controller/order.go +++ b/business/elm/controller/order.go @@ -1,8 +1,10 @@ package controller import ( + "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" @@ -30,7 +32,13 @@ func (o *OrderController) OrderMessage(msg *elmapi.CallbackMsg) (retVal *elmapi. orderID := innerMsg["orderId"].(string) globals2.RoutinePool.CallFun(func() { if msg.Type == elmapi.MsgTypeOrderValid { - retVal = o.NewOrder(msg, orderID) + userMobile := "" + if phoneList, ok := innerMsg["phoneList"].([]interface{}); ok && len(phoneList) > 1 { + userMobile = phoneList[0].(string) + } else { + baseapi.SugarLogger.Warnf("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) } @@ -38,32 +46,46 @@ func (o *OrderController) OrderMessage(msg *elmapi.CallbackMsg) (retVal *elmapi. return retVal } +func (o *OrderController) acceptOrder(orderID string, userMobile string) { + if controllers.IsAutoAcceptOrder(userMobile, nil) { + globals2.ElmAPI.ConfirmOrder(orderID) + if userMobile == "" { + globals.SugarLogger.Infof("elm order:%v force accepted, because userMobile is empty", orderID) + } + } else { + globals.SugarLogger.Infof("elm order:%v refused, userMobile:%s", orderID, userMobile) + } +} -func (o *OrderController) NewOrder(msg *elmapi.CallbackMsg, orderId string) *elmapi.CallbackResponse { +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) - 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 - } + retVal = errResponseDBError } else { - globals.SugarLogger.Infof("duplicate elm msg received:%v", msg) + if created || rec.Type != msg.Type { + result, err := globals2.ElmAPI.GetOrder(orderId) + if err != nil { + retVal = errResponseCallELMAPIError + } else { + err = globals2.FreshFoodAPI.NewELMOrder(result) + if err != nil { + retVal = errResponseInternal + } + } + } else { + globals.SugarLogger.Infof("duplicate elm msg received:%v", msg) + } } - return elmapi.SuccessResponse + o.acceptOrder(orderId, userMobile) + return retVal } func (o *OrderController) OrderStatusChanged(msg *elmapi.CallbackMsg, orderId string) *elmapi.CallbackResponse { diff --git a/business/jd/controller/order.go b/business/jd/controller/order.go index 30c45b6fe..91d4d7709 100644 --- a/business/jd/controller/order.go +++ b/business/jd/controller/order.go @@ -5,6 +5,7 @@ import ( "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/controllers" "git.rosy.net.cn/jx-callback/business/jd/models" "git.rosy.net.cn/jx-callback/compat/corm" "git.rosy.net.cn/jx-callback/globals" @@ -143,13 +144,21 @@ func (c *OrderController) OrderDeliveryStatus(jdOrderDeliveryStatusMsg *jdapi.Ca } //----------- -func acceptOrder(msg *jdapi.CallbackOrderMsg) { - globals2.Jdapi.OrderAcceptOperate(msg.BillID, true) +func acceptOrder(msg *jdapi.CallbackOrderMsg, userMobile string, db orm.Ormer) { + if controllers.IsAutoAcceptOrder(userMobile, db) { + globals2.Jdapi.OrderAcceptOperate(msg.BillID, true) + if userMobile == "" { + globals.SugarLogger.Infof("jd order:%v force accepted, because userMobile is empty", msg) + } + } else { + globals.SugarLogger.Infof("jd order:%v refused, userMobile:%s", msg, userMobile) + } } func newOrder(msg *jdapi.CallbackOrderMsg) error { result, err := globals2.Jdapi.LegacyQuerySingleOrder(msg.BillID) - acceptOrder(msg) + userMobile := "" + var db orm.Ormer if err == nil { rec := &models.Jdorder{ ID: msg.ID, @@ -175,8 +184,9 @@ func newOrder(msg *jdapi.CallbackOrderMsg) error { resultByteArr := utils.MustMarshal(data) rec.Data = string(resultByteArr) rec.Data4Json = data + userMobile = rec.Data4Json["buyerMobile"].(string) err = utils.CallFuncLogError(func() error { - db := orm.NewOrm() + db = orm.NewOrm() _, err := db.Update(rec, "Data", "Code", "Msg", "Success", "CityName", "OrderStatus", "OrderStatusTime") return err }, globals2.ErrStrAccessDB) @@ -187,6 +197,7 @@ func newOrder(msg *jdapi.CallbackOrderMsg) error { globals.SugarLogger.Errorf("can not get jdorder info:%v", msg.BillID) } } + acceptOrder(msg, userMobile, db) return err } diff --git a/business/models/models.go b/business/models/models.go new file mode 100644 index 000000000..030f1b3ce --- /dev/null +++ b/business/models/models.go @@ -0,0 +1,12 @@ +package models + +import ( + "time" +) + +type BlackClient struct { + ID int `orm:"column(id)"` + Mobile string `orm:"size(16);unique"` + CreatedAt time.Time `orm:"auto_now_add;type(datetime)` + UpdatedAt time.Time `orm:"auto_now;type(datetime)` +} diff --git a/globals/globals2/globals2.go b/globals/globals2/globals2.go index 4daa6b81e..f1178a189 100644 --- a/globals/globals2/globals2.go +++ b/globals/globals2/globals2.go @@ -72,6 +72,7 @@ func initDB() { orm.RegisterModel(new(jdmodels.Jdorder)) orm.RegisterModel(new(elmmodels.ELMOrder)) orm.RegisterModel(new(models.Config)) + orm.RegisterModel(new(models.BlackClient)) // create table orm.RunSyncdb("default", false, true)