[ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['POST'], ], ], ]; } /** * Author:Steven * Desc:酒店订单列表 * @return string */ public function actionIndex() { $searchModel = new searchOrderMain(); $searchModel->date_from = date('Y-m-d', strtotime('-3 days')); $searchModel->date_to = date('Y-m-d'); $rs = $searchModel->search_list(Yii::$app->request->queryParams); $dataProvider = $rs['dataProvider']; $status_arr = $rs['status_arr']; $channel_status_arr = $rs['channel_status_arr']; $channel = BaseSupplier::find() ->select(['DISTINCT(a.ID)', 'a.SUPPLIER_NAME']) ->joinWith('baseSupplierSale as b', false) ->from('base_supplier as a') ->where(['and', ['=', 'b.PARENT_TYPE', 25], ['=', 'a.SUPPLIER_TYPE', 301], ['=', 'a.cancel_flag', 0], ['=', 'a.IS_DISABLED', 0], ['=', 'b.cancel_flag', 0], ['or', ['=', 'main_corp_id', Yii::$app->user->identity->MAIN_CORP_ID], ['=', 'main_corp_id', 0], ], ]) // -> createCommand() -> getRawSql(); ->asArray()->all(); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, 'status_arr' => $status_arr, 'channel_status_arr' => $channel_status_arr, 'model_list' => $channel, ]); } /** * Notes:接受渠道订单 * User: Steven * Date: 2018/1/19 * Time: 11:37 * @param $id * @param $status //渠道的订单状态 * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionReceiveChannel($id, $status) { $order = $this->findModel($id); if ($order->CHANNEL_ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_ACCEPT; $order->UPDATE_USER_ID = Yii::$app->user->id; if (!$order->receiveChannel()) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '接单失败']); } //这里需要判断是哪个渠道 //直连的订单,需要推送状态 if ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ali']['supplier_id']) { //阿里 Yii::$app->runAction('hotel/ali/confirm-order', ['tid' => $order->OUTSIDE_ORDER_NO, 'opt_type' => '2']); } 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' => $this->_developerList] ); } } } 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] );*/ } } return \GuzzleHttp\json_encode(['code' => 0]); } /** * Notes:拒绝渠道订单 * User: Steven * Date: 2018/1/19 * Time: 11:41 * @param $id * @param $status * @param $msg默认为满房 * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionRefuseChannel($id, $status, $msg = 101) { $order = $this->findModel($id); if ($order->CHANNEL_ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->UPDATE_USER_ID = Yii::$app->user->id; $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_REJECT; $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); if ($order->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_SEND) { //待发单 渠道状态:拒绝 订单状态:取消 $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL; $order->ORDER_VALID_STATUS = 0; if (!$order->refuseChannel(true)) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '拒单失败']); } } //待安排、已取消 elseif ($order->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_CONFIRM || $order->ORDER_STATUS == OrderMain::ORDER_STATUS_CANCEL) { if (!$order->refuseChannel(false)) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '拒单失败']); } } if ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ali']['supplier_id']) { //阿里 Yii::$app->runAction('hotel/ali/confirm-order', ['tid' => $order->OUTSIDE_ORDER_NO, 'opt_type' => '1']); } 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' => '',//酒店确认号 'OrderStatus' => CtripOrder::ORDER_STATUS_REFUSED,//订单状态 3:确认;4:拒绝 'InterFaceSendID' => $interFace->InterFaceSendID,//订单接口发送号 'ResultCode' => $msg, // 101:满房 103 价格错误 'Message' => CtripOrder::RETURN_MSG[$msg], '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' => $this->_developerList] ); } } } else { //微信商城 拒绝渠道订单 向微信发起订单取消 $res = Util::interfaceZzcx($order->ORDER_ID, 3);//如果不是需要通知微信的渠道订单,则不发送通知 if ($res['code'] != 0) { /*zOfficeWechat::sendMsg([ 'agentid' => zOfficeWechat::SEND_HOTEL, 'title' => '直连订单状态推送失败:', 'msg' => '接单失败【微信商城订单】:' . $order->ORDER_ID . ' ' . $res['info'], 'touser' => $this->_developerList, ] );*/ } } return \GuzzleHttp\json_encode(['code' => 0]); } /** * Notes:订单列表-确认订单 * User: Steven * Date: 2018/1/19 * Time: 11:43 * @param $id * @param $status * @param $msg * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionConfirm($id, $status, $msg) { $postMsg = Yii::$app->request->post("copyMsg"); $order = $this->findModel($id); $tmp_channel_status = $order->CHANNEL_ORDER_STATUS; if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CONFIRMED; if ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL) $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_ACCEPT; $order->ORDER_CONFIRM_CODE = $postMsg; $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) { zOfficeWechat::sendMsg([ 'agentid' => zOfficeWechat::SEND_HOTEL, 'title' => 'CS直连订单状态推送失败:', 'msg' => '渠道已取消订单:' . $order->ORDER_ID . "不能确认订单", 'touser' => $this->_developerList . $this->_messageList, ] ); return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '订单无法确认,请联系客服发取消单']); } if (!$order->confirm()) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '确认失败']); } elseif ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL) { //直连 //对接的订单,需要推送状态 if ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ali']['supplier_id'] && $tmp_channel_status == OrderMain::ORDER_CHANNEL_STATUS_WAITING) { //阿里 //这里㤇判断是否已经接单,如果没有接单的话,需要推送状态,如果接单了,相当于确认状态已经推送携程了,不能重复推送 Yii::$app->runAction('hotel/ali/confirm-order', ['tid' => $order->OUTSIDE_ORDER_NO, 'opt_type' => '2']); } 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 携程传 ]; $set = new SetService(); $setDes = $set->setOrderStatus($params); if ($setDes['flag'] == false) { zOfficeWechat::sendMsg([ 'agentid' => zOfficeWechat::SEND_HOTEL, 'title' => '直连订单状态推送失败:', 'msg' => '酒店已经确认了直连订单:' . $order->ORDER_ID . "\n但是直连状态推送失败,请手动接单。", 'touser' => $this->_developerList] ); } } } elseif ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['wx_hotel']['supplier_id']) { //微信商城 $res = Util::confirmHotelOrder($order->ORDER_ID); if (!$res) { 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 = new TopLogger(); $logger->log([date("Y-m-d H:i:s"), 'cs后台确认,清除缓存,订单号:' . $order->ORDER_ID . ',订单状态:' . $order->ORDER_STATUS . "\n" . PHP_EOL], 'ali/error'); return \GuzzleHttp\json_encode(['code' => 0]); } /** * Notes:发单到酒店 * User: Steven * Date: 2018/1/19 * Time: 11:44 * @param $id * @param $status * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionSendHotel($id, $status) { $order = $this->findModel($id); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->ORDER_STATUS = OrderMain::ORDER_STATUS_WAITING_CONFIRM; //变为待安排(待确认) $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->sendOrder()) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '发单失败']); } $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_WAITING_CONFIRM, $order->PROD_TOP_ORG_ID, $order->PROD_NAME); return \GuzzleHttp\json_encode(['code' => 0]); } /** * Notes:取消单 * User: Steven * Date: 2018/1/17 * Time: 18:32 * @param $id * @param $status * @param $msg * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionCancelOrder($id, $status, $msg) { $order = $this->findModel($id); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } //直连-渠道申请取消-订单待安排 $order->UPDATE_USER_ID = Yii::$app->user->id; $order->ORDER_VALID_STATUS = 0; $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); if ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL && //直连订单 ($order->CHANNEL_ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL || $order->CHANNEL_ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED) //渠道接单状态 申请取消 已同意取消 && ($order->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_CONFIRM || $order->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_SEND)) { //订单状态是待确认 待发单 $order->ORDER_LEVEL = OrderMain::ORDER_LEVEL_CANCEL; $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL; $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED; if (!$order->cancelOrder($msg)) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '取消失败']); } $order->resetMem(); } else { //非直连订单 if ($order->ORDER_STATUS != 313) { $order->ORDER_LEVEL = OrderMain::ORDER_LEVEL_CANCEL; } $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL; if (!$order->refuse($msg, 'cancel_order')) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '取消失败']); } if ($status == OrderMain::ORDER_STATUS_CHANGING) { $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_CANCEL_BEFORE_CONFIRM, $order->PROD_TOP_ORG_ID, $order->PROD_NAME); } else { $order->resetMem(); } } return \GuzzleHttp\json_encode(['code' => 0]); } /** * Notes:订单退改 * User: Steven * Date: 2018/1/19 * Time: 11:44 * @param $id * @param $status * @param $msg * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionBackChange($id, $status, $msg) { $order = $this->findModel($id); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CHANGING; $order->UPDATE_USER_ID = Yii::$app->user->id; if (!$order->backChange($msg)) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '退改失败']); } $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_WAITING_SEND, $order->PROD_TOP_ORG_ID, $order->PROD_NAME); return \GuzzleHttp\json_encode(['code' => 0]); } /** * Notes:向酒店供应商申请退单 * User: Steven * Date: 2018/1/19 * Time: 11:45 * @param $id * @param $status * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionCancelConfirming($id, $status) { $order = $this->findModel($id); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); $order->ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_WAITING_CONFIRM; $order->UPDATE_USER_ID = Yii::$app->user->id; if (!$order->cancelConfirming()) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '申请退单失败']); } $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_CANCEL_BEFORE_CONFIRM, $order->PROD_TOP_ORG_ID, $order->PROD_NAME); return \GuzzleHttp\json_encode(['code' => 0]); } /** * Notes:取消退改 * User: Steven * Date: 2018/1/19 * Time: 11:45 * @param $id * @param $status * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionCancelBackChange($id, $status) { $order = $this->findModel($id); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CONFIRMED; $order->UPDATE_USER_ID = Yii::$app->user->id; $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); if (!$order->cancelBackChange()) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '取消退改失败']); } // $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_CANCEL_BEFORE_CONFIRM, $order->PROD_TOP_ORG_ID, $order->PROD_NAME); $order->resetMem(); return \GuzzleHttp\json_encode(['code' => 0]); } /** * Notes:同意退单 * User: Steven * Date: 2018/1/18 * Time: 11:57 * @param $id * @param $status * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionAgreeCancel($id, $status) { $order = $this->findModel($id); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->ORDER_LEVEL = 2; $order->ORDER_VALID_STATUS = 0; $order->UPDATE_USER_ID = Yii::$app->user->id; $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); $flag = true; if ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL && $order->ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_WAITING_CONFIRM) { //待退单确认 $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED; $flag = false; } $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL; if (!$order->agreeCancel($flag, 'agree-cancel')) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '同意退单失败']); } $order->resetMem(); return \GuzzleHttp\json_encode(['code' => 0]); } /** * Notes:拒绝退单 * User: Steven * Date: 2018/1/18 * Time: 11:36 * @param $id * @param $status * @return string * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionRefuseCancel($id, $status) { $order = $this->findModel($id); if ($order->ORDER_STATUS != $status) { return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']); } $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CONFIRMED; $order->UPDATE_USER_ID = Yii::$app->user->id; $order->UPDATE_TIME = date('Y-m-d H:i:s', time()); if ($status == OrderMain::ORDER_TYPE_CHANNEL && $status == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_WAITING_CONFIRM) { //待退单确认 $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_REJECT; } if (!$order->refuseCancel()) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '拒绝退单失败']); } $order->resetMem(); return \GuzzleHttp\json_encode(['code' => 0]); } /** * Steven * 获取该供应商下所有的邮件信息 */ public function actionGetEmailInfo($supplier_id) { $emails = BaseSupplierLink::find()->select(['LINK_NAME', 'EMAIL'])->where(['SUPPLIER_ID' => $supplier_id, 'CANCEL_FLAG' => 0])->asArray()->all(); return \GuzzleHttp\json_encode(['code' => 0, 'data' => $emails]); } /** * Steven * 发送 邮件 */ public function actionSendEmail($id, $msg) { $order = $this->findModel($id); $filename = "【" . $order->ORDER_ID . "】" . $order->CUSTOMER_NAME . $order->PROD_START_STATION_DATE . ".doc"; $html = $order->wordHtml($order->ORDER_LEVEL); $mail = Yii::$app->mailer->compose(); /*$email = BaseSupplierLink::find()->select(['EMAIL'])->where(['SUPPLIER_ID' => $order->PROD_TOP_ORG_ID, 'CANCEL_FLAG' => 0])->asArray()->one(); if (empty($email)) { return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '邮件发送失败,供应商邮件未设置!']); }*/ $email_arr = explode(',', $msg); $mail->setTo($email_arr); // $mail->setTo('shifp@zhizhuchuxing.com'); $mail->setSubject($filename); $mail->attachContent($html, ['fileName' => $filename, 'contentType' => 'text/plain']); // $mail->setTextBody("酒店确认单:
订单号:{$order->ORDER_ID}
烦请尽快确认"); //发布纯文字文本 $mail->setHtmlBody("
酒店确认单:
订单号:{$order->ORDER_ID}
烦请尽快确认"); //发布可以带html标签的文本 if ($mail->send()) { $seq_id = ($order->RUN_BUS_SEAT_SEQ_ID) == -1 ? 1 : $order->RUN_BUS_SEAT_SEQ_ID + 1; OrderMain::updateAll(['RUN_BUS_SEAT_SEQ_ID' => $seq_id, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())], ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $order->ORDER_ID], ['PARENT_ORDER_ID' => $order->ORDER_ID]]]); $order->saveLog('send_email_success', false, $msg); return \GuzzleHttp\json_encode(['code' => 0, 'msg' => '邮件发送成功']); } else { OrderMain::updateAll(['RUN_BUS_SEAT_SEQ_ID' => -1, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())], ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $order->ORDER_ID], ['PARENT_ORDER_ID' => $order->ORDER_ID]]]); $order->saveLog('send_email_error', false, $msg); return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '邮件发送失败,请手动发邮件到酒店!']); } } /** * Author:Steven * Desc:酒店订单白名单处理 * @return string */ public function actionOrderWhiteList() { $exception = new OrderHtExceptionList(); if (Yii::$app->request->isPost) { $param = Yii::$app->request->post(); if ($exception->load($param) && $exception->save()) { // 保存操作日志 $order_model = OrderMain::findOne(['ORDER_ID' => $param['OrderHtExceptionList']['order_id'], 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0]); $order_model->saveLog('add_white_list', false, OrderHtExceptionList::WHITE_ARRAY[$param['OrderHtExceptionList']['status']]); return ''; } else { Yii::$app->session->setFlash('error', "添加失败!"); } } return $this->render('_order_whitelist', [ 'model' => $exception, ]); } /** * @Author wanglg * @Desc 获取订单备注信息,用于弹框显示 * @return string */ public function actionGetComment() { $request = Yii::$app->request->post(); $comment = new OrderComment(); $comment_list = $comment->getCommentList($request['order_id']); $data['comment_list'] = $comment_list; return json_encode($data); } /** * @Author wanglg * @Desc 修改确认号form框 * @return string */ public function actionUpdateConfirm() { $model = new OrderMain(['scenario' => 'upConfirm']); $request = Yii::$app->request->get(); return $this->render('_updateConfirmCode', [ 'model' => $model, 'hidden' => $request['param'], ]); } /** * @Author wanglg * @Desc 获取订单发票信息,用于弹框显示 * @return string */ public function actionGetInvoice() { $request = Yii::$app->request->post(); $model = new OrderInvoiceInfo(); $invoice_list = $model->getInvoiceInfo($request['order_id']); $invoice_list[0]['NeedInvoice'] = OrderInvoiceInfo::NEEDINVOICE[$invoice_list[0]['NeedInvoice']]; $invoice_list[0]['EarllyPrepare'] = OrderInvoiceInfo::EARLLYPREPARE[$invoice_list[0]['EarllyPrepare']]; $invoice_list[0]['PostType'] = OrderInvoiceInfo::POSTTYPE[$invoice_list[0]['PostType']]; $invoice_list[0]['InvoiceType'] = OrderInvoiceInfo::INVOICETYPE[$invoice_list[0]['InvoiceType']]; $invoice_list[0]['Status'] = OrderInvoiceInfo::ORDER_STATUS_DESC[$invoice_list[0]['Status']]; $data['invoice_list'] = $invoice_list; return json_encode($data); } /** * @Author wanglg * @Desc 录入订单发票信息页面 * @return bool|string */ public function actionAddInvoiceView() { if (empty(Yii::$app->request->get('order_id')) || empty(Yii::$app->request->get('channel_id'))) { return json_encode(array('code' => '1', 'msg' => '参数有误')); } $model = OrderInvoiceInfo::findOne(['OrderID' => Yii::$app->request->get('order_id')]); if (empty($model)) { // 用户选择发票类型,用于显示赋值 $type = Yii::$app->request->get('type') == 2 ? 2 : 1; $model = Yii::$app->request->get('type') == 2 ? new OrderInvoiceInfo(['scenario' => 'exclusive']) : new OrderInvoiceInfo(['scenario' => 'showInvoice']); $model->InvoiceType = $type; $model->ChannelId = Yii::$app->request->get('channel_id'); } else { $scenario = $model->InvoiceType == 1 ? 'addInvoice' : 'exclusive'; $model->scenario = $scenario; } return $this->render('_add_invoice', ['model' => $model, 'order_id' => Yii::$app->request->get('order_id')]); } /** * @Author wanglg * @Desc 录入发票操作 */ public function actionAddInvoice() { $request = Yii::$app->request->post(); $model = OrderInvoiceInfo::findOne(['OrderID' => $request['OrderInvoiceInfo']['OrderID']]); if (empty($model)) { $msg = '添加发票成功!'; $logDesc = '添加发票'; $model = new OrderInvoiceInfo(); $model->CreateUseId = Yii::$app->user->id; } else { $msg = '修改发票信息成功'; $logDesc = '修改发票'; } if ($model->load($request) && $model->validate()) { $model->Status = 1; if ($model->save()) { // 添加或修改发票信息成功 Yii::$app->session->setFlash('success', $msg); // 记录日志 $model->addInvoice($logDesc); return ''; } } Yii::$app->session->setFlash('error', "添加发票失败!"); return $this->renderPartial('_add_invoice', [ 'model' => $model, 'order_id' => $request['OrderInvoiceInfo']['OrderID'], ]); } /** * @Author wanglg * @Desc 申请开发票,修改发票信息状态 * @return string */ public function actionUpdateInvoiceStatus() { $order_id = Yii::$app->request->get('id'); $user_id = Yii::$app->user->id; if (empty($order_id)) { return json_encode(array('code' => 1, 'msg' => '申请参数不能为空')); } if (empty($user_id)) { return json_encode(array('code' => 1, 'msg' => '请重新登录再提交申请')); } $model = OrderInvoiceInfo::findOne(['OrderID' => $order_id, 'Status' => [1, 5]]); $user = BaseUser::findOne(['ID' => $user_id, 'CANCEL_FLAG' => 0]); if (empty($model)) { return json_encode(array('code' => 2, 'msg' => '当前发票不允许执行该操作')); } $model->Status = 2; $model->ApplyUser = $user_id; $model->CreateTime = date('Y-m-d H:i:s'); $update = $model->update(); if ($update) { // 记录开票日志 $model->applyInvoice(); zOfficeWechat::sendMsg([ 'agentid' => zOfficeWechat::SEND_HOTEL, 'title' => '【发票通知】您有一个新的发票任务等待开具:', 'msg' => "关联订单号:" . $order_id . "\n申请人:" . $user->TRUE_NAME . "\n申请时间:" . date('Y-m-d H:i:s') . "\n请至CS系统财务管理-发票管理进行操作", 'touser' => $this->_financeList, // 'touser' => $this->_private, ]); } $res = $update == 0 ? json_encode(array('code' => 3, 'msg' => '申请开票失败,请重新申请')) : json_encode(array('code' => 0, 'msg' => '申请开票成功')); return $res; } /** * @Author wanglg * @Desc 修改确认号 * @return string */ public function actionUpdateConfirmCode() { $request = Yii::$app->request->post(); $uid = Yii::$app->user->id; $order = $this->findModel($request['order_id']); $count = OrderMain::find() ->select(['count(*) as count'])->where(['ORDER_ID' => $request['order_id'], 'ORDER_STATUS' => $request['order_status'], 'CHANNEL_ORDER_STATUS' => $request['channel_order_status'], 'CANCEL_FLAG' => 0]) // -> createCommand() -> getRawSql(); ->asArray()->one(); if ($count['count'] == 0) { Yii::$app->session->setFlash('error', "订单状态已改变,请重新刷新页面"); return ''; } $res = OrderMain::updateAll(['ORDER_CONFIRM_CODE' => $request['OrderMain']['ORDER_CONFIRM_CODE'], 'UPDATE_USER_ID' => $uid, 'UPDATE_TIME' => date('Y-m-d H:i:s')], ['and', 'CANCEL_FLAG= 0', ['or', 'ORDER_ID=' . $request['order_id'], 'PARENT_ORDER_ID=' . $request['order_id']]]); !$res ? Yii::$app->session->setFlash('error', "修改确认号失败!") : Yii::$app->session->setFlash('success', "修改确认号成功!"); if ($res) { $order->saveLog('update_confirm', false, $request['OrderMain']['ORDER_CONFIRM_CODE']); return ''; } } /** * @Author wanglg * @Desc 获取订单详情 * @param $id * @return string */ public function actionOrderDetail($id) { $request = Yii::$app->request->post(); $model = new OrderMain(); $supplier = new \backend\modules\api\models\BaseSupplier(); $channel_list = $supplier->getChannelList(); $data = $model->orderDetail($id); $order_log_model = new OperaHotelLog(); $order_logs = $order_log_model->getOrderLog($id); $main_order = array(); // 加载库存,通过pjax实现 if (Yii::$app->request->isAjax) { $request = Yii::$app->request->get(); // 查询库存信息 $orderModel = new CommonOrder(['scenario' => 'Product']); if ($orderModel->load($request, '') && $orderModel->validate()) { $data['hotel_child_order_detail'] = $orderModel->getHotelStock(); } } foreach ($data['data'] as $order) { if ($order['PARENT_ORDER_ID'] == 0) { $main_order = $order; } } return $this->render('orderDetail', [ 'model' => $model, 'channel_list' => $channel_list, 'data' => $data, 'child_order' => $data['hotel_child_order_detail'], 'main_order' => $main_order, 'log' => $order_logs, ]); } /** * @Author wanglg * @Desc 修改入住需求 * @return string */ public function actionUpdateCheckIn() { $param = Yii::$app->request->post(); $avail_data = array( 'HotelID' => $param['hotel_id'], 'RoomID' => $param['room_id'], 'RoomNum' => $param['room_count'], 'CheckIn' => $param['start_date'], 'CheckOut' => $param['end_date'], 'DistribID' => $param['org_id'], 'CreateUserID' => $param['user_id'], 'RoomPrices' => 0, 'IfCheckPrice' => false, ); $newOrder = new CommonOrder(['scenario' => 'CheckRoomAvail']); if (!$newOrder->load($avail_data, '') || !$newOrder->validate()) { $error = array_values($newOrder->getFirstErrors()); return json_encode(['code' => 1, 'info' => $error[0]]); } $is_avail = $newOrder->checkRoomAvail(); if ($is_avail['code'] != 0) { return json_encode(['code' => 2, 'info' => $is_avail['info']]); } $room_price = array(); foreach ($is_avail['data']['room_price'] as $k => $room) { $room_price[] = array('RunDate' => $room['run_date'], 'Price' => $room['price']); } // 客人信息 $uncus_names = explode(' ', $param['customer_name']); $all_cus_name = array_values(array_filter($uncus_names)); $split_customer = array_map("self::customer", $all_cus_name); $make_order_arr = array( 'CreateUserID' => Yii::$app->user->id, 'ZZ_ORDER_ID' => $param['order_id'], //蜘蛛订单号 'OrderID' => $param['org_num'], //渠道订单号 'HotelID' => $param['hotel_id'], //酒店ID 'RoomID' => $param['room_id'], //房型ID 'DistribID' => $param['org_id'],//渠道ID 'RoomNum' => $param['room_count'], //房间数量 'CheckIn' => $param['start_date'], //入住日期 'CheckOut' => $param['end_date'], //离店日期, 'TotalPrice' => $is_avail['data']['total_price'],//订单总价 'Currency' => 'RMB', //币种 'ContactName' => $param['customer_name'],//联系人姓名 'ContactTel' => $param['customer_mobile'], //联系人电话 'OrderGuests' => $split_customer, //入住人信息 'Comment' => $param['customer_memo'], //客人备注 'NeedInvoice' => 0, 'InvoiceInfos' => array(), 'RoomPrices' => $room_price, ); $newUpdateOrder = new CommonOrder(['scenario' => 'UpdateHotelOrder']); if ($newUpdateOrder->load($make_order_arr, '')) { $res = $newUpdateOrder->updateHotelOrder(); return json_encode($res); } else { $error = array_values($newOrder->getFirstErrors()); return json_encode(['code' => 3, 'info' => $error[0]]); } } /** * @Author wanglg * @Desc 客人信息处理 * @param $item * @return array */ public static function customer($item) { return array('Name' => $item); } /** * @Author wanglg * @Desc 修改订单客户信息 * @return string */ public function actionUpdateCustomer() { $request = Yii::$app->request->post(); // $main_order = OrderMain::findOne(['ORDER_ID' => $request['OrderMain']['ORDER_ID'], 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN]); $main_order = OrderMain::find() ->select(['order_main.*', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE']) ->joinWith('operaHotelRoom') ->from('order_main') ->where(['ORDER_ID' => $request['OrderMain']['ORDER_ID'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN]) ->asArray()->one(); if (in_array($main_order['ORDER_STATUS'], array(198, 382))) { $update_res = OrderMain::updateAll(['CUSTOMER_NAME' => $request['OrderMain']['CUSTOMER_NAME'], 'CUSTOMER_MOBILE' => $request['OrderMain']['CUSTOMER_MOBILE'], 'UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1], ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $request['OrderMain']['ORDER_ID'], 'PARENT_ORDER_ID=' . $request['OrderMain']['ORDER_ID']]]); } else { $update_res = OrderMain::updateAll(['CUSTOMER_NAME' => $request['OrderMain']['CUSTOMER_NAME'], 'CUSTOMER_MOBILE' => $request['OrderMain']['CUSTOMER_MOBILE'], 'UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s')], ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $request['OrderMain']['ORDER_ID'], 'PARENT_ORDER_ID=' . $request['OrderMain']['ORDER_ID']]]); } // 修改成功则添加日志记录 if ($update_res) { $log_desc = "修改客人信息:修改客人信息【{$main_order['CUSTOMER_NAME']}】为【{$request['OrderMain']['CUSTOMER_NAME']}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $main_order['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['OrderMain']['ORDER_ID']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录日志失败!'); } } } empty($update_res) ? Yii::$app->session->setFlash('error', '修改客人信息失败') : Yii::$app->session->setFlash('success', '修改客人信息成功'); return $this->redirect(['/hotel/ordermain/order-detail', 'id' => $request['OrderMain']['ORDER_ID']]); } /** * @Author wanglg * @Desc 添加备注 * @return */ public function actionComment() { $request = Yii::$app->request->get(); if (empty($request['comment_txt'])) { return false; } // 查询主订单 $main_order = OrderMain::find() ->select(['order_main.*', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE']) ->joinWith('operaHotelRoom') ->from('order_main') ->where(['ORDER_ID' => $request['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN]) ->asArray()->one(); $comment_arr = array('ORDER_ID' => $request['order_id'], 'COMMENT_TYPE' => $request['comment_type'], 'COMMENT_TXT' => $request['comment_txt'], 'CANCEL_FLAG' => 0, 'CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => 0, 'UPDATE_TIME' => '0'); if ($request['comment_type'] == 1 && in_array($main_order['ORDER_STATUS'], array(198, 382))) { OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1], ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $request['order_id'], 'PARENT_ORDER_ID=' . $request['order_id']]]); } $comment = new OrderComment(); if ($comment->load($comment_arr, '') && $comment->validate()) { if (!$comment->save()) { Yii::$app->session->setFlash('error', '添加备注失败'); } else { Yii::$app->session->setFlash('success', '添加备注成功'); } } $log_type = $request['comment_type'] == 0 ? '内部备注' : '公共备注'; // 保存添加备注日志 $log_desc = "添加备注:【{$log_type}】 【{$request['comment_txt']}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $main_order['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['order_id']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录日志失败!'); } } return $this->redirect(['/hotel/ordermain/order-detail', 'id' => $request['order_id']]); } /** * @Author wanglg * @Desc 删除备注 * @return int|\yii\web\Response */ public function actionDelComment() { $request = Yii::$app->request->get(); $order = OrderComment::findOne($request['comment_id']); $order->CANCEL_FLAG = 1; $order->UPDATE_USER_ID = Yii::$app->user->id; $order->UPDATE_TIME = date('Y-m-d H:i:s'); $main_order = OrderMain::find() ->select(['order_main.*', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE']) ->joinWith('operaHotelRoom') ->from('order_main') ->where(['ORDER_ID' => $request['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN]) ->asArray()->one(); // 如果是公共备注生成修改单 if ($order->COMMENT_TYPE == 1 && in_array($main_order['ORDER_STATUS'], array(198, 382))) { OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1], ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $order->ORDER_ID, 'PARENT_ORDER_ID=' . $order->ORDER_ID]]); } if (!$order->update()) { Yii::$app->session->setFlash('error', '删除失败'); } else { Yii::$app->session->setFlash('success', '删除成功'); } $log_type = $request['comment_type'] == 0 ? '内部备注' : '公共备注'; // 保存添加备注日志 $log_desc = "删除备注:【{$log_type}】 【{$order['COMMENT_TXT']}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $main_order['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['order_id']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录日志失败!'); } } return $this->redirect(['/hotel/ordermain/order-detail', 'id' => $request['order_id']]); } /** * @Author wanglg * @Desc修改采购价 * @return string */ public function actionUpdatePurchasePrice() { $request = Yii::$app->request->post(); $order_main = OrderMain::findOne(['ORDER_ID' => $request['order_id'], 'CANCEL_FLAG' => 0]); $data = json_decode($request['data'], true); $transa = Yii::$app->db->beginTransaction(); try { if (in_array($order_main['ORDER_STATUS'], array(198, 382))) // 待确认 - 退改中的订单需要生成修改单 { OrderMain::updateAll(['ORDER_LEVEL' => 1], "CANCEL_FLAG=0 and ORDER_VALID_STATUS=1 and (ORDER_ID={$request['order_id']} or PARENT_ORDER_ID={$request['order_id']})"); } foreach ($data as $key => $day) { // 查询订单入住该天的订单信息 $sel_old_info = OrderMain::find() ->select(['a.BASE_PRICE', 'a.ORDER_PRICE', 'a.TOTAL_COMMISSION', 'a.ORDER_STATUS', 'a.OUTSIDE_SALE_ORG_ID', 'b.HOTEL_ID', 'b.PARENT_ROOM_TYPE', 'b.ROOM_TYPE']) ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID AND b.ROOM_TYPE=a.PROD_ID and b.CANCEL_FLAG=0') ->from('order_main a') ->where(['a.PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'a.CANCEL_FLAG' => 0, 'a.ORDER_VALID_STATUS' => 1]) // -> createCommand()->getRawSql(); ->asArray()->one(); if ($sel_old_info['BASE_PRICE'] == $day['base_price']) continue; //如果当天价格相等则不进行修改 if (!$sel_old_info) { throw new \Exception('修改采购价 -- 未找到相关信息'); } // 只有待发单-待安排-退改中状态的订单允许进行修改 if (!in_array($sel_old_info['ORDER_STATUS'], array('313', '198', '382'))) { throw new \Exception('事务异常-目前只有待发单-待安排-退改中状态的订单允许进行修改'); } // 修改子订单采购价 $update_order = OrderMain::updateAll(['BASE_PRICE' => $day['base_price'], 'PROFIT_VALUE' => $sel_old_info['ORDER_PRICE'] - $sel_old_info['TOTAL_COMMISSION'] - $day['base_price'], 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => Yii::$app->user->id], ['ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date']]); if (!$update_order) { throw new \Exception('修改子订单成本价失败'); } // 保存操作日志 $log_desc = "修改采购价:修改【{$day['run_date']}】采购价【{$sel_old_info['BASE_PRICE']}】为【{$day['base_price']}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $sel_old_info['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $sel_old_info['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $sel_old_info['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['order_id']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录修改日志失败!'); } } } /** 修改主订单信息**/ // 计算子订单的成本和利润之和 $sum_orders = OrderMain::find()->select(['SUM(BASE_PRICE) as sum_base_price', 'SUM(PROFIT_VALUE) AS sum_profit_value']) ->where(['PARENT_ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0])->asArray()->one(); if (empty($sum_orders)) { throw new \Exception('修改采购价 -- 未找到子订单信息'); } // 修改主订单 $update_parent_order = OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'BASE_PRICE' => $sum_orders['sum_base_price'], 'PROFIT_VALUE' => $sum_orders['sum_profit_value']], ['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]); if (!$update_parent_order) { throw new \Exception('修改采购价 -- 修改主订单信息失败'); } $transa->commit(); // 渠道预付款处理,修改采购价 $comm_model = new CommonOrder(); $update_res = $comm_model->previousBalance(CommonOrder::UPDATE_ORDER_DEDUCTION_TYPE, $request['order_id']); if ($update_res['code'] != 0) { // 通知处理 $this->sendAliMsgToRtx('预付款处理失败', '关联订单:' . "{$request['order_id']}\n" . '修改采购价:' . $update_res['msg'], $this->_developerList); } } catch (\Exception $e) { $transa->rollBack(); return json_encode(array('code' => 1, 'info' => $e->getMessage())); } return json_encode(array('code' => 0, 'info' => '修改成功', 'order_id' => $request['order_id'])); } /** * Author:Steven * Desc:直连失败订单处理 * @return string */ public function actionExceptionOrder() { $flag = false; $orderChannelInfo = new OrderChannelInfo(['scenario' => 'error_order']); $data['orderChannelInfo'] = $orderChannelInfo; if (Yii::$app->request->post()) { $param = Yii::$app->request->post('OrderChannelInfo'); $outside_order_id = trim($param['channel_order_id']); $order_id = trim($param['ORDER_ID']); $order_main = OrderMain::find() ->leftJoin('opera_hotel_room', 'order_main.PARENT_PROD_ID=opera_hotel_room.HOTEL_ID and order_main.PROD_ID=opera_hotel_room.ROOM_TYPE and opera_hotel_room.CANCEL_FLAG=0') ->select(['outside_sale_org_id', 'PARENT_PROD_ID', 'PROD_ID', 'opera_hotel_room.PARENT_ROOM_TYPE'])->where([ 'ORDER_ID' => $order_id, 'PARENT_ORDER_ID' => 0, 'order_main.CANCEL_FLAG' => 0, 'OUTSIDE_ORDER_NO' => "{$outside_order_id}", ])->asArray()->one(); if (empty($order_main)) { return ''; } if ($order_main['outside_sale_org_id'] == Yii::$app->params['ctrip']['supplier_id']) { $effect_count = OrderChannelInfo::updateAll([ 'ORDER_ID' => $order_id, ], "CANCEL_FLAG=0 and channel_order_id=$outside_order_id"); } elseif ($order_main['outside_sale_org_id'] == Yii::$app->params['ali']['supplier_id']) { //这里需要查询ali_order的支付宝流水号 $ali_order = AliOrder::find() ->select(['AlipayTradeNo']) ->where(['TaoBaoOrderId' => $outside_order_id]) ->asArray()->one(); if (!empty($ali_order)) { $orderLog = new OperaHotelLog(); $orderLog->CREATE_USER_ID = Yii::$app->params['ali']['base_user_id']; $orderLog->HOTEL_ID = $order_main['PARENT_PROD_ID']; $orderLog->LOG_TYPE = OperaHotelLog::LOG_TYPE_ORDER; $orderLog->ROOM_TYPE = $order_main['PROD_ID']; $orderLog->PARENT_ROOM_TYPE = $order_main['PARENT_ROOM_TYPE']; $orderLog->LOG_DESC = "支付订单,支付宝流水号:" . $ali_order['AlipayTradeNo']; $orderLog->ORDER_ID = $order_id; } } $count = OrderMain::updateAll([ 'DOCKING_TYPE' => 556, 'CHANNEL_ORDER_STATUS' => 550, ], "ORDER_ID=$order_id or PARENT_ORDER_ID=$order_id"); $flag = true; // 记录日志 if ($count) { $model = OrderMain::findOne(['CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_ID' => $order_id, 'ORDER_LEVEL' => [0, 1], 'ORDER_STATUS' => [147, 198, 313, 314], 'ORDER_VALID_STATUS' => 1]); $model->saveLog('exception-order'); } return ''; } $data['flag'] = $flag; return $this->render('_exception_order', ['data' => $data]); } /** * @Author wanglg * @Desc 修改销售价 */ public function actionUpdateSalePrice() { $request = Yii::$app->request->post(); // 首先判断订单是否是直连订单,直连订单不允许修改销售价 $main_order = OrderMain::findOne(['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]); if ($main_order['DOCKING_TYPE'] == 556) // 556 直连 557 录单 { return ['code' => 1, 'msg' => '直连订单不允许修改销售价']; } $data = json_decode($request['data'], true); $transa = Yii::$app->db->beginTransaction(); try { foreach ($data as $key => $day) { // 查询订单入住该天的订单信息 $sel_old_info = OrderMain::find() ->select(['a.ORDER_PRICE', 'a.OUTSIDE_SALE_ORG_ID', 'a.BASE_PRICE', 'b.HOTEL_ID', 'b.PARENT_ROOM_TYPE', 'b.ROOM_TYPE']) ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID AND b.ROOM_TYPE=a.PROD_ID and b.CANCEL_FLAG=0') ->from('order_main a') ->where(['a.PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'a.CANCEL_FLAG' => 0, 'a.ORDER_VALID_STATUS' => 1]) // -> createCommand()->getRawSql(); ->asArray()->one(); if (!$sel_old_info) throw new \Exception('修改销售价 -- 未找到相关信息'); if ($sel_old_info['ORDER_PRICE'] == $day['sale_price']) continue; //如果当天价格相等则不进行修改 // 渠道佣金规则 $commission_role = BaseSupplier::find() ->select(['b.BACK_COMMISION_METHOD', "b.BACK_PERCENT", "b.BACK_VALUE"]) ->innerJoin('base_supplier_sale as b', 'a.ID=b.SUPPLIER_ID AND b.PARENT_TYPE=25 and b.CANCEL_FLAG=0') ->from('base_supplier as a') ->where(['a.id' => $sel_old_info['OUTSIDE_SALE_ORG_ID'], 'a.CANCEL_FLAG' => 0, 'a.IS_DISABLED' => 0])->asArray()->one(); //更改销售价和利润 //修改销售单价的时候,渠道佣金也要根据当前设置佣金规则设置新的佣金金额 $commission_sql = empty($commission_role['BACK_COMMISION_METHOD']) ? 0 : ($commission_role['BACK_COMMISION_METHOD'] == 308 ? number_format($day['sale_price'] * $commission_role['BACK_PERCENT'] / 100, 2) : $commission_role['BACK_VALUE']); $profit = $day['sale_price'] - $sel_old_info['BASE_PRICE'] - $commission_sql; $update_orders = OrderMain::updateAll(['UPDATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => Yii::$app->user->id, 'ORDER_PRICE' => $day['sale_price'], 'TOTAL_COMMISSION' => $commission_sql, 'PROFIT_VALUE' => $profit], ['PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'CANCEL_FLAG' => 0, 'ORDER_VALID_STATUS' => 1]); if (!$update_orders) { throw new \Exception('修改子订单成本价失败'); } // 保存操作日志 $log_desc = "修改销售价:修改【{$day['run_date']}】销售价【{$sel_old_info['ORDER_PRICE']}】为【{$day['sale_price']}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $sel_old_info['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $sel_old_info['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $sel_old_info['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['order_id']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录修改日志失败!'); } } } // 修改主订单信息 // 计算子订单的成本和利润之和 $sum_orders = OrderMain::find() ->select(['SUM(ORDER_PRICE) as sum_order_price', 'SUM(TOTAL_COMMISSION) as sum_total_commission', 'SUM(PROFIT_VALUE) AS sum_profit_value']) ->where(['PARENT_ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0])->asArray()->one(); if (empty($sum_orders)) { throw new \Exception('修改销售价--未找到子订单信息'); } // 修改主订单 $update_parent_order = OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_PRICE' => $sum_orders['sum_order_price'], 'PROFIT_VALUE' => $sum_orders['sum_profit_value'], 'TOTAL_COMMISSION' => $sum_orders['sum_total_commission']], ['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]); if (!$update_parent_order) { throw new \Exception('修改销售价--修改主订单信息失败'); } $transa->commit(); // 渠道预付款处理,修改采购价 $comm_model = new CommonOrder(); $update_res = $comm_model->previousBalance(CommonOrder::UPDATE_ORDER_DEDUCTION_TYPE, $request['order_id']); if ($update_res['code'] != 0) { $this->sendAliMsgToRtx('预付款处理失败', '关联订单:' . "{$request['order_id']}\n" . '修改销售价:' . $update_res['msg'], $this->_developerList); } } catch (\Exception $e) { $transa->rollBack(); return json_encode(array('code' => 1, 'info' => $e->getMessage())); } return json_encode(array('code' => 0, 'info' => '修改成功')); } /** * Displays a single OrderMain model. * @param integer $id * @return mixed */ public function actionView($id) { $request = Yii::$app->request->get(); return $this->render('view', [ 'model' => $this->findModel($id), ]); } /** * Creates a new OrderMain model. * If creation is successful, the browser will be redirected to the 'view' page. * @return mixed */ public function actionCreate() { $model = new OrderMain(); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->ID]); } else { return $this->render('create', [ 'model' => $model, ]); } } /** * Updates an existing OrderMain model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id * @return mixed */ public function actionUpdate($id) { $model = $this->findModel($id); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->ID]); } else { return $this->render('update', [ 'model' => $model, ]); } } /** * Deletes an existing OrderMain model. * If deletion is successful, the browser will be redirected to the 'index' page. * @param integer $id * @return mixed */ public function actionDelete($id) { $this->findModel($id)->delete(); return $this->redirect(['index']); } /** * 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($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } } /** * CS调用订单是否可下 * * @param $hotel integer * @param $room integer * @param $channel integer * @param $date string 日期 用,分隔 * @param $count string 日期对应的数量 用,分隔 * * @author wangxj */ public function actionCheckAvailable($hotel, $room, $channel, $date, $count) { $date_array = explode(',', $date); $count_array = explode(',', $count); if (count($date_array) === count($count_array)) { $result = ['flag' => 'true', 'message' => []]; $data = [ 'PROD_ID' => $room, 'PARENT_PROD_ID' => $hotel, 'OUTSIDE_SALE_ORG_ID' => $channel, ]; foreach ($date_array as $key => $item) { $tmp_order = new OrderMain(); $tmp_order->load($data + ['RUN_DATE' => $item, 'room_count' => $count_array[$key]], ''); $tmp_order->orderAvailable(); if ($tmp_order->hasErrors()) { $result['flag'] = 'false'; $result['message'][] = $tmp_order->getErrorMsg(); } } $result['message'] = array_unique($result['message']); \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; return $result; } else { throw new HttpException('400', '数据不匹配,无法操作'); } } /** * @Author wanglg * @Desc获取房型库存价格列表 * @return array */ public function actionGetPriceList() { /*$param = [ 'RoomNum' => 2, 'RoomID' => 2474, 'DistribID' => 669, 'CheckIn' => '2018-01-18', 'CheckOut' => '2018-01-21', ];*/ $request = Yii::$app->request->post(); if (empty($request['RoomNum'])) { return json_encode(array('code' => 1, 'info' => '缺少必要参数')); } $orderModel = new CommonOrder(['scenario' => 'Product']); if ($orderModel->load($request, '') && $orderModel->validate()) { $price_res = $orderModel->getHotelStock(); // return json_encode($price_res); return json_encode(array('code' => 0, 'info' => '获取成功', 'data' => $price_res)); } else { $error = array_values($orderModel->getFirstErrors()); return json_encode(array('code' => 1, 'info' => implode('|', $error))); } } /** * @Author wanglg * @Desc 导出订单信息 */ public function actionExport() { set_time_limit(0); ini_set("memory_limit", "-1"); $obj = new searchOrderMain(); $obj->date_from = date('Y-m-d', strtotime('-3 days')); $obj->date_to = date('Y-m-d'); $search = Yii::$app->request->queryParams; $dataProvider = $obj->exportList($search); $data = $dataProvider->getModels(); $date_type = $search['searchOrderMain']['date_type'] == 1 ? '预订日期' : (($search['searchOrderMain']['date_type'] == 2) ? '入住日期' : '离店日期'); $objPHPExcel = new zPhpExcel(); //实例化PHPExcel类 $cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; if (!\PHPExcel_Settings::setCacheStorageMethod($cacheMethod)) { die($cacheMethod . " 缓存方法不可用" . EOL); } $objSheet = $objPHPExcel->getActiveSheet(); //获取当前活动sheet的操作对象 $objSheet->setTitle('User'); $objPHPExcel->file_name = '订单信息' . date('Y-m-d H_i_s') . '_' . $date_type; // 定义要需要导出的字段 $order_sort = ['ORDER_ID', 'PARENT_PROD_NAME', 'PROD_NAME', 'CREATE_TIME', 'CREATE_USER_NAME', 'PROD_SUPPLY_ORG_NAME', 'PROD_START_STATION_DATE', 'PROD_END_STATION_DATE', 'room_count', 'ORDER_CONFIRM_CODE', 'CUSTOMER_NAME', 'CUSTOMER_MOBILE', 'SUPPLIER_NAME', 'OUTSIDE_ORDER_NO', 'ORDER_PRICE', 'BASE_PRICE', 'TOTAL_COMMISSION', 'PROFIT_VALUE', 'PAY_WAY', 'ORDER_STATUS', 'CUSTOMER_MEMO', 'SALES_NAME', 'PRINCIPAL', 'ORDER_TITLE_ID']; //设置表头 $a_k = range('A', 'X'); foreach ($a_k as $key => $item) { $objSheet->setCellValue($item . '1', $obj->getAttributeLabel($order_sort[$key])); } foreach ($data as $key => $datum) { foreach ($a_k as $index => $item) { if ($item == 'M') $objSheet->setCellValue($item . ($key + 2), $datum->baseChannel->SUPPLIER_NAME); elseif ($item == 'E') // 操作人, 客服 $objSheet->setCellValue($item . ($key + 2), $datum->user->TRUE_NAME); elseif ($item == 'I') // 间夜数 $objSheet->setCellValue($item . ($key + 2), $datum['room_count']); elseif ($item == 'V') // 采购负责人 $objSheet->setCellValue($item . ($key + 2), $datum->salesMan->TRUE_NAME); elseif ($item == 'W') // 运营负责人 $objSheet->setCellValue($item . ($key + 2), $datum->principalMan->TRUE_NAME); elseif ($item == 'S') // 支付方式 $objSheet->setCellValue($item . ($key + 2), $datum->baseChannel->settleType->TYPE_NAME); elseif ($item == 'T') // 订单状态 $objSheet->setCellValue($item . ($key + 2), $datum->statusLabel->TYPE_NAME); elseif ($item == 'X') // 组合单 { $group = ($datum->ORDER_TITLE_ID == 0) ? '否' : '是(组合订单号:' . $datum->ORDER_TITLE_ID . ')'; $objSheet->setCellValue($item . ($key + 2), $group); } else $objSheet->setCellValue($item . ($key + 2), $datum->$order_sort[$index]); } } //设置宽度 $objPHPExcel->setColumnSize(range('B', 'X'), [25, 30, 25, 10, 25, 20, 20, 10, 15, 15, 15, 20, 20, 10, 10, 10, 10, 10, 15, 20, 15, 15, 25]); $objPHPExcel->output(); } /** * @Author wanglg * @Desc 导出订单格式CSV */ public function actionExportCsv() { set_time_limit(0); ini_set("memory_limit", "-1"); $obj = new searchOrderMain(); $obj->date_from = date('Y-m-d', strtotime('-3 days')); $obj->date_to = date('Y-m-d'); $search = Yii::$app->request->queryParams; $dataProvider = $obj->exportList($search); $data = $dataProvider->getModels(); $date_type = $search['searchOrderMain']['date_type'] == 1 ? '预订日期' : (($search['searchOrderMain']['date_type'] == 2) ? '入住日期' : '离店日期'); $file_name = '订单信息 时间范围 ' . $search['searchOrderMain']['date_from'] . '~' . $search['searchOrderMain']['date_to'] . '_' . date('Y-m-d H_i_s') . '_' . $date_type; // 输出Excel文件头,可把user.csv换成你要的文件名 header('Content-Type: application/vnd.ms-excel;charset=UTF-8'); header('Content-Disposition: attachment;filename="' . $file_name . '.csv"'); header('Cache-Control: max-age=0'); $fp = fopen('php://output', 'a'); $order_sort = ['订单编号', '酒店名称', '预订产品', '预定时间', '预订人', '供应商', '入住时间', '离店时间', '间夜数', '确认号', '客人姓名', '联系电话', '渠道商', '渠道商订单号', '订单金额', '成本金额', '渠道佣金', '利润', '支付方式', '订单状态', '备注', '采购负责人', '运营负责人', '是否是组合订单']; $attrs = ['ORDER_ID', 'PARENT_PROD_NAME', 'PROD_NAME', 'CREATE_TIME', 'CREATE_USER_NAME', 'PROD_SUPPLY_ORG_NAME', 'PROD_START_STATION_DATE', 'PROD_END_STATION_DATE', 'room_count', 'ORDER_CONFIRM_CODE', 'CUSTOMER_NAME', 'CUSTOMER_MOBILE', 'SUPPLIER_NAME', 'OUTSIDE_ORDER_NO', 'ORDER_PRICE', 'BASE_PRICE', 'TOTAL_COMMISSION', 'PROFIT_VALUE', 'PAY_WAY', 'ORDER_STATUS', 'CUSTOMER_MEMO', 'SALES_NAME', 'PRINCIPAL', 'ORDER_TITLE_ID']; foreach ($order_sort as $key => $item) { $order_sort[$key] = iconv('utf-8', 'GB18030', $item); } fputcsv($fp, $order_sort); $data_count = count($data); $num = 0; // 订单下标 while ($num < $data_count) { $put_data = array(); foreach ($attrs as $k => $attr) { if ($attr == 'CREATE_USER_NAME') { $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->user->TRUE_NAME); } elseif ($attr == 'SUPPLIER_NAME') { $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->baseChannel->SUPPLIER_NAME); } elseif ($attr == 'room_count') // 间夜数 { $put_data[] = iconv('utf-8', 'GB18030', $data[$num]['room_count']); } elseif ($attr == 'SALES_NAME') // 采购负责人 { $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->salesMan->TRUE_NAME); } elseif ($attr == 'PRINCIPAL') // 运营负责人 { $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->principalMan->TRUE_NAME); } elseif ($attr == 'PAY_WAY') { $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->baseChannel->settleType->TYPE_NAME); } elseif ($attr == 'ORDER_STATUS') // 订单状态 { $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->statusLabel->TYPE_NAME); } elseif ($attr == 'ORDER_TITLE_ID') // 组合单 { $group = ($data[$num]->ORDER_TITLE_ID == 0) ? '否' : '是(组合订单号:' . $data[$num]->ORDER_TITLE_ID . ')'; $put_data[] = iconv('utf-8', 'GB18030', $group); } elseif ($attr == 'ORDER_PRICE' || $attr == 'PROD_START_STATION_DATE' || $attr == 'PROD_END_STATION_DATE' || $attr == 'BASE_PRICE' || $attr == 'room_count' || $attr == 'TOTAL_COMMISSION' || $attr == 'PROFIT_VALUE') // 组合单 { $put_data[] = (string)iconv('utf-8', 'GB18030', $data[$num]->$attr); } else { $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->$attr . "\t"); } } fputcsv($fp, $put_data); if (is_int($num / 5000)) { ob_flush(); flush(); } $num++; } exit(); } /** * @Author wanglg * @Desc 添加备注信息 * @param $order_id * @param $comment_type * @param $comment_txt * @return bool|string */ public function actionAddcomment($order_id, $comment_type, $comment_txt) { $comment_arr = array('ORDER_ID' => $order_id, 'COMMENT_TYPE' => $comment_type, 'COMMENT_TXT' => $comment_txt, 'CANCEL_FLAG' => 0, 'CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => 0, 'UPDATE_TIME' => '0'); $comment = new OrderComment(); if ($comment->load($comment_arr, '') && $comment->validate()) { if (!$comment->save()) { return false; } } $data['order_comment'] = OrderComment::find() ->joinWith('user') ->where(['ORDER_ID' => $order_id, 'COMMENT_TYPE' => [0, 1], 'order_comment.CANCEL_FLAG' => 0])->asArray()->all(); return $this->render('order_detail', ['data' => $data]); } /** * @Author wanglg * @Desc 订单详情页 * @return string */ public function actionDetail() { $id = Yii::$app->request->get('id'); $model = new OrderMain(); $model->setScenario('csBook'); $comment_model = new OrderComment(); $common_order = new CommonOrder(); $stock_arr[1] = ['stock_id' => 0, 'stock_count' => 0]; $order_log_model = new OperaHotelLog(); if (Yii::$app->request->isAjax) { $request = Yii::$app->request->get(); //订单详情操作:读取和修改 // 备注添加 if ($request['deal_type'] == 1) { $model->comment($request); } // 删除备注 if ($request['deal_type'] == 2) { $model->delComment($request); } // 修改客人信息 if ($request['deal_type'] == 3) { $model->updateCustomer($request); } // 修改入住需求 if ($request['deal_type'] == 6) { $model->updateCheckIn($request); } // 修改销售价 if ($request['deal_type'] == 7) { $this->actionUpdateOrderPrice($id, $request); } // 修改采购价 if ($request['deal_type'] == 8) { $this->actionUpdateBasePrice($id, $request); } // 获取订单详情信息 $data = $model->orderDetail($id); // 获取价格信息 if ($request['deal_type'] == 5) { $common_order->setScenario('Product'); $stock_res = $common_order->getOrderRoomNum($id, $request); $stock_arr = empty($stock_res) ? $stock_arr : $stock_res; $load_html = $model->getStockPriceList($request); $data['hotel_child_order_detail'] = $load_html; if (!empty($load_html)) { $main_order['ORDER_PRICE'] = array_sum(array_column($load_html, 'ALL_PRICE')); $main_order['TOTAL_MID_PRICE'] = array_sum(array_column($load_html, 'MID_PRICE')); $main_order['TOTAL_COMMISSION'] = array_sum(array_column($load_html, 'TOTAL_COMMISSION')); $main_order['PROFIT_VALUE'] = array_sum(array_column($load_html, 'BENEFIT')); } } if ($request['deal_type'] == 9) { $order_logs = $order_log_model->getOrderLog($id, $request['user_id']); } } else { $data = $model->orderDetail($id); $order_logs = $order_log_model->getOrderLog($id); } $supplier = new \backend\modules\api\models\BaseSupplier(); $channel_list = $supplier->getChannelList(); $log_users = $order_log_model->getLogUser($id); foreach ($data['data'] as $order) { if ($order['PARENT_ORDER_ID'] == 0) { $main_order = $order; } } return $this->render('order_detail', [ 'hotel_log' => $order_log_model, 'log' => $order_logs, 'log_users' => $log_users, 'model' => $model, 'channel_list' => $channel_list, 'data' => $data, 'comment_model' => $comment_model, 'common_order' => $common_order, 'stock_arr' => $stock_arr, 'child_order' => $data['hotel_child_order_detail'], 'main_order' => $main_order]); } /** * @Author wanglg * @Desc 修改销售价 * @throws \yii\db\Exception */ public function actionUpdateOrderPrice($order_id, $request) { // 首先判断订单是否是直连订单,直连订单不允许修改销售价 $main_order = OrderMain::findOne(['ORDER_ID' => $order_id, 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]); if ($main_order['DOCKING_TYPE'] == 556) // 556 直连 557 录单 { return ['code' => 1, 'msg' => '直连订单不允许修改销售价']; } $data = json_decode($request['data'], true); $transa = Yii::$app->db->beginTransaction(); try { foreach ($data as $key => $day) { // 查询订单入住该天的订单信息 $sel_old_info = OrderMain::find() ->select(['a.ID', 'a.ORDER_PRICE', 'a.OUTSIDE_SALE_ORG_ID', 'a.BASE_PRICE', 'b.HOTEL_ID', 'b.PARENT_ROOM_TYPE', 'b.ROOM_TYPE']) ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID AND b.ROOM_TYPE=a.PROD_ID and b.CANCEL_FLAG=0') ->from('order_main a') ->where(['a.PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'a.CANCEL_FLAG' => 0, 'a.ORDER_VALID_STATUS' => 1]) // -> createCommand()->getRawSql(); ->asArray()->all(); if (!$sel_old_info) throw new \Exception('修改销售价 -- 未找到相关信息'); if ($sel_old_info['ORDER_PRICE'] == $day['sale_price']) continue; //如果当天价格相等则不进行修改 // 渠道佣金规则 $commission_role = BaseSupplier::find() ->select(['b.BACK_COMMISION_METHOD', "b.BACK_PERCENT", "b.BACK_VALUE"]) ->innerJoin('base_supplier_sale as b', 'a.ID=b.SUPPLIER_ID AND b.PARENT_TYPE=25 and b.CANCEL_FLAG=0') ->from('base_supplier as a') ->where(['a.id' => $sel_old_info['OUTSIDE_SALE_ORG_ID'], 'a.CANCEL_FLAG' => 0, 'a.IS_DISABLED' => 0])->asArray()->one(); //更改销售价和利润 //修改销售单价的时候,渠道佣金也要根据当前设置佣金规则设置新的佣金金额 $commission_sql = empty($commission_role['BACK_COMMISION_METHOD']) ? 0 : ($commission_role['BACK_COMMISION_METHOD'] == 308 ? number_format($day['sale_price'] * $commission_role['BACK_PERCENT'] / 100, 2) : $commission_role['BACK_VALUE']); foreach ($sel_old_info as $old_info) { $profit = $day['sale_price'] - $old_info['BASE_PRICE'] - $commission_sql; $update_orders = OrderMain::updateAll(['UPDATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => Yii::$app->user->id, 'ORDER_PRICE' => $day['sale_price'], 'TOTAL_COMMISSION' => $commission_sql, 'PROFIT_VALUE' => $profit], ['ID' => $old_info["ID"], 'PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'CANCEL_FLAG' => 0, 'ORDER_VALID_STATUS' => 1]); if (!$update_orders) { throw new \Exception('修改子订单成本价失败'); } } // 保存操作日志 $log_desc = "修改销售价:修改【{$day['run_date']}】销售价【{$sel_old_info[0]['ORDER_PRICE']}】为【{$day['sale_price']}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $sel_old_info[0]['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $sel_old_info[0]['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $sel_old_info[0]['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['order_id']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录修改日志失败!'); } } } /** 修改主订单信息**/ // 计算子订单的成本和利润之和 $sum_orders = OrderMain::find() ->select(['SUM(ORDER_PRICE) as sum_order_price', 'SUM(TOTAL_COMMISSION) as sum_total_commission', 'SUM(PROFIT_VALUE) AS sum_profit_value']) ->where(['PARENT_ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0])->asArray()->one(); if (empty($sum_orders)) { throw new \Exception('修改销售价--未找到子订单信息'); } // 修改主订单 $update_parent_order = OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_PRICE' => $sum_orders['sum_order_price'], 'PROFIT_VALUE' => $sum_orders['sum_profit_value'], 'TOTAL_COMMISSION' => $sum_orders['sum_total_commission']], ['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]); if (!$update_parent_order) { throw new \Exception('修改销售价--修改主订单信息失败'); } $transa->commit(); // 渠道预付款处理,修改采购价 $comm_model = new CommonOrder(); $update_res = $comm_model->previousBalance(CommonOrder::UPDATE_ORDER_DEDUCTION_TYPE, $request['order_id']); if ($update_res['code'] != 0) { $this->sendAliMsgToRtx('预付款处理失败', '关联订单:' . "{$request['order_id']}\n" . '修改销售价:' . $update_res['msg'], $this->_developerList); } } catch (\Exception $e) { $transa->rollBack(); return ['code' => 1, 'info' => $e->getMessage()]; } return ['code' => 0, 'info' => '修改成功']; } /** * @Author wanglg * @Desc修改采购价 * @return string */ public function actionUpdateBasePrice($order_id, $request) { $order_main = OrderMain::findOne(['ORDER_ID' => $order_id, 'CANCEL_FLAG' => 0]); $data = json_decode($request['data'], true); $transa = Yii::$app->db->beginTransaction(); try { if (in_array($order_main['ORDER_STATUS'], array(198, 382))) // 待确认 - 退改中的订单需要生成修改单 { OrderMain::updateAll(['ORDER_LEVEL' => 1], "CANCEL_FLAG=0 and ORDER_VALID_STATUS=1 and (ORDER_ID={$request['order_id']} or PARENT_ORDER_ID={$request['order_id']})"); } foreach ($data as $key => $day) { // 查询订单入住该天的订单信息 $sel_old_info = OrderMain::find() ->select(['ROUND(SUM(a.BASE_PRICE)/COUNT(a.ORDER_ID), 2) as BASE_PRICE', 'a.ORDER_PRICE', 'a.TOTAL_COMMISSION', 'a.ORDER_STATUS', 'a.OUTSIDE_SALE_ORG_ID', 'b.HOTEL_ID', 'b.PARENT_ROOM_TYPE', 'b.ROOM_TYPE']) ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID AND b.ROOM_TYPE=a.PROD_ID and b.CANCEL_FLAG=0') ->from('order_main a') ->where(['a.PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'a.CANCEL_FLAG' => 0, 'a.ORDER_VALID_STATUS' => 1]) ->groupBy('RUN_DATE') ->asArray()->one(); if ($sel_old_info['BASE_PRICE'] == $day['base_price']) continue; //如果当天价格相等则不进行修改 if (!$sel_old_info) { throw new \Exception('修改采购价 -- 未找到相关信息'); } // 只有待发单-待安排-退改中状态的订单允许进行修改 if (!in_array($sel_old_info['ORDER_STATUS'], array('313', '198', '382'))) { throw new \Exception('事务异常-目前只有待发单-待安排-退改中状态的订单允许进行修改'); } // 修改子订单采购价 $update_order = OrderMain::updateAll(['BASE_PRICE' => $day['base_price'], 'PROFIT_VALUE' => $sel_old_info['ORDER_PRICE'] - $sel_old_info['TOTAL_COMMISSION'] - $day['base_price'], 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => Yii::$app->user->id], ['ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date']]); if (!$update_order) { throw new \Exception('修改子订单成本价失败'); } // 保存操作日志 $log_desc = "修改采购价:修改【{$day['run_date']}】采购价【{$sel_old_info['BASE_PRICE']}】为【{$day['base_price']}】"; $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $sel_old_info['HOTEL_ID'], 'PARENT_ROOM_TYPE' => $sel_old_info['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $sel_old_info['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['order_id']); $order_log = new OperaHotelLog(); if ($order_log->load($log_arr, '') && $order_log->validate()) { if (!$order_log->save()) { throw new \Exception('记录修改日志失败!'); } } } /** 修改主订单信息**/ // 计算子订单的成本和利润之和 $sum_orders = OrderMain::find()->select(['SUM(BASE_PRICE) as sum_base_price', 'SUM(PROFIT_VALUE) AS sum_profit_value']) ->where(['PARENT_ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0])->asArray()->one(); if (empty($sum_orders)) { throw new \Exception('修改采购价 -- 未找到子订单信息'); } // 修改主订单 $update_parent_order = OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'BASE_PRICE' => $sum_orders['sum_base_price'], 'PROFIT_VALUE' => $sum_orders['sum_profit_value']], ['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]); if (!$update_parent_order) { throw new \Exception('修改采购价 -- 修改主订单信息失败'); } $transa->commit(); // 渠道预付款处理,修改采购价 $comm_model = new CommonOrder(); $update_res = $comm_model->previousBalance(CommonOrder::UPDATE_ORDER_DEDUCTION_TYPE, $request['order_id']); if ($update_res['code'] != 0) { // 通知处理 $this->sendAliMsgToRtx('预付款处理失败', '关联订单:' . "{$request['order_id']}\n" . '修改采购价:' . $update_res['msg'], $this->_developerList); } } catch (\Exception $e) { $transa->rollBack(); return json_encode(array('code' => 1, 'info' => $e->getMessage())); } return json_encode(array('code' => 0, 'info' => '修改成功', 'order_id' => $request['order_id'])); } /** * @Author wanglg * @Desc 修改入住需求时获取库存,合并以前的库存数量 * @return string */ public function actionGetChannelStock() { $request = Yii::$app->request->post(); $orderModel = new CommonOrder(['scenario' => 'Product']); if ($orderModel->load($request, '') && $orderModel->validate()) { $getStockRes = $orderModel->dealStock($request['order_id'], $request); return json_encode(array('code' => 0, 'info' => '成功', 'data' => $getStockRes)); } else { $error = array_values($orderModel->getFirstErrors()); return json_encode(['code' => 1, 'info' => $error[0]]); } } } ?>