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; } } }