You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
397 lines
13 KiB
397 lines
13 KiB
10 months ago
|
<?php
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||
|
// +----------------------------------------------------------------------
|
||
|
namespace crmeb\services\crud;
|
||
|
|
||
|
use crmeb\services\crud\enum\FormTypeEnum;
|
||
|
use crmeb\services\crud\enum\ServiceActionEnum;
|
||
|
use think\helper\Str;
|
||
|
|
||
|
/**
|
||
|
* Class Business
|
||
|
* @package crmeb\services
|
||
|
*/
|
||
|
class Service extends Make
|
||
|
{
|
||
|
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $name = "services";
|
||
|
|
||
|
/**
|
||
|
* @return string
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/4/4
|
||
|
*/
|
||
|
protected function setBaseDir(): string
|
||
|
{
|
||
|
return 'app' . DS . 'services' . DS . 'crud';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $name
|
||
|
* @param array $options
|
||
|
* @return Service
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/3/23
|
||
|
*/
|
||
|
public function handle(string $name, array $options = [])
|
||
|
{
|
||
|
$path = $options['path'] ?? '';
|
||
|
$field = $options['field'] ?? [];
|
||
|
$columnField = $options['columnField'] ?? [];
|
||
|
$hasOneFields = $options['hasOneField'] ?? [];
|
||
|
|
||
|
$this->value['USE_PHP'] = $this->getDaoClassName($name, $path);
|
||
|
$this->value['MODEL_NAME'] = $options['modelName'] ?? $name;
|
||
|
$this->value['NAME_CAMEL'] = Str::studly($name);
|
||
|
$this->value['PATH'] = $this->getfolderPath($path);
|
||
|
|
||
|
return $this->setServiceContent($field, $name, $columnField, $hasOneFields, $options)
|
||
|
->setService($name, $path);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $name
|
||
|
* @param string $path
|
||
|
* @return $this
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/8/12
|
||
|
*/
|
||
|
protected function setService(string $name, string $path)
|
||
|
{
|
||
|
//生成service
|
||
|
[$className, $content] = $this->getStubContent($name, $this->name);
|
||
|
$this->value['NAME'] = $className;
|
||
|
|
||
|
$contentStr = str_replace($this->var, $this->value, $content);
|
||
|
|
||
|
$filePath = $this->getFilePathName($path, $this->value['NAME_CAMEL']);
|
||
|
$this->usePath = $this->baseDir . '\\' . $this->value['NAME_CAMEL'];
|
||
|
|
||
|
$this->setContent($contentStr);
|
||
|
$this->setPathname($filePath);
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取请求方法
|
||
|
* @param string $name
|
||
|
* @return string
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/9/5
|
||
|
*/
|
||
|
protected function getActionContent(string $name)
|
||
|
{
|
||
|
$contentAction = '';
|
||
|
foreach (ServiceActionEnum::SERVICE_ACTION_ALL as $item) {
|
||
|
[, $stub] = $this->getStubContent($name, $item);
|
||
|
$contentAction .= $stub . "\n";
|
||
|
}
|
||
|
|
||
|
return $contentAction;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取列表展示字段
|
||
|
* @param array $columnField
|
||
|
* @param array $options
|
||
|
* @return string
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/8/12
|
||
|
*/
|
||
|
protected function getSelectFieldsContent(array $columnField, array $options)
|
||
|
{
|
||
|
$select = [];
|
||
|
foreach ($columnField as $item) {
|
||
|
//处理查询字段
|
||
|
if (in_array($item['type'], [
|
||
|
FormTypeEnum::FRAME_IMAGES,
|
||
|
FormTypeEnum::DATE_TIME_RANGE,
|
||
|
FormTypeEnum::RADIO,
|
||
|
FormTypeEnum::SELECT,
|
||
|
FormTypeEnum::CHECKBOX
|
||
|
])) {
|
||
|
$select[] = '`' . $item['field'] . '` as ' . $item['field'] . $this->attrPrefix;
|
||
|
} else {
|
||
|
$select[] = $item['field'];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!empty($options['key'])) {
|
||
|
array_push($select, $options['key']);
|
||
|
}
|
||
|
return implode(',', $select);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $field
|
||
|
* @param string $name
|
||
|
* @param array $columnField
|
||
|
* @param array $hasOneFields
|
||
|
* @param array $options
|
||
|
* @return Service
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/8/12
|
||
|
*/
|
||
|
protected function setServiceContent(array $field, string $name, array $columnField, array $hasOneFields, array $options = [])
|
||
|
{
|
||
|
//生成form表单
|
||
|
$var = [
|
||
|
'{%KEY%}',
|
||
|
'{%DATE%}',
|
||
|
'{%ROUTE%}',
|
||
|
'{%FORM_PHP%}',
|
||
|
'{%MODEL_NAME%}',
|
||
|
'{%FIELD%}',
|
||
|
'{%WITH%}'
|
||
|
];
|
||
|
|
||
|
$value = [
|
||
|
$options['key'] ?? 'id',
|
||
|
$this->value['DATE'],
|
||
|
Str::snake($options['route'] ?? $name),
|
||
|
$this->getFormContent($field),
|
||
|
$options['modelName'] ?? $options['menus'] ?? $name,
|
||
|
$this->getSelectFieldsContent($columnField, $options),
|
||
|
$this->getWithFieldsContent($hasOneFields)
|
||
|
];
|
||
|
|
||
|
//替换模板中的变量
|
||
|
$this->value['CONTENT_PHP'] = str_replace($var, $value, $this->getActionContent($name));
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取表单创建内容
|
||
|
* @param array $field
|
||
|
* @return string
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/8/12
|
||
|
*/
|
||
|
protected function getFormContent(array $field)
|
||
|
{
|
||
|
$this->value['USE_PHP'] .= "\n" . 'use crmeb\services\FormBuilder;';
|
||
|
|
||
|
$from = [];
|
||
|
foreach ($field as $item) {
|
||
|
|
||
|
if (in_array($item['type'], [
|
||
|
FormTypeEnum::FRAME_IMAGES,
|
||
|
FormTypeEnum::RADIO,
|
||
|
FormTypeEnum::SELECT,
|
||
|
FormTypeEnum::CHECKBOX
|
||
|
])) {
|
||
|
$fieldPre = $item['field'] . $this->attrPrefix;
|
||
|
} else {
|
||
|
$fieldPre = $item['field'];
|
||
|
}
|
||
|
|
||
|
//处理表单信息
|
||
|
switch ($item['type']) {
|
||
|
case FormTypeEnum::FRAME_IMAGE_ONE:
|
||
|
$from[] = $this->tab(2) . $this->getframeImageOnePhpContent($item['field'], $item['name']) . ';';
|
||
|
break;
|
||
|
case FormTypeEnum::FRAME_IMAGES:
|
||
|
$from[] = $this->tab(2) . $this->getframeImagesPhpContent($item['field'], $item['name'], $fieldPre) . ';';
|
||
|
break;
|
||
|
case FormTypeEnum::DATE_TIME_RANGE:
|
||
|
$tab = $this->tab(2);
|
||
|
$tab3 = $this->tab(3);
|
||
|
$from[] = <<<CONTENT
|
||
|
{$tab}if (isset(\$info['$fieldPre'])) {
|
||
|
{$tab3}\$time = is_array(\$info['$fieldPre']) ? \$info['$fieldPre'] : json_decode(\$info['$fieldPre'], true);
|
||
|
{$tab}} else {
|
||
|
{$tab3}\$time = ['', ''];
|
||
|
{$tab}}
|
||
|
{$tab}\$statTime = \$time[0] ?? '';
|
||
|
{$tab}\$endTime = \$time[1] ?? '';
|
||
|
CONTENT;
|
||
|
$from[] = $this->tab(2) . '$rule[] = FormBuilder::' . FormTypeEnum::DATE_TIME_RANGE . '("' . $item['field'] . '", "' . $item['name'] . '", $statTime, $endTime);';
|
||
|
break;
|
||
|
default:
|
||
|
$valueContent = "''";
|
||
|
$input = '$info["' . $item['field'] . '"] ?? ';
|
||
|
if (in_array($item['type'], [FormTypeEnum::CHECKBOX])) {
|
||
|
$input = "is_string($input []) ? array_map('intval',(array)json_decode($input '', true)) : $input []";
|
||
|
} else if (in_array($item['type'], [FormTypeEnum::RADIO, FormTypeEnum::SELECT])) {
|
||
|
$input = 'isset($info[\'' . $item['field'] . '\']) ? (int)$info[\'' . $item['field'] . '\'] : \'\'';
|
||
|
} else if (FormTypeEnum::SWITCH === $item['type']) {
|
||
|
$input = "isset(\$info['" . $item['field'] . "']) ? (string)\$info['" . $item['field'] . "'] : ''";
|
||
|
} else {
|
||
|
$input = $input . $valueContent;
|
||
|
}
|
||
|
$from[] = $this->tab(2) . '$rule[] = FormBuilder::' . $item['type'] . '("' . $item['field'] . '", "' . $item['name'] . '", ' . $input . ')' . $this->getOptionContent(in_array($item['type'], ['radio', 'select', 'checkbox']), $item['option'] ?? []) . ';';
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $from ? implode("\n", $from) : '';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取关联查询内容
|
||
|
* @param array $hasOneFields
|
||
|
* @return string
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/8/12
|
||
|
*/
|
||
|
protected function getWithFieldsContent(array $hasOneFields)
|
||
|
{
|
||
|
$with = [];
|
||
|
foreach ($hasOneFields as $item) {
|
||
|
if (isset($item['hasOne'])) {
|
||
|
[$modelName,] = is_array($item['hasOne']) ? $item['hasOne'] : [$item['hasOne'], 'id'];
|
||
|
$modelName = Model::getHasOneNamePases($modelName);
|
||
|
if (!$modelName) {
|
||
|
continue;
|
||
|
}
|
||
|
$with[] = "'" . Str::camel($item['field']) . 'HasOne' . "'";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $with ? '[' . implode(',', $with) . ']' : '[]';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取选项内容
|
||
|
* @param bool $isOption
|
||
|
* @param array $option
|
||
|
* @return string
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/3/23
|
||
|
*/
|
||
|
protected function getOptionContent(bool $isOption, array $option = [])
|
||
|
{
|
||
|
if (!$isOption) {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
$php = '';
|
||
|
if ($option) {
|
||
|
$attOption = [];
|
||
|
foreach ($option as $item) {
|
||
|
$value = (int)$item['value'];
|
||
|
$attOption[] = $this->tab(3) . "['value'=>{$value}, 'label'=>'{$item['label']}'],";
|
||
|
}
|
||
|
|
||
|
$strOption = implode("\n", $attOption);
|
||
|
$php = "->options([\n" . $strOption . "\n" . $this->tab(2) . "])";
|
||
|
}
|
||
|
|
||
|
return $php;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 单图获取formphp内容
|
||
|
* @param string $field
|
||
|
* @param string $name
|
||
|
* @param bool $required
|
||
|
* @param string $icon
|
||
|
* @param string $width
|
||
|
* @param string $height
|
||
|
* @return string
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/4/14
|
||
|
*/
|
||
|
protected function getframeImageOnePhpContent(string $field, string $name, bool $required = false, string $icon = 'el-icon-picture-outline', string $width = '950px', string $height = '560px')
|
||
|
{
|
||
|
$name = addslashes($name);
|
||
|
$requiredText = $required ? '->required()' : '';
|
||
|
$content = <<<CONTENT
|
||
|
\$rule[] = FormBuilder::frameImage('$field', '$name', url(config('app.admin_prefix', 'admin') . '/widget.images/index', ['fodder' => '$field']), \$info['$field'] ?? '')->icon('$icon')->width('$width')->height('$height')->Props(['footer' => false])$requiredText
|
||
|
CONTENT;
|
||
|
return $content;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 多图获取formphp内容
|
||
|
* @param string $field
|
||
|
* @param string $name
|
||
|
* @param bool $required
|
||
|
* @param string $icon
|
||
|
* @param int $maxLength
|
||
|
* @param string $width
|
||
|
* @param string $height
|
||
|
* @return string
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/4/14
|
||
|
*/
|
||
|
protected function getframeImagesPhpContent(string $field, string $name, bool $required = false, string $icon = 'el-icon-picture-outline', int $maxLength = 10, string $width = '950px', string $height = '560px')
|
||
|
{
|
||
|
$name = addslashes($name);
|
||
|
$requiredText = $required ? '->required()' : '';
|
||
|
$tab = $this->tab(2);
|
||
|
$tab3 = $this->tab(3);
|
||
|
$content = <<<CONTENT
|
||
|
if (isset(\$info['$field'])) {
|
||
|
{$tab3}\$pics = is_array(\$info['$field']) ? \$info['$field'] : json_decode(\$info['$field'], true);
|
||
|
{$tab}} else {
|
||
|
{$tab3}\$pics = [];
|
||
|
{$tab}}
|
||
|
{$tab}\$pics = is_array(\$pics) ? \$pics : [];
|
||
|
{$tab}\$rule[] = FormBuilder::frameImages('$field', '$name', url(config('app.admin_prefix', 'admin') . '/widget.images/index', ['fodder' => '$field', 'type' => 'many', 'maxLength' => $maxLength]), \$pics)->maxLength($maxLength)->icon('$icon')->width('$width')->height('$height')->Props(['footer' => false])$requiredText
|
||
|
CONTENT;
|
||
|
return $content;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $name
|
||
|
* @param string $path
|
||
|
* @return string
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/3/23
|
||
|
*/
|
||
|
protected function getDaoClassName(string $name, string $path)
|
||
|
{
|
||
|
$path = str_replace(['app\\services', 'app/services'], '', $path);
|
||
|
$path = ltrim(str_replace('\\', '/', $path), '/');
|
||
|
return 'use app\dao\crud\\' . ($path ? $path . '\\' : '') . Str::studly($name) . 'Dao;';
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param string $type
|
||
|
* @return string|string[]
|
||
|
* @author 等风来
|
||
|
* @email 136327134@qq.com
|
||
|
* @date 2023/3/13
|
||
|
*/
|
||
|
protected function getStub(string $type = 'services')
|
||
|
{
|
||
|
$servicePath = __DIR__ . DS . 'stubs' . DS . 'service' . DS;
|
||
|
|
||
|
$stubs = [
|
||
|
'index' => $servicePath . 'crudListIndex.stub',
|
||
|
'form' => $servicePath . 'getCrudForm.stub',
|
||
|
'save' => $servicePath . 'crudSave.stub',
|
||
|
'update' => $servicePath . 'crudUpdate.stub',
|
||
|
'services' => $servicePath . 'crudService.stub',
|
||
|
];
|
||
|
|
||
|
return $type ? $stubs[$type] : $stubs;
|
||
|
}
|
||
|
}
|