Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

2397 righe
107 KiB

  1. <?php
  2. namespace backend\modules\api\models;
  3. use backend\modules\api\util\KxTicketUtil;
  4. use backend\modules\api\util\Util;
  5. use backend\modules\zzcs\models\BaseSupplierSale;
  6. use common\models\Msg;
  7. use yii\base\Exception;
  8. use yii\db\ActiveRecord;
  9. use Yii;
  10. use yii\db\Expression;
  11. /**
  12. * This is the model class for table "order_main".
  13. *
  14. * @property integer $ID
  15. * @property integer $CANCEL_FLAG
  16. * @property integer $MAIN_CREATE_USER_ID
  17. * @property integer $CREATE_USER_ID
  18. * @property string $CREATE_TIME
  19. * @property integer $UPDATE_USER_ID
  20. * @property string $UPDATE_TIME
  21. * @property integer $SALE_ORG_ID
  22. * @property integer $SALE_TOP_ORG_ID
  23. * @property integer $PROD_TOP_ORG_ID
  24. * @property integer $ORDER_ID
  25. * @property string $ORDER_DESCRIPTION
  26. * @property string $OUTSIDE_ORDER_NO
  27. * @property integer $ORDER_VALID_STATUS
  28. * @property integer $ORDER_BOOK_STATUS
  29. * @property integer $ORDER_PAY_STATUS
  30. * @property integer $ORDER_PAY_MAIN_ID
  31. * @property integer $ORDER_PAY_USER_ID
  32. * @property string $ORDER_PAY_TIME
  33. * @property integer $ORDER_PRINT_TIMES
  34. * @property integer $PARENT_ORDER_ID
  35. * @property integer $PROD_ID
  36. * @property integer $PARENT_PROD_ID
  37. * @property string $PROD_NAME
  38. * @property string $PARENT_PROD_NAME
  39. * @property string $ORDER_PRICE
  40. * @property string $ORDER_PROD_TYPE
  41. * @property string $PROD_SUPPLY_ORG_NAME
  42. * @property string $BASE_PRICE
  43. * @property string $MID_PRICE
  44. * @property integer $RUN_ID
  45. * @property string $RUN_DATE
  46. * @property integer $RUN_DATE_NUM
  47. * @property string $RUN_TIME
  48. * @property integer $RUN_TIME_MINUTES
  49. * @property integer $RUN_BUS_ORDER_ID
  50. * @property integer $RUN_BUS_SEAT_TYPE
  51. * @property integer $RUN_BUS_SEAT_SEQ_ID
  52. * @property integer $RUN_BUS_SEAT_ID
  53. * @property string $RUN_BUS_SEAT_NAME
  54. * @property integer $PROD_START_STATION_RES_ID
  55. * @property string $PROD_START_STATION_RES_NAME
  56. * @property integer $PROD_START_STATION_CHECKPORT_RES_ID
  57. * @property string $PROD_START_STATION_CHECKPORT_RES_NAME
  58. * @property integer $PROD_START_STATION_SEQ_ID
  59. * @property string $PROD_START_STATION_DATE
  60. * @property integer $PROD_START_STATION_DATE_NUM
  61. * @property string $PROD_START_STATION_TIME
  62. * @property integer $PROD_START_STATION_TIME_MINUTES
  63. * @property integer $PROD_START_STATION_AREA_ID
  64. * @property string $PROD_START_STATION_AREA_NAME
  65. * @property integer $PROD_END_STATION_RES_ID
  66. * @property string $PROD_END_STATION_RES_NAME
  67. * @property integer $PROD_END_STATION_SEQ_ID
  68. * @property string $PROD_END_STATION_DATE
  69. * @property integer $PROD_END_STATION_DATE_NUM
  70. * @property string $PROD_END_STATION_TIME
  71. * @property integer $PROD_END_STATION_TIME_MINUTES
  72. * @property integer $PROD_END_STATION_AREA_ID
  73. * @property string $PROD_END_STATION_AREA_NAME
  74. * @property string $CUSTOMER_NAME
  75. * @property integer $CUSTOMER_SEX
  76. * @property string $CUSTOMER_MOBILE
  77. * @property integer $CUSTOMER_ID_TYPE
  78. * @property string $CUSTOMER_ID_NO
  79. * @property string $CUSTOMER_ADDRESS
  80. * @property integer $CUSTOMER_ADDRESS_AREA_ID
  81. * @property string $CUSTOMER_POSTCODE
  82. * @property string $CUSTOMER_MEMO
  83. * @property integer $MEMBER_ID
  84. * @property integer $MEMBER_SCORE_PAY
  85. * @property integer $MEMBER_SCORE_GET
  86. * @property integer $ORDER_STATUS
  87. * @property integer $ORDER_DISABLE_TYPE
  88. * @property integer $ORDER_DISABLE_USER_ID
  89. * @property string $ORDER_DISABLE_TIME
  90. * @property string $ORDER_DISABLE_PERCENT
  91. * @property string $ORDER_DISABLE_FEE
  92. * @property integer $ORDER_DISABLE_APPLY_USER_ID
  93. * @property string $ORDER_DISABLE_APPLY_TIME
  94. * @property string $KEEP_END_TIME
  95. * @property integer $KEEP_END_MINUTES
  96. * @property integer $if_gift
  97. * @property integer $reorder_times
  98. * @property integer $IF_LAST_PROD
  99. * @property integer $ORDER_LEVEL
  100. * @property string $ORDER_CONFIRM_CODE
  101. * @property integer $OUTSIDE_SALE_ORG_ID
  102. * @property integer $IS_UP
  103. * @property integer $APPLY_ID
  104. * @property string $SALES_MAN
  105. * @property string $RECEIVE_VALUE
  106. * @property integer $REAL_PASSENGER_NUM
  107. * @property integer $STOCK_TYPE
  108. * @property integer $REFUSE_FLAG
  109. * @property string $PROFIT_VALUE
  110. * @property string $TOTAL_COMMISSION
  111. * @property integer $ORDER_TITLE_ID
  112. * @property integer $MAIN_CORP_ID
  113. */
  114. class OrderMain extends ActiveRecord
  115. {
  116. /**
  117. * @inheritdoc
  118. */
  119. public static function tableName()
  120. {
  121. return 'order_main';
  122. }
  123. /**
  124. * @inheritdoc
  125. */
  126. public function rules()
  127. {
  128. return [
  129. [['ID', 'ORDER_BOOK_STATUS', 'PROD_START_STATION_TIME_MINUTES'], 'required'],
  130. [['ID', 'CANCEL_FLAG', 'MAIN_CREATE_USER_ID', 'CREATE_USER_ID', 'UPDATE_USER_ID', 'SALE_ORG_ID', 'SALE_TOP_ORG_ID', 'PROD_TOP_ORG_ID', 'ORDER_ID', 'ORDER_VALID_STATUS', 'ORDER_BOOK_STATUS', 'ORDER_PAY_STATUS', 'ORDER_PAY_MAIN_ID', 'ORDER_PAY_USER_ID', 'ORDER_PRINT_TIMES', 'PARENT_ORDER_ID', 'PROD_ID', 'PARENT_PROD_ID', 'ORDER_PROD_TYPE', 'RUN_ID', 'RUN_DATE_NUM', 'RUN_TIME_MINUTES', 'RUN_BUS_ORDER_ID', 'RUN_BUS_SEAT_TYPE', 'RUN_BUS_SEAT_SEQ_ID', 'RUN_BUS_SEAT_ID', 'PROD_START_STATION_RES_ID', 'PROD_START_STATION_CHECKPORT_RES_ID', 'PROD_START_STATION_SEQ_ID', 'PROD_START_STATION_DATE_NUM', 'PROD_START_STATION_TIME_MINUTES', 'PROD_START_STATION_AREA_ID', 'PROD_END_STATION_RES_ID', 'PROD_END_STATION_SEQ_ID', 'PROD_END_STATION_DATE_NUM', 'PROD_END_STATION_TIME_MINUTES', 'PROD_END_STATION_AREA_ID', 'CUSTOMER_SEX', 'CUSTOMER_ID_TYPE', 'CUSTOMER_ADDRESS_AREA_ID', 'MEMBER_ID', 'MEMBER_SCORE_PAY', 'MEMBER_SCORE_GET', 'ORDER_STATUS', 'ORDER_DISABLE_TYPE', 'ORDER_DISABLE_USER_ID', 'ORDER_DISABLE_APPLY_USER_ID', 'KEEP_END_MINUTES', 'if_gift', 'reorder_times', 'IF_LAST_PROD', 'ORDER_LEVEL', 'OUTSIDE_SALE_ORG_ID', 'IS_UP', 'APPLY_ID', 'REAL_PASSENGER_NUM', 'STOCK_TYPE', 'REFUSE_FLAG', 'ORDER_TITLE_ID'], 'integer'],
  131. [['ORDER_DESCRIPTION'], 'string'],
  132. [['ORDER_PRICE', 'BASE_PRICE', 'MID_PRICE', 'ORDER_DISABLE_PERCENT', 'ORDER_DISABLE_FEE', 'RECEIVE_VALUE', 'PROFIT_VALUE', 'TOTAL_COMMISSION'], 'number'],
  133. [['CREATE_TIME', 'UPDATE_TIME', 'RUN_DATE', 'PROD_START_STATION_DATE', 'PROD_END_STATION_DATE', 'ORDER_DISABLE_TIME', 'ORDER_DISABLE_APPLY_TIME', 'KEEP_END_TIME'], 'string', 'max' => 20],
  134. [['OUTSIDE_ORDER_NO', 'PROD_NAME', 'PARENT_PROD_NAME', 'CUSTOMER_ADDRESS'], 'string', 'max' => 200],
  135. [['ORDER_PAY_TIME'], 'string', 'max' => 255],
  136. [['PROD_SUPPLY_ORG_NAME', 'RUN_BUS_SEAT_NAME', 'PROD_START_STATION_RES_NAME', 'PROD_START_STATION_CHECKPORT_RES_NAME', 'PROD_START_STATION_AREA_NAME', 'PROD_END_STATION_RES_NAME', 'PROD_END_STATION_AREA_NAME', 'CUSTOMER_NAME', 'CUSTOMER_MOBILE', 'CUSTOMER_ID_NO', 'CUSTOMER_POSTCODE'], 'string', 'max' => 100],
  137. [['RUN_TIME', 'PROD_START_STATION_TIME', 'PROD_END_STATION_TIME'], 'string', 'max' => 10],
  138. [['CUSTOMER_MEMO'], 'string', 'max' => 500],
  139. [['ORDER_CONFIRM_CODE', 'SALES_MAN'], 'string', 'max' => 50],
  140. [['PRINCIPAL_ID'], 'safe'],
  141. ];
  142. }
  143. /**
  144. * @inheritdoc
  145. */
  146. public function attributeLabels()
  147. {
  148. return [
  149. 'ID' => 'ID',
  150. 'CANCEL_FLAG' => '记录有效性标记,CANCEL_FLAG=0记录有效;CANCEL_FLAG=1,记录已删除',
  151. 'MAIN_CREATE_USER_ID' => '代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  152. 'CREATE_USER_ID' => '记录创建用户ID',
  153. 'CREATE_TIME' => '记录创建时间',
  154. 'UPDATE_USER_ID' => '记录最后更新用户ID',
  155. 'UPDATE_TIME' => '记录最后更新时间',
  156. 'SALE_ORG_ID' => '分销商机构ID,BASE_ORGANIZATION.ORG_ID',
  157. 'SALE_TOP_ORG_ID' => '下单组织机构所属一级机构ID,BASE_ORGANIZATION.ORG_ID,算法使用',
  158. 'PROD_TOP_ORG_ID' => '产品所属一级机构ID,BASE_ORGANIZATION.ORG_ID,计算层级代理费算法使用',
  159. 'ORDER_ID' => '订单ID',
  160. 'ORDER_DESCRIPTION' => '最细颗粒度的订单描述',
  161. 'OUTSIDE_ORDER_NO' => '分销商订单编号',
  162. 'ORDER_VALID_STATUS' => '订单有效性状态,0失效订单、1有效订单',
  163. 'ORDER_BOOK_STATUS' => '订单预订状态,0非预订、1有时限、2永久锁位预订',
  164. 'ORDER_PAY_STATUS' => '订单是否已支付,0未支付,1已支付',
  165. 'ORDER_PAY_MAIN_ID' => '支付记录主ID,ORDER_PAY_MAIN.ID',
  166. 'ORDER_PAY_USER_ID' => '支付操作用户ID,BASE_USER.ID',
  167. 'ORDER_PAY_TIME' => '支付操作时间',
  168. 'ORDER_PRINT_TIMES' => '票张打印次数',
  169. 'PARENT_ORDER_ID' => '父订单ID,ORDER_MAIN.ORDER_ID',
  170. 'PROD_ID' => '订单产品ID,OPERA_PRODUCT.PROD_ID',
  171. 'PARENT_PROD_ID' => '订单产品父ID,OPERA_PRODUCT.PROD_ID',
  172. 'PROD_NAME' => '订单产品名称',
  173. 'PARENT_PROD_NAME' => '订单产品父名称',
  174. 'ORDER_PRICE' => '订单价格',
  175. 'ORDER_PROD_TYPE' => '订单类型',
  176. 'PROD_SUPPLY_ORG_NAME' => '供应商名字',
  177. 'BASE_PRICE' => '成本价格',
  178. 'MID_PRICE' => 'Mid Price',
  179. 'RUN_ID' => '班次ID,RUN_MAIN.RUN_ID',
  180. 'RUN_DATE' => '票:出发时间 酒店:入住时间',
  181. 'RUN_DATE_NUM' => '班次首发日期参数,发车日期至2016-01-01天数,算法使用',
  182. 'RUN_TIME' => '班次发车时间,格式HH:MM',
  183. 'RUN_TIME_MINUTES' => '班次发车时间距首发日零点分钟数,算法使用',
  184. 'RUN_BUS_ORDER_ID' => '班次车号,RUN_BUS.BUS_ORDER_ID',
  185. 'RUN_BUS_SEAT_TYPE' => '座位类型,DICT_TYPE.ID,普通座、贵宾座等',
  186. 'RUN_BUS_SEAT_SEQ_ID' => '座位内部序列ID',
  187. 'RUN_BUS_SEAT_ID' => '座位ID,RUN_X.ID',
  188. 'RUN_BUS_SEAT_NAME' => '座位名称,仅供显示用',
  189. 'PROD_START_STATION_RES_ID' => '上车站资源ID,BASE_RESOURCE.RES_ID,资源ID',
  190. 'PROD_START_STATION_RES_NAME' => '上车站资源名称',
  191. 'PROD_START_STATION_CHECKPORT_RES_ID' => '上车站检票口资源ID,BASE_RESOURCE.RES_ID,资源ID',
  192. 'PROD_START_STATION_CHECKPORT_RES_NAME' => '上车站检票口资源名称',
  193. 'PROD_START_STATION_SEQ_ID' => '上车站序列ID,RUN_STATION.STATION_ORDER_ID',
  194. 'PROD_START_STATION_DATE' => '上车站发车日期',
  195. 'PROD_START_STATION_DATE_NUM' => '上车站发车日期参数,发车日期至2016-01-01天数,算法使用',
  196. 'PROD_START_STATION_TIME' => '上车站发车时间,格式HH:MM',
  197. 'PROD_START_STATION_TIME_MINUTES' => '上车站发车时间距发车日零点分钟数',
  198. 'PROD_START_STATION_AREA_ID' => 'Prod Start Station Area ID',
  199. 'PROD_START_STATION_AREA_NAME' => 'Prod Start Station Area Name',
  200. 'PROD_END_STATION_RES_ID' => '下车站资源ID,BASE_RESOURCE.RES_ID,资源ID',
  201. 'PROD_END_STATION_RES_NAME' => '下车站资源名称',
  202. 'PROD_END_STATION_SEQ_ID' => '下车站序列ID,RUN_STATION.STATION_ORDER_ID',
  203. 'PROD_END_STATION_DATE' => '下车站发车日期',
  204. 'PROD_END_STATION_DATE_NUM' => '下车站发车日期参数 ,发车日期至2016-01-01天数,算法使用',
  205. 'PROD_END_STATION_TIME' => '下车站发车时间,格式HH:MM',
  206. 'PROD_END_STATION_TIME_MINUTES' => '下车站发车时间距发车日零点分钟数',
  207. 'PROD_END_STATION_AREA_ID' => 'Prod End Station Area ID',
  208. 'PROD_END_STATION_AREA_NAME' => 'Prod End Station Area Name',
  209. 'CUSTOMER_NAME' => '客人姓名',
  210. 'CUSTOMER_SEX' => '客人性别,0女1男',
  211. 'CUSTOMER_MOBILE' => '客人手机',
  212. 'CUSTOMER_ID_TYPE' => '客人证件类别,DICT_TYPE.ID',
  213. 'CUSTOMER_ID_NO' => '客人证件号码',
  214. 'CUSTOMER_ADDRESS' => '客人地址',
  215. 'CUSTOMER_ADDRESS_AREA_ID' => '客人地址所在地ID',
  216. 'CUSTOMER_POSTCODE' => '客人地址邮编',
  217. 'CUSTOMER_MEMO' => '订单备注',
  218. 'MEMBER_ID' => '购票人会员卡ID',
  219. 'MEMBER_SCORE_PAY' => '购票会员花费积分,保留字段',
  220. 'MEMBER_SCORE_GET' => '购票会员可获得积分,保留字段',
  221. 'ORDER_STATUS' => '订单当前状态',
  222. 'ORDER_DISABLE_TYPE' => '订单取消模式标记,DICT_TYPE.ID,0无取消相关操作,其他包括:申请纠票、审核纠票、退票、超时作废、预订取消',
  223. 'ORDER_DISABLE_USER_ID' => '订单作废用户ID,BASE_USER.ID',
  224. 'ORDER_DISABLE_TIME' => '订单作废时间',
  225. 'ORDER_DISABLE_PERCENT' => '订单作废手续费百分比',
  226. 'ORDER_DISABLE_FEE' => '订单作废手续费金额',
  227. 'ORDER_DISABLE_APPLY_USER_ID' => '订单申请纠票用户ID,BASE_USER.ID',
  228. 'ORDER_DISABLE_APPLY_TIME' => '订单申请纠票时间',
  229. 'KEEP_END_TIME' => '订单保留截至时间,ORDER_BOOK_STATUS=1时有效,当此时间点时订单超时作废',
  230. 'KEEP_END_MINUTES' => '订单保留至上车点发车时间前分钟数,本字段可正可负,发车前为正,发车后为负',
  231. 'if_gift' => '是否是赠票,0不是赠票,1是赠票',
  232. 'reorder_times' => '改签次数,标记本记录为第几次改签后的票',
  233. 'IF_LAST_PROD' => '是否最细颗粒度的判断',
  234. 'ORDER_LEVEL' => 'Order Level',
  235. 'ORDER_CONFIRM_CODE' => '酒店确认号',
  236. 'OUTSIDE_SALE_ORG_ID' => 'Outside Sale Org ID',
  237. 'IS_UP' => '0已提现 1未提现',
  238. 'APPLY_ID' => '提现ID',
  239. 'SALES_MAN' => 'Sales Man',
  240. 'PRINCIPAL_ID' => '运营负责人',
  241. 'RECEIVE_VALUE' => '代收金额',
  242. 'REAL_PASSENGER_NUM' => 'Real Passenger Num',
  243. 'STOCK_TYPE' => '酒店下单占用的库存类型:买断,保留,现询',
  244. 'REFUSE_FLAG' => '拒单标志,供酒店使用,0:不允许拒单,1:允许拒单',
  245. 'PROFIT_VALUE' => '利润',
  246. 'TOTAL_COMMISSION' => '订单总佣金',
  247. 'ORDER_TITLE_ID' => '是否是组合订单拆分的 0:否 0以外:组合订单号',
  248. 'SUB_CHANNEL_ID' => '下级渠道id(用于代售)',
  249. 'SUB_CHANNEL_NO' => '下级渠道订单号',
  250. 'MAIN_CORP_ID' => '订单所属运营主体',
  251. 'SALE_PATH' => '销售路径(代售)eg:1001,1002,1003',
  252. 'AGENT_LEVEL' => '代理层级:终端1,上一级2,再上一级3',
  253. ];
  254. }
  255. /**
  256. * Function Description:获取指定车次的订单信息
  257. * Function Name: getRunBusOrderInfo
  258. * @param int $run_id 班次id
  259. * @param int $bus_order_id 车次号
  260. *
  261. * @return array|\yii\db\ActiveRecord[]
  262. *
  263. * @author 张帅
  264. */
  265. public function getRunBusOrderInfo($run_id, $bus_order_id)
  266. {
  267. $result = self::find()->select([
  268. 'order_id' => 'o.parent_order_id',//订单号
  269. 'people_num' => "count(o.order_id)",//人数
  270. 'start_station_id' => 'o.prod_start_station_res_id',//上车站
  271. 'start_station_seq_id' => 'o.prod_start_station_seq_id',//第几站
  272. 'end_station_id' => 'o.prod_end_station_res_id',//下车站
  273. 'o.customer_name',//乘客姓名
  274. 'o.customer_mobile',//乘客电话
  275. 'check_status' => OrderCheckTickets::find()->select('check_status')->where('order_id = o.parent_order_id')->orderBy(['id' => SORT_DESC])->limit(1),//检票状态
  276. ])->from(self::tableName() . ' as o')
  277. ->where([
  278. 'and',
  279. ['=', 'run_id', $run_id],
  280. ['=', 'run_bus_order_id', $bus_order_id],
  281. ['=', 'cancel_flag', 0],
  282. ['=', 'o.agent_level', 1],
  283. ['!=', 'parent_order_id', 0],
  284. ['in', 'order_status', [146, 147]],
  285. ])
  286. ->groupBy(['o.parent_order_id'])
  287. ->asArray()->all();
  288. if (count($result) > 0) {
  289. foreach ($result as $key => $vel) {
  290. $vel['check_status'] == '' ? $result[$key]['check_status'] = 0 : true;
  291. }
  292. }
  293. return $result;
  294. }
  295. /**
  296. * Function Description:获取座位信息
  297. * Function Name: getSeatArray
  298. * @param array $run_bus_arr 班次车次数组
  299. * @param array $prod_arr 产品数据
  300. *
  301. * @return array
  302. *
  303. * @author 张帅
  304. */
  305. public function getSeatArray($run_bus_arr, $prod_arr)
  306. {
  307. $result = [];
  308. foreach ($run_bus_arr as $key => $vel) {
  309. $seat_no = [];
  310. $i = 0;
  311. #region 连座筛选
  312. foreach ($vel as $key1 => $vel2) {
  313. $seat_no[$key1 - $i][$key1] = $vel2;
  314. $i++;
  315. }
  316. #endregion
  317. #region 挑选座位
  318. $run_seat_value = [];
  319. foreach ($seat_no as $key1 => $vel2) {
  320. if (count($vel2) >= $prod_arr[$key]['num']) {
  321. $run_seat_value = array_slice($vel2, 0, $prod_arr[$key]['num'], true);
  322. break;
  323. }
  324. }
  325. if (count($run_seat_value) == 0) {
  326. $run_seat_value = array_slice($vel, 0, $prod_arr[$key]['num'], true);
  327. }
  328. #endregion
  329. $result[$key] = $run_seat_value;
  330. }
  331. return $result;
  332. }
  333. /**
  334. * Function Description:下单
  335. * Function Name: submitBusOrder
  336. * @param array $prod_list 产品列表
  337. * @param array $seat_arr 座位
  338. * @param array $order_info_arr 订单的其他信息
  339. * @param array $customer_info_arr 乘客
  340. * @param array $order_append_arr 附加产品
  341. * @param int $is_send_msg 是否发短信
  342. *
  343. * @return mixed
  344. *
  345. * @author 张帅
  346. */
  347. public function submitBusOrder($prod_list, $seat_arr, $order_info_arr, $customer_info_arr, $order_append_arr, $is_send_msg)
  348. {
  349. #region 获取最大唯一值,先赋给支付id,然后递增
  350. $base_main_id = BaseUniqueId2::find()->select('unique_id')->where(['id' => 1])->asArray()->one();
  351. //※更新唯一键值
  352. #计算BaseUniqueId 需要 增加的值(往返程的主订单和子订单的id个数)
  353. $add_count = 0;
  354. foreach ($prod_list as $k => $v) {
  355. $add_count += $v['people_num'] + 1;
  356. }
  357. $time = time() . rand(0, 999999);
  358. $res = BaseUniqueId2::updateAll(['UNIQUE_ID' => $base_main_id['unique_id'] + $add_count + 1, 'UPDATE_TIME' => $time], ['id' => 1]);
  359. if (!$res) {
  360. $result['code'] = '1';
  361. $result['info'] = '下单失败';
  362. $result['error'] = 'BaseUniqueId更新失败';
  363. return $result;
  364. }
  365. $pay_main_id = $base_main_id['unique_id'] + 1;
  366. $parent_order_id = $pay_main_id;
  367. #endregion
  368. #region 提交订单操作数据库所需数据
  369. $main_order = [];//主订单数据
  370. $main_order_key = [];//提交主订单时所需key值
  371. $son_order = [];//子订单数据
  372. $son_order_key = [];//提交子订单时所需key值
  373. $run_x_arr = [];//run_x
  374. $run_bus_prod_stock_arr = [];//run_bus,run_prod,run_stock更新数据
  375. $main_order_id = [];//订单id数组
  376. $pay_main_arr = [];//主支付记录数据
  377. $pay_main_key = [];//主支付记录键值
  378. $order_price = 0;
  379. $son_order_id = 0;
  380. #endregion
  381. #region 整理数据
  382. foreach ($prod_list as $key => $vel) {
  383. $run_x_one = [];//run_x_one
  384. $prod_list[$key]['order_id'] = $parent_order_id;//订单号
  385. #region 主订单数据
  386. $main_order_val = [
  387. 'ID' => $parent_order_id,
  388. 'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  389. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  390. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  391. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  392. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  393. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  394. 'SALE_TOP_ORG_ID' => 0,//'下单组织机构所属一级机构ID',
  395. 'PROD_TOP_ORG_ID' => 0,//'产品所属一级机构ID',
  396. 'ORDER_ID' => $parent_order_id,
  397. 'ORDER_DESCRIPTION' => $vel['ticket_name'] . ',' . $vel['run_date'] . ',' . $vel['people_num'] . '|' . $vel['people_num'],//'最细颗粒度的订单描述',
  398. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
  399. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  400. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  401. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  402. 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
  403. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  404. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  405. 'PARENT_ORDER_ID' => 0,
  406. 'PARENT_PROD_ID' => $vel['line_id'],
  407. 'PARENT_PROD_NAME' => $vel['line_name'],
  408. 'ORDER_PRICE' => $vel['total_price'],//'订单价格',
  409. 'ORDER_PROD_TYPE' => 81,//'订单类型',
  410. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],//'上车站检票口资源ID',
  411. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],//'上车站检票口资源名称',
  412. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],//'上车站发车时间距发车日零点分钟数',
  413. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],//'下车站发车时间距发车日零点分钟数',
  414. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  415. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  416. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  417. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  418. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  419. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  420. 'MEMBER_ID' => $order_info_arr['member_id'],
  421. 'ORDER_STATUS' => $order_info_arr['order_status'],//'订单当前状态',
  422. 'IF_LAST_PROD' => 1,//'是否最细颗粒度的判断',
  423. 'ORDER_LEVEL' => 0,//'Order Level',
  424. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],//
  425. 'SALES_MAN' => $order_info_arr['sales_man'],
  426. 'RECEIVE_VALUE' => $vel['total_receiver_value'],
  427. ];
  428. #endregion
  429. $single_price = $vel['total_price'];
  430. $order_price += $vel['total_price'];
  431. #region 收集主订单的id
  432. if ($vel['if_back'] == 1) {
  433. $main_order_id[0] = $parent_order_id;//收集主订单的id
  434. } else {
  435. $main_order_id[1] = $parent_order_id;//收集主订单的id
  436. }
  437. #endregion
  438. #region 主订单key值
  439. if (count($main_order_key) == 0) {
  440. $main_order_key = array_keys($main_order_val);
  441. }
  442. #endregion
  443. $son_order_id = $parent_order_id;//子订单id号
  444. #region 根据人数遍历每个子订单的个数
  445. foreach ($seat_arr[$vel['ticket_id']] as $seat_key => $seat_vel) {
  446. $son_order_id++;//子订单号递增
  447. #region 子订单数据
  448. $son_order_val = [
  449. 'ID' => $son_order_id,
  450. 'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  451. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  452. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  453. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  454. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  455. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  456. 'SALE_TOP_ORG_ID' => 0,
  457. 'PROD_TOP_ORG_ID' => 0,
  458. 'ORDER_ID' => $son_order_id,
  459. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
  460. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  461. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  462. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  463. 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
  464. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  465. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  466. 'PARENT_ORDER_ID' => $parent_order_id,
  467. 'PROD_ID' => $vel['ticket_id'],
  468. 'PARENT_PROD_ID' => $vel['line_id'],
  469. 'PROD_NAME' => $vel['ticket_name'],
  470. 'PARENT_PROD_NAME' => $vel['line_name'],
  471. 'ORDER_PRICE' => $vel['order_price'],
  472. 'ORDER_PROD_TYPE' => 82,
  473. 'RUN_ID' => $vel['run_id'],
  474. 'RUN_DATE' => $vel['run_date'],
  475. 'RUN_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),//'班次首发日期参数,发车日期至2016-01-01天数,算法使用',
  476. 'RUN_TIME' => $vel['run_time'],
  477. 'RUN_BUS_ORDER_ID' => $seat_vel['bus_order_id'],//'班次车号,RUN_BUS.BUS_ORDER_ID',
  478. 'RUN_BUS_SEAT_TYPE' => $vel['seat_type'],//'座位类型,DICT_TYPE.ID,普通座、贵宾座等',
  479. 'RUN_BUS_SEAT_SEQ_ID' => $seat_vel['seat_seq_id'],//'座位内部序列ID',
  480. 'RUN_BUS_SEAT_NAME' => $seat_vel['seat_name'],
  481. 'PROD_START_STATION_RES_ID' => $vel['start_res_id'],
  482. 'PROD_START_STATION_RES_NAME' => $vel['start_res_name'],
  483. 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],
  484. 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],
  485. 'PROD_START_STATION_SEQ_ID' => $vel['start_seq_id'],
  486. 'PROD_START_STATION_DATE' => $vel['run_date'],
  487. 'PROD_START_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  488. 'PROD_START_STATION_TIME' => $vel['start_time'],
  489. 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],
  490. 'PROD_START_STATION_AREA_ID' => $vel['start_area_id'],
  491. 'PROD_START_STATION_AREA_NAME' => $vel['start_area_name'],
  492. 'PROD_END_STATION_RES_ID' => $vel['end_res_id'],
  493. 'PROD_END_STATION_RES_NAME' => $vel['end_res_name'],
  494. 'PROD_END_STATION_SEQ_ID' => $vel['end_seq_id'],
  495. 'PROD_END_STATION_DATE' => $vel['run_date'],
  496. 'PROD_END_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
  497. 'PROD_END_STATION_TIME' => $vel['end_time'],
  498. 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],
  499. 'PROD_END_STATION_AREA_ID' => $vel['end_area_id'],
  500. 'PROD_END_STATION_AREA_NAME' => $vel['end_area_name'],
  501. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  502. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  503. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  504. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  505. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  506. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  507. 'MEMBER_ID' => $order_info_arr['member_id'],
  508. 'ORDER_STATUS' => $order_info_arr['order_status'],
  509. 'if_gift' => 0,//'是否是赠票,0不是赠票,1是赠票',
  510. 'ORDER_LEVEL' => 0,
  511. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],
  512. 'SALES_MAN' => $order_info_arr['sales_man'],
  513. 'RECEIVE_VALUE' => $vel['receiver_value'],
  514. ];
  515. #endregion
  516. #region 子订单key值
  517. if (count($son_order_key) == 0) {
  518. $son_order_key = array_keys($son_order_val);
  519. }
  520. #endregion
  521. #region run_bus,run_prod,run_stock更新数据
  522. if (!isset($run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']])) {
  523. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['num'] = $vel['people_num'];//数量
  524. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['run_id'] = $vel['run_id'];//班次id
  525. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['bus_order_id'] = $seat_vel['bus_order_id'];//车次号
  526. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['ticket_id'] = $vel['ticket_id'];//票种id
  527. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['start_seq_id'] = $vel['start_seq_id'];//开始站顺序号
  528. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['end_seq_id'] = $vel['end_seq_id'];//结束站顺序号
  529. $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['seat_type'] = $vel['seat_type'];//座位类型
  530. }
  531. #endregion
  532. #region 更新run_x配置数据
  533. $run_x_one[$seat_key]['run_x_id'] = $seat_vel['run_x_id'];
  534. $run_x_one[$seat_key]['run_date'] = substr($vel['run_date'], 0, 7);
  535. $run_x_one[$seat_key]['run_date'] = str_replace('-', '', $run_x_one[$seat_key]['run_date']);//run_x表的日期后缀
  536. $run_x_one[$seat_key]['order_main_id'] = $son_order_id;//主订单号
  537. $run_x_one[$seat_key]['order_main_prod_id'] = $vel['line_id'];//线路id
  538. $run_x_one[$seat_key]['order_prod_id'] = $vel['ticket_id'];//票种id
  539. #endregion
  540. #region 子订单数组
  541. $son_order[] = $son_order_val;
  542. #endregion
  543. }
  544. #endregion
  545. #region 更新run_x配置数据
  546. $run_x_arr[$key] = $run_x_one;
  547. #endregion
  548. $parent_order_id = $son_order_id + 1;
  549. #region 主订单数组
  550. $main_order[] = $main_order_val;
  551. #endregion
  552. }
  553. #endregion
  554. $unique_id = $son_order_id;//唯一主键
  555. #region 主支付记录数据数组
  556. foreach ($main_order_id as $key => $vel) {
  557. #region 主支付记录
  558. $pay_main_one = [
  559. 'ID' => $pay_main_id,
  560. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  561. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  562. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  563. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  564. 'PAY_TOTAL' => $single_price,
  565. 'ORDER_ID' => $vel,
  566. ];
  567. #endregion
  568. $pay_main_arr[] = $pay_main_one;//主支付记录数组
  569. #region 主支付记录key值
  570. if (count($pay_main_key) == 0) {
  571. $pay_main_key = array_keys($pay_main_one);
  572. }
  573. #endregion
  574. }
  575. #endregion
  576. $transaction = Yii::$app->db->beginTransaction();
  577. try {
  578. #region 1.占座 更新run_x表
  579. foreach ($run_x_arr as $run_x_key => $run_x_vel) {
  580. foreach ($run_x_vel as $key => $vel) {
  581. $update_sql = 'update run_' . $vel['run_date'] . '
  582. set order_main_id = ' . $vel['order_main_id'] . ',
  583. order_main_prod_id = ' . $vel['order_main_prod_id'] . ',
  584. order_prod_id = ' . $vel['order_prod_id'] . ',
  585. seat_status = 2,
  586. order_lock_user_id = ' . $order_info_arr['user_id'] . ',
  587. order_lock_time = \'' . date('Y-m-d H:i:s') . '\'
  588. where id in (' . $vel['run_x_id'] . ')';
  589. $res = Yii::$app->db->createCommand($update_sql)->execute();
  590. if (!$res) {
  591. throw new Exception('占位失败');
  592. }
  593. }
  594. }
  595. #endregion
  596. #region 2.插入主订单
  597. $res = Yii::$app->db->createCommand()->batchInsert(OrderMain::tableName(), $main_order_key, $main_order)->execute();
  598. if (!$res) {
  599. throw new Exception('主订单提交失败');
  600. }
  601. #endregion
  602. #region 3.插入子订单
  603. $res = Yii::$app->db->createCommand()->batchInsert(OrderMain::tableName(), $son_order_key, $son_order)->execute();
  604. if (!$res) {
  605. throw new Exception('子订单提交失败');
  606. }
  607. #endregion
  608. #region 4.更新run_prod,run_bus,run_stock
  609. foreach ($run_bus_prod_stock_arr as $key => $vel) {
  610. #region (1).更新run_prod
  611. $update_value = [
  612. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  613. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  614. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  615. ];
  616. $update_where = [
  617. 'and',
  618. ['=', 'run_id', $vel['run_id']],
  619. ['=', 'prod_id', $vel['ticket_id']],
  620. ['=', 'cancel_flag', 0],
  621. ];
  622. $res = RunProd::updateAll($update_value, $update_where);
  623. if (!$res) {
  624. throw new Exception('更新run_prod失败');
  625. }
  626. #endregion
  627. #region (2).更新run_bus
  628. $update_value = [
  629. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  630. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  631. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  632. ];
  633. $update_where = [
  634. 'and',
  635. ['=', 'run_id', $vel['run_id']],
  636. ['=', 'bus_order_id', $vel['bus_order_id']],
  637. ['=', 'cancel_flag', 0],
  638. ];
  639. $res = RunBus::updateAll($update_value, $update_where);
  640. if (!$res) {
  641. throw new Exception('更新run_bus失败');
  642. }
  643. #endregion
  644. #region (3).更新run_stock
  645. $update_value = [
  646. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  647. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  648. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
  649. ];
  650. $update_where = [
  651. 'and',
  652. ['=', 'run_id', $vel['run_id']],
  653. ['>=', 'seq_id', $vel['start_seq_id']],
  654. ['<', 'seq_id', $vel['end_seq_id']],
  655. ['=', 'seat_type', $vel['seat_type']],
  656. ['=', 'cancel_flag', 0],
  657. ];
  658. $res = RunStock::updateAll($update_value, $update_where);
  659. if (!$res) {
  660. throw new Exception('更新run_stock失败');
  661. }
  662. #endregion
  663. }
  664. #endregion
  665. //==================这里加判断,只有是已支付状态,才插入支付记录=============
  666. // if($order_info_arr['order_pay_status']==1){
  667. #region 5.插入主支付记录
  668. $res = Yii::$app->db->createCommand()->batchInsert(OrderPayMain::tableName(), $pay_main_key, $pay_main_arr)->execute();
  669. if (!$res) {
  670. throw new Exception('插入主支付记录失败');
  671. }
  672. #endregion
  673. #region 6.插入支付明细
  674. $order_pay_detail = new OrderPayDetail();
  675. $order_pay_detail->attributes = [
  676. 'ID' => $pay_main_id,
  677. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  678. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  679. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  680. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  681. 'PAY_MAIN_ID' => $pay_main_id,
  682. 'PAY_TYPE_ID_1' => $order_info_arr['pay_type'],
  683. 'PAY_MONEY' => $order_price,
  684. ];
  685. $res = $order_pay_detail->insert();
  686. if (!$res) {
  687. throw new Exception('插入支付明细失败');
  688. }
  689. #endregion
  690. // }
  691. /*#region 7.更新唯一键值
  692. $res = BaseUniqueId2::updateAll(['UNIQUE_ID' => $unique_id], ['id' => 1]);
  693. if (!$res) {
  694. throw new Exception('更新唯一键值失败');
  695. }
  696. #endregion*/
  697. #region 8.如果是往返 建立往返关系
  698. if (count($main_order_id) == 2) {
  699. $to_from = new ToFrom();
  700. $to_from->attributes = [
  701. 'to_orderid' => $main_order_id[0],
  702. 'back_orderid' => $main_order_id[1],
  703. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  704. ];
  705. $res = $to_from->insert();
  706. if (!$res) {
  707. throw new Exception('建立往返关系失败');
  708. }
  709. }
  710. #endregion
  711. #region 9.插入酒店门票价格
  712. if ($order_append_arr['gate_price'] != 0 || $order_append_arr['hotel_price'] != 0) {
  713. $order_extra_info = new OrderExtraInfo();
  714. $order_extra_info->attributes = [
  715. 'order_id' => $main_order_id[0],
  716. 'hotel_price' => $order_append_arr['hotel_price'],
  717. 'gate_price' => $order_append_arr['gate_price'],
  718. ];
  719. $res = $order_extra_info->insert();
  720. if (!$res) {
  721. throw new Exception('酒店门票价格提交失败' . serialize($order_extra_info->getErrors()));
  722. }
  723. }
  724. #endregion
  725. #region 10.插入日志
  726. $order_run_time = array();
  727. $opera_time = date('Y-m-d H:i:s');
  728. foreach ($prod_list as $key => $vel) {
  729. $order_opera_log = new OrderOperaLog();
  730. $order_opera_log->attributes = [
  731. 'order_id' => $vel['order_id'],
  732. 'opera_user_id' => $order_info_arr['user_id'],
  733. 'opera_type' => 1,
  734. 'opera_time' => $opera_time,
  735. 'opera_detail' => '创建订单,出发日期' . $vel['run_date'] . ',订单渠道' . $order_info_arr['org_name'] . ',单价' . $vel['order_price'] . ',总额' . $vel['total_price'] . ',联系人信息:' . $customer_info_arr['customer_name'] . ',' . $customer_info_arr['customer_mobile'] . ',' . $customer_info_arr['customer_id_no'] . ',备注信息:' . $customer_info_arr['customer_memo'],
  736. 'member_id' => $order_info_arr['member_id'],
  737. 'opera_platform' => '统一下单',
  738. ];
  739. $order_run_time[$vel['order_id']] = $vel['run_date'];
  740. $res = $order_opera_log->insert();
  741. if (!$res) {
  742. throw new Exception('插入日志失败');
  743. }
  744. }
  745. #endregion
  746. $transaction->commit();
  747. #region 11.发送短信
  748. if ($order_info_arr['order_pay_status'] == 1 && $is_send_msg == 1) {
  749. foreach ($main_order_id as $key => $vel) {
  750. //这里对发送短信时间做一个判断,满足条件的才发送短信
  751. $time_diff = $this->get_time_diff($vel);
  752. if ($time_diff >= 0) {
  753. $url = 'http://' . CS1_DOMAIN . '/api/msg/order-send-msg';
  754. $sendInfo['order_id'] = $vel;
  755. $sendInfo['msg_type'] = 'cs';
  756. Msg::httpRequest($url, $sendInfo);
  757. }
  758. }
  759. }
  760. #endregion
  761. #region 12.添加订单状态
  762. if ($order_info_arr['order_pay_status'] == 1) {
  763. //添加出票成功短信
  764. $tomorrow_day = date("Y-m-d", strtotime("+1 days"));
  765. $current_time = date("H:i");
  766. foreach ($main_order_id as $key => $vel) {
  767. $order_run_day = $order_run_time[$vel];
  768. //if( $order_run_day > $tomorrow_day || ( $order_run_day == $order_run_day && $current_time < "18:30" ) ) {
  769. $url = 'http://' . CS1_DOMAIN . '/api/msg/order-send-success-msg';
  770. $sendInfo['order_id'] = $vel;
  771. Msg::httpRequest($url, $sendInfo);
  772. //}
  773. $url = 'http://' . CS_DOMAIN . '/st-xm/Api/add_order_status_log.php';
  774. $post_data['order_id'] = $vel;
  775. if ($order_info_arr['order_pay_status'] == 1) {
  776. $post_data['order_status'] = '451,452,453';
  777. } else {
  778. $post_data['order_status'] = '451';
  779. }
  780. Msg::httpRequest($url, $post_data);
  781. }
  782. }
  783. #endregion
  784. $result['code'] = '0';
  785. $result['info'] = '下单成功';
  786. $result['data'] = implode(',', $main_order_id);
  787. } catch (Exception $e) {
  788. # 回滚事务
  789. $transaction->rollBack();
  790. $result['code'] = '1';
  791. $result['info'] = '下单失败';
  792. $result['error'] = $e->getMessage();
  793. }
  794. return $result;
  795. }
  796. /**
  797. * Function Description:获取短信发送时间差(巴士班次时间-当前时间)
  798. * Function Name: get_time_diff
  799. * @param int $order_id 巴士主订单
  800. *
  801. * @return mixed
  802. *
  803. * @author 温依莅
  804. */
  805. public function get_time_diff($order_id)
  806. {
  807. $now = time();
  808. //$sql="select b.run_date,b.RUN_MINUTES,(UNIX_TIMESTAMP(b.run_date)+b.run_minutes*60) as stamp from order_main a left join run_main b on a.run_id=b.run_id where a.PARENT_ORDER_ID=$order_id limit 1";
  809. //$sql = "select b.run_date,b.RUN_MINUTES,(UNIX_TIMESTAMP(b.run_date)) as stamp from order_main a left join run_main b on a.run_id=b.run_id where a.PARENT_ORDER_ID=$order_id limit 1";
  810. $res = OrderMain::find()->select([
  811. 'b.run_date',
  812. 'b.run_minutes',
  813. 'stamp' => new Expression('UNIX_TIMESTAMP(b.run_date)'),
  814. ])->from('order_main a')
  815. ->leftJoin('run_main b', 'a.run_id=b.run_id')
  816. ->where(['a.parent_order_id' => $order_id])
  817. ->asArray()
  818. ->one();
  819. $run_stamp = $res['stamp'];
  820. return ($run_stamp + 3600 * 24) - $now;
  821. }
  822. /**
  823. * Function Description:获取订单数据
  824. * Function Name: getOrderInfoArray
  825. * @param string $order_info_str 订单基础信息{下单用户,会员号,渠道id,渠道订单号,是否自动退票(0否1是),支付方式(授信275),是否支付(0否1是),业务员}
  826. *
  827. * @return mixed
  828. *
  829. * @author 张帅
  830. */
  831. public function getOrderInfoArray($order_info_str)
  832. {
  833. $order_info_str = substr($order_info_str, 1, -1);
  834. $order_info_arr = explode(',', $order_info_str);
  835. $result['user_id'] = (!isset($order_info_arr[0]) || empty($order_info_arr[0])) ? 1 : $order_info_arr[0];//下单用户id
  836. $result['member_id'] = (!isset($order_info_arr[1]) || empty($order_info_arr[1])) ? 0 : $order_info_arr[1];//会员id
  837. $result['outside_sale_org_id'] = (!isset($order_info_arr[2]) || empty($order_info_arr[2])) ? 0 : $order_info_arr[2];//外部下单id
  838. $result['outside_sale_order_no'] = (!isset($order_info_arr[3]) || empty($order_info_arr[3])) ? '' : $order_info_arr[3];//外部下单号
  839. $result['order_book_status'] = (!isset($order_info_arr[4]) || $order_info_arr[4] === '') ? 1 : $order_info_arr[4];//订单预订状态
  840. $result['pay_type'] = (!isset($order_info_arr[5]) || empty($order_info_arr[5])) ? 275 : $order_info_arr[5];//支付方式(授信,微信)
  841. $result['order_pay_status'] = (!isset($order_info_arr[6]) || empty($order_info_arr[6])) ? 0 : $order_info_arr[6];//是否支付
  842. $result['sales_man'] = (!isset($order_info_arr[7]) || empty($order_info_arr[7])) ? '' : $order_info_arr[7];//业务员
  843. $supplier_info = BaseSupplier::find()->select('sales_man,supplier_name')->where(['id' => $result['outside_sale_org_id']])->asArray()->one();
  844. if ($result['sales_man'] == '') {
  845. $result['sales_man'] = empty($supplier_info['sales_man']) ? '' : $supplier_info['sales_man'];
  846. }
  847. $result['org_name'] = empty($supplier_info['supplier_name']) ? '' : $supplier_info['supplier_name'];
  848. $result['order_status'] = $result['order_pay_status'] == 0 ? 145 : 146;
  849. return $result;
  850. }
  851. /**
  852. * Function Description:获取乘客信息
  853. * Function Name: getCustomerInfoArray
  854. * @param string $customer_info_str 顾客信息,格式为{联系人,联系电话,z证件类型,联系人身份证,备注}
  855. *
  856. * @return mixed
  857. *
  858. * @author 张帅
  859. */
  860. public function getCustomerInfoArray($customer_info_str)
  861. {
  862. $customer_info_str = substr($customer_info_str, 1, -1);
  863. $customer_info_arr = explode(',', $customer_info_str);
  864. $result['customer_name'] = (!isset($customer_info_arr[0]) || empty($customer_info_arr[0])) ? '' : $customer_info_arr[0];//乘客姓名
  865. $result['customer_mobile'] = (!isset($customer_info_arr[1]) || empty($customer_info_arr[1])) ? '' : $customer_info_arr[1];//乘客电话
  866. $result['customer_id_type'] = (!isset($customer_info_arr[2]) || empty($customer_info_arr[2])) ? 150 : $customer_info_arr[2];//乘客证件类型
  867. $result['customer_id_no'] = (!isset($customer_info_arr[3]) || empty($customer_info_arr[3])) ? '' : $customer_info_arr[3];//乘客证件号
  868. $result['customer_memo'] = (!isset($customer_info_arr[4]) || empty($customer_info_arr[4])) ? '' : $customer_info_arr[4];//乘客备注
  869. return $result;
  870. }
  871. /**
  872. * Function Description:订单附加产品
  873. * Function Name: getOrderAppendArray
  874. * @param string $order_append_str 订单附加产品,格式为{门票价格,酒店价格}
  875. *
  876. * @return mixed
  877. *
  878. * @author 张帅
  879. */
  880. public function getOrderAppendArray($order_append_str)
  881. {
  882. $order_append_str = substr($order_append_str, 1, -1);
  883. $order_append_arr = explode(',', $order_append_str);
  884. $result['gate_price'] = (!isset($order_append_arr[0]) || empty($order_append_arr[0])) ? '0' : $order_append_arr[0];//门票价格
  885. $result['hotel_price'] = (!isset($order_append_arr[1]) || empty($order_append_arr[1])) ? '0' : $order_append_arr[1];//酒店价格
  886. return $result;
  887. }
  888. /**
  889. * Function Description:获取代收价
  890. * Function Name: getBusProductListReceiver
  891. * @param array $prod_list 产品列表
  892. * @param string $receiver_value_str 代收信息
  893. * @param array $prod_arr 产品简易数据
  894. *
  895. * @return mixed
  896. *
  897. * @author 张帅
  898. */
  899. public function getBusProductListReceiver($prod_list, $receiver_value_str, $prod_arr)
  900. {
  901. $result = [];
  902. $receiver_value_str = substr($receiver_value_str, 1, -1);
  903. $receiver_value_arr = explode(',', $receiver_value_str);//代收价格信息
  904. $receiver_value = (!isset($receiver_value_arr[0]) || empty($receiver_value_arr[0])) ? 0 : $receiver_value_arr[0];//代收单价
  905. $total_receiver_value = (!isset($receiver_value_arr[1]) || empty($receiver_value_arr[1])) ? 0 : $receiver_value_arr[1];//代收总价
  906. $receiver_value = $receiver_value / count($prod_list);
  907. $total_receiver_value = $total_receiver_value / count($prod_list);
  908. //将订单单价,人数,总价,往返标志,代收单价,代收总价放入产品列表中
  909. foreach ($prod_list as $key => $vel) {
  910. if ($total_receiver_value != 0) {
  911. $prod_list[$key]['total_receiver_value'] = round($total_receiver_value, 2);
  912. $prod_list[$key]['receiver_value'] = round($total_receiver_value / $prod_arr[$key]['num'], 2);
  913. } else {
  914. $prod_list[$key]['total_receiver_value'] = round($receiver_value * $prod_arr[$key]['num'], 2);
  915. $prod_list[$key]['receiver_value'] = round($receiver_value, 2);
  916. }
  917. $prod_list[$key]['order_price'] = $prod_arr[$key]['price'];
  918. $prod_list[$key]['total_price'] = $prod_arr[$key]['price'] * $prod_arr[$key]['num'];
  919. $prod_list[$key]['people_num'] = $prod_arr[$key]['num'];
  920. $prod_list[$key]['if_back'] = $prod_arr[$key]['if_back'];
  921. }
  922. //将产品安往返排序
  923. foreach ($prod_arr as $key => $vel) {
  924. $result[$key] = $prod_list[$key];
  925. }
  926. return $result;
  927. }
  928. /**
  929. * Function Description:获取订单所属线路
  930. * Function Name: getOrderLineIdCount
  931. * @param array $order_id_arr 订单id数组
  932. *
  933. * @return array|null|ActiveRecord
  934. *
  935. * @author 张帅
  936. */
  937. public function getOrderLineIdCount($order_id_arr)
  938. {
  939. $result = self::find()
  940. ->select([
  941. 'order_id',
  942. 'line_id' => 'parent_prod_id',//线路id
  943. 'order_count' => "substring_index(order_description,'|',-1)",//人数
  944. 'order_valid_status',//订单是否有效
  945. 'line_type' => OperaLine::find()->select('line_type')->where('line_id = m.parent_prod_id')->limit(1),//线路类型
  946. ])
  947. ->from(self::tableName() . ' as m')
  948. ->where([
  949. 'and',
  950. ['in', 'order_id', $order_id_arr],
  951. ['=', 'parent_order_id', 0],
  952. ])
  953. ->indexBy('order_id')
  954. ->asArray()->all();
  955. return $result;
  956. }
  957. /**
  958. * Function Description:获取订单班次信息
  959. * Function Name: getOrderRunInfo
  960. * @param array $order_id_arr 订单id数组
  961. *
  962. * @return array|\yii\db\ActiveRecord[]
  963. *
  964. * @author 张帅
  965. */
  966. public function getOrderRunInfo($order_id_arr)
  967. {
  968. $result = self::find()
  969. ->select([
  970. 'run_id',//班次id
  971. 'run_date',//班次日期
  972. 'bus_order_id' => "group_concat(distinct run_bus_order_id)",//车次号
  973. 'start_seq_id' => 'prod_start_station_seq_id',//开始站顺序号
  974. 'end_seq_id' => 'prod_end_station_seq_id',//结束站站顺序号
  975. 'order_num' => "count(*)",//订单人数
  976. 'ticket_id' => 'prod_id',//票种id
  977. 'order_id' => "group_concat(order_id)",//订单id
  978. 'seat_type' => 'run_bus_seat_type',//座位类型
  979. ])
  980. ->where([
  981. 'and',
  982. ['in', 'parent_order_id', $order_id_arr],
  983. ['=', 'cancel_flag', 0],
  984. ])
  985. ->groupBy([
  986. 'run_id',
  987. 'start_seq_id',
  988. 'end_seq_id',
  989. ])
  990. ->indexBy('run_id')
  991. ->asArray()->all();
  992. return $result;
  993. }
  994. /**
  995. * Function Description:取消单一线路订单
  996. * Function Name: cancelSingleBusOrder
  997. * @param array $order_id_arr 订单号
  998. * @param array $order_run_info 订单班次信息
  999. * @param int $user_id 操作用户
  1000. * @param string $cancel_reason 退票原因
  1001. * @param string $opera_platform 统一退票
  1002. *
  1003. * @return mixed
  1004. *
  1005. * @author 张帅
  1006. */
  1007. public function cancelSingleBusOrder($order_id_arr, $order_run_info, $user_id, $cancel_reason, $opera_platform = '统一退票')
  1008. {
  1009. $transaction = Yii::$app->db->beginTransaction();
  1010. try {
  1011. #region 1.更新订单信息
  1012. $update_value = [
  1013. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1014. 'ORDER_STATUS' => 148,
  1015. 'ORDER_VALID_STATUS' => 0,
  1016. 'ORDER_DISABLE_USER_ID' => $user_id,
  1017. 'ORDER_DISABLE_TIME' => date('Y-m-d H:i:s'),
  1018. ];
  1019. $update_where = [
  1020. 'or',
  1021. ['in', 'order_id', $order_id_arr],
  1022. ['in', 'parent_order_id', $order_id_arr],
  1023. ];
  1024. $res = self::updateAll($update_value, $update_where);
  1025. if (!$res) {
  1026. throw new Exception('更新订单信息失败');
  1027. }
  1028. #endregion
  1029. #region 2.更新run_x
  1030. foreach ($order_run_info as $key => $vel) {
  1031. $run_x_date = substr($vel['run_date'], 0, 7);
  1032. $run_x_date = str_replace('-', '', $run_x_date);
  1033. $update_sql = 'update run_' . $run_x_date . '
  1034. set order_main_id = 0,
  1035. allow_select_seat=156,
  1036. order_main_prod_id = 0,
  1037. order_prod_id = 0,
  1038. seat_status = 0,
  1039. order_lock_user_id = 0,
  1040. order_lock_time = \'' . date('Y-m-d H:i:s') . '\'
  1041. where run_id = ' . $vel['run_id'] . '
  1042. and order_main_id in (' . $vel['order_id'] . ')';
  1043. $res = Yii::$app->db->createCommand($update_sql)->execute();
  1044. if (!$res) {
  1045. throw new Exception('更新run_x失败');
  1046. }
  1047. }
  1048. #endregion
  1049. #region 3.更新run_prod,run_bus,run_stock
  1050. foreach ($order_run_info as $key => $vel) {
  1051. #region (1).更新run_prod
  1052. $update_value = [
  1053. 'UPDATE_USER_ID' => $user_id,
  1054. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1055. 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
  1056. ];
  1057. $update_where = [
  1058. 'and',
  1059. ['=', 'run_id', $vel['run_id']],
  1060. ['=', 'prod_id', $vel['ticket_id']],
  1061. //['=', 'cancel_flag', 0],
  1062. ];
  1063. $res = RunProd::updateAll($update_value, $update_where);
  1064. if (!$res) {
  1065. throw new Exception('更新run_prod失败');
  1066. }
  1067. #endregion
  1068. #region (2).更新run_bus
  1069. $update_value = [
  1070. 'UPDATE_USER_ID' => $user_id,
  1071. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1072. 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
  1073. ];
  1074. $update_where = [
  1075. 'and',
  1076. ['=', 'run_id', $vel['run_id']],
  1077. ['=', 'bus_order_id', $vel['bus_order_id']],
  1078. ['=', 'cancel_flag', 0],
  1079. ];
  1080. $res = RunBus::updateAll($update_value, $update_where);
  1081. if (!$res) {
  1082. throw new Exception('更新run_bus失败');
  1083. }
  1084. #endregion
  1085. #region (3).更新run_stock
  1086. $update_value = [
  1087. 'UPDATE_USER_ID' => $user_id,
  1088. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1089. 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
  1090. ];
  1091. $update_where = [
  1092. 'and',
  1093. ['=', 'run_id', $vel['run_id']],
  1094. ['>=', 'seq_id', $vel['start_seq_id']],
  1095. ['<', 'seq_id', $vel['end_seq_id']],
  1096. ['=', 'seat_type', $vel['seat_type']],
  1097. ['=', 'cancel_flag', 0],
  1098. ];
  1099. $res = RunStock::updateAll($update_value, $update_where);
  1100. if (!$res) {
  1101. throw new Exception('更新run_stock失败');
  1102. }
  1103. #endregion
  1104. }
  1105. #endregion
  1106. #region 4.订单重排
  1107. // foreach ($order_id_arr as $key => $vel) {
  1108. // $url = 'http://' . CS_DOMAIN . '/api1.0/run_x_reorder.php';
  1109. // $post_data['order_id'] = $vel;
  1110. // Msg::httpRequest($url, $post_data);
  1111. // }
  1112. #endregion
  1113. #region 5.上级渠道订单的取消
  1114. $order_sale_path = self::find()->select('sale_path')->from(self::tableName())->where(['in', 'order_id', $order_id_arr])
  1115. ->asArray()->all();
  1116. $ori_order_id = $order_id_arr;
  1117. foreach ($order_sale_path as $val) {
  1118. if ($val['sale_path'] != '') {
  1119. $tmp_update_value = [
  1120. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1121. 'ORDER_STATUS' => 148,
  1122. 'ORDER_VALID_STATUS' => 0,
  1123. 'ORDER_DISABLE_USER_ID' => $user_id,
  1124. 'ORDER_DISABLE_TIME' => date('Y-m-d H:i:s'),
  1125. ];
  1126. $tmp_order_arr = explode(',', $val['sale_path']);
  1127. foreach ($tmp_order_arr as $v) {
  1128. $order_id_arr[$v] = $v;
  1129. }
  1130. $tmp_update_where = [
  1131. 'or',
  1132. ['in', 'order_id', $tmp_order_arr],
  1133. ['in', 'parent_order_id', $tmp_order_arr],
  1134. ];
  1135. $res = self::updateAll($tmp_update_value, $tmp_update_where);
  1136. if (!$res) {
  1137. throw new Exception('更新订单信息失败');
  1138. }
  1139. }
  1140. }
  1141. #endregion
  1142. #region 6.插入日志
  1143. $order_opera_log = new OrderOperaLog();
  1144. foreach ($order_id_arr as $key => $vel) {
  1145. $order_opera_log_tmp = clone $order_opera_log;
  1146. $log_user_id = in_array($vel, $ori_order_id) ? $user_id : 2;//如果是非终端订单,操作用户记录为2-系统自动
  1147. $order_opera_log_tmp->attributes = [
  1148. 'order_id' => $vel,
  1149. 'opera_user_id' => $log_user_id,
  1150. 'opera_type' => 2,
  1151. 'opera_time' => date('Y-m-d H:i:s'),
  1152. 'opera_detail' => '取消原因:' . $cancel_reason,
  1153. 'opera_platform' => $opera_platform,
  1154. ];
  1155. $res = $order_opera_log_tmp->insert();
  1156. if (!$res) {
  1157. throw new Exception('插入日志失败');
  1158. }
  1159. }
  1160. #endregion
  1161. $transaction->commit();
  1162. #region 7.添加订单状态
  1163. foreach ($order_id_arr as $key => $vel) {
  1164. $url = 'http://' . CS_DOMAIN . '/st-xm/Api/add_order_status_log.php';
  1165. $post_data['order_id'] = $vel;
  1166. $post_data['order_status'] = '460';
  1167. Msg::httpRequest($url, $post_data);
  1168. }
  1169. #endregion
  1170. $result['code'] = '0';
  1171. $result['info'] = '退票成功';
  1172. $result['data'] = implode(',', $order_id_arr);
  1173. } catch (Exception $e) {
  1174. # 回滚事务
  1175. $result['code'] = '1';
  1176. $result['info'] = '退票失败';
  1177. $result['error'] = $e->getMessage();
  1178. }
  1179. return $result;
  1180. }
  1181. /**
  1182. * Function Description:从订单中获取所有需要修改成本的父子订单
  1183. * Function Name: getUpdateCostOrder
  1184. * @param array $bus_cost_count bus_cost
  1185. *
  1186. * @return array|bool
  1187. *
  1188. * @author 张帅
  1189. */
  1190. public function getUpdateCostOrder($bus_cost_count)
  1191. {
  1192. #region andWhere
  1193. $and_where = ['or'];
  1194. foreach ($bus_cost_count as $key => $vel) {
  1195. $and_where[] = [
  1196. 'and',
  1197. ['=', 'run_id', $vel['run_id']],
  1198. ['=', 'run_bus_order_id', $vel['bus_order_id']],
  1199. // comment by qius on 20170531 ['=', 'main_corp_id', $vel['main_corp_id']],
  1200. ];
  1201. }
  1202. #endregion
  1203. #region 根据车次获取子订单列表
  1204. $son_order_list = self::find()
  1205. ->select([
  1206. 'order_id' => "group_concat(order_id)",//子订单id序列
  1207. 'people_sum' => "count(order_id)",//总人数
  1208. 'parent_order_id',//父订单id
  1209. 'run_id',//班次id
  1210. 'bus_order_id' => 'run_bus_order_id',//车次id
  1211. ])
  1212. ->where([
  1213. 'and',
  1214. 'main_corp_id = source_main_corp_id',
  1215. ['=', 'cancel_flag', 0],
  1216. ['!=', 'parent_order_id', 0],
  1217. ['in', 'order_status', [146, 147]],
  1218. ['=', 'order_valid_status', 1],
  1219. ['in', 'order_prod_type', [82, 369]],
  1220. //['=', 'main_corp_id', 'source_main_corp_id'],//只有线路运营主体的订单才会按照用车成本来均摊订单成本
  1221. ])
  1222. ->andWhere($and_where)
  1223. ->groupBy(['parent_order_id', 'run_id', 'bus_order_id'])
  1224. ->asArray()->all();
  1225. #endregion
  1226. if (count($son_order_list) == 0) {
  1227. return false;
  1228. }
  1229. $result = [];//返回数组
  1230. $main_order_list = [];//主订单修改数组
  1231. #region 将数据处理成易修改模式
  1232. foreach ($son_order_list as $key => $vel) {
  1233. $son_order_list[$key]['base_price'] = $bus_cost_count[$vel['run_id'] . '-' . $vel['bus_order_id']]['base_price'];
  1234. if (!isset($main_order_list[$vel['parent_order_id']])) {
  1235. $main_order_list[$vel['parent_order_id']]['order_id'] = $vel['parent_order_id'];
  1236. $main_order_list[$vel['parent_order_id']]['base_price'] = 0;
  1237. }
  1238. $main_order_list[$vel['parent_order_id']]['base_price'] += $son_order_list[$key]['base_price'] * $vel['people_sum'];
  1239. }
  1240. #endregion
  1241. $result['son_order_list'] = $son_order_list;//子订单数据
  1242. $result['main_order_list'] = $main_order_list;//父订单数据
  1243. $sum = 0;
  1244. foreach ($son_order_list as $k => $v) {
  1245. $sum += $v['people_sum'];
  1246. }
  1247. return $result;
  1248. }
  1249. /**
  1250. * Function Description:修改订单成本价格
  1251. * Function Name: updateOrderBasePrice
  1252. * @param array $order_info 待修改的订单信息
  1253. *
  1254. * @return bool
  1255. *
  1256. * @author 张帅
  1257. */
  1258. public function updateOrderBasePrice($order_info)
  1259. {
  1260. $son_order_list = $order_info['son_order_list'];//子订单待修改数据
  1261. $main_order_list = $order_info['main_order_list'];//父订单待修改数据
  1262. $transaction = Yii::$app->db->beginTransaction();
  1263. try {
  1264. #region 修改子订单
  1265. foreach ($son_order_list as $key => $vel) {
  1266. $update_value = ['BASE_PRICE' => $vel['base_price']];
  1267. $update_where = [
  1268. 'and',
  1269. ['in', 'order_id', explode(',', $vel['order_id'])],
  1270. ];
  1271. self::updateAll($update_value, $update_where);
  1272. }
  1273. #endregion
  1274. #region 修改父订单
  1275. foreach ($main_order_list as $key => $vel) {
  1276. $update_value = ['BASE_PRICE' => $vel['base_price']];
  1277. $update_where = ['order_id' => $vel['order_id']];
  1278. self::updateAll($update_value, $update_where);
  1279. }
  1280. #endregion
  1281. $transaction->commit();
  1282. } catch (Exception $e) {
  1283. # 回滚事务
  1284. return false;
  1285. }
  1286. return true;
  1287. }
  1288. /**
  1289. * Function Description:自动计算订单佣金(先暂时对应直连OTA)
  1290. * Function Name: updateOrderBasePrice
  1291. * @param bool /string $start_date
  1292. *
  1293. * @return bool
  1294. *
  1295. * @author Redstop
  1296. */
  1297. public function updateOrderComission($start_date = false)
  1298. {
  1299. if ($start_date == false) {
  1300. //默认更新过去一个月
  1301. $start_date = date("Y-m-d", strtotime("-2 months"));
  1302. }
  1303. // $transaction = Yii::$app->db->beginTransaction();
  1304. // try {
  1305. // #region
  1306. // $update_sql = '' . " update order_main set TOTAL_COMMISSION = ORDER_PRICE * 8 / 100 where ORDER_PROD_TYPE NOT IN (25,26) AND CREATE_TIME >= '{$start_date} 00:00:00' AND ORDER_STATUS IN (146,147) AND CANCEL_FLAG = 0 AND ORDER_PRICE > 0 AND OUTSIDE_SALE_ORG_ID IN (17,28,76,1310) ";
  1307. // Yii::$app->db->createCommand($update_sql)->execute();
  1308. // $update_sql = '' . " update order_title set order_title_all_affi = order_title_all_price * 8 / 100 where create_time >= '{$start_date} 00:00:00' AND order_title_status IN (2,3) AND cancel_flag = 0 AND order_title_all_price > 0 AND outside_sale_org_id IN (17,28,76,1310) ";
  1309. // Yii::$app->db->createCommand($update_sql)->execute();
  1310. // #endregion
  1311. //
  1312. // #region
  1313. // $update_sql = '' . " update order_main set TOTAL_COMMISSION = ORDER_PRICE * 7 / 100 where ORDER_PROD_TYPE NOT IN (25,26) AND CREATE_TIME >= '{$start_date} 00:00:00' AND ORDER_STATUS IN (146,147) AND CANCEL_FLAG = 0 AND ORDER_PRICE > 0 AND OUTSIDE_SALE_ORG_ID IN (80) ";
  1314. // Yii::$app->db->createCommand($update_sql)->execute();
  1315. // $update_sql = '' . " update order_title set order_title_all_affi = order_title_all_price * 7 / 100 where create_time >= '{$start_date} 00:00:00' AND order_title_status IN (2,3) AND cancel_flag = 0 AND order_title_all_price > 0 AND outside_sale_org_id IN (80) ";
  1316. // Yii::$app->db->createCommand($update_sql)->execute();
  1317. // #endregion
  1318. //
  1319. // #region
  1320. // $update_sql = '' . " update order_main set TOTAL_COMMISSION = ORDER_PRICE * 6 / 100 where ORDER_PROD_TYPE NOT IN (25,26) AND CREATE_TIME >= '{$start_date} 00:00:00' AND ORDER_STATUS IN (146,147) AND CANCEL_FLAG = 0 AND ORDER_PRICE > 0 AND OUTSIDE_SALE_ORG_ID IN (11) ";
  1321. // Yii::$app->db->createCommand($update_sql)->execute();
  1322. // $update_sql = '' . " update order_title set order_title_all_affi = order_title_all_price * 6 / 100 where create_time >= '{$start_date} 00:00:00' AND order_title_status IN (2,3) AND cancel_flag = 0 AND order_title_all_price > 0 AND outside_sale_org_id IN (11) ";
  1323. // Yii::$app->db->createCommand($update_sql)->execute();
  1324. // #endregion
  1325. //
  1326. // #region
  1327. // $update_sql = '' . " update order_main set TOTAL_COMMISSION = ORDER_PRICE * 5.5 / 100 where ORDER_PROD_TYPE NOT IN (25,26) AND CREATE_TIME >= '{$start_date} 00:00:00' AND ORDER_STATUS IN (146,147) AND CANCEL_FLAG = 0 AND ORDER_PRICE > 0 AND OUTSIDE_SALE_ORG_ID IN (12) ";
  1328. // Yii::$app->db->createCommand($update_sql)->execute();
  1329. // $update_sql = '' . " update order_title set order_title_all_affi = order_title_all_price * 5.5 / 100 where create_time >= '{$start_date} 00:00:00' AND order_title_status IN (2,3) AND cancel_flag = 0 AND order_title_all_price > 0 AND outside_sale_org_id IN (12) ";
  1330. // Yii::$app->db->createCommand($update_sql)->execute();
  1331. // #endregion
  1332. //
  1333. // #region
  1334. // $update_sql = '' . " update order_main set TOTAL_COMMISSION = ORDER_PRICE * 5 / 100 where ORDER_PROD_TYPE NOT IN (25,26) AND CREATE_TIME >= '{$start_date} 00:00:00' AND ORDER_STATUS IN (146,147) AND CANCEL_FLAG = 0 AND ORDER_PRICE > 0 AND OUTSIDE_SALE_ORG_ID IN (128,149) ";
  1335. // Yii::$app->db->createCommand($update_sql)->execute();
  1336. // $update_sql = '' . " update order_title set order_title_all_affi = order_title_all_price * 5 / 100 where create_time >= '{$start_date} 00:00:00' AND order_title_status IN (2,3) AND cancel_flag = 0 AND order_title_all_price > 0 AND outside_sale_org_id IN (128,149) ";
  1337. // Yii::$app->db->createCommand($update_sql)->execute();
  1338. // #endregion
  1339. // $transaction->commit();
  1340. //
  1341. // } catch (Exception $e) {
  1342. // # 回滚事务
  1343. // return false;
  1344. // }
  1345. //
  1346. // return true;
  1347. //根据返佣规则返佣
  1348. $select = ['a.id', 'b.back_commision_type', 'b.back_commision_method', 'b.back_percent', 'b.back_value'];
  1349. $where = ['and'];
  1350. $where[] = ['=', 'b.PARENT_TYPE', 310];
  1351. $where[] = ['>=', 'a.CREATE_TIME', $start_date . ' 00:00:00'];
  1352. $where[] = ['=', 'b.COMMISION_FLAG', 1];
  1353. $where[] = ['not in', 'a.ORDER_PROD_TYPE', [25, 26]];
  1354. $a = self::find()->select($select)->from(self::tableName() . ' a')->leftJoin(BaseSupplierSale::tableName() . ' b', 'a.OUTSIDE_SALE_ORG_ID = b.SUPPLIER_ID and a.cancel_flag = 0 and b.cancel_flag = 0')->where($where)->distinct()->asArray()->all();
  1355. $transaction = Yii::$app->db->beginTransaction();
  1356. try {
  1357. //循环修改
  1358. foreach ($a as $v) {
  1359. if ($v['back_commision_type'] == 306) {
  1360. //如果是固定金额返现
  1361. if ($v['back_commision_method'] == 309) {
  1362. $id = $v['id'];
  1363. $back_value = $v['back_value'];
  1364. $obj = self::findOne($id);
  1365. $obj->TOTAL_COMMISSION = $back_value;
  1366. $obj->save();
  1367. }
  1368. //如果是按照比例返现
  1369. if ($v['back_commision_method'] == 308) {
  1370. $id = $v['id'];
  1371. $back_percent = $v['back_percent'];
  1372. $obj = self::findOne($id);
  1373. $obj->TOTAL_COMMISSION = round(($obj->ORDER_PRICE * $back_percent / 100), 2);
  1374. $obj->save();
  1375. }
  1376. }
  1377. }
  1378. $transaction->commit();
  1379. return true;
  1380. } catch (Exception $e) {
  1381. # 回滚事务
  1382. $transaction->rollBack();
  1383. return false;
  1384. }
  1385. }
  1386. /**
  1387. * Function Description:修改成本价格
  1388. * Function Name: updateBasePrice
  1389. * @param int $order_id 订单id
  1390. * @param int $people_num 人数
  1391. * @param double $base_price 订单价格
  1392. *
  1393. * @return bool
  1394. *
  1395. * @author 张帅
  1396. */
  1397. public function updateBasePrice($order_id, $people_num, $base_price)
  1398. {
  1399. $total__base_price = round($base_price * $people_num, 2);
  1400. $transaction = Yii::$app->db->beginTransaction();
  1401. try {
  1402. #region 修改子订单
  1403. $update_value = ['BASE_PRICE' => $base_price];
  1404. $update_where = [
  1405. 'and',
  1406. ['=', 'parent_order_id', $order_id],
  1407. ];
  1408. self::updateAll($update_value, $update_where);
  1409. #endregion
  1410. #region 修改父订单
  1411. $main_order_one = self::findOne(['order_id' => $order_id]);
  1412. $main_order_one->BASE_PRICE = $total__base_price;
  1413. $main_order_one->update();
  1414. #endregion
  1415. $transaction->commit();
  1416. } catch (Exception $e) {
  1417. # 回滚事务
  1418. return false;
  1419. }
  1420. return true;
  1421. }
  1422. /**
  1423. * Function Description:获取票种代收价
  1424. * Function Name: getTicketProductListReceiver
  1425. * @param array $prod_list 产品列表
  1426. * @param string $receiver_value_str 代收信息
  1427. *
  1428. * @return array
  1429. *
  1430. * @author 张帅
  1431. */
  1432. public function getTicketProductListReceiver($prod_list, $receiver_value_str)
  1433. {
  1434. $result = [];
  1435. $receiver_value_str = substr($receiver_value_str, 1, -1);
  1436. $receiver_value_arr = explode(',', $receiver_value_str);//代收价格信息
  1437. $receiver_value = (!isset($receiver_value_arr[0]) || empty($receiver_value_arr[0])) ? 0 : $receiver_value_arr[0];//代收单价
  1438. $total_receiver_value = (!isset($receiver_value_arr[1]) || empty($receiver_value_arr[1])) ? 0 : $receiver_value_arr[1];//代收总价
  1439. #region 获取代收单价 订单描述 订单总人数 订单总价 订单总成本
  1440. $base_price = 0;//订单总成本
  1441. $count_people_num = 0;//总人数
  1442. $order_description = [];//订单描述
  1443. $order_price = 0;//订单总价
  1444. foreach ($prod_list as $key => $vel) {
  1445. $order_description[] = $vel['prod_name'] . ',' . date('Y-m-d', time()) . ',' . $vel['people_num'];//订单描述
  1446. $count_people_num += $vel['people_num'];//订单总人数
  1447. $order_price += $vel['order_price'] * $vel['people_num'];//订单总价
  1448. $base_price += $vel['prod_price'] * $vel['people_num'];//订单总成本
  1449. }
  1450. $order_description[] = $count_people_num;
  1451. $order_description = implode('|', $order_description);//订单描述
  1452. if ($total_receiver_value != 0) {
  1453. $receiver_value = $total_receiver_value / $count_people_num;
  1454. } else {
  1455. $total_receiver_value = $receiver_value * $count_people_num;
  1456. }
  1457. #endregion
  1458. #region 代收单价,代收总价放入产品列表中
  1459. foreach ($prod_list as $key => $vel) {
  1460. $prod_list[$key]['receiver_value'] = round($receiver_value, 2);
  1461. }
  1462. #endregion
  1463. $main_order_info = [
  1464. 'receiver_value' => $total_receiver_value,
  1465. 'people_num' => $count_people_num,
  1466. 'order_description' => $order_description,
  1467. 'order_price' => $order_price,
  1468. 'base_price' => $base_price,
  1469. ];
  1470. $result['prod_list'] = $prod_list;
  1471. $result['main_order_info'] = $main_order_info;
  1472. return $result;
  1473. }
  1474. /**
  1475. * Function Description:提交门票订单
  1476. * Function Name: submitTicketOrder
  1477. * @param array $main_prod 主产品
  1478. * @param array $prod_list 产品列表
  1479. * @param array $order_info_arr 订单的其他信息
  1480. * @param array $customer_info_arr 乘客
  1481. *
  1482. * @return mixed
  1483. *
  1484. * @author 张帅
  1485. */
  1486. public function submitTicketOrder($main_prod, $prod_list, $order_info_arr, $customer_info_arr)
  1487. {
  1488. #region 获取最大唯一值,先赋给支付id,然后递增
  1489. $pay_main_id = BaseUniqueId2::find()->select('unique_id')->where(['id' => 1])->asArray()->one();
  1490. $pay_main_id = $pay_main_id['unique_id'] + 1;
  1491. $parent_order_id = $pay_main_id + 1;
  1492. #endregion
  1493. #region 提交订单操作数据库所需数据
  1494. $son_order = [];//子订单数据
  1495. $son_order_key = [];//提交子订单时所需key值
  1496. #endregion
  1497. #region 整理主订单数据
  1498. $main_order = [//主订单数据
  1499. 'ID' => $parent_order_id,
  1500. 'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  1501. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  1502. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1503. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1504. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1505. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  1506. 'SALE_TOP_ORG_ID' => 0,//'下单组织机构所属一级机构ID',
  1507. 'PROD_TOP_ORG_ID' => 0,//'产品所属一级机构ID',
  1508. 'ORDER_ID' => $parent_order_id,
  1509. 'ORDER_DESCRIPTION' => $main_prod['order_description'],//'最细颗粒度的订单描述',
  1510. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
  1511. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  1512. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  1513. 'PROD_START_STATION_TIME_MINUTES' => 0,
  1514. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  1515. 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
  1516. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  1517. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  1518. 'PARENT_ORDER_ID' => 0,
  1519. 'PROD_ID' => $main_prod['prod_id'],//产品id
  1520. 'PROD_NAME' => $main_prod['prod_name'],//产品id
  1521. 'PARENT_PROD_ID' => $main_prod['prod_id'],//产品id
  1522. 'PARENT_PROD_NAME' => $main_prod['prod_name'],//产品id
  1523. 'BASE_PRICE' => $main_prod['base_price'],//产品成本
  1524. 'ORDER_PRICE' => $main_prod['order_price'],//'订单价格',
  1525. 'ORDER_PROD_TYPE' => 311,//'订单类型',
  1526. 'RUN_DATE' => $main_prod['run_date'],
  1527. 'RUN_DATE_NUM' => (strtotime($main_prod['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),//'班次首发日期参数,发车日期至2016-01-01天数,算法使用',
  1528. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  1529. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  1530. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  1531. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  1532. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  1533. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  1534. 'MEMBER_ID' => $order_info_arr['member_id'],
  1535. 'ORDER_STATUS' => $order_info_arr['order_status'],//'订单当前状态',
  1536. 'IF_LAST_PROD' => 1,//'是否最细颗粒度的判断',
  1537. 'ORDER_LEVEL' => 0,//'Order Level',
  1538. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],
  1539. 'SALES_MAN' => $order_info_arr['sales_man'],
  1540. 'RECEIVE_VALUE' => $main_prod['receiver_value'],
  1541. 'PRINCIPAL_ID' => $main_prod['run_duty_id'],
  1542. ];
  1543. #endregion
  1544. #region 获取子订单数据
  1545. $son_order_id = $parent_order_id + 1;
  1546. foreach ($prod_list as $key => $vel) {
  1547. for ($i = 0; $i < $vel['people_num']; $i++) {
  1548. #region 子订单数据
  1549. $son_order_val = [
  1550. 'ID' => $son_order_id,
  1551. 'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
  1552. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  1553. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1554. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1555. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1556. 'SALE_ORG_ID' => 0,//'分销商机构ID',
  1557. 'SALE_TOP_ORG_ID' => 0,
  1558. 'PROD_TOP_ORG_ID' => 0,
  1559. 'ORDER_ID' => $son_order_id,
  1560. 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
  1561. 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
  1562. 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
  1563. 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
  1564. 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
  1565. 'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
  1566. 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
  1567. 'PARENT_ORDER_ID' => $parent_order_id,
  1568. 'PROD_ID' => $vel['prod_id'],
  1569. 'PARENT_PROD_ID' => $main_prod['prod_id'],
  1570. 'PROD_NAME' => $vel['prod_name'],
  1571. 'PARENT_PROD_NAME' => $main_prod['prod_name'],
  1572. 'ORDER_PRICE' => $vel['order_price'],
  1573. 'BASE_PRICE' => $vel['prod_price'],//产品成本
  1574. 'ORDER_PROD_TYPE' => $vel['prod_type'],
  1575. 'RUN_DATE' => $vel['run_date'],
  1576. 'RUN_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),//'班次首发日期参数,发车日期至2016-01-01天数,算法使用',
  1577. 'RUN_TIME' => $vel['run_time'],
  1578. 'PROD_START_STATION_TIME_MINUTES' => 0,
  1579. 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
  1580. 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
  1581. 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
  1582. 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
  1583. 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
  1584. 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
  1585. 'MEMBER_ID' => $order_info_arr['member_id'],
  1586. 'ORDER_STATUS' => $order_info_arr['order_status'],
  1587. 'if_gift' => 0,//'是否是赠票,0不是赠票,1是赠票',
  1588. 'ORDER_LEVEL' => 0,
  1589. 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],
  1590. 'SALES_MAN' => $order_info_arr['sales_man'],
  1591. 'RECEIVE_VALUE' => $vel['receiver_value'],
  1592. 'PRINCIPAL_ID' => $main_prod['run_duty_id'],
  1593. ];
  1594. #endregion
  1595. #region 子订单key值
  1596. if (count($son_order_key) == 0) {
  1597. $son_order_key = array_keys($son_order_val);
  1598. }
  1599. #endregion
  1600. #region 子订单数组
  1601. $son_order[] = $son_order_val;
  1602. #endregion
  1603. $son_order_id++;
  1604. }
  1605. }
  1606. #endregion
  1607. $unique_id = $son_order_id;//唯一主键
  1608. $transaction = Yii::$app->db->beginTransaction();
  1609. try {
  1610. #region 1.插入主订单
  1611. $this->attributes = $main_order;
  1612. $res = $this->insert();
  1613. if (!$res) {
  1614. throw new Exception('主订单提交失败');
  1615. }
  1616. #endregion
  1617. #region 2.插入子订单
  1618. $res = Yii::$app->db->createCommand()->batchInsert(OrderMain::tableName(), $son_order_key, $son_order)->execute();
  1619. if (!$res) {
  1620. throw new Exception('子订单提交失败');
  1621. }
  1622. #endregion
  1623. #region 3.更新opera_product_run
  1624. foreach ($prod_list as $key => $vel) {
  1625. $update_value = [
  1626. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1627. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1628. 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['people_num']),
  1629. ];
  1630. $update_where = [
  1631. 'and',
  1632. ['=', 'prod_id', $vel['prod_id']],
  1633. ['=', 'run_date', $vel['run_date']],
  1634. ['=', 'cancel_flag', 0],
  1635. ];
  1636. $res = OperaProductRun::updateAll($update_value, $update_where);
  1637. if (!$res) {
  1638. throw new Exception('更新opera_product_run失败');
  1639. }
  1640. }
  1641. #endregion
  1642. #region 4.插入主支付记录
  1643. $order_pay_main = new OrderPayMain();
  1644. $order_pay_main->attributes = [
  1645. 'ID' => $pay_main_id,
  1646. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  1647. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1648. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1649. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1650. 'PAY_TOTAL' => $main_prod['order_price'],
  1651. 'ORDER_ID' => $parent_order_id,
  1652. ];
  1653. $res = $order_pay_main->insert();
  1654. if (!$res) {
  1655. throw new Exception('插入主支付记录失败');
  1656. }
  1657. #endregion
  1658. #region 5.插入支付明细
  1659. $order_pay_detail = new OrderPayDetail();
  1660. $order_pay_detail->attributes = [
  1661. 'ID' => $pay_main_id,
  1662. 'CREATE_USER_ID' => $order_info_arr['user_id'],
  1663. 'CREATE_TIME' => date('Y-m-d H:i:s'),
  1664. 'UPDATE_USER_ID' => $order_info_arr['user_id'],
  1665. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1666. 'PAY_MAIN_ID' => $pay_main_id,
  1667. 'PAY_TYPE_ID_1' => $order_info_arr['pay_type'],
  1668. 'PAY_MONEY' => $main_prod['order_price'],
  1669. ];
  1670. $res = $order_pay_detail->insert();
  1671. if (!$res) {
  1672. throw new Exception('插入支付明细失败');
  1673. }
  1674. #endregion
  1675. #region 6.更新唯一键值
  1676. $time = time() . rand(0, 999999);
  1677. $res = BaseUniqueId2::updateAll(['UNIQUE_ID' => $unique_id, 'UPDATE_TIME' => $time], ['id' => 1]);
  1678. if (!$res) {
  1679. throw new Exception('更新唯一键值失败');
  1680. }
  1681. #endregion
  1682. #region 7.插入日志
  1683. $order_opera_log = new OrderOperaLog();
  1684. $order_opera_log->attributes = [
  1685. 'order_id' => $parent_order_id,
  1686. 'opera_user_id' => $order_info_arr['user_id'],
  1687. 'opera_type' => 1,
  1688. 'opera_time' => date('Y-m-d H:i:s'),
  1689. 'opera_detail' => '创建订单,出发日期' . $main_prod['run_date'] . ',订单渠道' . $order_info_arr['org_name'] . ',订单总金额' . $main_prod['order_price'] . ',联系人信息:' . $customer_info_arr['customer_name'] . ',' . $customer_info_arr['customer_mobile'] . ',' . $customer_info_arr['customer_id_no'] . ',备注信息:' . $customer_info_arr['customer_memo'],
  1690. 'member_id' => $order_info_arr['member_id'],
  1691. 'opera_platform' => '统一下单',
  1692. ];
  1693. $res = $order_opera_log->insert();
  1694. if (!$res) {
  1695. throw new Exception('插入日志失败');
  1696. }
  1697. #endregion
  1698. $transaction->commit();
  1699. //驴妈妈产品下单特殊处理--lmn
  1700. $util = new Util();
  1701. $util->LvmamaOrderCheck($parent_order_id);
  1702. //智游宝门票下单
  1703. $kxTicketUtil = new KxTicketUtil();
  1704. $kxTicketUtil->OrderCheck($parent_order_id);
  1705. $result['code'] = '0';
  1706. $result['info'] = '下单成功';
  1707. $result['data'] = $parent_order_id;
  1708. } catch (Exception $e) {
  1709. # 回滚事务
  1710. $result['code'] = '1';
  1711. $result['info'] = '下单失败';
  1712. $result['error'] = $e->getMessage();
  1713. }
  1714. return $result;
  1715. }
  1716. /**
  1717. * Function Description:获取门票订单数据
  1718. * Function Name: getTicketOrderInfo
  1719. * @param int $order_id 订单id
  1720. *
  1721. * @return array|ActiveRecord[]
  1722. *
  1723. * @author 张帅
  1724. */
  1725. public function getTicketOrderInfo($order_id)
  1726. {
  1727. $result = self::find()
  1728. ->select([
  1729. 'prod_id',//子票种id
  1730. 'parent_prod_id',//父票种id
  1731. 'order_num' => 'count(order_id)',//人数
  1732. 'run_date',
  1733. 'order_confirm_code', //渠道保险单号
  1734. ])
  1735. ->where([
  1736. 'and',
  1737. ['=', 'parent_order_id', $order_id],
  1738. ['=', 'cancel_flag', 0],
  1739. ['=', 'order_valid_status', 1],
  1740. ['!=', 'order_status', [147, 148]],
  1741. ])
  1742. ->groupBy(['prod_id'])
  1743. ->asArray()->all();
  1744. return $result;
  1745. }
  1746. /**
  1747. * Function Description:取消门票订单
  1748. * Function Name: cancelTicketOrder
  1749. * @param int $order_id 订单id
  1750. * @param array $order_info 订单数据
  1751. * @param int $user_id 用户id
  1752. * @param string $cancel_reason 退票原因
  1753. * @param int $lvmama_flag 是否需要去驴妈妈退票
  1754. *
  1755. * @return mixed
  1756. *
  1757. * @author 张帅
  1758. */
  1759. public function cancelTicketOrder($order_id, $order_info, $user_id, $cancel_reason, $lvmama_flag = 1)
  1760. {
  1761. $transaction = Yii::$app->db->beginTransaction();
  1762. try {
  1763. #region 1.更新订单信息
  1764. $update_value = [
  1765. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1766. 'ORDER_STATUS' => 148,
  1767. 'ORDER_VALID_STATUS' => 0,
  1768. 'ORDER_DISABLE_USER_ID' => $user_id,
  1769. 'ORDER_DISABLE_TIME' => date('Y-m-d H:i:s'),
  1770. ];
  1771. $update_where = [
  1772. 'or',
  1773. ['=', 'order_id', $order_id],
  1774. ['=', 'parent_order_id', $order_id],
  1775. ];
  1776. $res = self::updateAll($update_value, $update_where);
  1777. if (!$res) {
  1778. throw new Exception('更新订单信息失败');
  1779. }
  1780. #endregion
  1781. #region 2.更新opera_product_run
  1782. foreach ($order_info as $key => $vel) {
  1783. $update_value = [
  1784. 'UPDATE_USER_ID' => $user_id,
  1785. 'UPDATE_TIME' => date('Y-m-d H:i:s'),
  1786. 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
  1787. ];
  1788. $update_where = [
  1789. 'and',
  1790. ['=', 'prod_id', $vel['prod_id']],
  1791. ['=', 'run_date', $vel['run_date']],
  1792. ['=', 'cancel_flag', 0],
  1793. ];
  1794. $res = OperaProductRun::updateAll($update_value, $update_where);
  1795. if (!$res) {
  1796. throw new Exception('更新opera_product_run失败');
  1797. }
  1798. }
  1799. #endregion
  1800. //驴妈妈订单取消需要去驴妈妈渠道申请退款
  1801. $opera_prod = new OperaProduct();
  1802. $lvmama_order_connect = new LvmamaOrderConnect();
  1803. $org_id = $opera_prod::find()->from('opera_product')->where(['prod_id' => $order_info[0]['parent_prod_id']])->asArray()->one();
  1804. if ($org_id['ORG_ID'] == 1369 && $lvmama_flag == 1) {//org_id=1369时就是驴妈妈的产品
  1805. //查出主订单所有关联订单
  1806. $lvmama_ids = $lvmama_order_connect::find()->select('partner_id,lvmama_id')->from('lvmama_order_connect')->where(['main_order_id' => $order_id])->asArray()->all();
  1807. if (!empty($lvmama_ids)) {
  1808. foreach ($lvmama_ids as $val) {
  1809. $cancel_lvmama = Util::OrderCancelForLvmama($val['partner_id'], $val['lvmama_id']);
  1810. if ($cancel_lvmama['state']['code'] != 1000) {
  1811. $result['code'] = '1';
  1812. $result['info'] = '退票失败';
  1813. $result['error'] = '驴妈妈订单取消失败:' . $cancel_lvmama['message']['solution'];
  1814. return $result;
  1815. }
  1816. }
  1817. }
  1818. }
  1819. #region 3.插入日志
  1820. $order_opera_log = new OrderOperaLog();
  1821. $order_opera_log->attributes = [
  1822. 'order_id' => $order_id,
  1823. 'opera_user_id' => $user_id,
  1824. 'opera_type' => 2,
  1825. 'opera_time' => date('Y-m-d H:i:s'),
  1826. 'opera_detail' => '取消原因:' . $cancel_reason,
  1827. 'opera_platform' => '统一退票',
  1828. ];
  1829. $res = $order_opera_log->insert();
  1830. if (!$res) {
  1831. throw new Exception('插入日志失败');
  1832. }
  1833. #endregion
  1834. $transaction->commit();
  1835. $result['code'] = '0';
  1836. $result['info'] = '退票成功';
  1837. $result['data'] = $order_id;
  1838. } catch (Exception $e) {
  1839. # 回滚事务
  1840. $result['code'] = '1';
  1841. $result['info'] = '退票失败';
  1842. $result['error'] = $e->getMessage();
  1843. }
  1844. return $result;
  1845. }
  1846. /**
  1847. * Function Description:获取某个车次的所有订单 经过白名单过滤的所有订单
  1848. * Function Name: getOrderArrayFromRunbus
  1849. * @param int $run_id 班次id
  1850. * @param int $bus_order_id 车次ID
  1851. *
  1852. * @return array
  1853. *
  1854. * @author Redstop
  1855. */
  1856. public function getOrderArrayFromRunbus($run_id, $bus_order_id)
  1857. {
  1858. $result = self::find()->select([
  1859. 'parent_order_id', "customer_mobile", "main_corp_id"
  1860. ])->from(self::tableName())
  1861. ->innerJoin('appoint_send_message', 'appoint_send_message.order_id = order_main.parent_order_id')
  1862. ->where([
  1863. 'and',
  1864. ['=', 'run_id', $run_id],
  1865. ['=', 'run_bus_order_id', $bus_order_id],
  1866. ['>', 'parent_order_id', 0],
  1867. ['in', 'order_status', [146, 147]],
  1868. ['=', 'order_main.cancel_flag', 0],
  1869. ['=', 'appoint_send_message.cancel_flag', 0],
  1870. ['=', 'agent_level', 1],
  1871. ['in', 'order_prod_type', [81, 82, 369]],
  1872. ])
  1873. ->groupBy('parent_order_id')
  1874. ->asArray()->all();
  1875. return $result;
  1876. }
  1877. /*
  1878. * 判断车票销售层级是否是终端
  1879. */
  1880. public function check_cancel($order_id)
  1881. {
  1882. $result = self::find()->select('agent_level')
  1883. ->from(self::tableName())
  1884. ->where(['order_id' => $order_id])
  1885. ->asArray()
  1886. ->one();
  1887. return $result['agent_level'];
  1888. }
  1889. /**
  1890. * Function Description:查询巴士起点位置信息及相关出行信息
  1891. * Function Name: get_bus_position_info
  1892. * @param $order_id
  1893. * @param $run_date
  1894. *
  1895. * @return array|null|ActiveRecord
  1896. *
  1897. * @author 娄梦宁
  1898. */
  1899. public function get_bus_position_info($order_id, $run_date)
  1900. {
  1901. $select = [
  1902. 'longitude' => '(select property from base_resource_property where res_id=m.prod_start_station_res_id and type_id=212 and cancel_flag=0 limit 1)',
  1903. 'latitude' => '(select property from base_resource_property where res_id=m.prod_start_station_res_id and type_id=213 and cancel_flag=0 limit 1) ',
  1904. 'address' => ' (select ifnull(property,"") from base_resource_property where res_id=m.prod_start_station_res_id and type_id=279 and cancel_flag=0 limit 1)',
  1905. 'res_id' => 'prod_start_station_res_id',
  1906. 'res_name' => 'prod_start_station_res_name',
  1907. 'bus_id' => 'r.send_bus_res_id',
  1908. 'bus_no' => 'r.send_bus_no',
  1909. 'driver_name' => 'r.send_driver_name',
  1910. 'driver_mobile' => 'send_driver_mobile',
  1911. 'color' => '(select res_name from base_resource where res_id=b.bus_color)',
  1912. 'lng' => 'g.longitude',
  1913. 'lat' => 'g.latitude',
  1914. 'img_url' => 'b.bus_img_path',
  1915. 'bus_name' => '(select res_name from base_resource where res_id=b.brand_id)',
  1916. 'seat_list' => '(select group_concat(run_bus_seat_name) from order_main where parent_order_id=m.parent_order_id and cancel_flag = 0)',
  1917. 'appoint_message' => '(select count(order_id) FROM appoint_send_message where order_id = m.parent_order_id and cancel_flag = 0 ) ',
  1918. 'click_send_message' => '(select count(order_id) FROM wechat_click_message where order_id = m.parent_order_id and cancel_flag = 0 ) '
  1919. ];
  1920. $current_day = date("Y-m-d");
  1921. $result = self::find()->select($select)
  1922. ->from('order_main m')
  1923. ->leftJoin('run_bus r', 'm.run_id=r.run_id and m.run_bus_order_id=r.bus_order_id')
  1924. ->leftJoin('base_bus b', 'b.bus_id=r.send_bus_res_id')
  1925. ->leftJoin('gps_new g', "g.run_date = '{$current_day}' and g.bus_no=r.send_bus_no ")
  1926. ->where(['and', ['=', 'parent_order_id', $order_id], ['=', 'm.run_date', $run_date]])
  1927. ->orderBy(['g.create_time' => SORT_DESC])
  1928. ->limit(1)
  1929. ->asArray()->one();
  1930. return $result;
  1931. }
  1932. /*
  1933. * 获取订单渠道号
  1934. */
  1935. public function getOutsideSaleOrgId($order_id_arr)
  1936. {
  1937. $result = self::find()->select('outside_sale_org_id')->from(self::tableName())
  1938. ->where(['in', 'order_id', $order_id_arr])
  1939. ->limit(1)
  1940. ->asArray()
  1941. ->one();
  1942. return $result['outside_sale_org_id'];
  1943. }
  1944. public function getOperaLine()
  1945. {
  1946. return $this->hasOne(OperaLine::className(), ['LINE_ID' => 'PARENT_PROD_ID']);
  1947. }
  1948. /**
  1949. * Function Description:查询订单里面的票种
  1950. * Function Name: getRunTicketInfo
  1951. * @param $run_id
  1952. *
  1953. * @return array|ActiveRecord[]
  1954. *
  1955. * @author 李健
  1956. */
  1957. public function getRunTicketInfo($run_id)
  1958. {
  1959. $select = [
  1960. 'order.order_id',
  1961. 'order.prod_id',
  1962. 'order.prod_start_station_area_name as start_area',
  1963. 'order.prod_end_station_area_name as end_area',
  1964. 'order.prod_start_station_res_name as start_station',
  1965. 'order.prod_end_station_res_name as end_station',
  1966. 'order.prod_start_station_time as start_time',
  1967. 'order.prod_end_station_time as end_time',
  1968. 'order.run_bus_order_id as bus_order_id',
  1969. 'dict.type_name as seat_type',
  1970. 'order.run_bus_seat_name as seat_name',
  1971. 'order.order_price',
  1972. 'if_print' => new Expression('if(`order`.order_print_times>0,"是","否")')
  1973. ];
  1974. $where = ['and'];
  1975. $where[] = ['=', 'order.run_id', $run_id];
  1976. $where[] = ['=', 'order.order_valid_status', 1];
  1977. $where[] = ['=', 'order.cancel_flag', 0];
  1978. $where[] = ['>', 'order.parent_order_id', 0];
  1979. $where[] = ['=', 'order.order_prod_type', 82];
  1980. $res = self::find()
  1981. ->select($select)
  1982. ->from(self::tableName() . ' order')
  1983. ->leftJoin(DictType::tableName() . ' dict', 'dict.id=`order`.run_bus_seat_type')
  1984. ->where($where)
  1985. ->asArray()
  1986. ->all();
  1987. return $res;
  1988. }
  1989. /**
  1990. * Function Description:获取订单班次信息(获取座次详情时)
  1991. * Function Name: getOrderInfoForGetSeat
  1992. * @param $order_id
  1993. *
  1994. * @return array|null|ActiveRecord
  1995. *
  1996. * @author 娄梦宁
  1997. */
  1998. public function getOrderInfoForGetSeat($order_id)
  1999. {
  2000. $select = [
  2001. 'son_order' => 'group_concat(order_id)',
  2002. 'seat_name' => 'group_concat(distinct run_bus_seat_name)',
  2003. 'line_id' => 'parent_prod_id',//线路id
  2004. 'run_id',//班次id
  2005. 'run_bus_order_id',//班次车号
  2006. 'run_bus_seat_seq_id' => 'group_concat(distinct run_bus_seat_seq_id)',//座位号
  2007. 'run_date',//班次日期
  2008. 'customer_mobile',//手机号
  2009. 'bus_order_id' => "group_concat(distinct run_bus_order_id)",//车次号
  2010. 'start_seq_id' => 'prod_start_station_seq_id',//开始站顺序号
  2011. 'end_seq_id' => 'prod_end_station_seq_id',//结束站站顺序号
  2012. 'start_area_id' => 'prod_start_station_area_id',//起点poi id
  2013. 'start_area_name' => 'PROD_START_STATION_AREA_NAME',
  2014. 'end_area_id' => 'prod_end_station_area_id',//终点 poi id
  2015. 'end_area_name' => 'PROD_END_STATION_AREA_NAME',
  2016. 'cnt' => 'count(1)',//子订单数
  2017. 'run_x' => "concat('run_',year(run_date),LPAD(month(run_date),2,0))",
  2018. 'run_time',
  2019. 'create_time',
  2020. 'prod_start_station_date',
  2021. 'prod_start_station_time'
  2022. ];
  2023. $result = self::find()->select($select)
  2024. ->from(self::tableName())
  2025. ->where(['and', ['=', 'parent_order_id', $order_id], ['=', 'cancel_flag', 0]])
  2026. ->asArray()
  2027. ->one();
  2028. return $result;
  2029. }
  2030. /**
  2031. * Function Description:获取订单所有座位序列号
  2032. * Function Name: getSeatNumber
  2033. * @param $order_id
  2034. *
  2035. * @return mixed
  2036. *
  2037. * @author 娄梦宁
  2038. */
  2039. public function getSeatNumber($order_id)
  2040. {
  2041. $result = self::find()->select('group_concat(RUN_BUS_SEAT_NAME) as seat_no')->from(self::tableName())->where(['and', ['=', 'cancel_flag', 0], ['=', 'parent_order_id', $order_id]])->asArray()->one();
  2042. return $result['seat_no'];
  2043. }
  2044. /**
  2045. * Des:根据订单ID获取车辆信息
  2046. * Name: getBusInfoByOrderId
  2047. * @param $order_id
  2048. * @return array
  2049. * @author 倪宗锋
  2050. */
  2051. public function getBusInfoByOrderId($order_id)
  2052. {
  2053. $select = [
  2054. 'c.BUS_NO', 'c.SEAT_MATRIX_ID', 'c.BUS_TYPE_RES_ID', 'c.BUS_ID', 'c.BUS_NO', 'c.BUS_COLOR'
  2055. ];
  2056. $getInfo = self::find()->select($select)
  2057. ->from(self::tableName() . ' a')
  2058. ->innerJoin(RunBus::tableName() . ' b', 'a.RUN_ID = b.RUN_ID and a.RUN_BUS_ORDER_ID = b.BUS_ORDER_ID')
  2059. ->leftJoin(BaseBus::tableName() . ' c', 'b.SEND_BUS_RES_ID = c.BUS_ID')
  2060. ->where(['=', 'a.PARENT_ORDER_ID', $order_id])
  2061. ->groupBy('a.ORDER_ID')
  2062. ->asArray()
  2063. ->one();
  2064. return $getInfo;
  2065. }
  2066. /**
  2067. * Function Description:获取订单对应的所有子订单
  2068. * Function Name: getSonOrderArr
  2069. * @param $order_id
  2070. *
  2071. * @return array|ActiveRecord[]
  2072. *
  2073. * @author 娄梦宁
  2074. */
  2075. public function getSonOrderArr($order_id)
  2076. {
  2077. $result = self::find()->select('order_id')
  2078. ->from(self::tableName())
  2079. ->where(['and', ['=', 'cancel_flag', 0], ['=', 'parent_order_id', $order_id]])
  2080. ->asArray()
  2081. ->all();
  2082. return $result;
  2083. }
  2084. /**
  2085. * Function Description:获取订单所属供应商
  2086. * Function Name: getProdTopOrgId
  2087. * @param $order_id
  2088. *
  2089. * @return mixed
  2090. *
  2091. * @author 娄梦宁
  2092. */
  2093. public function getProdTopOrgId($order_id)
  2094. {
  2095. $result = self::find()->select('prod_top_org_id')->from(self::tableName())
  2096. ->where(['and', ['=', 'cancel_flag', 0], ['=', 'order_id', $order_id]])
  2097. ->asArray()
  2098. ->one();
  2099. return $result['prod_top_org_id'];
  2100. }
  2101. /**
  2102. * Des:派车时,更新order_main中的座位名称
  2103. * Name: updateOrderMainForNewBusByOldMatrix
  2104. * @param $run_id
  2105. * @param $bus_order_id
  2106. * @param $res_id
  2107. * @param $user_id
  2108. * @author 倪宗锋
  2109. */
  2110. public function updateOrderMainForNewBusByOldMatrix($run_id, $bus_order_id, $res_id, $user_id)
  2111. {
  2112. $sql = "update order_main a
  2113. INNER JOIN base_resource_matrix b on a.RUN_BUS_SEAT_SEQ_ID = b.POS_SEQ_ID
  2114. SET a.RUN_BUS_SEAT_NAME = b.POS_NAME , a.UPDATE_USER_ID = $user_id
  2115. where a.run_id= {$run_id} and a.RUN_BUS_ORDER_ID = {$bus_order_id}
  2116. and b.RES_ID={$res_id} and b.CANCEL_FLAG=0";
  2117. \Yii::$app->db->createCommand($sql)->execute();
  2118. }
  2119. /**
  2120. * Des:派车时,更新order_main中的座位名称
  2121. * Name: updateOrderMainForNewBusByNewMatrix
  2122. * @param $run_id
  2123. * @param $bus_order_id
  2124. * @param $res_id
  2125. * @param $user_id
  2126. * @author 倪宗锋
  2127. */
  2128. public function updateOrderMainForNewBusByNewMatrix($run_id, $bus_order_id, $res_id, $user_id)
  2129. {
  2130. $sql = "update order_main a
  2131. INNER JOIN bus_seat_matrix b on a.RUN_BUS_SEAT_SEQ_ID = b.POS_SEQ_ID
  2132. SET a.RUN_BUS_SEAT_NAME = b.POS_NAME , a.UPDATE_USER_ID = $user_id
  2133. where a.run_id= {$run_id} and a.RUN_BUS_ORDER_ID = {$bus_order_id}
  2134. and b.RES_ID={$res_id} and b.CANCEL_FLAG=0";
  2135. \Yii::$app->db->createCommand($sql)->execute();
  2136. }
  2137. /**
  2138. * Function Description:根据订单号获取其所属车票是否需要检票
  2139. * Function Name: getTicketChecked
  2140. * @param $order_id
  2141. *
  2142. * @return array|null|ActiveRecord
  2143. *
  2144. * @author 娄梦宁
  2145. */
  2146. public function getTicketChecked($order_id)
  2147. {
  2148. $result = self::find()->select('b.is_checked')
  2149. ->from(self::tableName() . ' a')
  2150. ->leftJoin('opera_tickets b', 'a.prod_id=b.ticket_id')
  2151. ->where(['and', ['=', 'a.parent_order_id', $order_id], ['=', 'b.cancel_flag', 0]])
  2152. ->limit(1)
  2153. ->asArray()
  2154. ->one();
  2155. return $result['is_checked'];
  2156. }
  2157. /**
  2158. * Function Description:校验供应商订单号是否存在
  2159. * Function Name: checkOutsideOrderNo
  2160. * @param $outside_order_no
  2161. *
  2162. * @return array
  2163. *
  2164. * @author 娄梦宁
  2165. */
  2166. public function checkOutsideOrderNo($outside_order_no, $org_id)
  2167. {
  2168. $where = [
  2169. 'and',
  2170. ['=', 'outside_order_no', $outside_order_no],
  2171. ['=', 'parent_order_id', 0],
  2172. ['=', 'ORDER_PROD_TYPE', 81],
  2173. ['=', 'cancel_flag', 0],
  2174. ['=', 'outside_sale_org_id', $org_id]
  2175. ];
  2176. $result = self::find()->select(['order_id', 'outside_sale_org_id', 'order_status'])->from(self::tableName())
  2177. ->where($where)->orderBy('order_id desc')->limit(1)->asArray()->all();
  2178. return $result;
  2179. }
  2180. /**
  2181. * Function Description:修改保险单号到ORDER_CONFIRM_CODE
  2182. * Function Name: updateInsuranceNo
  2183. * @param $param ['policyno','order_id']
  2184. *
  2185. * @return integer
  2186. *
  2187. * @author 付泓程
  2188. */
  2189. public function updateInsuranceNo($param)
  2190. {
  2191. $update_value = [
  2192. 'ORDER_CONFIRM_CODE' => $param['policyno'],
  2193. 'UPDATE_TIME' => date('Y-m-d H:i:s')
  2194. ];
  2195. $update_where = [
  2196. 'AND',
  2197. ['OR',
  2198. ['=', 'ORDER_ID', $param['order_id']],
  2199. ['=', 'PARENT_ORDER_ID', $param['order_id']]
  2200. ],
  2201. ['=', 'CANCEL_FLAG', 0],
  2202. ];
  2203. $result = self::updateAll($update_value, $update_where);
  2204. return $result;
  2205. }
  2206. /**
  2207. * 获取检票通知的订单号
  2208. * @return a
  2209. */
  2210. public function getZybCheckTicketOrder()
  2211. {
  2212. $select = [
  2213. "prodCnt" => new Expression("count(1)") ,
  2214. "outside_order_no" => "OUTSIDE_ORDER_NO",
  2215. "customer_name" => "CUSTOMER_NAME",
  2216. "customer_mobile" => "CUSTOMER_MOBILE",
  2217. "customer_id_no" => new Expression("GROUP_CONCAT(DISTINCT CUSTOMER_ID_NO)")
  2218. ];
  2219. $where = [
  2220. 'and',
  2221. ["=", "RUN_DATE", date("Y-m-d")],
  2222. [">=", "RUN_TIME", date("H:i")],
  2223. ["<", "RUN_TIME", date("H:i", strtotime('+5 minute'))],
  2224. ["=", "OUTSIDE_SALE_ORG_ID", 1835],
  2225. ];
  2226. $result = self::find()->select($select)
  2227. ->where($where)
  2228. ->groupBy("OUTSIDE_ORDER_NO")
  2229. ->limit(1)
  2230. ->asArray()
  2231. ->all();
  2232. return $result;
  2233. }
  2234. }