$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'] = 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; } }