cxgj/commands/OrderController.php
2023-11-27 09:45:13 +08:00

569 lines
24 KiB
PHP

<?php
/**
* @author Any
* @description KISS
* @date 2022年6月11日
* @version 1.0.0
*
* _____LOG_____
*
*/
namespace app\commands;
use app\components\SysErrCode;
use app\models\Balance;
use app\models\BallCart;
use app\models\Box;
use app\models\Model;
use app\models\Order;
use app\models\OrderDetail;
use app\models\sms\SmsMsgHelper;
use app\models\sms\SmsTpl;
use app\models\Store;
use app\models\StoreBj;
use app\models\StoreEarnings;
use app\models\StoreMake;
use app\models\StoreUser;
use app\models\UniqueOrderNo;
use app\models\User;
use app\models\UserCoupon;
use app\modules\api\models\MsgCentreForm;
use yii\console\Controller;
use yii\console\ExitCode;
use app\components\SiteHelper;
/**
* This command echoes the first argument that you have entered.
*
* This command is provided as an example for you to learn how to create console commands.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @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;
}
}
}