| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- <?php
- /*
- * @Descripttion:
- * @version:
- * @Author: ewgof
- * @Date: 2021-10-20 14:34:16
- * @LastEditors: ewgof
- * @LastEditTime: 2022-01-20 17:54:35
- */
- namespace addons\Store\console\controllers;
- use common\enums\AddonsEnum;
- use common\models\mall\MallAddons;
- use yii\console\Controller;
- use common\models\mall\Mall;
- use common\enums\OrderStatusEnum;
- use common\enums\StatusEnum;
- use yii\console\ExitCode;
- use addons\Store\common\models\StoreCashierOrder;
- /**
- * 订单相关定时处理任务
- */
- class CashierOrderController extends Controller
- {
- /**
- * 自动关闭过期订单
- */
- public function actionAutoClose()
- {
- $where = [
- ['pay_status' => OrderStatusEnum::NOT_PAY],
- ['status' => StatusEnum::ENABLED],
- ];
- return self::actionOrderProcess('close', 'order.payment_expire_time', $where);
- }
- /**
- * @name:
- * @msg:
- * @param {string} $action 操作类型,close:自动关闭订单,confirm:自动确认收货,complete:订单自动过售后
- * @param {string} $config_key 相应操作时间间隔配置名称
- * @param {int} pay_status 需要进行处理的订单的状态
- * @return {int}
- */
- private static function actionOrderProcess(string $action, string $config_key, array $order_wheres = null) : int
- {
- $action_info_map = [
- 'close' => [
- 'task_name' => '自动关闭订单',
- 'time_radix' => 60, // 时间节点计算的基数,自动关闭订单时间单位是分钟,转换为秒的基数是60
- 'method' => 'close',
- 'time_field' => 'created_at',
- 'default' => 5, // 自动关闭订单默认时间 20 分钟
- ],
- ];
- try {
- $mall_list = Mall::getEnableMallList(true);
- $mall_ids = array_column($mall_list, 'id');
- if (empty($mall_ids)) {
- echo '没有可用商城,不做处理 ... ' . PHP_EOL;
- return ExitCode::UNSPECIFIED_ERROR;
- }
- foreach ($mall_ids as $mall_id) {
- $is_install = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_STORE);
- if(empty($is_install)) continue;
- // 如果自动处理时间没有配置,则取默认值
- $order_auto_handle_time = $action_info_map[$action]['default'];
- // 订单自动处理时间节点,延后两分钟处理,避免支付回调尚未回来订单已经被取消s
- $time_node = time() - $order_auto_handle_time * $action_info_map[$action]['time_radix'] - 120;
- $time_field = $action_info_map[$action]['time_field'];
- $where = [
- 'and',
- ['mall_id' => $mall_id],
- ['<', $time_field, $time_node]
- ];
- if (!empty($order_wheres)) {
- foreach ($order_wheres as $order_where) {
- array_push($where, $order_where);
- }
- }
- $select = 'id,mall_id,user_id,pay_money';
- foreach (StoreCashierOrder::find()->select($select)->where($where)->each(500) as $order) {
- $data = [
- 'id' => $order->id,
- 'user_id' => $order->user_id,
- 'mall_id' => $mall_id,
- 'operator_id' => 0,
- 'operator_name' => '系统',
- ];
- $method = $action_info_map[$action]['method'];
- if (!StoreCashierOrder::$method($data)) {
- echo ' 订单[ID:' . $order->id . ']' . $action_info_map[$action]['task_name'] . '失败, errmsg: ' . StoreCashierOrder::getStaticError() . PHP_EOL;
- continue;
- }
- }
- }
- return ExitCode::OK;
- } catch (\Exception $e) {
- echo ' 订单' . $action_info_map[$action]['task_name'] . ' 任务处理出错:' . $e->getMessage() . PHP_EOL;
- return ExitCode::UNSPECIFIED_ERROR;
- }
- }
- }
|