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.
315 lines
9.6 KiB
315 lines
9.6 KiB
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | Niucloud-admin 企业快速开发的多应用管理平台
|
|
// +----------------------------------------------------------------------
|
|
// | 官方网址:https://www.niucloud.com
|
|
// +----------------------------------------------------------------------
|
|
// | niucloud团队 版权所有 开源版本可自由商用
|
|
// +----------------------------------------------------------------------
|
|
// | Author: Niucloud Team
|
|
// +----------------------------------------------------------------------
|
|
|
|
namespace app\service\admin\document;
|
|
|
|
use app\model\document\DocumentDataSourceConfig;
|
|
use app\model\contract\Contract;
|
|
use core\base\BaseAdminService;
|
|
use think\facade\Db;
|
|
|
|
/**
|
|
* 文档数据源配置服务类
|
|
* Class DocumentDataSourceService
|
|
* @package app\service\admin\document
|
|
*/
|
|
class DocumentDataSourceService extends BaseAdminService
|
|
{
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
$this->model = new DocumentDataSourceConfig();
|
|
}
|
|
|
|
/**
|
|
* 获取数据源配置分页列表
|
|
* @param array $where
|
|
* @return array
|
|
*/
|
|
public function getPage(array $where = []): array
|
|
{
|
|
$field = 'id, contract_id, table_name, table_alias, field_name, field_alias, field_type, is_active, sort_order, created_at';
|
|
$order = 'sort_order asc, created_at desc';
|
|
|
|
$search_model = $this->model
|
|
->withSearch(['contract_id', 'table_name', 'field_name'], $where)
|
|
->field($field)
|
|
->order($order);
|
|
|
|
$list = $this->pageQuery($search_model, $where);
|
|
|
|
// 关联合同信息
|
|
if (!empty($list['data'])) {
|
|
$contract_ids = array_unique(array_column($list['data'], 'contract_id'));
|
|
$contracts = (new Contract())->whereIn('id', $contract_ids)->column('name', 'id');
|
|
|
|
foreach ($list['data'] as &$item) {
|
|
$item['contract_name'] = $contracts[$item['contract_id']] ?? '';
|
|
// 兼容placeholder字段
|
|
$item['placeholder'] = '{{' . $item['field_alias'] . '}}';
|
|
}
|
|
}
|
|
|
|
return $list;
|
|
}
|
|
|
|
/**
|
|
* 获取数据源配置信息
|
|
* @param int $id
|
|
* @return array
|
|
*/
|
|
public function getInfo(int $id): array
|
|
{
|
|
$field = 'id, contract_id, table_name, table_alias, field_name, field_alias, field_type, is_active, sort_order, created_at';
|
|
|
|
$info = $this->model->field($field)->where([['id', '=', $id]])->findOrEmpty()->toArray();
|
|
if (empty($info)) {
|
|
throw new \Exception('DATA_NOT_EXIST');
|
|
}
|
|
|
|
// 获取合同信息
|
|
if (!empty($info['contract_id'])) {
|
|
$contract = (new Contract())->where('id', $info['contract_id'])->field('id, name')->findOrEmpty();
|
|
$info['contract_name'] = $contract['name'] ?? '';
|
|
}
|
|
|
|
// 兼容placeholder字段
|
|
$info['placeholder'] = '{{' . $info['field_alias'] . '}}';
|
|
|
|
return $info;
|
|
}
|
|
|
|
/**
|
|
* 添加数据源配置
|
|
* @param array $data
|
|
* @return mixed
|
|
*/
|
|
public function add(array $data)
|
|
{
|
|
// 检查占位符是否已存在
|
|
$exists = $this->model->where([
|
|
['contract_id', '=', $data['contract_id']],
|
|
['placeholder', '=', $data['placeholder']]
|
|
])->findOrEmpty();
|
|
|
|
if (!$exists->isEmpty()) {
|
|
throw new \Exception('PLACEHOLDER_EXISTS');
|
|
}
|
|
|
|
$data['created_at'] = date('Y-m-d H:i:s');
|
|
$res = $this->model->save($data);
|
|
if (!$res) {
|
|
throw new \Exception('ADD_FAIL');
|
|
}
|
|
|
|
return $this->model->id;
|
|
}
|
|
|
|
/**
|
|
* 编辑数据源配置
|
|
* @param int $id
|
|
* @param array $data
|
|
* @return bool
|
|
*/
|
|
public function edit(int $id, array $data): bool
|
|
{
|
|
$info = $this->model->findOrEmpty($id);
|
|
if ($info->isEmpty()) {
|
|
throw new \Exception('DATA_NOT_EXIST');
|
|
}
|
|
|
|
// 检查占位符是否已存在(排除当前记录)
|
|
$exists = $this->model->where([
|
|
['contract_id', '=', $data['contract_id']],
|
|
['placeholder', '=', $data['placeholder']],
|
|
['id', '<>', $id]
|
|
])->findOrEmpty();
|
|
|
|
if (!$exists->isEmpty()) {
|
|
throw new \Exception('PLACEHOLDER_EXISTS');
|
|
}
|
|
|
|
$res = $info->save($data);
|
|
if (!$res) {
|
|
throw new \Exception('EDIT_FAIL');
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 删除数据源配置
|
|
* @param int $id
|
|
* @return bool
|
|
*/
|
|
public function del(int $id): bool
|
|
{
|
|
$info = $this->model->findOrEmpty($id);
|
|
if ($info->isEmpty()) {
|
|
throw new \Exception('DATA_NOT_EXIST');
|
|
}
|
|
|
|
$res = $info->delete();
|
|
if (!$res) {
|
|
throw new \Exception('DELETE_FAIL');
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 批量配置数据源
|
|
* @param int $contractId
|
|
* @param array $configs
|
|
* @return bool
|
|
*/
|
|
public function batchConfig(int $contractId, array $configs): bool
|
|
{
|
|
if (empty($contractId) || empty($configs)) {
|
|
throw new \Exception('INVALID_PARAMS');
|
|
}
|
|
|
|
// 开启事务
|
|
Db::startTrans();
|
|
try {
|
|
// 删除原有配置
|
|
$this->model->where('contract_id', $contractId)->delete();
|
|
|
|
// 批量插入新配置
|
|
$insertData = [];
|
|
foreach ($configs as $config) {
|
|
$insertData[] = [
|
|
'contract_id' => $contractId,
|
|
'placeholder' => $config['placeholder'] ?? '',
|
|
'table_name' => $config['table_name'] ?? '',
|
|
'field_name' => $config['field_name'] ?? '',
|
|
'field_type' => $config['field_type'] ?? 'string',
|
|
'is_required' => $config['is_required'] ?? 0,
|
|
'default_value' => $config['default_value'] ?? '',
|
|
'created_at' => date('Y-m-d H:i:s')
|
|
];
|
|
}
|
|
|
|
if (!empty($insertData)) {
|
|
$this->model->insertAll($insertData);
|
|
}
|
|
|
|
Db::commit();
|
|
return true;
|
|
} catch (\Exception $e) {
|
|
Db::rollback();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取可用数据表列表
|
|
* @return array
|
|
*/
|
|
public function getAvailableTables(): array
|
|
{
|
|
// 定义可用的数据表及其描述
|
|
$tables = [
|
|
'school_personnel' => '员工基础信息表',
|
|
'school_personnel_info' => '员工详细信息表',
|
|
'school_member' => '会员信息表',
|
|
'school_contract_sign' => '合同签署表',
|
|
'school_course' => '课程信息表',
|
|
'school_order' => '订单信息表'
|
|
];
|
|
|
|
$result = [];
|
|
foreach ($tables as $table => $description) {
|
|
$result[] = [
|
|
'table_name' => $table,
|
|
'description' => $description
|
|
];
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 获取数据表字段列表
|
|
* @param string $tableName
|
|
* @return array
|
|
*/
|
|
public function getTableFields(string $tableName): array
|
|
{
|
|
try {
|
|
$fields = Db::query("SHOW COLUMNS FROM {$tableName}");
|
|
|
|
$result = [];
|
|
foreach ($fields as $field) {
|
|
$result[] = [
|
|
'field_name' => $field['Field'],
|
|
'field_type' => $this->parseFieldType($field['Type']),
|
|
'is_nullable' => $field['Null'] === 'YES',
|
|
'default_value' => $field['Default'],
|
|
'comment' => $field['Comment'] ?? ''
|
|
];
|
|
}
|
|
|
|
return $result;
|
|
} catch (\Exception $e) {
|
|
throw new \Exception('TABLE_NOT_EXISTS');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 解析字段类型
|
|
* @param string $type
|
|
* @return string
|
|
*/
|
|
private function parseFieldType(string $type): string
|
|
{
|
|
if (strpos($type, 'int') !== false) {
|
|
return 'integer';
|
|
} elseif (strpos($type, 'decimal') !== false || strpos($type, 'float') !== false || strpos($type, 'double') !== false) {
|
|
return 'decimal';
|
|
} elseif (strpos($type, 'date') !== false || strpos($type, 'time') !== false) {
|
|
return 'datetime';
|
|
} elseif (strpos($type, 'text') !== false) {
|
|
return 'text';
|
|
} else {
|
|
return 'string';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 预览数据源配置效果
|
|
* @param int $contractId
|
|
* @param array $sampleData
|
|
* @return array
|
|
*/
|
|
public function preview(int $contractId, array $sampleData = []): array
|
|
{
|
|
// 获取合同的数据源配置
|
|
$configs = $this->model->where('contract_id', $contractId)->select()->toArray();
|
|
|
|
$result = [];
|
|
foreach ($configs as $config) {
|
|
$placeholder = $config['field_alias'] ?? $config['placeholder'] ?? '';
|
|
$value = $sampleData[$placeholder] ?? $config['default_value'] ?? '';
|
|
|
|
$result[] = [
|
|
'placeholder' => '{{' . $placeholder . '}}',
|
|
'table_name' => $config['table_name'],
|
|
'field_name' => $config['field_name'],
|
|
'field_type' => $config['field_type'],
|
|
'is_required' => $config['is_active'] ?? 1,
|
|
'preview_value' => $value
|
|
];
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
}
|
|
|