* @since 2.0 */ class OrderController extends Controller { #将包厢订单未支付的订单变更为取消状态 public function actionOrderCancel() { echo '未支付超时取消-开始'; try { $redis_name_lock = "cxaibc:console:order:actionOrderCancel"; try { $get = \Yii::$app->redis->setnx($redis_name_lock, 1); if (empty($get)) { $ttl = \Yii::$app->redis->ttl($redis_name_lock); if ($ttl === -1) { \Yii::$app->redis->expire($redis_name_lock, 60); } var_dump("10分钟脚本正在执行中"); exit(); } \Yii::$app->redis->expire($redis_name_lock, 60 * 10); // 执行体、 $orderTimeoutCancel = SiteHelper::getCustomiseOptionByKey("orderTimeoutCancel", "hump"); $orderTimeoutCancel = $orderTimeoutCancel * 60; $all = Order::find()->select('id,created_at') ->where(['is_pay' => 0, 'cancel_status' => 0, 'is_delete' => 0, 'plugin_sign' => 'box_book']) ->asArray() ->all(); if (!empty($all)) { foreach ($all as $index => $item) { $time = $item['created_at'] + $orderTimeoutCancel; if (time() >= $time) { $order = Order::findOne($item['id']); $order->cancel_status = 1; $order->cancel_time = time(); $order->status = 3; if (!$order->save()) { echo '未支付超时取消-ERROR-ORRER_ID:' . $item['id']; } else { echo '未支付超时取消-SUCCESS-ORRER_ID:' . $item['id']; } } } } // 结束执行 \Yii::$app->redis->del($redis_name_lock); } catch (\Exception $e) { \Yii::$app->redis->del($redis_name_lock); var_dump($e->getMessage()); } echo '未支付超时取消-结束'; return ExitCode::OK; } catch (\Exception $e) { echo "未支付超时取消ERROR-Exception-{$e->getLine()}--{$e->getMessage()}--{$e->getFile()}" . PHP_EOL; } } #商品订单未支付提醒-每1分钟执行一次 public function actionOrderCancelGoods() { echo '商品订单未支付短信提醒-开始'; try { $redis_name_lock = "cxaibc:console:order:actionOrderCancelGoods"; try { $get = \Yii::$app->redis->setnx($redis_name_lock, 1); if (empty($get)) { $ttl = \Yii::$app->redis->ttl($redis_name_lock); if ($ttl === -1) { \Yii::$app->redis->expire($redis_name_lock, 60); } var_dump("商品订单未支付短信提醒脚本正在执行中"); exit(); } \Yii::$app->redis->expire($redis_name_lock, 60 * 10); // 执行体、 $all = Order::find()->select('id,order_no,user_id,created_at,distance') ->where(['is_pay' => 0, 'cancel_status' => 0, 'is_delete' => 0, 'plugin_sign' => 'goods']) ->asArray() ->all(); $date = date('Y-m-d'); if (!empty($all)) { $redis = \Yii::$app->redis; $sms_sender = new SmsMsgHelper(0); $tpl_type = SmsTpl::getTplKey(0); foreach ($all as $index => $item) { $redis_name = "cxgyc:OrderCancelGoods:{$date}_v1:{$item['user_id']}"; $user = User::findOne(['id' => $item['user_id']]); $time = time() - $item['created_at']; $time = floor($time / 60 / 60); // $time = floor($time / 60); $is_send = false; if ($time >= 8 && $item['distance'] < 8) { $is_send = true; $distance = 8; echo "商品订单未支付提醒ERROR-Exception-{$distance}_{$item['distance']}" . PHP_EOL; } if ($time >= 16 && $item['distance'] == 8) { $is_send = true; $distance = 16; echo "商品订单未支付提醒ERROR-Exception-{$distance}_{$item['distance']}" . PHP_EOL; } if ($time >= 24 && $item['distance'] == 16) { $is_send = true; $distance = 24; echo "商品订单未支付提醒ERROR-Exception-{$distance}_{$item['distance']}" . PHP_EOL; } if ($time > 24) { $get = $redis->setnx($redis_name, 1); if (empty($get)) { continue; } $redis->expire($redis_name, 60 * 60 * 24); $is_send = true; $distance = $item['distance'] + 24; echo "商品订单未支付提醒ERROR-Exception-{$distance}_{$item['distance']}_{$get}" . PHP_EOL; } if ($is_send && $user != null && !empty($user->mobile_phone) && !empty($user->mobile_prefix)) { $send_param['order_no'] = $item['order_no']; try { \Yii::$app->db->createCommand()->update(Order::tableName(), ['distance' => $distance], ['id' => $item['id']])->execute(); $data = $sms_sender->sender($user->mobile_phone, $tpl_type, $user->mobile_prefix, $user->id, $send_param); echo "商品订单未支付提醒ERROR-Exception-{$data['msg']}" . PHP_EOL; } catch (\Exception $ex) { echo "商品订单未支付提醒ERROR-Exception-{$ex->getMessage()}" . PHP_EOL; } } } } // 结束执行 \Yii::$app->redis->del($redis_name_lock); } catch (\Exception $e) { \Yii::$app->redis->del($redis_name_lock); var_dump($e->getMessage()); } echo '商品订单未支付短信提醒-结束'; return ExitCode::OK; } catch (\Exception $e) { echo "商品订单未支付短信提醒ERROR-Exception-{$e->getLine()}--{$e->getMessage()}--{$e->getFile()}" . PHP_EOL; } } #门店佣金,每天早10点运行 public function actionOrderSale() { echo '门店佣金-开始'; try { $redis_name_lock = "cxaibc:console:order:actionOrderSale"; try { $get = \Yii::$app->redis->setnx($redis_name_lock, 1); if (empty($get)) { $ttl = \Yii::$app->redis->ttl($redis_name_lock); if ($ttl === -1) { \Yii::$app->redis->expire($redis_name_lock, 60); } var_dump("门店佣金正在执行中"); exit(); } \Yii::$app->redis->expire($redis_name_lock, 60 * 10); // 执行体、 $begin = mktime(10, 0, 0, date('m'), date('d') - 1, date('Y')); $end = mktime(10, 0, 0, date('m'), date('d'), date('Y')); $all = Order::find()->select('id,user_id,total_price,store_id') ->where(['is_pay' => 1, 'cancel_status' => 0, 'is_delete' => 0, 'status' => 0]) ->andWhere(['between', 'created_at', $begin, $end]) ->asArray() ->all(); foreach ($all as $index => $item) { $store = Store::findOne(['id' => $item['store_id']]); if (!empty($store)) { $money = substr(sprintf("%.3f", $item['total_price'] * ($store->ratio / 100)), 0, -1); $earnings_data = [ 'store_id' => $store->id, 'user_id' => 0, 'order_id' => $item['id'], 'money' => $money, 'status' => 0, 'created_at' => time(), ]; $r = \Yii::$app->db->createCommand()->insert(StoreEarnings::tableName(), $earnings_data)->execute(); if (!$r) { echo '门店佣金__ORDER_ID=' . $item['id']; } } } // 结束执行 \Yii::$app->redis->del($redis_name_lock); } catch (\Exception $e) { \Yii::$app->redis->del($redis_name_lock); var_dump($e->getMessage()); } echo '门店佣金-结束'; return ExitCode::OK; } catch (\Exception $e) { echo "门店佣金ERROR-Exception-{$e->getLine()}--{$e->getMessage()}--{$e->getFile()}" . PHP_EOL; } } #店长佣金,每天早10点运行 public function actionStoreUserEarnings() { echo '店长佣金-开始'; try { $redis_name_lock = "cxaibc:console:order:actionStoreUserEarnings"; try { $get = \Yii::$app->redis->setnx($redis_name_lock, 1); if (empty($get)) { $ttl = \Yii::$app->redis->ttl($redis_name_lock); if ($ttl === -1) { \Yii::$app->redis->expire($redis_name_lock, 60); } var_dump("10分钟脚本正在执行中"); exit(); } \Yii::$app->redis->expire($redis_name_lock, 60 * 10); // 执行体、 $begin = mktime(10, 0, 0, date('m'), date('d') - 1, date('Y')); $end = mktime(10, 0, 0, date('m'), date('d'), date('Y')); $all = Order::find()->select('id,order_no,total_price,store_id') ->where(['is_pay' => 1, 'cancel_status' => 0, 'is_delete' => 0, 'status' => 0]) ->andWhere(['between', 'created_at', $begin, $end]) ->asArray() ->all(); $moneys = []; if (!empty($all)) { foreach ($all as $index => $item) { $store = Store::findOne(['id' => $item['store_id']]); $store_user = StoreMake::find() ->where(['store_id' => $store->id, 'is_delete' => 0, 'status' => 1]) ->andWhere(['between', 'make_time', $begin, $end]) ->orderBy(['id' => SORT_DESC])->one(); if (!empty($store) && !empty($store_user) && !empty($store->user_ratio) && $store->user_ratio > 0) { $money = substr(sprintf("%.3f", $item['total_price'] * ($store->user_ratio / 100)), 0, -1); $earnings_data = [ 'store_id' => $store->id, 'user_id' => $store_user->user_id, 'order_id' => $item['id'], 'money' => $money, 'status' => 0, 'created_at' => time(), ]; $r = \Yii::$app->db->createCommand()->insert(StoreEarnings::tableName(), $earnings_data)->execute(); if (!$r) { echo '门店佣金_ERROR_ORDER_ID=' . $item['id']; } else { $moneys[$store_user->user_id][] = $money; } } } } if (!empty($moneys)) { foreach ($moneys as $index => $item) { $money = array_sum($item); $r = Balance::userWalletLog($index, Balance::TYPE_INCOME, (float)$money, '预约店长入账记录', 99, '', '', 0, 1); if ($r['code'] != 0) { echo '店长佣金___ERROR___USER_ID=' . $index . '___MSG=' . $r['msg']; } else { echo '店长佣金___SUCCESS___USER_ID=' . $index . '___MONEY=' . $money; } } } // 结束执行 \Yii::$app->redis->del($redis_name_lock); } catch (\Exception $e) { \Yii::$app->redis->del($redis_name_lock); var_dump($e->getMessage()); } echo '店长佣金-结束'; return ExitCode::OK; } catch (\Exception $e) { echo "店长佣金ERROR-Exception-{$e->getLine()}--{$e->getMessage()}--{$e->getFile()}" . PHP_EOL; } } #包厢开始提醒-30分钟前提醒 public function actionBooxBeginRemind() { echo '包厢开始提醒-开始'; try { $redis_name_lock = "cxaibc:console:order:actionBooxBeginRemind"; try { $get = \Yii::$app->redis->setnx($redis_name_lock, 1); if (empty($get)) { $ttl = \Yii::$app->redis->ttl($redis_name_lock); if ($ttl === -1) { \Yii::$app->redis->expire($redis_name_lock, 60); } var_dump("10分钟脚本正在执行中"); exit(); } \Yii::$app->redis->expire($redis_name_lock, 60 * 10); // 执行体、 $all = Order::find()->alias('o') ->leftJoin(['od' => OrderDetail::tableName()], 'o.id=od.order_id') ->select('o.id,od.start_at') ->where([ 'is_pay' => 1, 'o.cancel_status' => 0, 'o.is_delete' => 0, 'o.status' => 1, 'o.plugin_sign' => 'box_book', 'o.is_confirm' => 0 ]) ->asArray() ->all(); if (!empty($all)) { foreach ($all as $index => $item) { if (time() >= ($item['start_at'] - 1800)) { echo $item['id'] . '-'; $order = Order::findOne(['id' => $item['id']]); MsgCentreForm::sendWxAppletBoxBookStartRemind($order); $order->is_confirm = 1; $order->save(); } } } // 结束执行 \Yii::$app->redis->del($redis_name_lock); } catch (\Exception $e) { \Yii::$app->redis->del($redis_name_lock); var_dump($e->getMessage()); } echo '包厢开始提醒-结束'; return ExitCode::OK; } catch (\Exception $e) { echo "包厢开始提醒-Exception-{$e->getLine()}--{$e->getMessage()}--{$e->getFile()}" . PHP_EOL; } } /** * 包厢结束保洁提醒 * @return int */ public function actionOrderRemind() { echo '保洁打扫短信提醒-开始'; try { $redis_name_lock = "cxaibc:console:order:actionOrderRemind"; try { $get = \Yii::$app->redis->setnx($redis_name_lock, 1); if (empty($get)) { $ttl = \Yii::$app->redis->ttl($redis_name_lock); if ($ttl === -1) { \Yii::$app->redis->expire($redis_name_lock, 60); } var_dump("10分钟脚本正在执行中"); exit(); } \Yii::$app->redis->expire($redis_name_lock, 60 * 10); // 执行体、 $all = Order::find()->alias('o') ->leftJoin(['rt' => OrderDetail::tableName()], 'o.id=rt.order_id') ->leftJoin(['s' => Store::tableName()], 'o.store_id=s.id') ->leftJoin(['bj' => StoreBj::tableName()], 'o.store_id=bj.store_id') ->leftJoin(['b' => Box::tableName()], 'b.id=o.coach_id') ->select('o.id,s.name as store_name,b.name as box_name,bj.mobile as bj_mobile,s.location_detail,s.store_mobile,rt.end_at,o.is_comment') ->where(['o.is_pay' => 1, 'o.cancel_status' => 0, 'o.is_delete' => 0, 'o.plugin_sign' => 'box_book']) ->andWhere(['o.is_comment' => 0]) ->andWhere(['o.status' => 1]) ->asArray() ->all(); $is_send = false; if (!empty($all)) { $sms_sender = new SmsMsgHelper(0); $tpl_type = SmsTpl::getTplKey(3); foreach ($all as $index => $item) { if (empty($item['bj_mobile'])) { continue; } $time = time(); $end_time = $item['end_at'] - $time; if ($end_time <= 60 * 10 && $end_time >= 0) { try { if ($item['is_comment'] == 0) { $is_send = true; $is_comment = 1; } if ($is_send == true) { \Yii::$app->db->createCommand()->update(Order::tableName(), ['is_comment' => $is_comment], ['id' => $item['id']])->execute(); $data = $sms_sender->sender($item['bj_mobile'], $tpl_type, '86', 0, [ 'store' => $item['store_name'], 'name' => $item['box_name'], 'location' => $item['location_detail'], 'phone' => $item['store_mobile'], ]); echo "保洁打扫提醒ERROR-Exception-{$data['msg']}" . PHP_EOL; } } catch (\Exception $ex) { echo "保洁打扫提醒ERROR-Exception-{$ex->getMessage()}" . PHP_EOL; } } } } // 结束执行 \Yii::$app->redis->del($redis_name_lock); } catch (\Exception $e) { \Yii::$app->redis->del($redis_name_lock); var_dump($e->getMessage()); } // 打扫门店:${store},包厢:${name},门店地址:${location},门店联系电话:${phone} echo '保洁打扫短信提醒-结束'; return ExitCode::OK; } catch (\Exception $e) { echo "保洁打扫短信提醒ERROR-Exception-{$e->getLine()}--{$e->getMessage()}--{$e->getFile()}" . PHP_EOL; } } #包厢即将结束提醒 public function actionBooxEndRemind() { echo '包厢即将结束提醒-开始'; try { $redis_name_lock = "cxaibc:console:order:actionBooxEndRemind"; try { $get = \Yii::$app->redis->setnx($redis_name_lock, 1); if (empty($get)) { $ttl = \Yii::$app->redis->ttl($redis_name_lock); if ($ttl === -1) { \Yii::$app->redis->expire($redis_name_lock, 60); } var_dump("10分钟脚本正在执行中"); exit(); } \Yii::$app->redis->expire($redis_name_lock, 60 * 10); // 执行体、 $bookEndTime = SiteHelper::getCustomiseOptionByKey("bookEndTime", "hump"); if (empty($bookEndTime)) { echo '包厢即将结束提醒-未设置数值'; return false; } $time = floor($bookEndTime * 60); $all = Order::find()->alias('o') ->leftJoin(['od' => OrderDetail::tableName()], 'o.id=od.order_id') ->select('o.id,od.end_at') ->where([ 'is_pay' => 1, 'o.cancel_status' => 0, 'o.is_delete' => 0, 'o.status' => 1, 'o.plugin_sign' => 'box_book', 'o.is_send' => 0 ]) ->asArray() ->all(); if (!empty($all)) { foreach ($all as $index => $item) { if (time() >= ($item['end_at'] - $time)) { echo $item['id'] . '-'; $order = Order::findOne(['id' => $item['id']]); MsgCentreForm::sendWxAppletBoxBookEndRemind($order); $order->is_send = 1; $order->save(); } } } // 结束执行 \Yii::$app->redis->del($redis_name_lock); } catch (\Exception $e) { \Yii::$app->redis->del($redis_name_lock); var_dump($e->getMessage()); } echo '包厢即将结束提醒-结束'; return ExitCode::OK; } catch (\Exception $e) { echo "包厢即将结束提醒-Exception-{$e->getLine()}--{$e->getMessage()}--{$e->getFile()}" . PHP_EOL; } } #包厢已预约订单过期更新为已完成 public function actionBooxOrderSave() { echo '更新已预约订单状态-开始'; try { $all = Order::find()->alias('o') ->leftJoin(['od' => OrderDetail::tableName()], 'o.id=od.order_id') ->select('o.id,od.start_at,od.end_at') ->where([ 'is_pay' => 1, 'o.cancel_status' => 0, 'o.is_delete' => 0, 'o.status' => 1, 'o.plugin_sign' => 'box_book', ]) ->asArray() ->all(); if (!empty($all)) { foreach ($all as $index => $item) { if (time() >= $item['end_at']) { $order = Order::findOne(['id' => $item['id']]); $order->status = 0; $order->save(); } } } echo '更新已预约订单状态-结束'; return ExitCode::OK; } catch (\Exception $e) { echo "更新已预约订单状态-Exception-{$e->getLine()}--{$e->getMessage()}--{$e->getFile()}" . PHP_EOL; } } }