$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 = ''.$SName['ss'][$value['shipping_status']].'';
}else{
$ss_status = $SName['ss'][$value['shipping_status']];
}
$os_status = $SName['os'][$value['order_status']];
if($value['pay_status']==3){
$ps_status = ''.$SName['ps'][$value['pay_status']].'';
}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'] = 'https://card.slash1000.com/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為付費會員';
}elseif($updateSlashUSer['code']==201){
$action['action_note'] = 'Card重覆操作';
}
}
$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;
$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') {
$arr['order_id'] = $order['order_id'];
$arr['order_status'] = OS_FINISHED;
$arr['pay_status'] = $order['pay_status'];
$arr['shipping_status'] = $order['shipping_status'];
$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;
}
}