[ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['POST'], ], ], ]; } /** * Lists all OrderMain models. * @return mixed */ public function actionIndex() { $searchModel = new searchOrderMain(); $searchModel->date_from = date('Y-m-d', strtotime('-3 days')); $searchModel->date_to = date('Y-m-d'); $dataProvider = $searchModel->supplierSearch(Yii::$app->request->queryParams); //要根据状态获取各状态的数量,所以把$dataProvider的models全部取出后,再筛选状态,减少sql查询次数,以达到优化时间的目的 //至少需要查询2次,一次获取数量,一次正常状态查询以实现分页功能 $tmp_dataProvider = unserialize(serialize($dataProvider)); $tmp_dataProvider->pagination = false; $models = $tmp_dataProvider->getModels(); $status_arr = []; $providerData = []; if (!empty($models)) { foreach ($models as $model) { $status_arr[0] += 1; if (!isset($status_arr[$model->ORDER_STATUS])) { $status_arr[$model->ORDER_STATUS] = 0; } $status_arr[$model->ORDER_STATUS] += 1; //符合状态的订单存起来供页面显示 if ($searchModel->ORDER_STATUS == '' || $searchModel->ORDER_STATUS == $model->ORDER_STATUS) $providerData[] = $model; } } $dataProvider = new ArrayDataProvider([ 'allModels' => $providerData ]); //登录账号所属酒店 $base_supplier = User::find() ->addSelect(['base_supplier.ID']) ->leftJoin('base_supplier', 'base_supplier.ID = base_user.TOP_ORG_ID') ->where(['base_user.ID' => Yii::$app->user->id]) ->asArray()->one(); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, 'status_arr' => $status_arr, 'supplier_id' => $base_supplier['ID'] ]); } /** * Author:Steven * Desc:查看订单详情页面 * @param $id * @return string * @throws NotFoundHttpException * @throws ServerErrorHttpException */ public function actionView($id) { $model = $this->findModel($id); //子订单 $detail = OrderMain::find() ->addSelect([ 'order_main.*', 'count(run_date) as room_count', //每一天的间数 ])->where(['PARENT_ORDER_ID' => $model->ORDER_ID, 'CANCEL_FLAG' => 0]) ->groupBy('RUN_DATE')->all(); if (empty($detail)) { throw new ServerErrorHttpException('订单数据不完整。'); } //订单备注,公共备注 $notes = OrderComment::find()->joinWith('user') ->where(['order_comment.CANCEL_FLAG' => 0, 'ORDER_ID' => $model->ORDER_ID, 'COMMENT_TYPE' => OrderComment::TYPE_PUBLIC]) ->all(); return $this->render('view', [ 'model' => $model, 'detail' => $detail, 'notes' => $notes ]); } /** * Notes: * User: Steven * Date: 2018/1/19 * Time: 13:10 * @param $order_id * @param $status * @param $msg //确认号 * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionConfirm($order_id, $status, $msg) { // $postMsg = Yii::$app->request->post("copyMsg"); $order = $this->findModel($order_id); $tmp_channel_status = $order->CHANNEL_ORDER_STATUS; $logger = new TopLogger(); $logger->log([date("Y-m-d H:i:s"), '酒店确认,渠道订单号:' . $order_id . ',渠道订单状态:' . $tmp_channel_status . "\n" . PHP_EOL], 'ali/error'); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CONFIRMED; $order->ORDER_CONFIRM_CODE = $msg; $order->ORDER_LEVEL = OrderMain::ORDER_LEVEL_SURE; $order->UPDATE_USER_ID = Yii::$app->user->id; $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); if ($order->validate()) { //渠道状态已取消,不能确认 if ($order->CHANNEL_ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '订单无法确认,请联系客服发取消单']); } if ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL) { //这里一定要在判断完渠道状态后再修改渠道的订单状态 $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_ACCEPT; } if (!$order->confirm()) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '确认失败']); } elseif ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL) { $order->resetMem(); if ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ali']['supplier_id'] && $tmp_channel_status == OrderMain::ORDER_CHANNEL_STATUS_WAITING) { //阿里直连 // 记录酒店发送是否发送确认日志 $userIp = Yii::$app->request->userIP; $logger->log([date("Y-m-d H:i:s"), '酒店确认,发送阿里确认状态,渠道订单号:' . $order_id . ',渠道订单号:' . $order->OUTSIDE_ORDER_NO . "\n请求ip:" . $userIp . PHP_EOL], 'ali/error'); //这里㤇判断是否已经接单,如果没有接单的话,需要推送状态,如果接单了,相当于确认状态已经推送携程了,不能重复推送 Yii::$app->runAction('hotel/ali/confirm-order', ['tid' => $order->OUTSIDE_ORDER_NO, 'opt_type' => '2']); $logger->log([date("Y-m-d H:i:s"), '酒店确认,通过RunAction,订单号:' . $order_id . "\n" . PHP_EOL], 'ali/error'); } elseif ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ctrip']['supplier_id']) { //携程直连 //对接的订单,需要推送状态 //这里不需要向阿里渠道那样,因为携程是需要确认号的,即使已经确认了,也要通过此接口,更新确认号,所以不需要判读 $interFace = OrderChannelInfo::findOne(['CANCEL_FLAG' => 0, 'ORDER_ID' => $order->ORDER_ID]); if ($interFace != null) { $params = [ 'OrderID' => $order->OUTSIDE_ORDER_NO,//订单ID 'InterfaceConfirmNo' => $order->ORDER_CONFIRM_CODE,//酒店确认号 'OrderStatus' => CtripOrder::ORDER_STATUS_COMFIRMED,//订单状态 3:确认;4:拒绝 'InterFaceSendID' => $interFace->InterFaceSendID,//订单接口发送号 'ResultCode' => CtripOrder::RETURN_CODE_SUCCESS, 'Message' => 'Success', 'channelId' => Yii::$app->params['ctrip']['relation_supplier_id'],//渠道ID 携程传1 ]; $set = new SetService(); $setDes = $set->setOrderStatus($params); if ($setDes['flag'] == false) { zOfficeWechat::sendMsg([ 'agentid' => zOfficeWechat::SEND_HOTEL, 'title' => '直连订单状态推送失败:', 'msg' => '酒店已经确认了直连订单:' . $order->ORDER_ID . "\n但是直连状态推送失败,请手动接单。", 'touser' => 'gaoj,wangxj,shifp,yuw'] ); } } } elseif ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['wx_hotel']['supplier_id']) { //微信商城 // 推送微信商城 $res = Util::confirmHotelOrder($order->ORDER_ID); if ($res['code'] != 0) { zOfficeWechat::sendMsg([ 'agentid' => zOfficeWechat::SEND_HOTEL, 'title' => '直连订单状态推送失败:', 'msg' => '接单失败【微信商城订单】:' . $order->ORDER_ID . ' ' . $res['info'], 'touser' => $this->_developerList] ); } } } } else { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => $order->getErrors()]); } $order->resetMem(); $logger->log([date("Y-m-d H:i:s"), '酒店确认,清除缓存,订单号:' . $order_id . ',订单状态:' . $order->ORDER_STATUS . '订单渠道:' . $order->OUTSIDE_SALE_ORG_ID . "\n" . '渠道订单状态:' . $tmp_channel_status . PHP_EOL], 'ali/error'); return \GuzzleHttp\json_encode(['code' => 0]); } /** * Author:Steven * Desc:拒单 * @param $order_id * @param $status * @param $msg * @return string * @throws NotFoundHttpException */ public function actionRefuse($order_id, $status, $msg) { $order = $this->findModel($order_id); //这里需要判断渠道订单状态: //当渠道接单状态为已接单或拒绝取消,然后发单给酒店,这个时候酒店不应该有拒单按钮的 //防止酒店页面在未刷新的情况下,点击拒绝 if ($order->ORDER_STATUS != $status && $order->CHANNEL_ORDER_STATUS != OrderMain::ORDER_CHANNEL_STATUS_ACCEPT && $order->CHANNEL_ORDER_STATUS != OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_REJECT) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } //当渠道状态为待接单,酒店拒单了,这个时候为了不直接影响服务数据,不直接推送拒绝给直连渠道,由客服自己决定(高瑾:2017-12-22) //当渠道接单状态为已接单或拒绝取消,然后发单给酒店,这个时候酒店不应该有拒单按钮的(高瑾:2017-12-22) $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL; if ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL) $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_REJECT; $order->UPDATE_USER_ID = Yii::$app->user->id; $order->ORDER_LEVEL = OrderMain::ORDER_LEVEL_CANCEL; $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); if ($order->validate()) { if (!$order->refuse($msg)) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '拒单失败']); } //重要:这里渠道拒单不推送渠道拒单状态,原因是有些订单,即使酒店拒单了,但是我们依然还是要收渠道的钱,所以拒绝渠道的订单均由我们人工操作(截止目前(2017-11-23)阿里、携程都实用这个逻辑:) // elseif ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL) { // //对接的订单,需要推送状态 // $interFace = OrderChannelInfo::findOne(['CANCEL_FLAG' => 0, 'ORDER_ID' => $order->ORDER_ID]); // if ($interFace != null) { // $params = [ // 'OrderID' => $order->ORDER_ID,//订单ID // 'InterfaceConfirmNo' => '',//酒店确认号 // 'OrderStatus' => 4,//订单状态 3:确认;4:拒绝 // 'InterFaceSendID' => $interFace->InterFaceSendID,//订单接口发送号 // 'channelId' => Yii::$app->params['ctrip']['relation_supplier_id'],//渠道ID 携程传1 // ]; // $set = new SetService(); // $setDes = $set->setOrderStatus($params); // if ($setDes['flag'] == false) { // zOfficeWechat::sendMsg([ // 'agentid' => zOfficeWechat::SEND_HOTEL, // 'title' => '直连订单状态推送失败:', // 'msg' => '酒店已经拒绝了直连订单:' . $order->ORDER_ID . "\n但是直连状态推送失败,请手动拒单。", // 'touser' => 'gaoj,wangxj,shifp,yuw'] // ); // } // // } // } } else { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => $order->getErrors()]); } //拒单成功,清除 $order->resetMem(); //发企业微信 /* @var $user User */ $user = Yii::$app->user->identity; $supplier = BaseSupplier::findOne(['ID' => $user->TOP_ORG_ID]); $customer_list = $this->_messageList; $arr = array( "agentid" => 1000002, "title" => '酒店拒单:', "msg" => $supplier->SUPPLIER_NAME . '拒绝订单:' . $order->ORDER_ID, "touser" => $customer_list); zOfficeWechat::sendMsg($arr); return \GuzzleHttp\json_encode(['code' => 0]); } /** * @param $order_id * @param $msg string 备注内容 */ public function actionAddNote($order_id, $msg) { $order = $this->findModel($order_id); //添加备注 $note = new OrderComment(); $note->ORDER_ID = $order_id; $note->COMMENT_TXT = $msg; $note->COMMENT_TYPE = OrderComment::TYPE_PUBLIC; //记录添加备注的操作日志 $order->saveLog('note', false, '添加备注:' . $msg); if ($note->save()) { return \GuzzleHttp\json_encode(['code' => 0]); } else { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => $note->getErrors()]); } } /** * Notes:已安排订单取消,酒店同意取消 * User: Steven * Date: 2018/1/18 * Time: 11:51 * @param $order_id * @param $status * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionCancelSure($order_id, $status) { $order = $this->findModel($order_id); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->ORDER_DISABLE_TYPE = OrderMain::ORDER_DISABLE_TYPE_CONFIRMED; $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL; $order->ORDER_LEVEL = OrderMain::ORDER_LEVEL_CANCEL; $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); $flag = $order->getOldAttribute('ORDER_STATUS'); $logger = new TopLogger(); $trans = Yii::$app->db->beginTransaction(); try { $res = $order->save(); if (!$res) { throw new \Exception(); } $roolback = $order->rollbackStocks(); $order->saveLog('cancel_confirm', $flag); $order->resetMem(); //修改子订单的状态值 $orders_res = OrderMain::updateAll([ 'ORDER_STATUS' => OrderMain::ORDER_STATUS_CANCEL, 'ORDER_DISABLE_TYPE' => OrderMain::ORDER_DISABLE_TYPE_CONFIRMED, 'ORDER_LEVEL' => OrderMain::ORDER_LEVEL_CANCEL, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()) ], ['CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $order->ORDER_ID]); if (!$orders_res) { throw new \Exception('修改子订单失败'); } //发企业微信 /* @var $user User */ $user = Yii::$app->user->identity; $supplier = BaseSupplier::findOne(['ID' => $user->TOP_ORG_ID]); $customer_list = $this->_messageList; $arr = array( "agentid" => 1000002, "title" => '酒店同意退单:', "msg" => '酒店' . $supplier->SUPPLIER_NAME . "\n订单号:" . $order->ORDER_ID, "touser" => $customer_list); zOfficeWechat::sendMsg($arr); $trans->commit(); return \GuzzleHttp\json_encode(['code' => 0]); } catch (\Exception $e) { $trans->rollBack(); $error_arr = array( "agentid" => 1000002, "title" => '酒店同意退单失败:', "msg" => "订单号:" . $order->ORDER_ID, "touser" => $this->_messageList ); zOfficeWechat::sendMsg($error_arr); return \GuzzleHttp\json_encode(['code' => 1, 'msg' => $order->getErrors()]); } } /** * Notes:已安排订单取消,酒店拒绝取消 * User: Steven * Date: 2018/1/18 * Time: 11:52 * @param $order_id * @param $status * @return string * @throws NotFoundHttpException */ public function actionCancelReject($order_id, $status) { $order = $this->findModel($order_id); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->ORDER_DISABLE_TYPE = OrderMain::ORDER_DISABLE_TYPE_CONFIRMED; $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CONFIRMED; $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); if (!is_numeric($order->ORDER_CONFIRM_CODE)) { $order->ORDER_CONFIRM_CODE = ''; } $flag = $order->getOldAttribute('ORDER_STATUS'); if ($order->save()) { $order->saveLog('cancel_confirm', $flag); //清除memcache缓存 $order->resetMem(); //发企业微信 /* @var $user User */ $user = Yii::$app->user->identity; $supplier = BaseSupplier::findOne(['ID' => $user->TOP_ORG_ID]); $customer_list = $this->_messageList; $arr = array( "agentid" => 1000002, "title" => '酒店拒绝退单:', "msg" => '酒店' . $supplier->SUPPLIER_NAME . "\n订单号:" . $order->ORDER_ID, "touser" => $customer_list); zOfficeWechat::sendMsg($arr); return \GuzzleHttp\json_encode(['code' => 0]); } else return \GuzzleHttp\json_encode(['code' => 1, 'msg' => $order->getErrors()]); } public function actionDownload($id, $type = 1) { $order = OrderMain::findOne(['ORDER_ID' => $id, 'PARENT_ORDER_ID' => 0, 'CANCEL_FLAG' => 0]); $order_id = $order->ORDER_ID; $filename = "【" . $order_id . "】" . $order->CUSTOMER_NAME . $order->PROD_START_STATION_DATE . ".doc"; ob_start(); //--网页显示 echo ''; $html = $order->wordHtml($type); echo $html; header('Content-type: application/word'); header("Content-Disposition: attachment; filename=\"{$filename}\""); // @readfile($filename,0777); ob_flush(); flush(); exit(); } /** * @Author wanglg * @Desc 获取订单内部备注信息,用于弹框显示 * @return string */ public function actionGetComment() { $request = Yii::$app->request->post(); $comment = new OrderComment(); $comment_list = $comment->getPublicComment($request['order_id']); $data['comment_list'] = $comment_list; return json_encode($data); } /** * 导出订单列表 */ public function actionExport() { $searchModel = new searchOrderMain(); $search = Yii::$app->request->queryParams; $dataProvider = $searchModel->supplierSearch($search); $dataProvider->pagination = false; $query = $dataProvider->query; $query->andFilterWhere(['order_main.ORDER_STATUS' => $searchModel->ORDER_STATUS]); $data = $dataProvider->getModels(); $objPHPExcel = new zPhpExcel(); //实例化PHPExcel类 $objPHPExcel->file_name = '订单信息' . date('Y-m-d'); $objSheet = $objPHPExcel->getActiveSheet(); $objSheet->setTitle('订单列表'); //设置表头 $attributes = OrderMain::supplierExportAttributes(); $order = new OrderMain(); foreach ($attributes as $key => $item) { //A1为编号不需要设置 $objSheet->setCellValue(chr(66 + $key) . '1', $order->getAttributeLabel($item)); } //内存设置,位置不一定合理 ini_set("memory_limit", "-1"); foreach ($data as $key => $datum) { foreach ($attributes as $index => $item) { if ($index === 0) $objSheet->setCellValue('A' . ($key + 2), $key + 1); //订单状态、备注需要特殊处理 if ($item === 'ORDER_STATUS') { $str = $datum->statusLabel->TYPE_NAME; } elseif ($item === 'CUSTOMER_MEMO') { $str = ''; if (!empty($datum->publicMemo)) { foreach ($datum->publicMemo as $memo) { $str .= $memo->COMMENT_TXT . ';'; } $str = substr($str, 0, -1); } } else { $str = $datum->$item; } $objSheet->setCellValue(chr(66 + $index) . ($key + 2), $str); } } //设置宽度 $objPHPExcel->setColumnSize(range('C', 'M'), [20, 40, 25, 12, 12, 10, 10, 12, 12, 10, 40]); $objPHPExcel->output(); } /** * 获取memcache中的订单列表,只要198和383状态的订单 * 返回memcache中对应酒店的缓存订单,查询过 1 次之后,置status为1 * @param $supplier_id integer */ public function actionMemList($supplier_id) { $mem = Yii::$app->cacheCS; $newOrder = $mem->get('hotel_newOrder'); if ($newOrder && count($newOrder) > 0) { if (isset($newOrder[$supplier_id])) { $tmp = $newOrder[$supplier_id]; foreach ($newOrder[$supplier_id] as &$order) { $order['status'] = in_array($order['type'], array(198, 383)) ? 1 : 0; } $mem->set('hotel_newOrder', $newOrder); return \GuzzleHttp\json_encode($tmp); } } return \GuzzleHttp\json_encode(array()); } /** * Finds the OrderMain model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. * @param integer $id * @return OrderMain the loaded model * @throws NotFoundHttpException if the model cannot be found */ protected function findModel($id) { if (($model = OrderMain::findOne(['ORDER_ID' => $id, 'CANCEL_FLAG' => 0])) !== null) { return $model; } else { throw new NotFoundHttpException('无效的订单号,请刷新页面后重试'); } } }