|
|
<?php
|
|
|
|
|
|
namespace app\adminapi\controller\v1;
|
|
|
|
|
|
use app\adminapi\ApiController;
|
|
|
use think\facade\Db;
|
|
|
|
|
|
use app\common\lib\Aes;
|
|
|
use app\common\shipping\ShippingStrategy;
|
|
|
|
|
|
class Order extends ApiController
|
|
|
{
|
|
|
//取得支付列表
|
|
|
public function list()
|
|
|
{
|
|
|
$params = input('post.');
|
|
|
|
|
|
$page = isset($params['page']) ? $params['page'] : 1;
|
|
|
$size = isset($params['size']) ? $params['size'] : 10;
|
|
|
$search = $params['search'];
|
|
|
|
|
|
$is_search = false;
|
|
|
|
|
|
foreach ($search as $key => $value) {
|
|
|
if (strlen(trim($value)) > 0) {
|
|
|
$is_search = true;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
$do = Db::name('order_info')
|
|
|
->alias('o')
|
|
|
->leftjoin('users u', 'u.user_id=o.user_id')
|
|
|
->leftjoin('payment p', 'p.pay_id=o.pay_id')
|
|
|
->leftjoin('shipping s', 's.shipping_id=o.shipping_id')
|
|
|
->field('o.order_id, o.order_sn, o.add_time, o.order_status, o.shipping_status, o.order_amount, o.money_paid,o.pay_id,o.pay_status, o.consignee, o.address, o.email, o.tel, o.mobile, o.extension_code, o.extension_id, ( o.goods_amount + o.tax + o.shipping_fee + o.insure_fee + o.pay_fee + o.pack_fee + o.card_fee ) AS total_fee, IFNULL(u.user_name, \'匿名用户\') AS buyer,p.pay_name,s.shipping_name')
|
|
|
->page($page, $size)
|
|
|
->order('o.order_id', 'desc');
|
|
|
|
|
|
if ($is_search) {
|
|
|
if (!empty($search['user_id'])) {
|
|
|
$do = $do->where('o.user_id', $search['user_id']);
|
|
|
}
|
|
|
if (!empty($search['order_sn'])) {
|
|
|
$do = $do->where('o.order_sn', 'like', '%' . trim($search['order_sn']) . '%');
|
|
|
}
|
|
|
if (!empty($search['consignee'])) {
|
|
|
$do = $do->where('o.consignee', 'like', '%' . trim($search['consignee']) . '%');
|
|
|
}
|
|
|
if (!empty($search['status'])) {
|
|
|
$do = $do->where('o.order_status', '=', $search['status']);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
$result = $do->select()->toArray();
|
|
|
|
|
|
$SName = getStatusName();
|
|
|
//格式化數據
|
|
|
foreach ($result as $key => $value) {
|
|
|
$result[$key]['add_time'] = date('Y-m-d H:i:s', $value['add_time']);
|
|
|
// $result[$key]['status'] = $SName['os'][$value['order_status']] . ',' . $SName['ps'][$value['pay_status']] . ',' . $SName['ss'][$value['shipping_status']];
|
|
|
|
|
|
if ($value['shipping_status'] == 7) {
|
|
|
$ss_status = '<font color="blue">' . $SName['ss'][$value['shipping_status']] . '</font>';
|
|
|
} else {
|
|
|
$ss_status = $SName['ss'][$value['shipping_status']];
|
|
|
}
|
|
|
$os_status = $SName['os'][$value['order_status']];
|
|
|
|
|
|
if ($value['pay_status'] == 3) {
|
|
|
$ps_status = '<font color="red">' . $SName['ps'][$value['pay_status']] . '</font>';
|
|
|
} else {
|
|
|
$ps_status = $SName['ps'][$value['pay_status']];
|
|
|
}
|
|
|
|
|
|
|
|
|
$result[$key]['status'] = $os_status . ',' . $ps_status . ',' . $ss_status;
|
|
|
|
|
|
if ($value['pay_id'] == 0) {
|
|
|
$result[$key]['pay_name'] = '貨到付款';
|
|
|
}
|
|
|
}
|
|
|
|
|
|
$rtn = [
|
|
|
'total' => $do->count(),
|
|
|
'page' => $page,
|
|
|
'data' => $result,
|
|
|
];
|
|
|
|
|
|
return $this->Success($rtn);
|
|
|
}
|
|
|
|
|
|
public function getCardInfo()
|
|
|
{
|
|
|
$sn = input('sn');
|
|
|
$order = Db::name('order_info')->where('order_sn', $sn)->find();
|
|
|
|
|
|
$info = Db::name('order_goods')
|
|
|
->where('order_id', $order['order_id'])
|
|
|
->where('goods_id', 1)
|
|
|
->value('add_info');
|
|
|
|
|
|
$result = json_decode($info, true);
|
|
|
|
|
|
$aes = new Aes([]);
|
|
|
// if(strlen(trim($info['uniqid']))>0){
|
|
|
// $params = urlencode($aes->encrypt('verify_code='.$user['uniqid']));
|
|
|
// }else{
|
|
|
$user_id = Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id');
|
|
|
$params = urlencode($aes->encrypt('user_id=' . $user_id));
|
|
|
// }
|
|
|
|
|
|
$result['nfcurl'] = env('slash.card_base_url').'/card/?params=' . $params;
|
|
|
|
|
|
return $this->Success($result);
|
|
|
}
|
|
|
|
|
|
//取得訂單詳情
|
|
|
public function getOrderInfo()
|
|
|
{
|
|
|
$id = input('id');
|
|
|
|
|
|
//取得訂單狀態名稱
|
|
|
$SName = getStatusName();
|
|
|
|
|
|
$order_info = Db::name('order_info')
|
|
|
->where('order_id', $id)->find();
|
|
|
|
|
|
$order_info['goods_item'] = $this->getOrderGoods($id);
|
|
|
$order_info['add_time'] = date('Y-m-d H:i:s', $order_info['add_time']);
|
|
|
if ($order_info['pay_time'] != 0) {
|
|
|
$order_info['pay_time'] = date('Y-m-d H:i:s', $order_info['pay_time']);
|
|
|
} else {
|
|
|
$order_info['pay_time'] = '未支付';
|
|
|
}
|
|
|
if ($order_info['shipping_time'] != 0) {
|
|
|
$order_info['shipping_time'] = date('Y-m-d H:i:s', $order_info['shipping_time']);
|
|
|
} else {
|
|
|
$order_info['shipping_time'] = '未發貨';
|
|
|
}
|
|
|
$order_info['confirm_time'] = date('Y-m-d H:i:s', $order_info['confirm_time']);
|
|
|
if ($order_info['pay_id'] != 0) {
|
|
|
$order_info['pay_name'] = Db::name('payment')->where('pay_id', $order_info['pay_id'])->value('pay_name');
|
|
|
} else {
|
|
|
$order_info['pay_name'] = '貨到付款';
|
|
|
}
|
|
|
$order_info['shipping_name'] = Db::name('shipping')->where('shipping_id', $order_info['shipping_id'])->value('shipping_name');
|
|
|
|
|
|
$order_info['order_status_name'] = $SName['os'][$order_info['order_status']];
|
|
|
$order_info['pay_status_name'] = $SName['ps'][$order_info['pay_status']];
|
|
|
$order_info['shipping_status_name'] = $SName['ss'][$order_info['shipping_status']];
|
|
|
|
|
|
|
|
|
//取得上一筆訂單
|
|
|
$order_info['prev'] = Db::name('order_info')->where('order_id', '<', $id)
|
|
|
->order('order_id desc')
|
|
|
->value('order_id');
|
|
|
|
|
|
//取得下一筆訂單
|
|
|
$order_info['next'] = Db::name('order_info')->where('order_id', '>', $id)
|
|
|
->order('order_id asc')
|
|
|
->value('order_id');
|
|
|
|
|
|
//取得操作功能列表
|
|
|
$order_info['op_list'] = $this->getOperableList($order_info);
|
|
|
|
|
|
return $this->Success($order_info);
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 取得訂單商品
|
|
|
* @param array $order
|
|
|
* @return array
|
|
|
*/
|
|
|
|
|
|
private function getOrderGoods($order_id)
|
|
|
{
|
|
|
$goods_list = Db::name('order_goods')
|
|
|
->alias('o')
|
|
|
->leftjoin('products p', 'o.product_id=p.product_id')
|
|
|
->leftjoin('goods g', 'o.goods_id=g.goods_id')
|
|
|
->leftjoin('brand b', 'g.brand_id=b.brand_id')
|
|
|
->field('o.*, g.suppliers_id AS suppliers_id,IF(o.product_id > 0, p.product_number, g.goods_number) AS storage, o.goods_attr, IFNULL(b.brand_name, \'\') AS brand_name, p.product_sn')
|
|
|
->where('order_id', $order_id)
|
|
|
->select()
|
|
|
->toArray();
|
|
|
|
|
|
foreach ($goods_list as $key => $value) {
|
|
|
$goods_list[$key]['subtotal'] = $value['goods_price'] * $value['goods_number'];
|
|
|
}
|
|
|
// while ($row = $GLOBALS['db']->fetchRow($res)) {
|
|
|
// // 虛擬商品支持
|
|
|
// if ($row['is_real'] == 0) {
|
|
|
// /* 取得語言項 */
|
|
|
// $filename = ROOT_PATH . 'plugins/' . $row['extension_code'] . '/languages/common_' . $GLOBALS['_CFG']['lang'] . '.php';
|
|
|
// if (file_exists($filename)) {
|
|
|
// include_once($filename);
|
|
|
// if (!empty($GLOBALS['_LANG'][$row['extension_code'] . '_link'])) {
|
|
|
// $row['goods_name'] = $row['goods_name'] . sprintf($GLOBALS['_LANG'][$row['extension_code'] . '_link'], $row['goods_id'], $order['order_sn']);
|
|
|
// }
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
// $row['formated_subtotal'] = price_format($row['goods_price'] * $row['goods_number']);
|
|
|
// $row['formated_goods_price'] = price_format($row['goods_price']);
|
|
|
|
|
|
// $goods_attr[] = explode(' ', trim($row['goods_attr'])); //將商品屬性拆分為一個數組
|
|
|
|
|
|
// if ($row['extension_code'] == 'package_buy') {
|
|
|
// $row['storage'] = '';
|
|
|
// $row['brand_name'] = '';
|
|
|
// $row['package_goods_list'] = get_package_goods_list($row['goods_id']);
|
|
|
// }
|
|
|
|
|
|
// //處理貨品id
|
|
|
// $row['product_id'] = empty($row['product_id']) ? 0 : $row['product_id'];
|
|
|
|
|
|
// $goods_list[] = $row;
|
|
|
// }
|
|
|
|
|
|
// $attr = array();
|
|
|
// $arr = array();
|
|
|
// foreach ($goods_attr as $index => $array_val) {
|
|
|
// foreach ($array_val as $value) {
|
|
|
// $arr = explode(':', $value); //以 : 號將屬性拆開
|
|
|
// $attr[$index][] = @array('name' => $arr[0], 'value' => $arr[1]);
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
// return array('goods_list' => $goods_list, 'attr' => $attr);
|
|
|
return $goods_list;
|
|
|
}
|
|
|
|
|
|
public function getOrderAction()
|
|
|
{
|
|
|
$SName = getStatusName();
|
|
|
|
|
|
$id = input('id');
|
|
|
$order_action = Db::name('order_action')
|
|
|
->where('order_id', $id)
|
|
|
->select()->toArray();
|
|
|
|
|
|
foreach ($order_action as $key => $value) {
|
|
|
$order_action[$key]['order_status'] = $SName['os'][$value['order_status']];
|
|
|
$order_action[$key]['shipping_status'] = $SName['ss'][$value['shipping_status']];
|
|
|
$order_action[$key]['pay_status'] = $SName['ps'][$value['pay_status']];
|
|
|
|
|
|
$order_action[$key]['log_time'] = date('Y-m-d H:i:s', $value['log_time']);
|
|
|
}
|
|
|
|
|
|
return $this->Success($order_action);
|
|
|
}
|
|
|
|
|
|
public function updateOrder()
|
|
|
{
|
|
|
$data = input('post.');
|
|
|
//更新order_info
|
|
|
$action['action_note'] = '';
|
|
|
|
|
|
$rtn = $this->updateStatus($data, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
return $this->Success('更新成功');
|
|
|
}
|
|
|
|
|
|
//變更訂單操作
|
|
|
public function updateOrderAction()
|
|
|
{
|
|
|
$params = input('post.');
|
|
|
$action['action_note'] = isset($params['action_note']) ? $params['action_note'] : '';
|
|
|
|
|
|
$order = Db::name('order_info')
|
|
|
->where('order_id', $params['order_id'])
|
|
|
->find();
|
|
|
|
|
|
if ($params['op'] == 'confirm') {
|
|
|
|
|
|
$arr = [
|
|
|
'order_id' => $params['order_id'],
|
|
|
'pay_status' => $order['pay_status'],
|
|
|
'shipping_status' => $order['shipping_status'],
|
|
|
'order_status' => 1,
|
|
|
];
|
|
|
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
} elseif ($params['op'] == 'cancel') {
|
|
|
/* 標記訂單為“取消”,記錄取消原因 */
|
|
|
$arr = [
|
|
|
'order_id' => $params['order_id'],
|
|
|
'order_status' => OS_CANCELED,
|
|
|
'pay_status' => $order['pay_status'],
|
|
|
'shipping_status' => $order['shipping_status'],
|
|
|
'to_buyer' => $action['action_note'],
|
|
|
'pay_status' => PS_UNPAYED,
|
|
|
'pay_time' => 0,
|
|
|
];
|
|
|
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
|
|
|
/* todo 處理退款 */
|
|
|
|
|
|
/* 記錄log */
|
|
|
|
|
|
/* 如果使用庫存,且下訂單時減庫存,則增加庫存 */
|
|
|
|
|
|
/* 退還用户餘額、積分、紅包 */
|
|
|
|
|
|
/* 發送郵件 */
|
|
|
} elseif ($params['op'] == 'invalid') {
|
|
|
/* 標記訂單為“無效”,記錄原因 */
|
|
|
$arr = [
|
|
|
'order_id' => $params['order_id'],
|
|
|
'order_status' => OS_INVALID,
|
|
|
'pay_status' => $order['pay_status'],
|
|
|
'shipping_status' => $order['shipping_status'],
|
|
|
'to_buyer' => $action['action_note'],
|
|
|
'pay_status' => PS_UNPAYED,
|
|
|
'pay_time' => 0,
|
|
|
];
|
|
|
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
|
|
|
/* 如果使用庫存,且下訂單時減庫存,則增加庫存 */
|
|
|
|
|
|
/* 發送郵件 */
|
|
|
} elseif ($params['op'] == 'remove') {
|
|
|
|
|
|
/* 刪除訂單 */
|
|
|
Db::name('order_info')->where('order_id', $params['order_id'])->delete();
|
|
|
Db::name('order_goods')->where('order_id', $params['order_id'])->delete();
|
|
|
Db::name('order_action')->where('order_id', $params['order_id'])->delete();
|
|
|
|
|
|
// $action_array = array('delivery', 'back');
|
|
|
// del_delivery($order_id, $action_array);
|
|
|
|
|
|
/* todo 記錄日誌 */
|
|
|
// admin_log($order['order_sn'], 'remove', 'order');
|
|
|
|
|
|
/* 返回 */
|
|
|
} elseif ($params['op'] == 'pay') {
|
|
|
|
|
|
/* 標記訂單為已確認、已付款,更新付款時間和已支付金額 */
|
|
|
|
|
|
$arr['order_id'] = $order['order_id'];
|
|
|
$arr['order_status'] = $order['order_status'];
|
|
|
$arr['shipping_status'] = $order['shipping_status'];
|
|
|
if ($order['order_status'] != OS_CONFIRMED) {
|
|
|
$arr['order_status'] = OS_CONFIRMED;
|
|
|
$arr['confirm_time'] = time();
|
|
|
}
|
|
|
$arr['pay_status'] = PS_PAYED;
|
|
|
$arr['pay_time'] = time();
|
|
|
// $arr['money_paid'] = $order['money_paid'] + $order['order_amount'];
|
|
|
// $arr['order_amount'] = 0;
|
|
|
// $payment = payment_info($order['pay_id']);
|
|
|
//貨到付款
|
|
|
// if ($payment['is_cod']) {
|
|
|
// $arr['shipping_status'] = SS_RECEIVED;
|
|
|
// $order['shipping_status'] = SS_RECEIVED;
|
|
|
// }
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
|
|
|
/* 記錄log */
|
|
|
// order_action($order['order_sn'], OS_CONFIRMED, $order['shipping_status'], PS_PAYED, $action_note);
|
|
|
} elseif ($params['op'] == 'unpay') {
|
|
|
/* 標記訂單為已確認、已付款,更新付款時間和已支付金額,如果是貨到付款,同時修改訂單為“收貨確認” */
|
|
|
$arr['order_id'] = $order['order_id'];
|
|
|
$arr['order_status'] = $order['order_status'];
|
|
|
$arr['shipping_status'] = SS_UNSHIPPED;
|
|
|
$arr['pay_status'] = PS_UNPAYED;
|
|
|
$arr['pay_time'] = 0;
|
|
|
// $arr['money_paid'] = $order['money_paid'] + $order['order_amount'];
|
|
|
// $arr['order_amount'] = 0;
|
|
|
// $payment = payment_info($order['pay_id']);
|
|
|
//貨到付款
|
|
|
// if ($payment['is_cod']) {
|
|
|
// $arr['shipping_status'] = SS_RECEIVED;
|
|
|
// $order['shipping_status'] = SS_RECEIVED;
|
|
|
// }
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
|
|
|
/* 記錄log */
|
|
|
// order_action($order['order_sn'], OS_CONFIRMED, $order['shipping_status'], PS_PAYED, $action_note);
|
|
|
} elseif ($params['op'] == 'printcard') {
|
|
|
$arr['order_id'] = $order['order_id'];
|
|
|
$arr['order_status'] = $order['order_status'];
|
|
|
$arr['pay_status'] = $order['pay_status'];
|
|
|
if ($order['order_status'] != OS_CONFIRMED) {
|
|
|
$arr['order_status'] = OS_CONFIRMED;
|
|
|
$arr['confirm_time'] = time();
|
|
|
}
|
|
|
$arr['shipping_status'] = 5;
|
|
|
$arr['shipping_time'] = time();
|
|
|
|
|
|
//檢查是否貨到付款,是的話更新card的資料
|
|
|
// if ($order['pay_id'] == 0) {
|
|
|
$updateSlashUSer = \app\common\SlashCard::updateUser($order);
|
|
|
|
|
|
if ($updateSlashUSer['code'] != 200 && $updateSlashUSer['code'] != 201) {
|
|
|
return $this->Error('更新SlashCard失敗');
|
|
|
} elseif ($updateSlashUSer['code'] == 200) {
|
|
|
$action['action_note'] = '配貨完成,更新Card為付費會員,到期日:'.date('Y-m-d',$updateSlashUSer['data']);
|
|
|
} elseif ($updateSlashUSer['code'] == 201) {
|
|
|
$action['action_note'] = '配貨完成,會員期限已更新過';
|
|
|
}
|
|
|
// }
|
|
|
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
} elseif ($params['op'] == 'ship') {
|
|
|
$arr['order_id'] = $order['order_id'];
|
|
|
$arr['order_status'] = $order['order_status'];
|
|
|
$arr['pay_status'] = $order['pay_status'];
|
|
|
if ($order['order_status'] != OS_CONFIRMED) {
|
|
|
$arr['order_status'] = OS_CONFIRMED;
|
|
|
$arr['confirm_time'] = time();
|
|
|
}
|
|
|
$arr['shipping_status'] = SS_SHIPPED;
|
|
|
$arr['shipping_time'] = time();
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
} elseif ($params['op'] == 'unship') {
|
|
|
$arr['order_id'] = $order['order_id'];
|
|
|
$arr['order_status'] = $order['order_status'];
|
|
|
$arr['pay_status'] = $order['pay_status'];
|
|
|
$arr['shipping_status'] = SS_UNSHIPPED;
|
|
|
$arr['shipping_time'] = 0;
|
|
|
|
|
|
$updateSlashUSer = \app\common\SlashCard::cancelUser($order);
|
|
|
if ($updateSlashUSer['code'] != 200 && $updateSlashUSer['code'] != 201) {
|
|
|
return $this->Error('更新SlashCard失敗');
|
|
|
} elseif ($updateSlashUSer['code'] == 200) {
|
|
|
$action['action_note'] = '取消配貨,更新Card會員資料,到期日:'.date('Y-m-d',$updateSlashUSer['data']);
|
|
|
} elseif ($updateSlashUSer['code'] == 201) {
|
|
|
$action['action_note'] = '取消配貨,會員期限未更新過';
|
|
|
}
|
|
|
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
} elseif ($params['op'] == 'arrive') {
|
|
|
$arr['order_id'] = $order['order_id'];
|
|
|
$arr['order_status'] = $order['order_status'];
|
|
|
$arr['pay_status'] = $order['pay_status'];
|
|
|
$arr['shipping_status'] = SS_SHIPPED_ARRIVE;
|
|
|
// $arr['shipping_time'] = time();
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
|
|
|
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
} elseif ($params['op'] == 'unarrive') {
|
|
|
$arr['order_id'] = $order['order_id'];
|
|
|
$arr['order_status'] = $order['order_status'];
|
|
|
$arr['pay_status'] = $order['pay_status'];
|
|
|
$arr['shipping_status'] = SS_SHIPPED_ING;
|
|
|
// $arr['shipping_time'] = 0;
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
} elseif ($params['op'] == 'finish') {
|
|
|
//訂單完成,計算分銷
|
|
|
$res = \app\common\Affiliate::calculateProfitShare($order);
|
|
|
|
|
|
if ($res['code'] > 0) {
|
|
|
return $this->Error('計算分銷失敗,請重新操作');
|
|
|
}
|
|
|
|
|
|
$arr['order_id'] = $order['order_id'];
|
|
|
$arr['order_status'] = OS_FINISHED;
|
|
|
$arr['pay_status'] = PS_PAYED;
|
|
|
$arr['shipping_status'] = SS_RECEIVED;
|
|
|
$rtn = $this->updateStatus($arr, $action);
|
|
|
if (!$rtn) {
|
|
|
return $this->Error('更新失敗');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
return $this->Success('更新成功');
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 返回某個訂單可執行的操作列表,包括權限判斷
|
|
|
* @param array $order 訂單信息 order_status, shipping_status, pay_status
|
|
|
* @param bool $is_cod 支付方式是否貨到付款
|
|
|
* @return array 可執行的操作 confirm, pay, unpay, prepare, ship, unship, receive, cancel, invalid, return, drop
|
|
|
* 格式 array('confirm' => true, 'pay' => true)
|
|
|
*/
|
|
|
private function getOperableList($order)
|
|
|
{
|
|
|
/* 取得訂單狀態、發貨狀態、付款狀態 */
|
|
|
$os = $order['order_status'];
|
|
|
$ss = $order['shipping_status'];
|
|
|
$ps = $order['pay_status'];
|
|
|
// /* 取得訂單操作權限 */
|
|
|
// $actions = $_SESSION['action_list'];
|
|
|
// if ($actions == 'all') {
|
|
|
// $priv_list = array('os' => true, 'ss' => true, 'ps' => true, 'edit' => true);
|
|
|
// } else {
|
|
|
// $actions = ',' . $actions . ',';
|
|
|
// $priv_list = array(
|
|
|
// 'os' => strpos($actions, ',order_os_edit,') !== false,
|
|
|
// 'ss' => strpos($actions, ',order_ss_edit,') !== false,
|
|
|
// 'ps' => strpos($actions, ',order_ps_edit,') !== false,
|
|
|
// 'edit' => strpos($actions, ',order_edit,') !== false
|
|
|
// );
|
|
|
// }
|
|
|
|
|
|
$priv_list = [
|
|
|
'os' => true,
|
|
|
'ss' => true,
|
|
|
'ps' => true,
|
|
|
'edit' => true
|
|
|
];
|
|
|
// /* 取得訂單支付方式是否貨到付款 */
|
|
|
// $payment = payment_info($order['pay_id']);
|
|
|
// $is_cod = $payment['is_cod'] == 1;
|
|
|
$is_cod = 0;
|
|
|
/* 根據狀態返回可執行操作 */
|
|
|
$list = [];
|
|
|
if (OS_UNCONFIRMED == $os) {
|
|
|
/* 狀態:未確認 => 未付款、未發貨 */
|
|
|
$list[] = 'confirm';
|
|
|
$list[] = 'invalid';
|
|
|
$list[] = 'cancel';
|
|
|
// if ($is_cod) {
|
|
|
// /* 貨到付款 */
|
|
|
// if ($priv_list['ss']) {
|
|
|
// $list['prepare'] = true; // 配貨
|
|
|
// $list['split'] = true; // 分單
|
|
|
// }
|
|
|
// } else {
|
|
|
// /* 不是貨到付款 */
|
|
|
// if ($priv_list['ps']) {
|
|
|
// $list['pay'] = true; // 付款
|
|
|
// }
|
|
|
// }
|
|
|
} elseif (OS_CONFIRMED == $os) {
|
|
|
/* 狀態:已確認 */
|
|
|
if (PS_PAYED == $ps) {
|
|
|
|
|
|
/* 狀態:已確認、已付款 */
|
|
|
$list[] = 'unpay';
|
|
|
|
|
|
if (SS_UNSHIPPED == $ss || SS_PREPARING == $ss) {
|
|
|
/* 狀態:已確認、已付款、未發貨(配貨中)*/
|
|
|
$list[] = 'ship';
|
|
|
} elseif (SS_SHIPPED_ING == $ss) {
|
|
|
/* 狀態:已確認、未付款、發貨中 */
|
|
|
$list[] = 'unship';
|
|
|
$list[] = 'arrive';
|
|
|
} elseif (SS_SHIPPED_ARRIVE == $ss) {
|
|
|
/* 狀態:已確認、未付款、發貨中 */
|
|
|
$list[] = 'unship';
|
|
|
$list[] = 'unarrive';
|
|
|
} else {
|
|
|
/* 狀態:已確認、已付款和付款中、已發貨或已收貨 */
|
|
|
$list[] = 'unship';
|
|
|
$list[] = 'arrive';
|
|
|
}
|
|
|
$list[] = 'prepare';
|
|
|
} elseif (PS_UNPAYED == $ps) {
|
|
|
$list[] = 'pay';
|
|
|
|
|
|
if (SS_UNSHIPPED == $ss || SS_PREPARING == $ss) {
|
|
|
/* 狀態:已確認、已付款、未發貨(配貨中)*/
|
|
|
$list[] = 'ship';
|
|
|
} elseif (SS_SHIPPED_ING == $ss) {
|
|
|
/* 狀態:已確認、未付款、發貨中 */
|
|
|
$list[] = 'unship';
|
|
|
$list[] = 'arrive';
|
|
|
} elseif (SS_SHIPPED_ARRIVE == $ss) {
|
|
|
/* 狀態:已確認、未付款、發貨中 */
|
|
|
$list[] = 'unship';
|
|
|
$list[] = 'unarrive';
|
|
|
} else {
|
|
|
/* 狀態:已確認、已付款和付款中、已發貨或已收貨 */
|
|
|
$list[] = 'unship';
|
|
|
$list[] = 'arrive';
|
|
|
}
|
|
|
$list[] = 'prepare';
|
|
|
} else {
|
|
|
/* 狀態:已確認、付款中 */
|
|
|
$list[] = 'unpay';
|
|
|
$list[] = 'pay';
|
|
|
|
|
|
if (SS_UNSHIPPED == $ss || SS_PREPARING == $ss) {
|
|
|
/* 狀態:已確認、已付款、未發貨(配貨中)*/
|
|
|
$list[] = 'ship';
|
|
|
} elseif (SS_SHIPPED_ING == $ss) {
|
|
|
/* 狀態:已確認、未付款、發貨中 */
|
|
|
$list[] = 'unship';
|
|
|
$list[] = 'arrive';
|
|
|
} elseif (SS_SHIPPED_ARRIVE == $ss) {
|
|
|
/* 狀態:已確認、未付款、發貨中 */
|
|
|
$list[] = 'unship';
|
|
|
$list[] = 'unarrive';
|
|
|
} else {
|
|
|
/* 狀態:已確認、已付款和付款中、已發貨或已收貨 */
|
|
|
$list[] = 'unship';
|
|
|
$list[] = 'arrive';
|
|
|
}
|
|
|
$list[] = 'prepare';
|
|
|
}
|
|
|
if ($priv_list['os']) {
|
|
|
$list[] = 'finish'; //完成
|
|
|
$list[] = 'cancel'; // 取消
|
|
|
$list[] = 'invalid'; // 無效
|
|
|
}
|
|
|
} elseif (OS_CANCELED == $os) {
|
|
|
/* 狀態:取消 */
|
|
|
if ($priv_list['os']) {
|
|
|
$list[] = 'confirm';
|
|
|
}
|
|
|
if ($priv_list['edit']) {
|
|
|
$list[] = 'remove';
|
|
|
}
|
|
|
} elseif (OS_INVALID == $os) {
|
|
|
/* 狀態:無效 */
|
|
|
if ($priv_list['os']) {
|
|
|
$list[] = 'confirm';
|
|
|
}
|
|
|
if ($priv_list['edit']) {
|
|
|
$list[] = 'remove';
|
|
|
}
|
|
|
} elseif (OS_FINISHED == $os) {
|
|
|
/* 狀態:完成 */
|
|
|
$list[] = 'return';
|
|
|
$list[] = 'after_service';
|
|
|
} else {
|
|
|
$list[] = 'cancel';
|
|
|
$list[] = 'invalid';
|
|
|
}
|
|
|
|
|
|
// } elseif (OS_RETURNED == $os) {
|
|
|
// /* 狀態:退貨 */
|
|
|
// if ($priv_list['os']) {
|
|
|
// $list['confirm'] = true;
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
// /* 修正發貨操作 */
|
|
|
// if (!empty($list['split'])) {
|
|
|
// /* 如果是團購活動且未處理成功,不能發貨 */
|
|
|
// if ($order['extension_code'] == 'group_buy') {
|
|
|
// include_once(ROOT_PATH . 'includes/lib_goods.php');
|
|
|
// $group_buy = group_buy_info(intval($order['extension_id']));
|
|
|
// if ($group_buy['status'] != GBS_SUCCEED) {
|
|
|
// unset($list['split']);
|
|
|
// unset($list['to_delivery']);
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
// /* 如果部分發貨 不允許 取消 訂單 */
|
|
|
// if (order_deliveryed($order['order_id'])) {
|
|
|
// $list['return'] = true; // 退貨(包括退款)
|
|
|
// unset($list['cancel']); // 取消
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
// /* 售後 */
|
|
|
|
|
|
//操作排序
|
|
|
$sort_arr = ['confirm', 'pay', 'prepare', 'split', 'to_delivery', 'ship', 'receive', 'unship', 'arrive', 'unarrive', 'unpay', 'finish', 'return', 'cancel', 'invalid', 'remove', 'after_service'];
|
|
|
|
|
|
// 使用 array_intersect 函數找到兩個 array 的交集
|
|
|
$intersection = array_intersect($list, $sort_arr);
|
|
|
|
|
|
// 使用 array_uintersect 函數按照另一個 array 的順序排序交集
|
|
|
$result = array_uintersect($sort_arr, $intersection, 'strcasecmp');
|
|
|
$result = array_values($result);
|
|
|
return $result;
|
|
|
}
|
|
|
|
|
|
private function updateStatus($data, $action)
|
|
|
{
|
|
|
|
|
|
try {
|
|
|
|
|
|
if (!isset($data['user_id']) && isset($data['user_sn'])) {
|
|
|
$data['order_id'] = Db::name('order_info')->where('order_sn', $data['order_sn'])->value('order_id');
|
|
|
}
|
|
|
|
|
|
Db::name('order_info')
|
|
|
->where('order_id', $data['order_id'])
|
|
|
->update($data);
|
|
|
|
|
|
//更新order_action
|
|
|
|
|
|
Db::name('order_action')
|
|
|
->insert([
|
|
|
'order_id' => $data['order_id'],
|
|
|
'action_user' => 'admin',
|
|
|
'order_status' => $data['order_status'],
|
|
|
'pay_status' => $data['pay_status'],
|
|
|
'shipping_status' => $data['shipping_status'],
|
|
|
'action_note' => $action['action_note'],
|
|
|
'log_time' => time()
|
|
|
]);
|
|
|
} catch (\Exception $e) {
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
public function printlabel()
|
|
|
{
|
|
|
$order_id = input('order_id');
|
|
|
$order = Db::name('order_info')->where('order_id', $order_id)->find();
|
|
|
$shipping_data = json_decode($order['shipping_data'], true);
|
|
|
|
|
|
if (empty($shipping_data)) {
|
|
|
return;
|
|
|
}
|
|
|
$shipping = new ShippingStrategy('ecpay');
|
|
|
|
|
|
$data = [
|
|
|
'AllPayLogisticsID' => $shipping_data['AllPayLogisticsID'],
|
|
|
'CVSPaymentNo' => $shipping_data['CVSPaymentNo'],
|
|
|
'type' => $shipping_data['LogisticsSubType']
|
|
|
];
|
|
|
|
|
|
switch ($data['type']) {
|
|
|
case 'UNIMARTC2C':
|
|
|
$data['CVSValidationNo'] = $shipping_data['CVSValidationNo'];
|
|
|
break;
|
|
|
case 'FAMIC2C':
|
|
|
break;
|
|
|
case 'HILIFEC2C':
|
|
|
break;
|
|
|
case 'OKMARTC2C':
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
$result = $shipping->printLabel($data);
|
|
|
|
|
|
return $result;
|
|
|
}
|
|
|
}
|