uberEate数据重组, 接上篇:优步外卖(Ubereat)接口请求封装-全球uberapi

/*** 数据转化* @param int $store_id 本地的数据库店铺id* @param array $data* @return false|string*/public function dataChange($data, $store_id = 0){$new_data = ['in' => [], //进中台的数据'out' => [] //进uber的数据];switch ($this->uri) {case 'getStoreStatus':$status = 0;if ($data['data']['status'] == 'ONLINE') {$status = 1;} elseif ($data['data']['status'] == 'OFFLINE' || $data['data']['status'] == 'PAUSED') {$status = 0;}$new_data['in'][$store_id] = ['id' => $store_id,'is_in_business' => $status];break;case 'setStoreStatus':/*$params = ['status' => 1];*/$status = 'PAUSED';if ($data['status'] == 1) {$status = 'ONLINE';}$new_data['out'][$store_id] = ['status' => $status];$return_status = 0;if ($data['data']['status'] == 'ONLINE') {$return_status = 1;}$new_data['in'][$store_id] = ['id' => $store_id,'is_in_business' => $return_status];break;case 'getHolidayHours':foreach ($data['data']['holiday_hours'] as $key => $val) {foreach ($val['open_time_periods'] as $key1 => $hour) {$val['open_time_periods'][$key1] = ['s' => $hour['start_time'],'e' => $hour['end_time'],];}$new_data['in'][$store_id] = ['week' => $this->getTimeWeek($key),'business_hours' => $val['open_time_periods']];}break;case 'setHolidayHours':/*$str = 'a:2:{i:0;a:2:{s:1:"s";s:5:"00:00";s:1:"e";s:5:"23:58";}i:1;a:2:{s:1:"s";s:5:"11:20";s:1:"e";s:5:"22:20";}}';$prams = ['date' => '2021-07-10','business_hours' => unserialize($str)];*/foreach ($data['business_hours'] as $hour) {$new_data['out']['holiday_hours'][$data['date']]['open_time_periods'][] = ['start_time' => $hour['s'],'end_time' => $hour['e'],];}break;case 'setItem'://time:更新商品暂停下架规则,price:更新商品的价格,menu_type:更新自取还是派送/*$params = ['price' => 1000,'time' => time(),//暂停后恢复销售的时间'reason' => '测试暂停销售', //暂停的原因'menu_type' => 1 //菜单类型];*/if (isset($data['price'])) {$new_data['out']['price_info']['price'] = (int)$data['price'] * 100;/*if($new_data['out']['price_info']['price'] > 1000000){$new_data['out']['price_info']['price'] = 1000000;}*/}if (isset($data['time'])) {//更新下架规则$c_time = time();$default_reason = '暫停售賣';if($data['time'] <= $c_time){$default_reason = '正在售賣';}$new_data['out']['suspension_info'] = ['suspension' => ['suspend_until' => $data['time'],//未来时间'reason' => isset($data['reason']) ? $data['reason'] : $default_reason//暂停的原因]];}if (isset($data['menu_type'])) {if ($data['menu_type'] == 1) {$new_data['out']['menu_type'] = 'MENU_TYPE_FULFILLMENT_DELIVERY';} elseif ($data['menu_type'] == 2) {$new_data['out']['menu_type'] = 'MENU_TYPE_FULFILLMENT_PICK_UP';} else {$new_data['out']['menu_type'] = 'MENU_TYPE_FULFILLMENT_PICK_UP';}}break;case 'putMenus':$new_data['out'] = $this->dealData($store_id);break;case 'getMenus':$new_data['in'] = $this->dataReBuild($data);break;case 'denyOrder':/*$params = ['code' => 0,//取消的原因 0通用错误响应, 1商店关闭或者休假或者营业时间以为,2正在处理中,3离线或者互联网终端或者系统问题,4商品缺货或服务时间不提供相应商品,5订单或者商品缺少必选物品或者菜单组规则无效,6缺少必需的订单详细信息或者项目缺少必需的选择选项//7.商品定价不匹配或者预期小计不匹配或者投标格式不正确,8没有开放的容量插槽或没有开放的容量插槽或没有开放的容量插槽 9缺少所需地址或者无效的地标 10UberEats 订单的商品级别说明或UberEats 订单上提供的过敏原信息或者器具选择加入/选择退出说明'details' => '',//取消的说明];*/$codes = ['OTHER','STORE_CLOSED','POS_NOT_READY','POS_OFFLINE','ITEM_AVAILABILITY','MISSING_ITEM','MISSING_INFO','PRICING','CAPACITY','ADDRESS','SPECIAL_INSTRUCTIONS'];$code = !empty($codes[$data['code']]) ? $codes[$data['code']] : $codes[0];$new_data['out']['reason'] = ['code' => $code,'explanation' => isset($data['details']) ? $data['details'] : 'Other Reason',];break;case 'cancelOrder':/*$params = ['reason' => 1,//取消的原因 1库存不足,2厨房下班了,3顾客要求取消,4满足不了顾客的需求,5其他'details' => '',//取消的说明'source' => '',//取消来源 1系統自動取消訂單,2消費者取消訂單,3門市取消訂單,'order_id' => '',//内部订单id];*/if ($data['reason'] == 1) {//库存不足$reason = 'OUT_OF_ITEMS';} elseif ($data['reason'] == 2) {//厨房下班了$reason = 'KITCHEN_CLOSED';} elseif ($data['reason'] == 3) {//顾客要求取消$reason = 'RESTAURANT_TOO_BUSY';} elseif ($data['reason'] == 4) {//满足不了顾客的需求$reason = 'CANNOT_COMPLETE_CUSTOMER_NOTE';} else {//其他$reason = 'OTHER';}$detail = isset($data['details']) ? $data['details'] : 'Other Reason';$new_data['out'] = ['reason' => $reason,'details' => $detail,//详细说名];if (isset($data['source'])) {if ($data['source'] == 2) { //用户$source = 'CUSTOMER';} else { //1门市 3系统$source = 'MERCHANT';}$new_data['out']['cancelling_party'] = $source;}$ext_data['reason'] = $reason . ':' . $detail;$new_data['in'] = $this->cancelOrder($data['order_id'], $data['source'], $ext_data);break;case 'acceptOrder':/*$params = ['reason' => 1,//取消的原因 1库存不足,2厨房下班了,3顾客要求取消,4满足不了顾客的需求,5其他'pickup_time' => 1234567890,//取单的时间(十位时间戳)(可选)'external_reference_id' => '',//内部订单唯一标识 (可选)];*/$new_data['out'] = ['reason' => $data['reason'] ?? 'accepted',];if (isset($data['pickup_time'])) {$new_data['out']['pickup_time'] = $data['pickup_time'];}if (isset($data['external_reference_id'])) {$new_data['out']['external_reference_id'] = $data['external_reference_id'];}break;case 'getOrderDetail':$new_data['in'] = $this->setOrderData($data);break;default:break;}return $new_data;}public function getTimeWeek($date){$time = strtotime($date);$week_array_name = ['日', '一', '二', '三', '四', '五', '六'];$week = date('w', $time);if ($week == 0) {$week = 7;}return ['name' => '星期' . $week_array_name[$week], 'num' => $week];}/*** uber上传菜单数据重组* @param $store_id int 平台店铺id* @param int $uber_status 线上状态* @return array|bool*/public function dealData($store_id = 0, $uber_status = 1){//数量, 价格, 主档商品编号,排序,商品名称,商品分类,配送类型$init_data = ['menus' => [['id' => 'All-day','title' => ['translations' => ['en_us' => 'All day',]],'service_availability' => [['time_periods' => [['start_time' => '00:00','end_time' => '23:59',]],'day_of_week' => 'monday'],['time_periods' => [['start_time' => '00:00','end_time' => '23:59',]],'day_of_week' => 'tuesday'],['time_periods' => [['start_time' => '00:00','end_time' => '23:59',]],'day_of_week' => 'wednesday'],['time_periods' => [['start_time' => '00:00','end_time' => '23:59',]],'day_of_week' => 'thursday'],['time_periods' => [['start_time' => '00:00','end_time' => '23:59',]],'day_of_week' => 'friday'],['time_periods' => [['start_time' => '00:00','end_time' => '23:59',]],'day_of_week' => 'saturday'],['time_periods' => [['start_time' => '00:00','end_time' => '23:59',]],'day_of_week' => 'sunday'],]],],'categories' => [],'items' => [],'modifier_groups' => [],'display_options' => ['disable_item_instructions' => true],];if (!$store_id) {//参数错误return $init_data;}
//        $store = pdo_get('ims_tiny_wmall_store', array('id' => $store_id, 'uber_status' => $uber_status));
//        if (!$store) {//            //店铺不存在
//            return $init_data;
//        }//获取店铺下的所有分类$categorys = pdo_getall('tiny_wmall_goods_category', array('sid' => $store_id, 'isdeleted' => 0, 'status' => 1));if (count($categorys) < 1) {//没有分类return $init_data;}$category_id_name = 'Category-';//$prefix_group = 'GROUP-';foreach ($categorys as $key => $category) {$init_data['menus'][0]['category_ids'][] = $category_id_name . $category['id'];}$goods = pdo_getall('ims_tiny_wmall_goods', array('sid' => $store_id, 'sys_available' => 1));$new_goods = [];$entities = [];//$group_name = 'group-item-';//额外商品idforeach ($goods as $good) {$good_id = $good['sapnumber'];$prefix_group = 'Item-'.$good_id.'-GROUP-';$group_name = 'group-item-'.$good_id.'-';//1019 a:2:{i:0;a:2:{s:4:"name";s:6:"辣度";s:5:"label";a:3:{i:0;s:6:"微辣";i:1;s:6:"中辣";i:2;s:6:"特辣";}}i:1;a:2:{s:4:"name";s:3:"量";s:5:"label";a:2:{i:0;s:6:"大份";i:1;s:6:"小份";}}}//1047 a:1:{i:0;a:2:{s:4:"name";s:6:"包装";s:5:"label";a:3:{i:0;s:3:"大";i:1;s:3:"中";i:2;s:3:"小";}}}$new_goods[$good_id] = $good;foreach ($categorys as $item) {if ($item['id'] == $good['cid']) {$entities[$category_id_name . $item['id']][] = ['id' => 'Item-' . $good_id,'type' => 'ITEM',];}}$overrides = [];//商品附加物$group_ids = [];$num = 0;//商品附属物添加,并且添加商品$attrs = iunserializer($good['attrs']);foreach ($attrs as $key1 => $attr) {$overrides[$good_id][] = ['context_type' => 'ITEM','context_value' => $prefix_group . $key1];$group_ids[$good_id][] = $prefix_group . $key1;$modifier_options[$key1] = [];foreach ($attr['label'] as $item) {++$num;$init_data['items'][] = ['id' => $group_name . $num,'title' => ['translations' => ["zh_tw" => $item]],'price_info' => ['price' => 0,]];//添加商品$modifier_options[$key1][] = ['id' => $group_name . $num,'type' => 'ITEM'];}if (!empty($modifier_options)) {$group = ['id' => $prefix_group . $key1,'title' => ['translations' => ["zh_tw" => $attrs[$key1]['name']]],'modifier_options' => $modifier_options[$key1],'quantity_info' => ['quantity' => ['min_permitted' => 0,'max_permitted' => 1]]];array_push($init_data['modifier_groups'], $group);}//MENU_TYPE_FULFILLMENT_PICK_UP 自提+外送,MENU_TYPE_FULFILLMENT_DELIVERY 外送,不选 均可if ($good['type'] == 1) {$init_data['menu_type'] = 'MENU_TYPE_FULFILLMENT_DELIVERY';} elseif ($good['type'] == 2) {$init_data['menu_type'] = 'MENU_TYPE_FULFILLMENT_PICK_UP';} else {$init_data['menu_type'] = 'MENU_TYPE_FULFILLMENT_PICK_UP';}}$good_price = (int)$good['price'] * 100;/*if($good_price > 1000000){$good_price = 1000000;}*/$c_time = time();$status_time = $good['status'] ? $c_time : $c_time + 60*60*24*2;$init_data['items'][] = ['id' => 'Item-' . $good_id,'external_data' => $good['data'],'title' => ['translations' => ["zh_tw" => $good['title']]],'description' => ['translations' => ["zh_tw" => $good['content']]],'image_url' => tomedia($good['thumb']),'price_info' => ['price' => $good_price,],'quantity_info' => ['quantity' => ['max_permitted' => (int)$good['unitnum'],'default_quantity' => 1//默认数量],'overrides' => !empty($overrides[$good_id]) ? $overrides[$good_id] : [],],'modifier_group_ids' => ['ids' => !empty($group_ids[$good_id]) ? $group_ids[$good_id] : []],'suspension_info' => ['suspension' => ['suspend_until' => $status_time,//未来时间'reason' => $good['status'] ? '正在售賣' : '暫停售賣'//暂停的原因]]/*'visibility_info' => ['hours' => ['hours_of_week' => ['time_periods' => [["start_time"=>"00:00","end_time"=>"23:59"]],'day_of_week' => 'monday']]],*/];}foreach ($init_data['menus'][0]['category_ids'] as $key => $category_id) {if (!empty($entities[$category_id])) {$init_data['categories'][] = ['id' => $category_id,'title' => ['translations' => ["zh_tw" => $categorys[$key]['title']]],'entities' => $entities[$category_id]];} else {$init_data['categories'][] = ['id' => $category_id,'title' => ['translations' => ["zh_tw" => $categorys[$key]['title']]]];}}return $init_data;}/*** 对获取到的数据重新组装* @param $res json* @return array[]*/public function dataReBuild($res){$categories = $res['data']['categories'] ?? [];$items = $res['data']['items'] ?? [];$modifier_groups = $res['data']['modifier_groups'] ?? [];$product_group = [];$attrs = [];$new_categories = [];$new_items = [];foreach ($categories as $category) {$categories_id_arr = explode('-', $category['id']);$new_categories[$categories_id_arr[1]] = ['id' => $categories_id_arr[1],'title' => $category['title']['translations']['zh_tw']];foreach ($category['entities'] as $entity) {foreach ($items as $key => $item) {if ($item['id'] == $entity['id']) {if ($res['data']['menu_type'] == 'MENU_TYPE_FULFILLMENT_DELIVERY') {$type = 1;} elseif ($res['data']['menu_type'] == 'MENU_TYPE_FULFILLMENT_PICK_UP') {$type = 2;} else {$type = 3;}$entity_id_arr = explode('-', $entity['id']);$new_items[$entity_id_arr[1]] = ['id' => $entity_id_arr[1],'data' => $item['external_data'],'title' => $item['title']['translations']['zh_tw'],'thumb' => tomedia($item['image_url']),'content' => $item['description']['translations']['zh_tw'],'unitnum' => $item['quantity_info']['quantity']['max_permitted'],'price' => $item['price_info']['price'] / 100,'type' => $type];if (!empty($item['modifier_group_ids']['ids'])) {$product_group[$entity_id_arr[1]] = $item['modifier_group_ids']['ids'];}}}}}foreach ($product_group as $key1 => $groups) {foreach ($modifier_groups as $key2 => $modifier_group) {foreach ($groups as $group) {if ($modifier_group['id'] == $group) {$attrs[$key1][$key2] = ['name' => $modifier_group['title']['translations']['zh_tw'],'label' => []];foreach ($modifier_group['modifier_options'] as $modifier_option) {foreach ($items as $item) {if ($modifier_option['id'] == $item['id']) {array_push($attrs[$key1][$key2]['label'], $item['title']['translations']['zh_tw']);}}}}}}}foreach ($new_items as &$item) {$item['attrs'] = $attrs[$item['id']] ? serialize($attrs[$item['id']]) : serialize([]);}$item_ids = empty($new_items) ? [] : array_column($new_items, 'id');return ['items' => $new_items, 'categories' => $new_categories, 'item_ids' => $item_ids];}

uber接口文档:https://developer.uber.com/docs/eats/api/v1/post-eats-store-storeid-status

菜鸟代码请绕到此地:https://download.csdn.net/download/weixin_31501115/20005098?spm=1001.2014.3001.5501

优步外卖(Ubereat)接口数据结构处理【仅供参考】相关推荐

  1. 短信接口与短信平台收费标准----速码云仅供参考

    文章来源:http://www.4006026717.com 就目前来说短信接口 价格参考 行业收费也基本上没有个固定的标准的价格,都是看各个公司自己的通道套餐跑的量和公司的运营成本结合预算后最终才来 ...

  2. 网络面经总结-仅供参考

    网络面经总结-仅供参考 1 服务器如何判断客户端连接不上了 1.1 recv 1.2 服务器一段时间内没接收到客户端心跳包反馈 1.3 struct tcp_info info 1.4[保活参数](h ...

  3. 单链表操作2-单链表A拆分成奇数和偶数值单链表B和C(个人学习笔记,仅供参考)

    单链表A拆分成奇数和偶数值单链表B和C 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 在一个带头结点的单链表A中,头指针为a,设计算法SplitList ( ...

  4. 《大学计算机基础》试题题库(仅供参考)

    <大学计算机基础>试题题库(仅供参考) [后附易考知识点,加上书后每章的课后题,考前多背诵,考试就问题不大了] [记得先把答案对准了,再背,别背错答案了,多理解记忆] 一.单选题练习  1 ...

  5. 嵌入式复习题思路(仅供参考)

    申明: 我所发表的仅仅是我个人的看法,本人能力有限,正确率是无法保证的,内容仅供参考 1. 电饭煲在人们的日常生活中广泛使用.假设某款电饭煲具有设定时间,加热煮饭.保温.定时提醒等功能,利用所学的嵌入 ...

  6. 单链表操作10-带头结点的单链表逆置(个人学习笔记,仅供参考)

    带头结点的单链表逆置 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 设计算法Reverse( ),将带头结点的单链表A逆置,要求利用原有链表的链点,最后输出 ...

  7. 地址解析(仅供参考与学习)<Java>

    地址解析步骤如下: 1.检查是否存在省份 2.如果存在省份,将会检查省份是否明确标注省,自治区,市(直辖市),特别行政区的关键字,如果不存在,将会自动拼接上,便于后边正则匹配 3.检查市级地区是否明确 ...

  8. 【vue+pc端】实现微信扫码登录pc端,后端通过微信开发平台,前端生成二维码(仅供参考)

    这两周的需求是通过微信扫码登录pc端,刚定下需求原型图还没出来前,后端特意发了微信开发平台的链接给我,关于如何生成二维码的文档,以及扫码跳转后如何传code给他. 请戳这里准备工作|微信开放文档 我最 ...

  9. 2020年数学建模国赛C题Demo【准确率只有61%,仅供参考】

    2020年数学建模国赛C题Demo[准确率只有61%,仅供参考] MPai下载链接:www.mpaidata.com 关注公众号:[万灵数据]可以看很多很多建模资料噢 附件数据下载:https://m ...

最新文章

  1. 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)
  2. 使用proxy来调用未定义的属性方法
  3. 【Keras】基于SegNet和U-Net的遥感图像语义分割
  4. ASP.NET4.0新的%: %语法用于HTML Encoding
  5. nginx配置php 9000,Nginx支持php配置
  6. 【渝粤教育】国家开放大学2018年春季 8664-21T文书档案管理 参考试题
  7. Super-palindrome【字符串+思维】
  8. 游戏场景设计文档案例_产品经理、设计、运营入门与进阶(132本书籍+需求文档+案例)...
  9. mysql ndb 命令_Mysql入门基础命令
  10. Linux yum仓库的安装
  11. 大数据平台的整体架构由哪些组成
  12. oracle元转换为亿元,元换算成亿元(亿元和圆的换算)
  13. 四个方面分析SEO如何提高网站的权重
  14. 零基础学习计算机路线,我在B站开专栏讲解了!
  15. 计算机专业动漫设计毕业论文,计算机动漫设计与制作专业毕业论文.doc
  16. 我遇到了bug,请问该如何解决
  17. autojs免root脚本引擎编写的QQ空间点赞脚本源码
  18. 计算机如何连接网络扫描仪,如何添加局域网网络扫描仪
  19. 【ML】MoG与EM:从EM到MoG
  20. 报错已加载插件:fastestmirror, langpacksLoading mirror speeds from cached hostfileThere are no enabled repos

热门文章

  1. mvc ajax异常,使用SpringMVC的controller中能获取数据但直接跳到异常页面,使用Ajax。...
  2. php 属猪,属猪人手机号码数字吉凶
  3. vacode允许c_在Windows10上用VSCode搭建C语言环境
  4. 健身管理系统【登录页,首页,会员添加,修改,查询】
  5. 利用OllyDbg解决JLINK提示The connected J-Link is defective. Proper opera...
  6. ios 短信验证码自动填充时总是被复制两遍
  7. 主板的各个部分及其功能
  8. jas完成编译后提示:HTTP Status 404 - /shop/user_regist.action }其中 和}代表什么
  9. C++上机练习:调整方阵
  10. 齐博cms最新SQL注入网站漏洞 可远程执行代码提权