<?php
namespace app\common\service\wechat\wow;
use app\common\model\Wxapp as WxappModel;
use app\common\model\wow\Order as OrderModel;
use app\common\model\wow\Setting as SettingModel;
use app\common\library\helper;
use app\common\enum\OrderType as OrderTypeEnum;
use app\common\enum\order\PayType as PayTypeEnum;
use app\common\enum\DeliveryType as DeliveryTypeEnum;
use app\common\library\wechat\wow\Order as WowOrder;
class Order
{
private $wxappId;
private $ApiDriver;
protected $error;
public function __construct($wxappId)
{
$this->wxappId = $wxappId;
$this->initApiDriver();
}
public function import($orderList, $isCheck = true)
{
$setting = SettingModel::getItem('basic', $this->wxappId);
if ($isCheck && $setting['is_order'] == false) {
return false;
}
$orderListParams = $this->getOrderList($orderList, true);
$status = $this->ApiDriver->import($orderListParams);
if ($status == false) {
$this->error = $this->ApiDriver->getError();
return $status;
}
$this->model()->add($this->wxappId, $orderList);
return $status;
}
public function update($orderList)
{
$legalList = $this->getLegalOrderList($orderList);
if (empty($legalList)) {
return false;
}
$orderListParams = $this->getOrderList($legalList);
$status = $this->ApiDriver->update($orderListParams);
if ($status == false) {
$this->error = $this->ApiDriver->getError();
return $status;
}
$this->model()->edit($legalList);
return $status;
}
private function getLegalOrderList($orderList, $orderType = OrderTypeEnum::MASTER)
{
$orderList = helper::arrayColumn2Key($orderList, 'order_id');
$legalOrderList = $this->model()->getListByOrderIds(array_keys($orderList), $orderType);
$legalList = [];
foreach ($legalOrderList as $item) {
$legalList[$item['id']] = $orderList[$item['order_id']];
}
return $legalList;
}
public function delete($id)
{
$model = $this->model($id, ['user']);
$status = $this->ApiDriver->delete($model['user']['open_id'], $model['order_id']);
if ($status == false) {
$this->error = $this->ApiDriver->getError();
}
$model->setDelete();
return true;
}
public function getError()
{
return $this->error;
}
public function getWxappId()
{
return $this->wxappId;
}
private function initApiDriver()
{
$config = WxappModel::getWxappCache($this->wxappId);
$this->ApiDriver = new WowOrder($config['app_id'], $config['app_secret']);
}
private function model($id = null, $with = ['user'])
{
static $model;
if (!$model instanceof OrderModel) {
$model = $id > 0 ? OrderModel::detail($id, $with) : (new OrderModel);
}
return $model;
}
private function getOrderList($orderList, $isCreate = false)
{
$data = [];
foreach ($orderList as $order) {
$goodsList = $this->getProductList($order['goods']);
$item = [
'order_id' => $order['order_id'],
'trans_id' => $order['transaction_id'], 'status' => self::getStatusByOrder($order), 'ext_info' => [
'user_open_id' => $order['user']['open_id'],
'order_detail_page' => [
'path' => "pages/order/detail?order_id={$order['order_id']}"
],
],
];
if ($isCreate == false) {
if (
$order['delivery_type']['value'] == DeliveryTypeEnum::EXPRESS
&& $order['delivery_status']['value'] == 20
) {
$item['ext_info']['express_info']['express_package_info_list'] = [[
'express_company_id' => $order['express']['express_id'], 'express_company_name' => $order['express']['express_name'], 'express_code' => $order['express_no'], 'ship_time' => $order['delivery_time'], 'express_page' => [
'path' => "pages/order/detail?order_id={$order['order_id']}"
],
'express_goods_info_list' => helper::getArrayColumns($goodsList, ['item_code', 'sku_id'])
]];
}
}
if ($isCreate == true) {
$item['create_time'] = $order['create_time'];
$item['pay_finish_time'] = $order['pay_time'];
$item['fee'] = $order['pay_price'] * 100;
$item['ext_info']['payment_method'] = $order['pay_type']['value'] == PayTypeEnum::WECHAT ? 1 : 2;
$item['ext_info']['product_info'] = ['item_list' => $goodsList];
$item['ext_info']['express_info'] = array_merge(
$this->getAddressInfo($order['delivery_type']['value'], $order['address']),
['price' => $order['express_price'] * 100] );
$item['ext_info']['brand_info'] = [
'phone' => '020-666666', 'contact_detail_page' => [
'kf_type' => 3,
'path' => 'pages/index/index',
],
];
}
$data[] = $item;
}
return $data;
}
public static function getStatusByOrder($order)
{
if ($order['pay_status']['value'] != 20) {
return (int)false;
}
if ($order['order_status']['value'] == 20) {
return 5;
}
if ($order['order_status']['value'] == 30) {
return 100;
}
if ($order['delivery_status']['value'] == 10) {
return 3;
}
if ($order['delivery_status']['value'] == 20) {
return 4;
}
return (int)false;
}
public static function status()
{
return [
0 => '未知',
3 => '支付完成',
4 => '已发货',
5 => '已退款',
100 => '已完成',
];
}
private function getProductList($goodsList)
{
$data = [];
foreach ($goodsList as $goods) {
$data[] = [
'item_code' => $goods['goods_id'], 'sku_id' => $goods['goods_id'],
'amount' => $goods['total_num'], 'total_fee' => $goods['total_price'] * 100, 'thumb_url' => $goods['image']['file_path'],
'title' => $goods['goods_name'], 'unit_price' => $goods['goods_price'] * 100, 'original_price' => $goods['line_price'] * 100, 'category_list' => ['商品分类'], 'item_detail_page' => ['path' => "pages/goods/index?goods_id={$goods['goods_id']}"],
];
}
return $data;
}
private function getAddressInfo($deliveryType, $express)
{
$data = [];
if ($deliveryType == DeliveryTypeEnum::EXPRESS) {
$data = [
'name' => $express['name'], 'phone' => $express['phone'], 'province' => $express['region']['province'], 'city' => $express['region']['city'], 'district' => $express['region']['region'], ];
$data['address'] = "{$data['province']} {$data['city']} {$data['district']} {$express['detail']}";
}
return $data;
}
}