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

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

猜你喜欢

转载自blog.csdn.net/weixin_31501115/article/details/118736292