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-';//额外商品id
foreach ($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