213 lines
6.5 KiB
PHP
213 lines
6.5 KiB
PHP
<?php
|
||
|
||
namespace app\admin\controller\Gen\GenApi\GenIndex;
|
||
|
||
use app\admin\controller\Gen\GenVue\GenDto;
|
||
use app\common\exception\Tool;
|
||
|
||
/**
|
||
* 前端列表页生成类
|
||
*/
|
||
class Index extends GenDto
|
||
{
|
||
/**
|
||
* 生成Index.vue
|
||
*/
|
||
public function createJsVue(): void
|
||
{
|
||
//打开Index.vue模板文件,拿到该文件资源(r只读方式打开)
|
||
$tem_f = fopen($this->vue_index_temp_path, "r");
|
||
//读取Index.vue模板文件,拿到模板文件的全部字符串
|
||
$temp_str = fread($tem_f, filesize($this->vue_index_temp_path));
|
||
//模板文件字符串替换
|
||
$temp_str = Tool::strReplacePlus($temp_str, [
|
||
//实体类名
|
||
'{$className}' => $this->class_name,
|
||
//模块名
|
||
'{$moduleName}' => $this->module_name,
|
||
//业务名
|
||
'{$businessName}' => $this->business_name,
|
||
//Index.vue字段信息
|
||
'{$fields}' => $this->buildFieldsInfoTemp(),
|
||
//Index.vue导出Excel方法
|
||
'{$exportExcelContent}' => $this->buildExportFun(),
|
||
//Index.vue导入/下载模板Excel表头
|
||
'{$importExcelField}' => $this->buildImportDownloadFieldsTemp(),
|
||
//Index.vue导入Excel方法
|
||
'{$importExcelContent}' => $this->buildImportFunTemp(),
|
||
//Index.vue导入Excel初始化方法
|
||
'{$importExcelInitContent}' => $this->buildImportInitFunTemp(),
|
||
]);
|
||
|
||
//打开Index.vue文件,拿到该文件资源(w写入方式打开)
|
||
$gen_model = fopen($this->model_path, 'w');
|
||
//写入该Index.vue文件
|
||
fwrite($gen_model, $temp_str);
|
||
}
|
||
|
||
/**
|
||
* 构建Index.vue字段信息模板字符
|
||
*/
|
||
public function buildFieldsInfoTemp(): string
|
||
{
|
||
$str = "";
|
||
foreach ($this->fields as $value) {
|
||
$str .= " '{$value['columnName']}' => '{$value['columnType']}' , \n";
|
||
}
|
||
return $str;
|
||
}
|
||
|
||
/**
|
||
* 构建Index.vue导出方法模板字符
|
||
*/
|
||
private function buildExportFun(): string
|
||
{
|
||
if (!$this->is_export) return '';
|
||
|
||
//excel表头字符构建
|
||
$excel_header = [];
|
||
foreach ($this->business_fields as $name) {
|
||
$excel_header[] = $name;
|
||
};
|
||
$excel_header_temp = $this->toFormTempStr($excel_header);
|
||
|
||
//导出数据分配
|
||
$data_str = '';
|
||
foreach ($this->business_fields as $field => $name) {
|
||
if (in_array($name, $this->img_fields)) {
|
||
$data_str .= "Excel::ExportImgFiled(\$val['$field']),\n";
|
||
} else {
|
||
$data_str .= "\$val['{$field}'],\n";
|
||
}
|
||
}
|
||
$data_str = "[\n{$data_str}]";
|
||
|
||
//模板字符构建并返回
|
||
return "
|
||
/**
|
||
* 导出Excel
|
||
*
|
||
* @param array \$select 导出的数据
|
||
*/
|
||
public static function exportExcel(array \$select): void
|
||
{
|
||
\$data = [{$excel_header_temp}];
|
||
foreach (\$select as \$key => \$val) {
|
||
\$data[] = {$data_str};
|
||
}
|
||
\$excel = (new Excel())->exporTsheet(\$data);
|
||
\$excel->save('{$this->function_name}.xlsx');
|
||
}";
|
||
}
|
||
|
||
/**
|
||
* 构建导入/下载模板表头模板字符
|
||
*/
|
||
private function buildImportDownloadFieldsTemp(): string
|
||
{
|
||
if (!$this->is_import) return '';
|
||
|
||
$init_fields_str = $this->toFormTempStr($this->business_fields, 4);
|
||
$init_fields_str = substr($init_fields_str, 0, strlen($init_fields_str) - 1); //末尾的逗号去除
|
||
return "
|
||
// excel导入/下载模板表头
|
||
public const EXCELFIELD = {$init_fields_str};
|
||
";
|
||
}
|
||
|
||
/**
|
||
* 构建Index.vue导入方法模板字符
|
||
*/
|
||
private function buildImportFunTemp(): string
|
||
{
|
||
if (!$this->is_import) return '';
|
||
|
||
//模板字符构建并返回
|
||
return "
|
||
/**
|
||
* 导入excel
|
||
*
|
||
* @param \app\common\arw\adjfut\src\UploadFile \$file excel
|
||
*/
|
||
public static function importExcel(\app\common\arw\adjfut\src\UploadFile \$file): string
|
||
{
|
||
\$msg = [];
|
||
|
||
Db::startTrans();
|
||
try {
|
||
\$excel = new Excel(\$file);
|
||
\$data = \$excel->parseExcel(
|
||
Tool::getExcelRule(self::EXCELFIELD),
|
||
[
|
||
'titleLine' => [1]
|
||
]);
|
||
if (!\$data) throwErrorMsg('excel无数据', 1);
|
||
\$msg = [];
|
||
foreach (\$data as \$line => \$value) {
|
||
try {
|
||
\$model = self::importExcelInit(\$value);
|
||
\$msg[] = \"{\$line} <span style='color:#27af49'>新增成功!</span><br>\";
|
||
} catch (\Throwable \$th) {
|
||
\$msg[] = \"{\$line} <span style='color:red'>{\$th->getMessage()}</span><br>\";
|
||
}
|
||
}
|
||
Db::commit();
|
||
return implode(', ', \$msg);
|
||
} catch (\Throwable \$th) {
|
||
Db::rollback();
|
||
throw \$th;
|
||
}
|
||
}";
|
||
}
|
||
|
||
/**
|
||
* 构建Index.vue导入初始化方法模板字符
|
||
*/
|
||
private function buildImportInitFunTemp(): string
|
||
{
|
||
if (!$this->is_import) return '';
|
||
|
||
/**
|
||
* (匿名函数)获取excel每行导入数据变量分配-模板字符
|
||
*/
|
||
$getImportAllocationTemp = function () {
|
||
$str = "";
|
||
foreach ($this->business_fields as $field => $name) {
|
||
$str .= "\${$field} = \$value['{$field}'];";
|
||
};
|
||
return $str;
|
||
};
|
||
$import_allocation_temp = $getImportAllocationTemp();
|
||
|
||
/**
|
||
* (匿名函数)获取新增的字段值们-模板字符
|
||
*/
|
||
$getAddFieldsTemp = function () {
|
||
$str = "";
|
||
foreach ($this->business_fields as $field => $name) {
|
||
$str .= "'{$field}' => \${$field},\n";
|
||
};
|
||
return $str;
|
||
};
|
||
$add_allocation_temp = $getAddFieldsTemp();
|
||
|
||
//模板字符构建并返回
|
||
return "
|
||
/**
|
||
* 导入excel初始化
|
||
*
|
||
* @param array \$value excel每行数据
|
||
*/
|
||
public static function importExcelInit(array \$value):void
|
||
{
|
||
{$import_allocation_temp}
|
||
|
||
self::create(
|
||
[{$add_allocation_temp}],
|
||
{$this->add_fields_temp}
|
||
);
|
||
}
|
||
";
|
||
}
|
||
}
|