You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1993 lines
92 KiB

  1. <?php
  2. namespace backend\modules\hotel\controllers;
  3. //use common\models\BaseSupplier;
  4. use backend\modules\api\models\BaseUser;
  5. use backend\modules\hotel\models\Ali\AliOrder;
  6. use backend\modules\hotel\models\Ali\TopLogger;
  7. use backend\modules\hotel\models\CommonOrder;
  8. use backend\modules\hotel\models\CtripOrder;
  9. use backend\modules\hotel\models\OperaRoomDistrib;
  10. use backend\modules\hotel\models\OrderComment;
  11. use backend\modules\hotel\models\OrderHtExceptionList;
  12. use backend\modules\hotel\models\OrderInvoiceInfo;
  13. use common\components\zGridView;
  14. use common\components\zPhpExcel;
  15. use common\models\BaseSupplierLink;
  16. use Yii;
  17. use backend\modules\hotel\models\OrderMain;
  18. use yii\helpers\ArrayHelper;
  19. use yii\web\Controller;
  20. use yii\web\HttpException;
  21. use yii\web\NotFoundHttpException;
  22. use yii\filters\VerbFilter;
  23. use backend\modules\hotel\models\search\searchOrderMain;
  24. use yii\data\ArrayDataProvider;
  25. use common\models\BaseSupplier;
  26. use backend\modules\hotel\models\OperaHotelLog;
  27. use common\components\zOfficeWechat;
  28. use backend\modules\hotel\models\OrderChannelInfo;
  29. use backend\modules\hotel\models\SetService;
  30. use backend\modules\api\util\Util;
  31. use yii\db\Expression;
  32. /**
  33. * OrdermainController implements the CRUD actions for OrderMain model.
  34. */
  35. class OrdermainController extends BaseController
  36. {
  37. public $layout = "@backend/modules/motorcade/views/layouts/iframe_new";
  38. public $enableCsrfValidation = false;
  39. /**
  40. * @inheritdoc
  41. */
  42. public function behaviors()
  43. {
  44. return [
  45. 'verbs' => [
  46. 'class' => VerbFilter::className(),
  47. 'actions' => [
  48. 'delete' => ['POST'],
  49. ],
  50. ],
  51. ];
  52. }
  53. /**
  54. * Author:Steven
  55. * Desc:酒店订单列表
  56. * @return string
  57. */
  58. public function actionIndex()
  59. {
  60. $searchModel = new searchOrderMain();
  61. $searchModel->date_from = date('Y-m-d', strtotime('-3 days'));
  62. $searchModel->date_to = date('Y-m-d');
  63. $rs = $searchModel->search_list(Yii::$app->request->queryParams);
  64. $dataProvider = $rs['dataProvider'];
  65. $status_arr = $rs['status_arr'];
  66. $channel_status_arr = $rs['channel_status_arr'];
  67. $channel = BaseSupplier::find()
  68. ->select(['DISTINCT(a.ID)', 'a.SUPPLIER_NAME'])
  69. ->joinWith('baseSupplierSale as b', false)
  70. ->from('base_supplier as a')
  71. ->where(['and',
  72. ['=', 'b.PARENT_TYPE', 25],
  73. ['=', 'a.SUPPLIER_TYPE', 301],
  74. ['=', 'a.cancel_flag', 0],
  75. ['=', 'a.IS_DISABLED', 0],
  76. ['=', 'b.cancel_flag', 0],
  77. ['or', ['=', 'main_corp_id', Yii::$app->user->identity->MAIN_CORP_ID], ['=', 'main_corp_id', 0],
  78. ],
  79. ])
  80. // -> createCommand() -> getRawSql();
  81. ->asArray()->all();
  82. return $this->render('index', [
  83. 'searchModel' => $searchModel,
  84. 'dataProvider' => $dataProvider,
  85. 'status_arr' => $status_arr,
  86. 'channel_status_arr' => $channel_status_arr,
  87. 'model_list' => $channel,
  88. ]);
  89. }
  90. /**
  91. * Notes:接受渠道订单
  92. * User: Steven
  93. * Date: 2018/1/19
  94. * Time: 11:37
  95. * @param $id
  96. * @param $status //渠道的订单状态
  97. * @return string
  98. * @throws NotFoundHttpException
  99. * @throws \yii\db\Exception
  100. */
  101. public function actionReceiveChannel($id, $status)
  102. {
  103. $order = $this->findModel($id);
  104. if ($order->CHANNEL_ORDER_STATUS != $status) {
  105. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  106. }
  107. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  108. $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_ACCEPT;
  109. $order->UPDATE_USER_ID = Yii::$app->user->id;
  110. if (!$order->receiveChannel()) {
  111. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '接单失败']);
  112. }
  113. //这里需要判断是哪个渠道 //直连的订单,需要推送状态
  114. if ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ali']['supplier_id']) { //阿里
  115. Yii::$app->runAction('hotel/ali/confirm-order', ['tid' => $order->OUTSIDE_ORDER_NO, 'opt_type' => '2']);
  116. } elseif ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ctrip']['supplier_id']) { //
  117. $interFace = OrderChannelInfo::findOne(['CANCEL_FLAG' => 0, 'ORDER_ID' => $order->ORDER_ID]);
  118. if ($interFace != null) {
  119. $params = [
  120. 'OrderID' => $order->OUTSIDE_ORDER_NO,//订单ID
  121. 'InterfaceConfirmNo' => $order->ORDER_CONFIRM_CODE,//酒店确认号
  122. 'OrderStatus' => CtripOrder::ORDER_STATUS_COMFIRMED,//订单状态 3:确认;4:拒绝
  123. 'InterFaceSendID' => $interFace->InterFaceSendID,//订单接口发送号
  124. 'ResultCode' => CtripOrder::RETURN_CODE_SUCCESS,
  125. 'Message' => 'Success',
  126. 'channelId' => Yii::$app->params['ctrip']['relation_supplier_id'],//渠道ID 携程传1
  127. ];
  128. $set = new SetService();
  129. $setDes = $set->setOrderStatus($params);
  130. if ($setDes['flag'] == false) {
  131. zOfficeWechat::sendMsg([
  132. 'agentid' => zOfficeWechat::SEND_HOTEL,
  133. 'title' => '直连订单状态推送失败:',
  134. 'msg' => '客服接单:' . $order->ORDER_ID . "\n接单成功,但状态推送失败,请先电话告知携程渠道该订单已接单,并告知技术人员予以解决",
  135. 'touser' => $this->_developerList]
  136. );
  137. }
  138. }
  139. } elseif ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['wx_hotel']['supplier_id']) { //微信商城
  140. //推送微信商城
  141. $res = Util::confirmHotelOrder($order->ORDER_ID);
  142. if ($res['code'] != 0) {
  143. /*zOfficeWechat::sendMsg([
  144. 'agentid' => zOfficeWechat::SEND_HOTEL,
  145. 'title' => '直连订单状态推送失败:',
  146. 'msg' => '接单失败【微信商城订单】:' . $order->ORDER_ID . ' ' . $res['info'],
  147. 'touser' => $this->_developerList]
  148. );*/
  149. }
  150. }
  151. return \GuzzleHttp\json_encode(['code' => 0]);
  152. }
  153. /**
  154. * Notes:拒绝渠道订单
  155. * User: Steven
  156. * Date: 2018/1/19
  157. * Time: 11:41
  158. * @param $id
  159. * @param $status
  160. * @param $msg默认为满房
  161. * @return string
  162. * @throws NotFoundHttpException
  163. * @throws \yii\db\Exception
  164. */
  165. public function actionRefuseChannel($id, $status, $msg = 101)
  166. {
  167. $order = $this->findModel($id);
  168. if ($order->CHANNEL_ORDER_STATUS != $status) {
  169. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  170. }
  171. $order->UPDATE_USER_ID = Yii::$app->user->id;
  172. $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_REJECT;
  173. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  174. if ($order->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_SEND) { //待发单 渠道状态:拒绝 订单状态:取消
  175. $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL;
  176. $order->ORDER_VALID_STATUS = 0;
  177. if (!$order->refuseChannel(true)) {
  178. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '拒单失败']);
  179. }
  180. } //待安排、已取消
  181. elseif ($order->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_CONFIRM || $order->ORDER_STATUS == OrderMain::ORDER_STATUS_CANCEL) {
  182. if (!$order->refuseChannel(false)) {
  183. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '拒单失败']);
  184. }
  185. }
  186. if ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ali']['supplier_id']) { //阿里
  187. Yii::$app->runAction('hotel/ali/confirm-order', ['tid' => $order->OUTSIDE_ORDER_NO, 'opt_type' => '1']);
  188. } elseif ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ctrip']['supplier_id']) {
  189. $interFace = OrderChannelInfo::findOne(['CANCEL_FLAG' => 0, 'ORDER_ID' => $order->ORDER_ID]);
  190. if ($interFace != null) {
  191. $params = [
  192. 'OrderID' => $order->OUTSIDE_ORDER_NO,//订单ID
  193. 'InterfaceConfirmNo' => '',//酒店确认号
  194. 'OrderStatus' => CtripOrder::ORDER_STATUS_REFUSED,//订单状态 3:确认;4:拒绝
  195. 'InterFaceSendID' => $interFace->InterFaceSendID,//订单接口发送号
  196. 'ResultCode' => $msg, // 101:满房 103 价格错误
  197. 'Message' => CtripOrder::RETURN_MSG[$msg],
  198. 'channelId' => Yii::$app->params['ctrip']['relation_supplier_id'],//渠道ID 携程传1
  199. ];
  200. $set = new SetService();
  201. $setDes = $set->setOrderStatus($params);
  202. if ($setDes['flag'] == false) {
  203. zOfficeWechat::sendMsg([
  204. 'agentid' => zOfficeWechat::SEND_HOTEL,
  205. 'title' => '直连订单状态推送失败:',
  206. 'msg' => '客服拒单:' . $order->ORDER_ID . "\n拒单成功,但状态推送失败,请先电话告知渠道该订单已接单,并告知技术人员予以解决",
  207. 'touser' => $this->_developerList]
  208. );
  209. }
  210. }
  211. } else { //微信商城 拒绝渠道订单 向微信发起订单取消
  212. $res = Util::interfaceZzcx($order->ORDER_ID, 3);//如果不是需要通知微信的渠道订单,则不发送通知
  213. if ($res['code'] != 0) {
  214. /*zOfficeWechat::sendMsg([
  215. 'agentid' => zOfficeWechat::SEND_HOTEL,
  216. 'title' => '直连订单状态推送失败:',
  217. 'msg' => '接单失败【微信商城订单】:' . $order->ORDER_ID . ' ' . $res['info'],
  218. 'touser' => $this->_developerList,
  219. ]
  220. );*/
  221. }
  222. }
  223. return \GuzzleHttp\json_encode(['code' => 0]);
  224. }
  225. /**
  226. * Notes:订单列表-确认订单
  227. * User: Steven
  228. * Date: 2018/1/19
  229. * Time: 11:43
  230. * @param $id
  231. * @param $status
  232. * @param $msg
  233. * @return string
  234. * @throws NotFoundHttpException
  235. * @throws \yii\db\Exception
  236. */
  237. public function actionConfirm($id, $status, $msg)
  238. {
  239. $postMsg = Yii::$app->request->post("copyMsg");
  240. $order = $this->findModel($id);
  241. $tmp_channel_status = $order->CHANNEL_ORDER_STATUS;
  242. if ($order->ORDER_STATUS != $status) {
  243. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  244. }
  245. $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CONFIRMED;
  246. if ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL)
  247. $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_ACCEPT;
  248. $order->ORDER_CONFIRM_CODE = $postMsg;
  249. $order->ORDER_LEVEL = OrderMain::ORDER_LEVEL_SURE;
  250. $order->UPDATE_USER_ID = Yii::$app->user->id;
  251. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  252. if ($order->validate()) {
  253. //渠道状态已取消,不能确认
  254. if ($order->CHANNEL_ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED) {
  255. zOfficeWechat::sendMsg([
  256. 'agentid' => zOfficeWechat::SEND_HOTEL,
  257. 'title' => 'CS直连订单状态推送失败:',
  258. 'msg' => '渠道已取消订单:' . $order->ORDER_ID . "不能确认订单",
  259. 'touser' => $this->_developerList . $this->_messageList,
  260. ]
  261. );
  262. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '订单无法确认,请联系客服发取消单']);
  263. }
  264. if (!$order->confirm()) {
  265. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '确认失败']);
  266. } elseif ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL) { //直连
  267. //对接的订单,需要推送状态
  268. if ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ali']['supplier_id'] &&
  269. $tmp_channel_status == OrderMain::ORDER_CHANNEL_STATUS_WAITING) { //阿里
  270. //这里㤇判断是否已经接单,如果没有接单的话,需要推送状态,如果接单了,相当于确认状态已经推送携程了,不能重复推送
  271. Yii::$app->runAction('hotel/ali/confirm-order', ['tid' => $order->OUTSIDE_ORDER_NO, 'opt_type' => '2']);
  272. } elseif ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['ctrip']['supplier_id']) {
  273. //这里不需要向阿里渠道那样,因为携程是需要确认号的,即使已经确认了,也要通过此接口,更新确认号,所以不需要判读
  274. $interFace = OrderChannelInfo::findOne(['CANCEL_FLAG' => 0, 'ORDER_ID' => $order->ORDER_ID]);
  275. if ($interFace != null) {
  276. $params = [
  277. 'OrderID' => $order->OUTSIDE_ORDER_NO,//订单ID
  278. 'InterfaceConfirmNo' => $order->ORDER_CONFIRM_CODE,//酒店确认号
  279. 'OrderStatus' => CtripOrder::ORDER_STATUS_COMFIRMED,//订单状态 3:确认;4:拒绝
  280. 'InterFaceSendID' => $interFace->InterFaceSendID,//订单接口发送号
  281. 'ResultCode' => CtripOrder::RETURN_CODE_SUCCESS,
  282. 'Message' => 'Success',
  283. 'channelId' => Yii::$app->params['ctrip']['relation_supplier_id'],//渠道ID 携程传
  284. ];
  285. $set = new SetService();
  286. $setDes = $set->setOrderStatus($params);
  287. if ($setDes['flag'] == false) {
  288. zOfficeWechat::sendMsg([
  289. 'agentid' => zOfficeWechat::SEND_HOTEL,
  290. 'title' => '直连订单状态推送失败:',
  291. 'msg' => '酒店已经确认了直连订单:' . $order->ORDER_ID . "\n但是直连状态推送失败,请手动接单。",
  292. 'touser' => $this->_developerList]
  293. );
  294. }
  295. }
  296. } elseif ($order->OUTSIDE_SALE_ORG_ID == Yii::$app->params['wx_hotel']['supplier_id']) { //微信商城
  297. $res = Util::confirmHotelOrder($order->ORDER_ID);
  298. if (!$res) {
  299. zOfficeWechat::sendMsg([
  300. 'agentid' => zOfficeWechat::SEND_HOTEL,
  301. 'title' => '直连订单状态推送失败:',
  302. 'msg' => '接单失败【微信商城订单】:' . $order->ORDER_ID . ' ' . $res['info'],
  303. 'touser' => $this->_developerList]
  304. );
  305. }
  306. }
  307. }
  308. } else {
  309. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => $order->getErrors()]);
  310. }
  311. $order->resetMem(); //将缓存中用于提醒酒店处理订单的数据删除
  312. $logger = new TopLogger();
  313. $logger->log([date("Y-m-d H:i:s"), 'cs后台确认,清除缓存,订单号:' . $order->ORDER_ID . ',订单状态:' . $order->ORDER_STATUS . "\n" . PHP_EOL], 'ali/error');
  314. return \GuzzleHttp\json_encode(['code' => 0]);
  315. }
  316. /**
  317. * Notes:发单到酒店
  318. * User: Steven
  319. * Date: 2018/1/19
  320. * Time: 11:44
  321. * @param $id
  322. * @param $status
  323. * @return string
  324. * @throws NotFoundHttpException
  325. * @throws \yii\db\Exception
  326. */
  327. public function actionSendHotel($id, $status)
  328. {
  329. $order = $this->findModel($id);
  330. if ($order->ORDER_STATUS != $status) {
  331. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  332. }
  333. $order->ORDER_STATUS = OrderMain::ORDER_STATUS_WAITING_CONFIRM; //变为待安排(待确认)
  334. $order->ORDER_LEVEL = OrderMain::ORDER_LEVEL_SURE;
  335. $order->UPDATE_USER_ID = Yii::$app->user->id;
  336. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  337. if (!$order->sendOrder()) {
  338. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '发单失败']);
  339. }
  340. $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_WAITING_CONFIRM, $order->PROD_TOP_ORG_ID, $order->PROD_NAME);
  341. return \GuzzleHttp\json_encode(['code' => 0]);
  342. }
  343. /**
  344. * Notes:取消单
  345. * User: Steven
  346. * Date: 2018/1/17
  347. * Time: 18:32
  348. * @param $id
  349. * @param $status
  350. * @param $msg
  351. * @return string
  352. * @throws NotFoundHttpException
  353. * @throws \yii\db\Exception
  354. */
  355. public function actionCancelOrder($id, $status, $msg)
  356. {
  357. $order = $this->findModel($id);
  358. if ($order->ORDER_STATUS != $status) {
  359. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  360. }
  361. //直连-渠道申请取消-订单待安排
  362. $order->UPDATE_USER_ID = Yii::$app->user->id;
  363. $order->ORDER_VALID_STATUS = 0;
  364. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  365. if ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL && //直连订单
  366. ($order->CHANNEL_ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL || $order->CHANNEL_ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED) //渠道接单状态 申请取消 已同意取消
  367. && ($order->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_CONFIRM || $order->ORDER_STATUS == OrderMain::ORDER_STATUS_WAITING_SEND)) { //订单状态是待确认 待发单
  368. $order->ORDER_LEVEL = OrderMain::ORDER_LEVEL_CANCEL;
  369. $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL;
  370. $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED;
  371. if (!$order->cancelOrder($msg)) {
  372. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '取消失败']);
  373. }
  374. $order->resetMem();
  375. } else { //非直连订单
  376. if ($order->ORDER_STATUS != 313) {
  377. $order->ORDER_LEVEL = OrderMain::ORDER_LEVEL_CANCEL;
  378. }
  379. $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL;
  380. if (!$order->refuse($msg, 'cancel_order')) {
  381. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '取消失败']);
  382. }
  383. if ($status == OrderMain::ORDER_STATUS_CHANGING) {
  384. $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_CANCEL_BEFORE_CONFIRM, $order->PROD_TOP_ORG_ID, $order->PROD_NAME);
  385. } else {
  386. $order->resetMem();
  387. }
  388. }
  389. return \GuzzleHttp\json_encode(['code' => 0]);
  390. }
  391. /**
  392. * Notes:订单退改
  393. * User: Steven
  394. * Date: 2018/1/19
  395. * Time: 11:44
  396. * @param $id
  397. * @param $status
  398. * @param $msg
  399. * @return string
  400. * @throws NotFoundHttpException
  401. * @throws \yii\db\Exception
  402. */
  403. public function actionBackChange($id, $status, $msg)
  404. {
  405. $order = $this->findModel($id);
  406. if ($order->ORDER_STATUS != $status) {
  407. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  408. }
  409. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  410. $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CHANGING;
  411. $order->UPDATE_USER_ID = Yii::$app->user->id;
  412. if (!$order->backChange($msg)) {
  413. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '退改失败']);
  414. }
  415. $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_WAITING_SEND, $order->PROD_TOP_ORG_ID, $order->PROD_NAME);
  416. return \GuzzleHttp\json_encode(['code' => 0]);
  417. }
  418. /**
  419. * Notes:向酒店供应商申请退单
  420. * User: Steven
  421. * Date: 2018/1/19
  422. * Time: 11:45
  423. * @param $id
  424. * @param $status
  425. * @return string
  426. * @throws NotFoundHttpException
  427. * @throws \yii\db\Exception
  428. */
  429. public function actionCancelConfirming($id, $status)
  430. {
  431. $order = $this->findModel($id);
  432. if ($order->ORDER_STATUS != $status) {
  433. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  434. }
  435. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  436. $order->ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_WAITING_CONFIRM;
  437. $order->UPDATE_USER_ID = Yii::$app->user->id;
  438. if (!$order->cancelConfirming()) {
  439. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '申请退单失败']);
  440. }
  441. $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_CANCEL_BEFORE_CONFIRM, $order->PROD_TOP_ORG_ID, $order->PROD_NAME);
  442. return \GuzzleHttp\json_encode(['code' => 0]);
  443. }
  444. /**
  445. * Notes:取消退改
  446. * User: Steven
  447. * Date: 2018/1/19
  448. * Time: 11:45
  449. * @param $id
  450. * @param $status
  451. * @return string
  452. * @throws NotFoundHttpException
  453. * @throws \yii\db\Exception
  454. */
  455. public function actionCancelBackChange($id, $status)
  456. {
  457. $order = $this->findModel($id);
  458. if ($order->ORDER_STATUS != $status) {
  459. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  460. }
  461. $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CONFIRMED;
  462. $order->UPDATE_USER_ID = Yii::$app->user->id;
  463. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  464. if (!$order->cancelBackChange()) {
  465. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '取消退改失败']);
  466. }
  467. // $order->setMemcache($order->ORDER_ID, OrderMain::ORDER_STATUS_CANCEL_BEFORE_CONFIRM, $order->PROD_TOP_ORG_ID, $order->PROD_NAME);
  468. $order->resetMem();
  469. return \GuzzleHttp\json_encode(['code' => 0]);
  470. }
  471. /**
  472. * Notes:同意退单
  473. * User: Steven
  474. * Date: 2018/1/18
  475. * Time: 11:57
  476. * @param $id
  477. * @param $status
  478. * @return string
  479. * @throws NotFoundHttpException
  480. * @throws \yii\db\Exception
  481. */
  482. public function actionAgreeCancel($id, $status)
  483. {
  484. $order = $this->findModel($id);
  485. if ($order->ORDER_STATUS != $status) {
  486. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  487. }
  488. $order->ORDER_LEVEL = 2;
  489. $order->ORDER_VALID_STATUS = 0;
  490. $order->UPDATE_USER_ID = Yii::$app->user->id;
  491. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  492. $flag = true;
  493. if ($order->DOCKING_TYPE == OrderMain::ORDER_TYPE_CHANNEL && $order->ORDER_STATUS == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_WAITING_CONFIRM) { //待退单确认
  494. $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED;
  495. $flag = false;
  496. }
  497. $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CANCEL;
  498. if (!$order->agreeCancel($flag, 'agree-cancel')) {
  499. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '同意退单失败']);
  500. }
  501. $order->resetMem();
  502. return \GuzzleHttp\json_encode(['code' => 0]);
  503. }
  504. /**
  505. * Notes:拒绝退单
  506. * User: Steven
  507. * Date: 2018/1/18
  508. * Time: 11:36
  509. * @param $id
  510. * @param $status
  511. * @return string
  512. * @throws NotFoundHttpException
  513. * @throws \yii\db\Exception
  514. */
  515. public function actionRefuseCancel($id, $status)
  516. {
  517. $order = $this->findModel($id);
  518. if ($order->ORDER_STATUS != $status) {
  519. return \GuzzleHttp\json_encode(['code' => 2, 'msg' => '订单状态已经发生变化,请刷新后再操作']);
  520. }
  521. $order->ORDER_STATUS = OrderMain::ORDER_STATUS_CONFIRMED;
  522. $order->UPDATE_USER_ID = Yii::$app->user->id;
  523. $order->UPDATE_TIME = date('Y-m-d H:i:s', time());
  524. if ($status == OrderMain::ORDER_TYPE_CHANNEL && $status == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_WAITING_CONFIRM) { //待退单确认
  525. $order->CHANNEL_ORDER_STATUS = OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_REJECT;
  526. }
  527. if (!$order->refuseCancel()) {
  528. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '拒绝退单失败']);
  529. }
  530. $order->resetMem();
  531. return \GuzzleHttp\json_encode(['code' => 0]);
  532. }
  533. /**
  534. * Steven
  535. * 获取该供应商下所有的邮件信息
  536. */
  537. public function actionGetEmailInfo($supplier_id)
  538. {
  539. $emails = BaseSupplierLink::find()->select(['LINK_NAME', 'EMAIL'])->where(['SUPPLIER_ID' => $supplier_id, 'CANCEL_FLAG' => 0])->asArray()->all();
  540. return \GuzzleHttp\json_encode(['code' => 0, 'data' => $emails]);
  541. }
  542. /**
  543. * Steven
  544. * 发送 邮件
  545. */
  546. public function actionSendEmail($id, $msg)
  547. {
  548. $order = $this->findModel($id);
  549. $filename = "【" . $order->ORDER_ID . "】" . $order->CUSTOMER_NAME . $order->PROD_START_STATION_DATE . ".doc";
  550. $html = $order->wordHtml($order->ORDER_LEVEL);
  551. $mail = Yii::$app->mailer->compose();
  552. /*$email = BaseSupplierLink::find()->select(['EMAIL'])->where(['SUPPLIER_ID' => $order->PROD_TOP_ORG_ID, 'CANCEL_FLAG' => 0])->asArray()->one();
  553. if (empty($email)) {
  554. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '邮件发送失败,供应商邮件未设置!']);
  555. }*/
  556. $email_arr = explode(',', $msg);
  557. $mail->setTo($email_arr);
  558. // $mail->setTo('shifp@zhizhuchuxing.com');
  559. $mail->setSubject($filename);
  560. $mail->attachContent($html, ['fileName' => $filename, 'contentType' => 'text/plain']);
  561. // $mail->setTextBody("<b>酒店确认单:</b><br>订单号:{$order->ORDER_ID}<br>烦请尽快确认"); //发布纯文字文本
  562. $mail->setHtmlBody("<br><b>酒店确认单:</b><br>订单号:{$order->ORDER_ID}<br>烦请尽快确认"); //发布可以带html标签的文本
  563. if ($mail->send()) {
  564. $seq_id = ($order->RUN_BUS_SEAT_SEQ_ID) == -1 ? 1 : $order->RUN_BUS_SEAT_SEQ_ID + 1;
  565. OrderMain::updateAll(['RUN_BUS_SEAT_SEQ_ID' => $seq_id, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())],
  566. ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $order->ORDER_ID], ['PARENT_ORDER_ID' => $order->ORDER_ID]]]);
  567. $order->saveLog('send_email_success', false, $msg);
  568. return \GuzzleHttp\json_encode(['code' => 0, 'msg' => '邮件发送成功']);
  569. } else {
  570. OrderMain::updateAll(['RUN_BUS_SEAT_SEQ_ID' => -1, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())],
  571. ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $order->ORDER_ID], ['PARENT_ORDER_ID' => $order->ORDER_ID]]]);
  572. $order->saveLog('send_email_error', false, $msg);
  573. return \GuzzleHttp\json_encode(['code' => 1, 'msg' => '邮件发送失败,请手动发邮件到酒店!']);
  574. }
  575. }
  576. /**
  577. * Author:Steven
  578. * Desc:酒店订单白名单处理
  579. * @return string
  580. */
  581. public function actionOrderWhiteList()
  582. {
  583. $exception = new OrderHtExceptionList();
  584. if (Yii::$app->request->isPost) {
  585. $param = Yii::$app->request->post();
  586. if ($exception->load($param) && $exception->save()) {
  587. // 保存操作日志
  588. $order_model = OrderMain::findOne(['ORDER_ID' => $param['OrderHtExceptionList']['order_id'], 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0]);
  589. $order_model->saveLog('add_white_list', false, OrderHtExceptionList::WHITE_ARRAY[$param['OrderHtExceptionList']['status']]);
  590. return '<script>z.pjaxFinish("success", "添加成功!", "#float-div");$("#search-btn").trigger(\'click\');</script>';
  591. } else {
  592. Yii::$app->session->setFlash('error', "添加失败!");
  593. }
  594. }
  595. return $this->render('_order_whitelist', [
  596. 'model' => $exception,
  597. ]);
  598. }
  599. /**
  600. * @Author wanglg
  601. * @Desc 获取订单备注信息,用于弹框显示
  602. * @return string
  603. */
  604. public function actionGetComment()
  605. {
  606. $request = Yii::$app->request->post();
  607. $comment = new OrderComment();
  608. $comment_list = $comment->getCommentList($request['order_id']);
  609. $data['comment_list'] = $comment_list;
  610. return json_encode($data);
  611. }
  612. /**
  613. * @Author wanglg
  614. * @Desc 修改确认号form框
  615. * @return string
  616. */
  617. public function actionUpdateConfirm()
  618. {
  619. $model = new OrderMain(['scenario' => 'upConfirm']);
  620. $request = Yii::$app->request->get();
  621. return $this->render('_updateConfirmCode', [
  622. 'model' => $model,
  623. 'hidden' => $request['param'],
  624. ]);
  625. }
  626. /**
  627. * @Author wanglg
  628. * @Desc 获取订单发票信息,用于弹框显示
  629. * @return string
  630. */
  631. public function actionGetInvoice()
  632. {
  633. $request = Yii::$app->request->post();
  634. $model = new OrderInvoiceInfo();
  635. $invoice_list = $model->getInvoiceInfo($request['order_id']);
  636. $invoice_list[0]['NeedInvoice'] = OrderInvoiceInfo::NEEDINVOICE[$invoice_list[0]['NeedInvoice']];
  637. $invoice_list[0]['EarllyPrepare'] = OrderInvoiceInfo::EARLLYPREPARE[$invoice_list[0]['EarllyPrepare']];
  638. $invoice_list[0]['PostType'] = OrderInvoiceInfo::POSTTYPE[$invoice_list[0]['PostType']];
  639. $invoice_list[0]['InvoiceType'] = OrderInvoiceInfo::INVOICETYPE[$invoice_list[0]['InvoiceType']];
  640. $invoice_list[0]['Status'] = OrderInvoiceInfo::ORDER_STATUS_DESC[$invoice_list[0]['Status']];
  641. $data['invoice_list'] = $invoice_list;
  642. return json_encode($data);
  643. }
  644. /**
  645. * @Author wanglg
  646. * @Desc 录入订单发票信息页面
  647. * @return bool|string
  648. */
  649. public function actionAddInvoiceView()
  650. {
  651. if (empty(Yii::$app->request->get('order_id')) || empty(Yii::$app->request->get('channel_id'))) {
  652. return json_encode(array('code' => '1', 'msg' => '参数有误'));
  653. }
  654. $model = OrderInvoiceInfo::findOne(['OrderID' => Yii::$app->request->get('order_id')]);
  655. if (empty($model)) {
  656. // 用户选择发票类型,用于显示赋值
  657. $type = Yii::$app->request->get('type') == 2 ? 2 : 1;
  658. $model = Yii::$app->request->get('type') == 2 ? new OrderInvoiceInfo(['scenario' => 'exclusive']) : new OrderInvoiceInfo(['scenario' => 'showInvoice']);
  659. $model->InvoiceType = $type;
  660. $model->ChannelId = Yii::$app->request->get('channel_id');
  661. } else {
  662. $scenario = $model->InvoiceType == 1 ? 'addInvoice' : 'exclusive';
  663. $model->scenario = $scenario;
  664. }
  665. return $this->render('_add_invoice', ['model' => $model, 'order_id' => Yii::$app->request->get('order_id')]);
  666. }
  667. /**
  668. * @Author wanglg
  669. * @Desc 录入发票操作
  670. */
  671. public function actionAddInvoice()
  672. {
  673. $request = Yii::$app->request->post();
  674. $model = OrderInvoiceInfo::findOne(['OrderID' => $request['OrderInvoiceInfo']['OrderID']]);
  675. if (empty($model)) {
  676. $msg = '添加发票成功!';
  677. $logDesc = '添加发票';
  678. $model = new OrderInvoiceInfo();
  679. $model->CreateUseId = Yii::$app->user->id;
  680. } else {
  681. $msg = '修改发票信息成功';
  682. $logDesc = '修改发票';
  683. }
  684. if ($model->load($request) && $model->validate()) {
  685. $model->Status = 1;
  686. if ($model->save()) {
  687. // 添加或修改发票信息成功
  688. Yii::$app->session->setFlash('success', $msg);
  689. // 记录日志
  690. $model->addInvoice($logDesc);
  691. return '<script>z.pjaxFinish("success", "' . $msg . '", "#float-div2");$("#search-button").trigger(\'click\');</script>';
  692. }
  693. }
  694. Yii::$app->session->setFlash('error', "添加发票失败!");
  695. return $this->renderPartial('_add_invoice', [
  696. 'model' => $model,
  697. 'order_id' => $request['OrderInvoiceInfo']['OrderID'],
  698. ]);
  699. }
  700. /**
  701. * @Author wanglg
  702. * @Desc 申请开发票,修改发票信息状态
  703. * @return string
  704. */
  705. public function actionUpdateInvoiceStatus()
  706. {
  707. $order_id = Yii::$app->request->get('id');
  708. $user_id = Yii::$app->user->id;
  709. if (empty($order_id)) {
  710. return json_encode(array('code' => 1, 'msg' => '申请参数不能为空'));
  711. }
  712. if (empty($user_id)) {
  713. return json_encode(array('code' => 1, 'msg' => '请重新登录再提交申请'));
  714. }
  715. $model = OrderInvoiceInfo::findOne(['OrderID' => $order_id, 'Status' => [1, 5]]);
  716. $user = BaseUser::findOne(['ID' => $user_id, 'CANCEL_FLAG' => 0]);
  717. if (empty($model)) {
  718. return json_encode(array('code' => 2, 'msg' => '当前发票不允许执行该操作'));
  719. }
  720. $model->Status = 2;
  721. $model->ApplyUser = $user_id;
  722. $model->CreateTime = date('Y-m-d H:i:s');
  723. $update = $model->update();
  724. if ($update) {
  725. // 记录开票日志
  726. $model->applyInvoice();
  727. zOfficeWechat::sendMsg([
  728. 'agentid' => zOfficeWechat::SEND_HOTEL,
  729. 'title' => '【发票通知】您有一个新的发票任务等待开具:',
  730. 'msg' => "关联订单号:" . $order_id . "\n申请人:" . $user->TRUE_NAME . "\n申请时间:" . date('Y-m-d H:i:s') . "\n请至CS系统财务管理-发票管理进行操作",
  731. 'touser' => $this->_financeList,
  732. // 'touser' => $this->_private,
  733. ]);
  734. }
  735. $res = $update == 0 ? json_encode(array('code' => 3, 'msg' => '申请开票失败,请重新申请')) : json_encode(array('code' => 0, 'msg' => '申请开票成功'));
  736. return $res;
  737. }
  738. /**
  739. * @Author wanglg
  740. * @Desc 修改确认号
  741. * @return string
  742. */
  743. public function actionUpdateConfirmCode()
  744. {
  745. $request = Yii::$app->request->post();
  746. $uid = Yii::$app->user->id;
  747. $order = $this->findModel($request['order_id']);
  748. $count = OrderMain::find()
  749. ->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])
  750. // -> createCommand() -> getRawSql();
  751. ->asArray()->one();
  752. if ($count['count'] == 0) {
  753. Yii::$app->session->setFlash('error', "订单状态已改变,请重新刷新页面");
  754. return '<script>z.pjaxFinish("error", "订单状态已改变,请重新刷新页面", "#float-div");</script>';
  755. }
  756. $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',
  757. ['or', 'ORDER_ID=' . $request['order_id'], 'PARENT_ORDER_ID=' . $request['order_id']]]);
  758. !$res ? Yii::$app->session->setFlash('error', "修改确认号失败!") : Yii::$app->session->setFlash('success', "修改确认号成功!");
  759. if ($res) {
  760. $order->saveLog('update_confirm', false, $request['OrderMain']['ORDER_CONFIRM_CODE']);
  761. return '<script>z.pjaxFinish("success", "修改成功", "#float-div");$("#search-button").trigger(\'click\');</script>';
  762. }
  763. }
  764. /**
  765. * @Author wanglg
  766. * @Desc 获取订单详情
  767. * @param $id
  768. * @return string
  769. */
  770. public function actionOrderDetail($id)
  771. {
  772. $request = Yii::$app->request->post();
  773. $model = new OrderMain();
  774. $supplier = new \backend\modules\api\models\BaseSupplier();
  775. $channel_list = $supplier->getChannelList();
  776. $data = $model->orderDetail($id);
  777. $order_log_model = new OperaHotelLog();
  778. $order_logs = $order_log_model->getOrderLog($id);
  779. $main_order = array();
  780. // 加载库存,通过pjax实现
  781. if (Yii::$app->request->isAjax) {
  782. $request = Yii::$app->request->get();
  783. // 查询库存信息
  784. $orderModel = new CommonOrder(['scenario' => 'Product']);
  785. if ($orderModel->load($request, '') && $orderModel->validate()) {
  786. $data['hotel_child_order_detail'] = $orderModel->getHotelStock();
  787. }
  788. }
  789. foreach ($data['data'] as $order) {
  790. if ($order['PARENT_ORDER_ID'] == 0) {
  791. $main_order = $order;
  792. }
  793. }
  794. return $this->render('orderDetail', [
  795. 'model' => $model,
  796. 'channel_list' => $channel_list,
  797. 'data' => $data,
  798. 'child_order' => $data['hotel_child_order_detail'],
  799. 'main_order' => $main_order,
  800. 'log' => $order_logs,
  801. ]);
  802. }
  803. /**
  804. * @Author wanglg
  805. * @Desc 修改入住需求
  806. * @return string
  807. */
  808. public function actionUpdateCheckIn()
  809. {
  810. $param = Yii::$app->request->post();
  811. $avail_data = array(
  812. 'HotelID' => $param['hotel_id'],
  813. 'RoomID' => $param['room_id'],
  814. 'RoomNum' => $param['room_count'],
  815. 'CheckIn' => $param['start_date'],
  816. 'CheckOut' => $param['end_date'],
  817. 'DistribID' => $param['org_id'],
  818. 'CreateUserID' => $param['user_id'],
  819. 'RoomPrices' => 0,
  820. 'IfCheckPrice' => false,
  821. );
  822. $newOrder = new CommonOrder(['scenario' => 'CheckRoomAvail']);
  823. if (!$newOrder->load($avail_data, '') || !$newOrder->validate()) {
  824. $error = array_values($newOrder->getFirstErrors());
  825. return json_encode(['code' => 1, 'info' => $error[0]]);
  826. }
  827. $is_avail = $newOrder->checkRoomAvail();
  828. if ($is_avail['code'] != 0) {
  829. return json_encode(['code' => 2, 'info' => $is_avail['info']]);
  830. }
  831. $room_price = array();
  832. foreach ($is_avail['data']['room_price'] as $k => $room) {
  833. $room_price[] = array('RunDate' => $room['run_date'], 'Price' => $room['price']);
  834. }
  835. // 客人信息
  836. $uncus_names = explode(' ', $param['customer_name']);
  837. $all_cus_name = array_values(array_filter($uncus_names));
  838. $split_customer = array_map("self::customer", $all_cus_name);
  839. $make_order_arr = array(
  840. 'CreateUserID' => Yii::$app->user->id,
  841. 'ZZ_ORDER_ID' => $param['order_id'], //蜘蛛订单号
  842. 'OrderID' => $param['org_num'], //渠道订单号
  843. 'HotelID' => $param['hotel_id'], //酒店ID
  844. 'RoomID' => $param['room_id'], //房型ID
  845. 'DistribID' => $param['org_id'],//渠道ID
  846. 'RoomNum' => $param['room_count'], //房间数量
  847. 'CheckIn' => $param['start_date'], //入住日期
  848. 'CheckOut' => $param['end_date'], //离店日期,
  849. 'TotalPrice' => $is_avail['data']['total_price'],//订单总价
  850. 'Currency' => 'RMB', //币种
  851. 'ContactName' => $param['customer_name'],//联系人姓名
  852. 'ContactTel' => $param['customer_mobile'], //联系人电话
  853. 'OrderGuests' => $split_customer, //入住人信息
  854. 'Comment' => $param['customer_memo'], //客人备注
  855. 'NeedInvoice' => 0,
  856. 'InvoiceInfos' => array(),
  857. 'RoomPrices' => $room_price,
  858. );
  859. $newUpdateOrder = new CommonOrder(['scenario' => 'UpdateHotelOrder']);
  860. if ($newUpdateOrder->load($make_order_arr, '')) {
  861. $res = $newUpdateOrder->updateHotelOrder();
  862. return json_encode($res);
  863. } else {
  864. $error = array_values($newOrder->getFirstErrors());
  865. return json_encode(['code' => 3, 'info' => $error[0]]);
  866. }
  867. }
  868. /**
  869. * @Author wanglg
  870. * @Desc 客人信息处理
  871. * @param $item
  872. * @return array
  873. */
  874. public static function customer($item)
  875. {
  876. return array('Name' => $item);
  877. }
  878. /**
  879. * @Author wanglg
  880. * @Desc 修改订单客户信息
  881. * @return string
  882. */
  883. public function actionUpdateCustomer()
  884. {
  885. $request = Yii::$app->request->post();
  886. // $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]);
  887. $main_order = OrderMain::find()
  888. ->select(['order_main.*', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE'])
  889. ->joinWith('operaHotelRoom')
  890. ->from('order_main')
  891. ->where(['ORDER_ID' => $request['OrderMain']['ORDER_ID'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN])
  892. ->asArray()->one();
  893. if (in_array($main_order['ORDER_STATUS'], array(198, 382))) {
  894. $update_res = OrderMain::updateAll(['CUSTOMER_NAME' => $request['OrderMain']['CUSTOMER_NAME'], 'CUSTOMER_MOBILE' => $request['OrderMain']['CUSTOMER_MOBILE'],
  895. 'UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1],
  896. ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $request['OrderMain']['ORDER_ID'], 'PARENT_ORDER_ID=' . $request['OrderMain']['ORDER_ID']]]);
  897. } else {
  898. $update_res = OrderMain::updateAll(['CUSTOMER_NAME' => $request['OrderMain']['CUSTOMER_NAME'], 'CUSTOMER_MOBILE' => $request['OrderMain']['CUSTOMER_MOBILE'],
  899. 'UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s')],
  900. ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $request['OrderMain']['ORDER_ID'], 'PARENT_ORDER_ID=' . $request['OrderMain']['ORDER_ID']]]);
  901. }
  902. // 修改成功则添加日志记录
  903. if ($update_res) {
  904. $log_desc = "修改客人信息:修改客人信息【{$main_order['CUSTOMER_NAME']}】为【{$request['OrderMain']['CUSTOMER_NAME']}】";
  905. $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'],
  906. 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['OrderMain']['ORDER_ID']);
  907. $order_log = new OperaHotelLog();
  908. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  909. if (!$order_log->save()) {
  910. throw new \Exception('记录日志失败!');
  911. }
  912. }
  913. }
  914. empty($update_res) ? Yii::$app->session->setFlash('error', '修改客人信息失败') : Yii::$app->session->setFlash('success', '修改客人信息成功');
  915. return $this->redirect(['/hotel/ordermain/order-detail', 'id' => $request['OrderMain']['ORDER_ID']]);
  916. }
  917. /**
  918. * @Author wanglg
  919. * @Desc 添加备注
  920. * @return
  921. */
  922. public function actionComment()
  923. {
  924. $request = Yii::$app->request->get();
  925. if (empty($request['comment_txt'])) {
  926. return false;
  927. }
  928. // 查询主订单
  929. $main_order = OrderMain::find()
  930. ->select(['order_main.*', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE'])
  931. ->joinWith('operaHotelRoom')
  932. ->from('order_main')
  933. ->where(['ORDER_ID' => $request['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN])
  934. ->asArray()->one();
  935. $comment_arr = array('ORDER_ID' => $request['order_id'], 'COMMENT_TYPE' => $request['comment_type'], 'COMMENT_TXT' => $request['comment_txt'],
  936. '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');
  937. if ($request['comment_type'] == 1 && in_array($main_order['ORDER_STATUS'], array(198, 382))) {
  938. OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1],
  939. ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $request['order_id'], 'PARENT_ORDER_ID=' . $request['order_id']]]);
  940. }
  941. $comment = new OrderComment();
  942. if ($comment->load($comment_arr, '') && $comment->validate()) {
  943. if (!$comment->save()) {
  944. Yii::$app->session->setFlash('error', '添加备注失败');
  945. } else {
  946. Yii::$app->session->setFlash('success', '添加备注成功');
  947. }
  948. }
  949. $log_type = $request['comment_type'] == 0 ? '内部备注' : '公共备注';
  950. // 保存添加备注日志
  951. $log_desc = "添加备注:【{$log_type}】 【{$request['comment_txt']}】";
  952. $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'],
  953. 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['order_id']);
  954. $order_log = new OperaHotelLog();
  955. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  956. if (!$order_log->save()) {
  957. throw new \Exception('记录日志失败!');
  958. }
  959. }
  960. return $this->redirect(['/hotel/ordermain/order-detail', 'id' => $request['order_id']]);
  961. }
  962. /**
  963. * @Author wanglg
  964. * @Desc 删除备注
  965. * @return int|\yii\web\Response
  966. */
  967. public function actionDelComment()
  968. {
  969. $request = Yii::$app->request->get();
  970. $order = OrderComment::findOne($request['comment_id']);
  971. $order->CANCEL_FLAG = 1;
  972. $order->UPDATE_USER_ID = Yii::$app->user->id;
  973. $order->UPDATE_TIME = date('Y-m-d H:i:s');
  974. $main_order = OrderMain::find()
  975. ->select(['order_main.*', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE'])
  976. ->joinWith('operaHotelRoom')
  977. ->from('order_main')
  978. ->where(['ORDER_ID' => $request['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN])
  979. ->asArray()->one();
  980. // 如果是公共备注生成修改单
  981. if ($order->COMMENT_TYPE == 1 && in_array($main_order['ORDER_STATUS'], array(198, 382))) {
  982. OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1],
  983. ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $order->ORDER_ID, 'PARENT_ORDER_ID=' . $order->ORDER_ID]]);
  984. }
  985. if (!$order->update()) {
  986. Yii::$app->session->setFlash('error', '删除失败');
  987. } else {
  988. Yii::$app->session->setFlash('success', '删除成功');
  989. }
  990. $log_type = $request['comment_type'] == 0 ? '内部备注' : '公共备注';
  991. // 保存添加备注日志
  992. $log_desc = "删除备注:【{$log_type}】 【{$order['COMMENT_TXT']}】";
  993. $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'],
  994. 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $request['order_id']);
  995. $order_log = new OperaHotelLog();
  996. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  997. if (!$order_log->save()) {
  998. throw new \Exception('记录日志失败!');
  999. }
  1000. }
  1001. return $this->redirect(['/hotel/ordermain/order-detail', 'id' => $request['order_id']]);
  1002. }
  1003. /**
  1004. * @Author wanglg
  1005. * @Desc修改采购价
  1006. * @return string
  1007. */
  1008. public function actionUpdatePurchasePrice()
  1009. {
  1010. $request = Yii::$app->request->post();
  1011. $order_main = OrderMain::findOne(['ORDER_ID' => $request['order_id'], 'CANCEL_FLAG' => 0]);
  1012. $data = json_decode($request['data'], true);
  1013. $transa = Yii::$app->db->beginTransaction();
  1014. try {
  1015. if (in_array($order_main['ORDER_STATUS'], array(198, 382))) // 待确认 - 退改中的订单需要生成修改单
  1016. {
  1017. OrderMain::updateAll(['ORDER_LEVEL' => 1], "CANCEL_FLAG=0 and ORDER_VALID_STATUS=1 and
  1018. (ORDER_ID={$request['order_id']} or PARENT_ORDER_ID={$request['order_id']})");
  1019. }
  1020. foreach ($data as $key => $day) {
  1021. // 查询订单入住该天的订单信息
  1022. $sel_old_info = OrderMain::find()
  1023. ->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'])
  1024. ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID AND b.ROOM_TYPE=a.PROD_ID and b.CANCEL_FLAG=0')
  1025. ->from('order_main a')
  1026. ->where(['a.PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'a.CANCEL_FLAG' => 0, 'a.ORDER_VALID_STATUS' => 1])
  1027. // -> createCommand()->getRawSql();
  1028. ->asArray()->one();
  1029. if ($sel_old_info['BASE_PRICE'] == $day['base_price']) continue; //如果当天价格相等则不进行修改
  1030. if (!$sel_old_info) {
  1031. throw new \Exception('修改采购价 -- 未找到相关信息');
  1032. }
  1033. // 只有待发单-待安排-退改中状态的订单允许进行修改
  1034. if (!in_array($sel_old_info['ORDER_STATUS'], array('313', '198', '382'))) {
  1035. throw new \Exception('事务异常-目前只有待发单-待安排-退改中状态的订单允许进行修改');
  1036. }
  1037. // 修改子订单采购价
  1038. $update_order = OrderMain::updateAll(['BASE_PRICE' => $day['base_price'], 'PROFIT_VALUE' => $sel_old_info['ORDER_PRICE'] - $sel_old_info['TOTAL_COMMISSION'] - $day['base_price'],
  1039. 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => Yii::$app->user->id],
  1040. ['ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date']]);
  1041. if (!$update_order) {
  1042. throw new \Exception('修改子订单成本价失败');
  1043. }
  1044. // 保存操作日志
  1045. $log_desc = "修改采购价:修改【{$day['run_date']}】采购价【{$sel_old_info['BASE_PRICE']}】为【{$day['base_price']}】";
  1046. $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'],
  1047. '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']);
  1048. $order_log = new OperaHotelLog();
  1049. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  1050. if (!$order_log->save()) {
  1051. throw new \Exception('记录修改日志失败!');
  1052. }
  1053. }
  1054. }
  1055. /** 修改主订单信息**/
  1056. // 计算子订单的成本和利润之和
  1057. $sum_orders = OrderMain::find()->select(['SUM(BASE_PRICE) as sum_base_price', 'SUM(PROFIT_VALUE) AS sum_profit_value'])
  1058. ->where(['PARENT_ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0])->asArray()->one();
  1059. if (empty($sum_orders)) {
  1060. throw new \Exception('修改采购价 -- 未找到子订单信息');
  1061. }
  1062. // 修改主订单
  1063. $update_parent_order = OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1064. 'BASE_PRICE' => $sum_orders['sum_base_price'], 'PROFIT_VALUE' => $sum_orders['sum_profit_value']],
  1065. ['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]);
  1066. if (!$update_parent_order) {
  1067. throw new \Exception('修改采购价 -- 修改主订单信息失败');
  1068. }
  1069. $transa->commit();
  1070. // 渠道预付款处理,修改采购价
  1071. $comm_model = new CommonOrder();
  1072. $update_res = $comm_model->previousBalance(CommonOrder::UPDATE_ORDER_DEDUCTION_TYPE, $request['order_id']);
  1073. if ($update_res['code'] != 0) {
  1074. // 通知处理
  1075. $this->sendAliMsgToRtx('预付款处理失败', '关联订单:' . "{$request['order_id']}\n" . '修改采购价:' . $update_res['msg'], $this->_developerList);
  1076. }
  1077. } catch (\Exception $e) {
  1078. $transa->rollBack();
  1079. return json_encode(array('code' => 1, 'info' => $e->getMessage()));
  1080. }
  1081. return json_encode(array('code' => 0, 'info' => '修改成功', 'order_id' => $request['order_id']));
  1082. }
  1083. /**
  1084. * Author:Steven
  1085. * Desc:直连失败订单处理
  1086. * @return string
  1087. */
  1088. public function actionExceptionOrder()
  1089. {
  1090. $flag = false;
  1091. $orderChannelInfo = new OrderChannelInfo(['scenario' => 'error_order']);
  1092. $data['orderChannelInfo'] = $orderChannelInfo;
  1093. if (Yii::$app->request->post()) {
  1094. $param = Yii::$app->request->post('OrderChannelInfo');
  1095. $outside_order_id = trim($param['channel_order_id']);
  1096. $order_id = trim($param['ORDER_ID']);
  1097. $order_main = OrderMain::find()
  1098. ->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')
  1099. ->select(['outside_sale_org_id', 'PARENT_PROD_ID', 'PROD_ID', 'opera_hotel_room.PARENT_ROOM_TYPE'])->where([
  1100. 'ORDER_ID' => $order_id,
  1101. 'PARENT_ORDER_ID' => 0,
  1102. 'order_main.CANCEL_FLAG' => 0,
  1103. 'OUTSIDE_ORDER_NO' => "{$outside_order_id}",
  1104. ])->asArray()->one();
  1105. if (empty($order_main)) {
  1106. return '<script>z.pjaxFinish("error", "订单不存在,请重新输入订单信息", "#float-div1");</script>';
  1107. }
  1108. if ($order_main['outside_sale_org_id'] == Yii::$app->params['ctrip']['supplier_id']) {
  1109. $effect_count = OrderChannelInfo::updateAll([
  1110. 'ORDER_ID' => $order_id,
  1111. ], "CANCEL_FLAG=0 and channel_order_id=$outside_order_id");
  1112. } elseif ($order_main['outside_sale_org_id'] == Yii::$app->params['ali']['supplier_id']) {
  1113. //这里需要查询ali_order的支付宝流水号
  1114. $ali_order = AliOrder::find()
  1115. ->select(['AlipayTradeNo'])
  1116. ->where(['TaoBaoOrderId' => $outside_order_id])
  1117. ->asArray()->one();
  1118. if (!empty($ali_order)) {
  1119. $orderLog = new OperaHotelLog();
  1120. $orderLog->CREATE_USER_ID = Yii::$app->params['ali']['base_user_id'];
  1121. $orderLog->HOTEL_ID = $order_main['PARENT_PROD_ID'];
  1122. $orderLog->LOG_TYPE = OperaHotelLog::LOG_TYPE_ORDER;
  1123. $orderLog->ROOM_TYPE = $order_main['PROD_ID'];
  1124. $orderLog->PARENT_ROOM_TYPE = $order_main['PARENT_ROOM_TYPE'];
  1125. $orderLog->LOG_DESC = "支付订单,支付宝流水号:" . $ali_order['AlipayTradeNo'];
  1126. $orderLog->ORDER_ID = $order_id;
  1127. }
  1128. }
  1129. $count = OrderMain::updateAll([
  1130. 'DOCKING_TYPE' => 556,
  1131. 'CHANNEL_ORDER_STATUS' => 550,
  1132. ], "ORDER_ID=$order_id or PARENT_ORDER_ID=$order_id");
  1133. $flag = true;
  1134. // 记录日志
  1135. if ($count) {
  1136. $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]);
  1137. $model->saveLog('exception-order');
  1138. }
  1139. return '<script>z.pjaxFinish("success", "直连成功", "#float-div1");$("#search-button").trigger(\'click\');</script>';
  1140. }
  1141. $data['flag'] = $flag;
  1142. return $this->render('_exception_order', ['data' => $data]);
  1143. }
  1144. /**
  1145. * @Author wanglg
  1146. * @Desc 修改销售价
  1147. */
  1148. public function actionUpdateSalePrice()
  1149. {
  1150. $request = Yii::$app->request->post();
  1151. // 首先判断订单是否是直连订单,直连订单不允许修改销售价
  1152. $main_order = OrderMain::findOne(['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]);
  1153. if ($main_order['DOCKING_TYPE'] == 556) // 556 直连 557 录单
  1154. {
  1155. return ['code' => 1, 'msg' => '直连订单不允许修改销售价'];
  1156. }
  1157. $data = json_decode($request['data'], true);
  1158. $transa = Yii::$app->db->beginTransaction();
  1159. try {
  1160. foreach ($data as $key => $day) {
  1161. // 查询订单入住该天的订单信息
  1162. $sel_old_info = OrderMain::find()
  1163. ->select(['a.ORDER_PRICE', 'a.OUTSIDE_SALE_ORG_ID', 'a.BASE_PRICE', 'b.HOTEL_ID', 'b.PARENT_ROOM_TYPE', 'b.ROOM_TYPE'])
  1164. ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID AND b.ROOM_TYPE=a.PROD_ID and b.CANCEL_FLAG=0')
  1165. ->from('order_main a')
  1166. ->where(['a.PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'a.CANCEL_FLAG' => 0, 'a.ORDER_VALID_STATUS' => 1])
  1167. // -> createCommand()->getRawSql();
  1168. ->asArray()->one();
  1169. if (!$sel_old_info) throw new \Exception('修改销售价 -- 未找到相关信息');
  1170. if ($sel_old_info['ORDER_PRICE'] == $day['sale_price']) continue; //如果当天价格相等则不进行修改
  1171. // 渠道佣金规则
  1172. $commission_role = BaseSupplier::find()
  1173. ->select(['b.BACK_COMMISION_METHOD', "b.BACK_PERCENT", "b.BACK_VALUE"])
  1174. ->innerJoin('base_supplier_sale as b', 'a.ID=b.SUPPLIER_ID AND b.PARENT_TYPE=25 and b.CANCEL_FLAG=0')
  1175. ->from('base_supplier as a')
  1176. ->where(['a.id' => $sel_old_info['OUTSIDE_SALE_ORG_ID'], 'a.CANCEL_FLAG' => 0, 'a.IS_DISABLED' => 0])->asArray()->one();
  1177. //更改销售价和利润
  1178. //修改销售单价的时候,渠道佣金也要根据当前设置佣金规则设置新的佣金金额
  1179. $commission_sql = empty($commission_role['BACK_COMMISION_METHOD']) ? 0
  1180. : ($commission_role['BACK_COMMISION_METHOD'] == 308 ? number_format($day['sale_price'] * $commission_role['BACK_PERCENT'] / 100, 2)
  1181. : $commission_role['BACK_VALUE']);
  1182. $profit = $day['sale_price'] - $sel_old_info['BASE_PRICE'] - $commission_sql;
  1183. $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],
  1184. ['PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'CANCEL_FLAG' => 0, 'ORDER_VALID_STATUS' => 1]);
  1185. if (!$update_orders) {
  1186. throw new \Exception('修改子订单成本价失败');
  1187. }
  1188. // 保存操作日志
  1189. $log_desc = "修改销售价:修改【{$day['run_date']}】销售价【{$sel_old_info['ORDER_PRICE']}】为【{$day['sale_price']}】";
  1190. $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'],
  1191. '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']);
  1192. $order_log = new OperaHotelLog();
  1193. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  1194. if (!$order_log->save()) {
  1195. throw new \Exception('记录修改日志失败!');
  1196. }
  1197. }
  1198. }
  1199. // 修改主订单信息
  1200. // 计算子订单的成本和利润之和
  1201. $sum_orders = OrderMain::find()
  1202. ->select(['SUM(ORDER_PRICE) as sum_order_price', 'SUM(TOTAL_COMMISSION) as sum_total_commission', 'SUM(PROFIT_VALUE) AS sum_profit_value'])
  1203. ->where(['PARENT_ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0])->asArray()->one();
  1204. if (empty($sum_orders)) {
  1205. throw new \Exception('修改销售价--未找到子订单信息');
  1206. }
  1207. // 修改主订单
  1208. $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'],
  1209. 'TOTAL_COMMISSION' => $sum_orders['sum_total_commission']], ['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]);
  1210. if (!$update_parent_order) {
  1211. throw new \Exception('修改销售价--修改主订单信息失败');
  1212. }
  1213. $transa->commit();
  1214. // 渠道预付款处理,修改采购价
  1215. $comm_model = new CommonOrder();
  1216. $update_res = $comm_model->previousBalance(CommonOrder::UPDATE_ORDER_DEDUCTION_TYPE, $request['order_id']);
  1217. if ($update_res['code'] != 0) {
  1218. $this->sendAliMsgToRtx('预付款处理失败', '关联订单:' . "{$request['order_id']}\n" . '修改销售价:' . $update_res['msg'], $this->_developerList);
  1219. }
  1220. } catch (\Exception $e) {
  1221. $transa->rollBack();
  1222. return json_encode(array('code' => 1, 'info' => $e->getMessage()));
  1223. }
  1224. return json_encode(array('code' => 0, 'info' => '修改成功'));
  1225. }
  1226. /**
  1227. * Displays a single OrderMain model.
  1228. * @param integer $id
  1229. * @return mixed
  1230. */
  1231. public function actionView($id)
  1232. {
  1233. $request = Yii::$app->request->get();
  1234. return $this->render('view', [
  1235. 'model' => $this->findModel($id),
  1236. ]);
  1237. }
  1238. /**
  1239. * Creates a new OrderMain model.
  1240. * If creation is successful, the browser will be redirected to the 'view' page.
  1241. * @return mixed
  1242. */
  1243. public function actionCreate()
  1244. {
  1245. $model = new OrderMain();
  1246. if ($model->load(Yii::$app->request->post()) && $model->save()) {
  1247. return $this->redirect(['view', 'id' => $model->ID]);
  1248. } else {
  1249. return $this->render('create', [
  1250. 'model' => $model,
  1251. ]);
  1252. }
  1253. }
  1254. /**
  1255. * Updates an existing OrderMain model.
  1256. * If update is successful, the browser will be redirected to the 'view' page.
  1257. * @param integer $id
  1258. * @return mixed
  1259. */
  1260. public function actionUpdate($id)
  1261. {
  1262. $model = $this->findModel($id);
  1263. if ($model->load(Yii::$app->request->post()) && $model->save()) {
  1264. return $this->redirect(['view', 'id' => $model->ID]);
  1265. } else {
  1266. return $this->render('update', [
  1267. 'model' => $model,
  1268. ]);
  1269. }
  1270. }
  1271. /**
  1272. * Deletes an existing OrderMain model.
  1273. * If deletion is successful, the browser will be redirected to the 'index' page.
  1274. * @param integer $id
  1275. * @return mixed
  1276. */
  1277. public function actionDelete($id)
  1278. {
  1279. $this->findModel($id)->delete();
  1280. return $this->redirect(['index']);
  1281. }
  1282. /**
  1283. * Finds the OrderMain model based on its primary key value.
  1284. * If the model is not found, a 404 HTTP exception will be thrown.
  1285. * @param integer $id
  1286. * @return OrderMain the loaded model
  1287. * @throws NotFoundHttpException if the model cannot be found
  1288. */
  1289. protected function findModel($id)
  1290. {
  1291. if (($model = OrderMain::findOne($id)) !== null) {
  1292. return $model;
  1293. } else {
  1294. throw new NotFoundHttpException('The requested page does not exist.');
  1295. }
  1296. }
  1297. /**
  1298. * CS调用订单是否可下
  1299. *
  1300. * @param $hotel integer
  1301. * @param $room integer
  1302. * @param $channel integer
  1303. * @param $date string 日期 用,分隔
  1304. * @param $count string 日期对应的数量 用,分隔
  1305. *
  1306. * @author wangxj
  1307. */
  1308. public function actionCheckAvailable($hotel, $room, $channel, $date, $count)
  1309. {
  1310. $date_array = explode(',', $date);
  1311. $count_array = explode(',', $count);
  1312. if (count($date_array) === count($count_array)) {
  1313. $result = ['flag' => 'true', 'message' => []];
  1314. $data = [
  1315. 'PROD_ID' => $room,
  1316. 'PARENT_PROD_ID' => $hotel,
  1317. 'OUTSIDE_SALE_ORG_ID' => $channel,
  1318. ];
  1319. foreach ($date_array as $key => $item) {
  1320. $tmp_order = new OrderMain();
  1321. $tmp_order->load($data + ['RUN_DATE' => $item, 'room_count' => $count_array[$key]], '');
  1322. $tmp_order->orderAvailable();
  1323. if ($tmp_order->hasErrors()) {
  1324. $result['flag'] = 'false';
  1325. $result['message'][] = $tmp_order->getErrorMsg();
  1326. }
  1327. }
  1328. $result['message'] = array_unique($result['message']);
  1329. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  1330. return $result;
  1331. } else {
  1332. throw new HttpException('400', '数据不匹配,无法操作');
  1333. }
  1334. }
  1335. /**
  1336. * @Author wanglg
  1337. * @Desc获取房型库存价格列表
  1338. * @return array
  1339. */
  1340. public function actionGetPriceList()
  1341. {
  1342. /*$param = [
  1343. 'RoomNum' => 2,
  1344. 'RoomID' => 2474,
  1345. 'DistribID' => 669,
  1346. 'CheckIn' => '2018-01-18',
  1347. 'CheckOut' => '2018-01-21',
  1348. ];*/
  1349. $request = Yii::$app->request->post();
  1350. if (empty($request['RoomNum'])) {
  1351. return json_encode(array('code' => 1, 'info' => '缺少必要参数'));
  1352. }
  1353. $orderModel = new CommonOrder(['scenario' => 'Product']);
  1354. if ($orderModel->load($request, '') && $orderModel->validate()) {
  1355. $price_res = $orderModel->getHotelStock();
  1356. // return json_encode($price_res);
  1357. return json_encode(array('code' => 0, 'info' => '获取成功', 'data' => $price_res));
  1358. } else {
  1359. $error = array_values($orderModel->getFirstErrors());
  1360. return json_encode(array('code' => 1, 'info' => implode('|', $error)));
  1361. }
  1362. }
  1363. /**
  1364. * @Author wanglg
  1365. * @Desc 导出订单信息
  1366. */
  1367. public function actionExport()
  1368. {
  1369. set_time_limit(0);
  1370. ini_set("memory_limit", "-1");
  1371. $obj = new searchOrderMain();
  1372. $obj->date_from = date('Y-m-d', strtotime('-3 days'));
  1373. $obj->date_to = date('Y-m-d');
  1374. $search = Yii::$app->request->queryParams;
  1375. $dataProvider = $obj->exportList($search);
  1376. $data = $dataProvider->getModels();
  1377. $date_type = $search['searchOrderMain']['date_type'] == 1 ? '预订日期' : (($search['searchOrderMain']['date_type'] == 2) ? '入住日期' : '离店日期');
  1378. $objPHPExcel = new zPhpExcel(); //实例化PHPExcel类
  1379. $cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
  1380. if (!\PHPExcel_Settings::setCacheStorageMethod($cacheMethod)) {
  1381. die($cacheMethod . " 缓存方法不可用" . EOL);
  1382. }
  1383. $objSheet = $objPHPExcel->getActiveSheet(); //获取当前活动sheet的操作对象
  1384. $objSheet->setTitle('User');
  1385. $objPHPExcel->file_name = '订单信息' . date('Y-m-d H_i_s') . '_' . $date_type;
  1386. // 定义要需要导出的字段
  1387. $order_sort = ['ORDER_ID', 'PARENT_PROD_NAME', 'PROD_NAME', 'CREATE_TIME', 'CREATE_USER_NAME', 'PROD_SUPPLY_ORG_NAME', 'PROD_START_STATION_DATE',
  1388. 'PROD_END_STATION_DATE', 'room_count', 'ORDER_CONFIRM_CODE', 'CUSTOMER_NAME', 'CUSTOMER_MOBILE', 'SUPPLIER_NAME', 'OUTSIDE_ORDER_NO', 'ORDER_PRICE', 'BASE_PRICE', 'TOTAL_COMMISSION',
  1389. 'PROFIT_VALUE', 'PAY_WAY', 'ORDER_STATUS', 'CUSTOMER_MEMO', 'SALES_NAME', 'PRINCIPAL', 'ORDER_TITLE_ID'];
  1390. //设置表头
  1391. $a_k = range('A', 'X');
  1392. foreach ($a_k as $key => $item) {
  1393. $objSheet->setCellValue($item . '1', $obj->getAttributeLabel($order_sort[$key]));
  1394. }
  1395. foreach ($data as $key => $datum) {
  1396. foreach ($a_k as $index => $item) {
  1397. if ($item == 'M')
  1398. $objSheet->setCellValue($item . ($key + 2), $datum->baseChannel->SUPPLIER_NAME);
  1399. elseif ($item == 'E') // 操作人, 客服
  1400. $objSheet->setCellValue($item . ($key + 2), $datum->user->TRUE_NAME);
  1401. elseif ($item == 'I') // 间夜数
  1402. $objSheet->setCellValue($item . ($key + 2), $datum['room_count']);
  1403. elseif ($item == 'V') // 采购负责人
  1404. $objSheet->setCellValue($item . ($key + 2), $datum->salesMan->TRUE_NAME);
  1405. elseif ($item == 'W') // 运营负责人
  1406. $objSheet->setCellValue($item . ($key + 2), $datum->principalMan->TRUE_NAME);
  1407. elseif ($item == 'S') // 支付方式
  1408. $objSheet->setCellValue($item . ($key + 2), $datum->baseChannel->settleType->TYPE_NAME);
  1409. elseif ($item == 'T') // 订单状态
  1410. $objSheet->setCellValue($item . ($key + 2), $datum->statusLabel->TYPE_NAME);
  1411. elseif ($item == 'X') // 组合单
  1412. {
  1413. $group = ($datum->ORDER_TITLE_ID == 0) ? '否' : '是(组合订单号:' . $datum->ORDER_TITLE_ID . ')';
  1414. $objSheet->setCellValue($item . ($key + 2), $group);
  1415. } else
  1416. $objSheet->setCellValue($item . ($key + 2), $datum->$order_sort[$index]);
  1417. }
  1418. }
  1419. //设置宽度
  1420. $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]);
  1421. $objPHPExcel->output();
  1422. }
  1423. /**
  1424. * @Author wanglg
  1425. * @Desc 导出订单格式CSV
  1426. */
  1427. public function actionExportCsv()
  1428. {
  1429. set_time_limit(0);
  1430. ini_set("memory_limit", "-1");
  1431. $obj = new searchOrderMain();
  1432. $obj->date_from = date('Y-m-d', strtotime('-3 days'));
  1433. $obj->date_to = date('Y-m-d');
  1434. $search = Yii::$app->request->queryParams;
  1435. $dataProvider = $obj->exportList($search);
  1436. $data = $dataProvider->getModels();
  1437. $date_type = $search['searchOrderMain']['date_type'] == 1 ? '预订日期' : (($search['searchOrderMain']['date_type'] == 2) ? '入住日期' : '离店日期');
  1438. $file_name = '订单信息 时间范围 ' . $search['searchOrderMain']['date_from'] . '~' . $search['searchOrderMain']['date_to'] . '_' . date('Y-m-d H_i_s') . '_' . $date_type;
  1439. // 输出Excel文件头,可把user.csv换成你要的文件名
  1440. header('Content-Type: application/vnd.ms-excel;charset=UTF-8');
  1441. header('Content-Disposition: attachment;filename="' . $file_name . '.csv"');
  1442. header('Cache-Control: max-age=0');
  1443. $fp = fopen('php://output', 'a');
  1444. $order_sort = ['订单编号', '酒店名称', '预订产品', '预定时间', '预订人', '供应商', '入住时间',
  1445. '离店时间', '间夜数', '确认号', '客人姓名', '联系电话', '渠道商', '渠道商订单号', '订单金额', '成本金额', '渠道佣金',
  1446. '利润', '支付方式', '订单状态', '备注', '采购负责人', '运营负责人', '是否是组合订单'];
  1447. $attrs = ['ORDER_ID', 'PARENT_PROD_NAME', 'PROD_NAME', 'CREATE_TIME', 'CREATE_USER_NAME', 'PROD_SUPPLY_ORG_NAME', 'PROD_START_STATION_DATE',
  1448. 'PROD_END_STATION_DATE', 'room_count', 'ORDER_CONFIRM_CODE', 'CUSTOMER_NAME', 'CUSTOMER_MOBILE', 'SUPPLIER_NAME', 'OUTSIDE_ORDER_NO', 'ORDER_PRICE', 'BASE_PRICE', 'TOTAL_COMMISSION',
  1449. 'PROFIT_VALUE', 'PAY_WAY', 'ORDER_STATUS', 'CUSTOMER_MEMO', 'SALES_NAME', 'PRINCIPAL', 'ORDER_TITLE_ID'];
  1450. foreach ($order_sort as $key => $item) {
  1451. $order_sort[$key] = iconv('utf-8', 'GB18030', $item);
  1452. }
  1453. fputcsv($fp, $order_sort);
  1454. $data_count = count($data);
  1455. $num = 0; // 订单下标
  1456. while ($num < $data_count) {
  1457. $put_data = array();
  1458. foreach ($attrs as $k => $attr) {
  1459. if ($attr == 'CREATE_USER_NAME') {
  1460. $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->user->TRUE_NAME);
  1461. } elseif ($attr == 'SUPPLIER_NAME') {
  1462. $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->baseChannel->SUPPLIER_NAME);
  1463. } elseif ($attr == 'room_count') // 间夜数
  1464. {
  1465. $put_data[] = iconv('utf-8', 'GB18030', $data[$num]['room_count']);
  1466. } elseif ($attr == 'SALES_NAME') // 采购负责人
  1467. {
  1468. $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->salesMan->TRUE_NAME);
  1469. } elseif ($attr == 'PRINCIPAL') // 运营负责人
  1470. {
  1471. $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->principalMan->TRUE_NAME);
  1472. } elseif ($attr == 'PAY_WAY') {
  1473. $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->baseChannel->settleType->TYPE_NAME);
  1474. } elseif ($attr == 'ORDER_STATUS') // 订单状态
  1475. {
  1476. $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->statusLabel->TYPE_NAME);
  1477. } elseif ($attr == 'ORDER_TITLE_ID') // 组合单
  1478. {
  1479. $group = ($data[$num]->ORDER_TITLE_ID == 0) ? '否' : '是(组合订单号:' . $data[$num]->ORDER_TITLE_ID . ')';
  1480. $put_data[] = iconv('utf-8', 'GB18030', $group);
  1481. } 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') // 组合单
  1482. {
  1483. $put_data[] = (string)iconv('utf-8', 'GB18030', $data[$num]->$attr);
  1484. } else {
  1485. $put_data[] = iconv('utf-8', 'GB18030', $data[$num]->$attr . "\t");
  1486. }
  1487. }
  1488. fputcsv($fp, $put_data);
  1489. if (is_int($num / 5000)) {
  1490. ob_flush();
  1491. flush();
  1492. }
  1493. $num++;
  1494. }
  1495. exit();
  1496. }
  1497. /**
  1498. * @Author wanglg
  1499. * @Desc 添加备注信息
  1500. * @param $order_id
  1501. * @param $comment_type
  1502. * @param $comment_txt
  1503. * @return bool|string
  1504. */
  1505. public function actionAddcomment($order_id, $comment_type, $comment_txt)
  1506. {
  1507. $comment_arr = array('ORDER_ID' => $order_id, 'COMMENT_TYPE' => $comment_type, 'COMMENT_TXT' => $comment_txt,
  1508. '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');
  1509. $comment = new OrderComment();
  1510. if ($comment->load($comment_arr, '') && $comment->validate()) {
  1511. if (!$comment->save()) {
  1512. return false;
  1513. }
  1514. }
  1515. $data['order_comment'] = OrderComment::find()
  1516. ->joinWith('user')
  1517. ->where(['ORDER_ID' => $order_id, 'COMMENT_TYPE' => [0, 1], 'order_comment.CANCEL_FLAG' => 0])->asArray()->all();
  1518. return $this->render('order_detail', ['data' => $data]);
  1519. }
  1520. /**
  1521. * @Author wanglg
  1522. * @Desc 订单详情页
  1523. * @return string
  1524. */
  1525. public function actionDetail()
  1526. {
  1527. $id = Yii::$app->request->get('id');
  1528. $model = new OrderMain();
  1529. $model->setScenario('csBook');
  1530. $comment_model = new OrderComment();
  1531. $common_order = new CommonOrder();
  1532. $stock_arr[1] = ['stock_id' => 0, 'stock_count' => 0];
  1533. $order_log_model = new OperaHotelLog();
  1534. if (Yii::$app->request->isAjax) {
  1535. $request = Yii::$app->request->get();
  1536. //订单详情操作:读取和修改
  1537. // 备注添加
  1538. if ($request['deal_type'] == 1) {
  1539. $model->comment($request);
  1540. }
  1541. // 删除备注
  1542. if ($request['deal_type'] == 2) {
  1543. $model->delComment($request);
  1544. }
  1545. // 修改客人信息
  1546. if ($request['deal_type'] == 3) {
  1547. $model->updateCustomer($request);
  1548. }
  1549. // 修改入住需求
  1550. if ($request['deal_type'] == 6) {
  1551. $model->updateCheckIn($request);
  1552. }
  1553. // 修改销售价
  1554. if ($request['deal_type'] == 7) {
  1555. $this->actionUpdateOrderPrice($id, $request);
  1556. }
  1557. // 修改采购价
  1558. if ($request['deal_type'] == 8) {
  1559. $this->actionUpdateBasePrice($id, $request);
  1560. }
  1561. // 获取订单详情信息
  1562. $data = $model->orderDetail($id);
  1563. // 获取价格信息
  1564. if ($request['deal_type'] == 5) {
  1565. $common_order->setScenario('Product');
  1566. $stock_res = $common_order->getOrderRoomNum($id, $request);
  1567. $stock_arr = empty($stock_res) ? $stock_arr : $stock_res;
  1568. $load_html = $model->getStockPriceList($request);
  1569. $data['hotel_child_order_detail'] = $load_html;
  1570. if (!empty($load_html)) {
  1571. $main_order['ORDER_PRICE'] = array_sum(array_column($load_html, 'ALL_PRICE'));
  1572. $main_order['TOTAL_MID_PRICE'] = array_sum(array_column($load_html, 'MID_PRICE'));
  1573. $main_order['TOTAL_COMMISSION'] = array_sum(array_column($load_html, 'TOTAL_COMMISSION'));
  1574. $main_order['PROFIT_VALUE'] = array_sum(array_column($load_html, 'BENEFIT'));
  1575. }
  1576. }
  1577. if ($request['deal_type'] == 9) {
  1578. $order_logs = $order_log_model->getOrderLog($id, $request['user_id']);
  1579. }
  1580. } else {
  1581. $data = $model->orderDetail($id);
  1582. $order_logs = $order_log_model->getOrderLog($id);
  1583. }
  1584. $supplier = new \backend\modules\api\models\BaseSupplier();
  1585. $channel_list = $supplier->getChannelList();
  1586. $log_users = $order_log_model->getLogUser($id);
  1587. foreach ($data['data'] as $order) {
  1588. if ($order['PARENT_ORDER_ID'] == 0) {
  1589. $main_order = $order;
  1590. }
  1591. }
  1592. return $this->render('order_detail', [
  1593. 'hotel_log' => $order_log_model,
  1594. 'log' => $order_logs,
  1595. 'log_users' => $log_users,
  1596. 'model' => $model,
  1597. 'channel_list' => $channel_list,
  1598. 'data' => $data,
  1599. 'comment_model' => $comment_model,
  1600. 'common_order' => $common_order,
  1601. 'stock_arr' => $stock_arr,
  1602. 'child_order' => $data['hotel_child_order_detail'],
  1603. 'main_order' => $main_order]);
  1604. }
  1605. /**
  1606. * @Author wanglg
  1607. * @Desc 修改销售价
  1608. * @throws \yii\db\Exception
  1609. */
  1610. public function actionUpdateOrderPrice($order_id, $request)
  1611. {
  1612. // 首先判断订单是否是直连订单,直连订单不允许修改销售价
  1613. $main_order = OrderMain::findOne(['ORDER_ID' => $order_id, 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]);
  1614. if ($main_order['DOCKING_TYPE'] == 556) // 556 直连 557 录单
  1615. {
  1616. return ['code' => 1, 'msg' => '直连订单不允许修改销售价'];
  1617. }
  1618. $data = json_decode($request['data'], true);
  1619. $transa = Yii::$app->db->beginTransaction();
  1620. try {
  1621. foreach ($data as $key => $day) {
  1622. // 查询订单入住该天的订单信息
  1623. $sel_old_info = OrderMain::find()
  1624. ->select(['a.ID', 'a.ORDER_PRICE', 'a.OUTSIDE_SALE_ORG_ID', 'a.BASE_PRICE', 'b.HOTEL_ID', 'b.PARENT_ROOM_TYPE', 'b.ROOM_TYPE'])
  1625. ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID AND b.ROOM_TYPE=a.PROD_ID and b.CANCEL_FLAG=0')
  1626. ->from('order_main a')
  1627. ->where(['a.PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'a.CANCEL_FLAG' => 0, 'a.ORDER_VALID_STATUS' => 1])
  1628. // -> createCommand()->getRawSql();
  1629. ->asArray()->all();
  1630. if (!$sel_old_info) throw new \Exception('修改销售价 -- 未找到相关信息');
  1631. if ($sel_old_info['ORDER_PRICE'] == $day['sale_price']) continue; //如果当天价格相等则不进行修改
  1632. // 渠道佣金规则
  1633. $commission_role = BaseSupplier::find()
  1634. ->select(['b.BACK_COMMISION_METHOD', "b.BACK_PERCENT", "b.BACK_VALUE"])
  1635. ->innerJoin('base_supplier_sale as b', 'a.ID=b.SUPPLIER_ID AND b.PARENT_TYPE=25 and b.CANCEL_FLAG=0')
  1636. ->from('base_supplier as a')
  1637. ->where(['a.id' => $sel_old_info['OUTSIDE_SALE_ORG_ID'], 'a.CANCEL_FLAG' => 0, 'a.IS_DISABLED' => 0])->asArray()->one();
  1638. //更改销售价和利润
  1639. //修改销售单价的时候,渠道佣金也要根据当前设置佣金规则设置新的佣金金额
  1640. $commission_sql = empty($commission_role['BACK_COMMISION_METHOD']) ? 0
  1641. : ($commission_role['BACK_COMMISION_METHOD'] == 308 ? number_format($day['sale_price'] * $commission_role['BACK_PERCENT'] / 100, 2)
  1642. : $commission_role['BACK_VALUE']);
  1643. foreach ($sel_old_info as $old_info) {
  1644. $profit = $day['sale_price'] - $old_info['BASE_PRICE'] - $commission_sql;
  1645. $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],
  1646. ['ID' => $old_info["ID"], 'PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'CANCEL_FLAG' => 0, 'ORDER_VALID_STATUS' => 1]);
  1647. if (!$update_orders) {
  1648. throw new \Exception('修改子订单成本价失败');
  1649. }
  1650. }
  1651. // 保存操作日志
  1652. $log_desc = "修改销售价:修改【{$day['run_date']}】销售价【{$sel_old_info[0]['ORDER_PRICE']}】为【{$day['sale_price']}】";
  1653. $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'],
  1654. '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']);
  1655. $order_log = new OperaHotelLog();
  1656. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  1657. if (!$order_log->save()) {
  1658. throw new \Exception('记录修改日志失败!');
  1659. }
  1660. }
  1661. }
  1662. /** 修改主订单信息**/
  1663. // 计算子订单的成本和利润之和
  1664. $sum_orders = OrderMain::find()
  1665. ->select(['SUM(ORDER_PRICE) as sum_order_price', 'SUM(TOTAL_COMMISSION) as sum_total_commission', 'SUM(PROFIT_VALUE) AS sum_profit_value'])
  1666. ->where(['PARENT_ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0])->asArray()->one();
  1667. if (empty($sum_orders)) {
  1668. throw new \Exception('修改销售价--未找到子订单信息');
  1669. }
  1670. // 修改主订单
  1671. $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'],
  1672. 'TOTAL_COMMISSION' => $sum_orders['sum_total_commission']], ['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]);
  1673. if (!$update_parent_order) {
  1674. throw new \Exception('修改销售价--修改主订单信息失败');
  1675. }
  1676. $transa->commit();
  1677. // 渠道预付款处理,修改采购价
  1678. $comm_model = new CommonOrder();
  1679. $update_res = $comm_model->previousBalance(CommonOrder::UPDATE_ORDER_DEDUCTION_TYPE, $request['order_id']);
  1680. if ($update_res['code'] != 0) {
  1681. $this->sendAliMsgToRtx('预付款处理失败', '关联订单:' . "{$request['order_id']}\n" . '修改销售价:' . $update_res['msg'], $this->_developerList);
  1682. }
  1683. } catch (\Exception $e) {
  1684. $transa->rollBack();
  1685. return ['code' => 1, 'info' => $e->getMessage()];
  1686. }
  1687. return ['code' => 0, 'info' => '修改成功'];
  1688. }
  1689. /**
  1690. * @Author wanglg
  1691. * @Desc修改采购价
  1692. * @return string
  1693. */
  1694. public function actionUpdateBasePrice($order_id, $request)
  1695. {
  1696. $order_main = OrderMain::findOne(['ORDER_ID' => $order_id, 'CANCEL_FLAG' => 0]);
  1697. $data = json_decode($request['data'], true);
  1698. $transa = Yii::$app->db->beginTransaction();
  1699. try {
  1700. if (in_array($order_main['ORDER_STATUS'], array(198, 382))) // 待确认 - 退改中的订单需要生成修改单
  1701. {
  1702. OrderMain::updateAll(['ORDER_LEVEL' => 1], "CANCEL_FLAG=0 and ORDER_VALID_STATUS=1 and
  1703. (ORDER_ID={$request['order_id']} or PARENT_ORDER_ID={$request['order_id']})");
  1704. }
  1705. foreach ($data as $key => $day) {
  1706. // 查询订单入住该天的订单信息
  1707. $sel_old_info = OrderMain::find()
  1708. ->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'])
  1709. ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID AND b.ROOM_TYPE=a.PROD_ID and b.CANCEL_FLAG=0')
  1710. ->from('order_main a')
  1711. ->where(['a.PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date'], 'a.CANCEL_FLAG' => 0, 'a.ORDER_VALID_STATUS' => 1])
  1712. ->groupBy('RUN_DATE')
  1713. ->asArray()->one();
  1714. if ($sel_old_info['BASE_PRICE'] == $day['base_price']) continue; //如果当天价格相等则不进行修改
  1715. if (!$sel_old_info) {
  1716. throw new \Exception('修改采购价 -- 未找到相关信息');
  1717. }
  1718. // 只有待发单-待安排-退改中状态的订单允许进行修改
  1719. if (!in_array($sel_old_info['ORDER_STATUS'], array('313', '198', '382'))) {
  1720. throw new \Exception('事务异常-目前只有待发单-待安排-退改中状态的订单允许进行修改');
  1721. }
  1722. // 修改子订单采购价
  1723. $update_order = OrderMain::updateAll(['BASE_PRICE' => $day['base_price'], 'PROFIT_VALUE' => $sel_old_info['ORDER_PRICE'] - $sel_old_info['TOTAL_COMMISSION'] - $day['base_price'],
  1724. 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => Yii::$app->user->id],
  1725. ['ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $request['order_id'], 'RUN_DATE' => $day['run_date']]);
  1726. if (!$update_order) {
  1727. throw new \Exception('修改子订单成本价失败');
  1728. }
  1729. // 保存操作日志
  1730. $log_desc = "修改采购价:修改【{$day['run_date']}】采购价【{$sel_old_info['BASE_PRICE']}】为【{$day['base_price']}】";
  1731. $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'],
  1732. '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']);
  1733. $order_log = new OperaHotelLog();
  1734. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  1735. if (!$order_log->save()) {
  1736. throw new \Exception('记录修改日志失败!');
  1737. }
  1738. }
  1739. }
  1740. /** 修改主订单信息**/
  1741. // 计算子订单的成本和利润之和
  1742. $sum_orders = OrderMain::find()->select(['SUM(BASE_PRICE) as sum_base_price', 'SUM(PROFIT_VALUE) AS sum_profit_value'])
  1743. ->where(['PARENT_ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0])->asArray()->one();
  1744. if (empty($sum_orders)) {
  1745. throw new \Exception('修改采购价 -- 未找到子订单信息');
  1746. }
  1747. // 修改主订单
  1748. $update_parent_order = OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1749. 'BASE_PRICE' => $sum_orders['sum_base_price'], 'PROFIT_VALUE' => $sum_orders['sum_profit_value']],
  1750. ['ORDER_ID' => $request['order_id'], 'ORDER_VALID_STATUS' => 1, 'CANCEL_FLAG' => 0]);
  1751. if (!$update_parent_order) {
  1752. throw new \Exception('修改采购价 -- 修改主订单信息失败');
  1753. }
  1754. $transa->commit();
  1755. // 渠道预付款处理,修改采购价
  1756. $comm_model = new CommonOrder();
  1757. $update_res = $comm_model->previousBalance(CommonOrder::UPDATE_ORDER_DEDUCTION_TYPE, $request['order_id']);
  1758. if ($update_res['code'] != 0) {
  1759. // 通知处理
  1760. $this->sendAliMsgToRtx('预付款处理失败', '关联订单:' . "{$request['order_id']}\n" . '修改采购价:' . $update_res['msg'], $this->_developerList);
  1761. }
  1762. } catch (\Exception $e) {
  1763. $transa->rollBack();
  1764. return json_encode(array('code' => 1, 'info' => $e->getMessage()));
  1765. }
  1766. return json_encode(array('code' => 0, 'info' => '修改成功', 'order_id' => $request['order_id']));
  1767. }
  1768. /**
  1769. * @Author wanglg
  1770. * @Desc 修改入住需求时获取库存,合并以前的库存数量
  1771. * @return string
  1772. */
  1773. public function actionGetChannelStock()
  1774. {
  1775. $request = Yii::$app->request->post();
  1776. $orderModel = new CommonOrder(['scenario' => 'Product']);
  1777. if ($orderModel->load($request, '') && $orderModel->validate()) {
  1778. $getStockRes = $orderModel->dealStock($request['order_id'], $request);
  1779. return json_encode(array('code' => 0, 'info' => '成功', 'data' => $getStockRes));
  1780. } else {
  1781. $error = array_values($orderModel->getFirstErrors());
  1782. return json_encode(['code' => 1, 'info' => $error[0]]);
  1783. }
  1784. }
  1785. }
  1786. ?>