package controllers import ( "encoding/json" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/server/web" "io/ioutil" "net/http" "net/url" "strings" "sync" "time" ) type MtwmController struct { web.Controller } var MTWMVendorStoreIDMap = new(sync.Map) func (c *MtwmController) onCallbackMsg(msgType string) { msg, callbackResponse := api.MtwmAPI.GetCallbackMsg(c.Ctx.Request) if callbackResponse == nil { vendorStoreId := msg.FormData.Get("app_poi_code") if vendorStoreId == "" { vendorStoreId = msg.FormData.Get("wm_poi_id") } if msgType == mtwmapi.MsgTypeOrderFinishedPickup && vendorStoreId == "" { finishedPickup := FinishedPickup{} json.Unmarshal([]byte(msg.FormData.Get("pick_up_data")), &finishedPickup) vendorStoreId = finishedPickup.AppPoiCode } if _, have := MTWMVendorStoreIDMap.Load(vendorStoreId); vendorStoreId != "" && !have { storeDetail, _ := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreId, model.VendorIDMTWM, "") if storeDetail == nil { switch web.BConfig.RunMode { case model.ServerTypeVegetable, "dev": callbackResponse = pushMTWMOrder2GY(msg.FormData, msgType, model.ServerTypeFruits) case model.ServerTypeFruits: callbackResponse = pushMTWMOrder2GY(msg.FormData, msgType, model.ServerTypePet) case model.ServerTypePet: callbackResponse = mtwmapi.Err2CallbackResponse(nil, "") // mtwmapi.Err2CallbackResponse(fmt.Errorf("美团菜市推果园,果园退超市未找到门店cmd:%s,storeId:%s", msgType, vendorStoreId), "") return } //c.Data["json"] = callbackResponse c.Data["json"] = mtwmapi.Err2CallbackResponse(nil, "") c.ServeJSON() return } else { MTWMVendorStoreIDMap.Store(vendorStoreId, model.YES) } } callbackResponse = mtwm.OnCallbackMsg(msg, msgType) if callbackResponse == nil { callbackResponse = mtwmapi.Err2CallbackResponse(nil, "") } } c.Data["json"] = callbackResponse c.ServeJSON() } func (c *MtwmController) WaybillStatus() { c.onCallbackMsg(mtwmapi.MsgTypeWaybillStatus) } func (c *MtwmController) NewOrder() { c.onCallbackMsg(mtwmapi.MsgTypeNewOrder) } func (c *MtwmController) OrderAccepted() { time.Sleep(500 * time.Millisecond) // 测试看看有的订单来不拣货,可能是这个状态推的太快了,上一个NewOrder还没处理结束导致的 c.onCallbackMsg(mtwmapi.MsgTypeOrderAccepted) } func (c *MtwmController) OrderFinished() { c.onCallbackMsg(mtwmapi.MsgTypeOrderFinished) } func (c *MtwmController) OrderFinancial() { c.onCallbackMsg(mtwmapi.MsgTypeOrderFinancial) } func (c *MtwmController) UserUrgeOrder() { c.onCallbackMsg(mtwmapi.MsgTypeUserUrgeOrder) } func (c *MtwmController) NumberDowngrade() { c.onCallbackMsg(mtwmapi.MsgTypePrivateNumberDowngrade) } func (c *MtwmController) OrderModified() { c.onCallbackMsg(mtwmapi.MsgTypeOrderModified) } func (c *MtwmController) OrderCanceled() { c.onCallbackMsg(mtwmapi.MsgTypeOrderCanceled) } func (c *MtwmController) OrderRefund() { c.onCallbackMsg(mtwmapi.MsgTypeOrderRefund) } func (c *MtwmController) OrderPartialRefund() { c.onCallbackMsg(mtwmapi.MsgTypeOrderPartialRefund) } func (c *MtwmController) StoreStatusChanged() { c.onCallbackMsg(mtwmapi.MsgTypeStoreStatusChanged) } func (c *MtwmController) OrderFinishedPickup() { c.onCallbackMsg(mtwmapi.MsgTypeOrderFinishedPickup) } func (c *MtwmController) StoreAuditStatusChanged() { c.onCallbackMsg(mtwmapi.MsgTypeStoreAuditStatusChanged) } func (c *MtwmController) SkuDelete() { c.onCallbackMsg(mtwmapi.MsgTypeSkuDelete) } func (c *MtwmController) StoreBind() { c.onCallbackMsg(mtwmapi.MsgTypeStoreBind) } func (c *MtwmController) IMCallback() { c.OnIMCallback() } func (c *MtwmController) DeliveryFeeChange() { c.onCallbackMsg(mtwmapi.MsgTypeOrderDeliveryFeeChange) } func (c *MtwmController) OnIMCallback() { c.Data["json"] = mtwmapi.Err2CallbackResponse(nil, "") msg, callbackResponse := api.MtwmAPI.GetIMCallbackMsg(c.Ctx.Request) if callbackResponse == nil { callbackResponse = mtwm.OnImMsg(msg) if callbackResponse == nil { callbackResponse = mtwmapi.Err2CallbackResponse(nil, "") } } c.Data["json"] = callbackResponse c.ServeJSON() } type FinishedPickup struct { AppPoiCode string `json:"app_poi_code"` ConsumingTime int `json:"consuming_time"` OrderId int64 `json:"order_id"` OrderViewId int64 `json:"order_view_id"` PickTime string `json:"pick_time"` PickType string `json:"pick_type"` } // 订单所属门店在菜市不存在时尝试推送到果园去 func pushMTWMOrder2GY(value url.Values, msgType string, serverType string) *mtwmapi.CallbackResponse { cl := http.Client{} var request *http.Request var err error switch serverType { case model.ServerTypeFruits: request, err = http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/mtwm/"+msgType, strings.NewReader(value.Encode())) case model.ServerTypePet: request, err = http.NewRequest(http.MethodPost, "http://callback-gblm.jxc4.com/mtwm/"+msgType, strings.NewReader(value.Encode())) } if err != nil { return mtwmapi.Err2CallbackResponse(err, "") } request.Header.Set("Content-Type", "application/x-www-form-urlencoded") request.Header.Set("accept", "application/json, text/plain, */*") resp, err := cl.Do(request) if err != nil { return mtwmapi.Err2CallbackResponse(err, "") } defer resp.Body.Close() byteData, _ := ioutil.ReadAll(resp.Body) result := mtwmapi.CallbackResponse{} json.Unmarshal(byteData, &result) return &result }