Files
admin/module/Application/src/Controller/FormController.php
2025-09-13 01:22:15 +08:00

230 lines
7.8 KiB
PHP

<?php
namespace Application\Controller;
use Application\Common\Enum;
use Application\Common\StatusCode;
use Application\Form\item\FormForm;
use Application\Mvc\Controller\BasicController;
use Application\Service\DB\Db;
use Application\Service\Extension\Formatter\Formatter;
use Application\Service\Extension\Formatter\FormFormatter;
use Application\Service\Extension\Formatter\FormViewFormatter;
use Application\Service\Extension\Helper\ArrayHelper;
use Application\Service\Extension\Laminas;
use Application\Service\Extension\Validator\ValidatorApplication;
use Application\Service\Logs;
use Exception;
use Laminas\View\Model\JsonModel;
/**
* 字典项设置 - 表单设置
*/
class FormController extends BasicController
{
/** @var string 表单字段配置key */
public const FORM_VALIDATOR = 'DictionaryForm';
public const LOG_TARGET = 'DictionaryForm';
/**
* 获取表单设置列表
* @doc https://www.showdoc.com.cn/p/757c59c613bc3c71675699d33694c165
* @url http://xx.com/dictionary/form
* @return JsonModel
*/
public function indexAction(): JsonModel
{
// 表单类型id
$form_group_id = $this->params()->fromPost('form_group_id', '');
// 表单tpye
$form_type = $this->params()->fromPost('form_type', '');
// 表单检索条件
$formWhereArr = ['is_del' => 0];
if($form_group_id) $formWhereArr['group_id'] = $form_group_id;
if($form_type !== '') $formWhereArr['type'] = $form_type;
$data = $this->LocalService()->dictionaryForm->fetchAllWithPagination([
'order' => ['order ASC'],
'columns' => ['id as parent', 'id', 'group_id', 'name', 'type', 'order'],
'where' => $formWhereArr
]);
Formatter::format($data['data'], new FormFormatter());
return $this->RenderApiJson()->Success($data['data'], 'OK', [
'total' => $data['count']
]);
}
/**
* 创建表单
* @doc https://www.showdoc.com.cn/p/e0d7e9989e501ccbfd039af9d025e572
* @url http://xx.com/dictionary/form/create
* @return JsonModel
* @throws Exception
*/
public function createAction(): JsonModel
{
$validator = new ValidatorApplication();
$validator->attach(
[[], 'form', 'config' => self::FORM_VALIDATOR],
[['reference_file'], 'default', 'value' => '[]'],
[['group_id'], 'exist', 'targetClass' => $this->LocalService()->dictionaryFormGroup, 'targetAttribute' => 'id'],
[['name'], 'function', 'targetClass' => \Application\Form\FormForm::class, 'method' => 'invalidCreateName'],
[['checklist_id'], 'function', 'targetClass' => \Application\Form\FormForm::class, 'method' => 'invalidCheckListId'],
);
if (!$validator->isValid()) {
return $this->RenderApiJson()->Error(StatusCode::E_FIELD_VALIDATOR, $validator->getFirstErrorToString());
}
$model = new \Application\Form\FormForm($validator);
if ($validator->attributes['id']) {
$model->editForm();
$this->LocalService()->log->saveFileLog($this->validator->attributes['id'], self::LOG_TARGET . '.form', $this->validator->attributes, Logs::OPERATE_EDIT, '编辑表单');
} else {
$this->LocalService()->log->saveFileLog($model->createForm(), self::LOG_TARGET . '.form', $this->validator->attributes, Logs::OPERATE_CREATE, '创建表单');
}
return $this->RenderApiJson()->Success();
}
/**
* 表单详情
* @doc https://www.showdoc.com.cn/p/e4c896652e7ae80c5560851e8ec8c171
* @url http://xx.com/dictionary/form/view
* @return JsonModel
* @throws Exception
*/
public function viewAction(): JsonModel
{
$validator = new ValidatorApplication();
$query = $this->LocalService()->dictionaryForm->fetchOne([
'columns' => [
'id', 'group_id', 'name', 'type', 'order', 'is_required', 'checklist_id', 'finish_condition',
'is_show', 'show_type', 'reference_file', 'rdg_type', 'var_name', 'can_patient_write', 'is_handwritten_signature',
'ds_stage','identification_edit'
],
'where' => ['id' => $validator->attributes['id']]
]) ?: ['order' => $this->getOrder()];
Formatter::format($query, new FormViewFormatter());
return $this->RenderApiJson()->Success($query, 'OK', [
'FormFileData' => ($this->getFieldConfig())
]);
}
/**
* 删除表单
* @doc https://www.showdoc.com.cn/p/2ed2ef0a8894ed47b8226d6daed08634
* @url http://xx.com/dictionary/form/del
* @return JsonModel
* @throws Exception
*/
public function delAction(): JsonModel
{
$validator = new ValidatorApplication();
$this->LocalService()->dictionaryForm->update([
'is_del' => 1
], [
'id' => $validator->attributes['id']
]);
$this->LocalService()->dictionaryFormField->update([
'is_del' => 1
], [
'form_id' => $validator->attributes['id']
]);
$this->LocalService()->log->saveFileLog($this->validator->attributes['id'], self::LOG_TARGET . '.form', $this->validator->attributes, Logs::OPERATE_DELETE, '删除表单');
return $this->RenderApiJson()->Success();
}
/**
* 获取字典项页面表单配置
* @return mixed
*/
protected function getFieldConfig(string $formValidator = self::FORM_VALIDATOR)
{
$config = include Laminas::$app->getConfig()['formValidator'][$formValidator];
$config['form'] = array_values($config['form']);
return $config;
}
protected function getOrder()
{
return $this->LocalService()->dictionaryForm->getMaxOrder('order');
}
/**
* 表单预览页面~
*/
public function previewAction()
{
$id = $this->params()->fromPost('id');
if (!$id) {
return $this->RenderApiJson()->Error(StatusCode::E_FIELD_VALIDATOR, '请传入正确的参数');
}
$query = $this->LocalService()->dictionaryForm->fetchOne([
'where' => ['id' => $id]
]);
return $this->RenderApiJson()->Success(ArrayHelper::merge($this->LocalService()->dictionaryForm->getPreviewConfig($id), [
'type' => $query['type'],
'show_type' => $query['show_type'] ?: 'right',
]));
}
/**
* 选择表单列表
*/
public function copyAction()
{
$this->validator->attach(
[['item_id'], 'required']
);
if (!$this->validator->isValid()) {
return $this->RenderApiJson()->Error(StatusCode::E_FIELD_VALIDATOR, $this->validator->getFirstErrorToString());
}
$model = new \Application\Form\FormForm($this->validator);
$data = $model->getCopyList();
return $this->RenderApiJson()->Success($data['data'], 'OK', [
'total' => $data['total']
]);
}
/**
* 选择表单
* @url
* @doc
* @return JsonModel
* @throws Exception
*/
public function copyToAction(): JsonModel
{
$this->validator->attach(
[['id', 'item_id'], 'required'],
[['id'], 'exist', 'targetClass' => $this->LocalService()->dictionaryForm, 'targetAttribute' => ['id']],
[['item_id'], 'exist', 'targetClass' => $this->LocalService()->itemInfo, 'targetAttribute' => ['id']],
[['id'], 'function', 'targetClass' => \Application\Form\FormForm::class, 'method' => 'invalidCopyId']
);
if (!$this->validator->isValid()) {
return $this->RenderApiJson()->Error(StatusCode::E_FIELD_VALIDATOR, $this->validator->getFirstErrorToString());
}
$model = new \Application\Form\FormForm($this->validator);
$model->copyTo();
return $this->RenderApiJson()->Success();
}
}