hyperf-view/builder/BaseCollection.php

126 lines
4.1 KiB
PHP

<?php
/**
* MineAdmin is committed to providing solutions for quickly building web applications
* Please view the LICENSE file that was distributed with this source code,
* For the full copyright and license information.
* Thank you very much for using MineAdmin.
*
* @Author X.Mo<root@imoi.cn>
* @Link https://gitee.com/xmo/MineAdmin
*/
declare(strict_types=1);
namespace Builder;
use Hyperf\Database\Model\Collection;
use Builder\Office\Excel\PhpOffice;
use Builder\Office\Excel\XlsWriter;
class BaseCollection extends Collection
{
/**
* 系统菜单转前端路由树
* @return array
*/
public function sysMenuToRouterTree(): array
{
$data = $this->toArray();
if (empty($data)) return [];
$routers = [];
foreach ($data as $menu) {
array_push($routers, $this->setRouter($menu));
}
return $this->toTree($routers);
}
/**
* @param $menu
* @return array
*/
public function setRouter(&$menu): array
{
$route = ($menu['type'] == 'L' || $menu['type'] == 'I') ? $menu['route'] : '/' . $menu['route'];
return [
'id' => $menu['id'],
'parent_id' => $menu['parent_id'],
'name' => $menu['code'],
'component' => $menu['component'],
'path' => $route,
'redirect' => $menu['redirect'],
'meta' => [
'type' => $menu['type'],
'icon' => $menu['icon'],
'title' => $menu['name'],
'hidden' => ($menu['is_hidden'] === 1),
'hiddenBreadcrumb' => false
]
];
}
/**
* @param array $data
* @param int $parentId
* @param string $id
* @param string $parentField
* @param string $children
* @return array
*/
public function toTree(array $data = [], int $parentId = 0, string $id = 'id', string $parentField = 'parent_id', string $children='children'): array
{
$data = $data ?: $this->toArray();
if (empty($data)) return [];
$tree = [];
foreach ($data as $value) {
if ($value[$parentField] == $parentId) {
$child = $this->toTree($data, $value[$id], $id, $parentField, $children);
if (!empty($child)) {
$value[$children] = $child;
}
array_push($tree, $value);
}
}
unset($data);
return $tree;
}
/**
* 导出数据
* @param string $dto
* @param string $filename
* @param array|\Closure|null $closure
* @return \Psr\Http\Message\ResponseInterface
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
public function export(string $dto, string $filename, array|\Closure $closure = null): \Psr\Http\Message\ResponseInterface
{
$excelDrive = config('mineadmin.excel_drive');
if ($excelDrive === 'auto') {
$excel = extension_loaded('xlswriter') ? new XlsWriter($dto) : new PhpOffice($dto);
} else {
$excel = $excelDrive === 'xlsWriter' ? new XlsWriter($dto) : new PhpOffice($dto);
}
return $excel->export($filename, is_null($closure) ? $this->toArray() : $closure);
}
/**
* 数据导入
* @param string $dto
* @param BaseModel $model
* @param \Closure|null $closure
* @return bool
* @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
public function import(string $dto, BaseModel $model, ?\Closure $closure = null): bool
{
$excelDrive = config('mineadmin.excel_drive');
if ($excelDrive === 'auto') {
$excel = extension_loaded('xlswriter') ? new XlsWriter($dto) : new PhpOffice($dto);
} else {
$excel = $excelDrive === 'xlsWriter' ? new XlsWriter($dto) : new PhpOffice($dto);
}
return $excel->import($model, $closure);
}
}