123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- <?php
- namespace App\Http\Admin;
- use App\Http\Admin\Requests\ColumnForm;
- use Txj\Elastic\Services\ColumnsService;
- use Txj\Elastic\Table\Assemble;
- use Illuminate\Database\Schema\Blueprint;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Schema;
- use Illuminate\Support\Str;
- class ColumnController extends AdminBaseController
- {
- protected string $tableAssemble = 'sys_assemble';
- protected string $tableAssembleColumn = 'sys_assemble_column';
- public function __construct()
- {
- parent::__construct();
- if (PHP_SAPI != 'cli') {
- $this->setWebsite(__NAMESPACE__);
- $this->isLoginJson();
- }
- }
- public function showColumnList(Request $request)
- {
- $mid = $request->post('mid');
- $id = $request->post('id');
- if (empty($mid) && empty($id)) {
- return responseMessage(2001, '参数错误!');
- }
- if ($id) {
- $infoObj = DB::table('sys_assemble')->find($id);
- } else {
- $infoObj = DB::table('sys_assemble')->where('mid', $mid)->first();
- }
- if (empty($infoObj)) {
- return responseMessage(2002, '参数错误!');
- }
- $listObj = DB::table($this->tableAssembleColumn)->where('is_delete', 0)->where('assemble_id', $infoObj->id)->get();
- $list = array_map('get_object_vars', $listObj->toArray());
- return responseMessage(1002, '', $list);
- }
- /**
- * @param ColumnForm $request
- * @return JsonResponse
- */
- public function save(ColumnForm $request)
- {
- $column_id = $request->post('id');
- $assemble_mid = $request->post('assemble_mid');
- // 获取集合信息
- if (PHP_SAPI == 'cli') {
- $assemble_id = $request->post('assemble_id');
- if (empty($assemble_id)) {
- return responseMessage(2000, '参数错误!');
- }
- $assembleInfo = DB::table($this->tableAssemble)->find($assemble_id);
- } else {
- $assembleInfo = DB::table($this->tableAssemble)->where('mid', $assemble_mid)->first();
- }
- if (empty($assembleInfo)) {
- return responseMessage(2001, '参数错误,集合不存在!');
- }
- // 清除缓存
- $assemble = new Assemble($assembleInfo->schema);
- $assemble->clearColumnsCache();
- $type = $request->post('type');
- $code = $request->post('code');
- $length = $request->post('length');
- $decimal = $request->post('decimal');
- $is_null = $request->post('is_null');
- $default = $request->post('default');
- $remark = $request->post('remark');
- $assemble_id = $assembleInfo->id;
- $tableName = $request->post('table');
- $length = intval($length);
- $is_null = intval($is_null);
- $requestData = [
- 'mid' => getRandNumber(),
- 'assemble_id' => $assemble_id,
- 'title' => $request->post('title'),
- 'code' => $code,
- 'type' => $type,
- 'length' => $length,
- 'decimal' => $decimal,
- 'is_null' => $is_null, //是否可以为空 1是 0否
- 'default' => $default,
- 'remark' => $remark,
- 'weight' => $request->post('weight'),
- 'is_delete' => 0,
- 'created_at' => time(),
- 'updated_at' => time(),
- ];
- return $this->saveTableColumn($requestData, $assembleInfo->schema, $column_id);
- }
- /**
- * 获取字段信息
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function getColumnInfo(Request $request)
- {
- $id = $request->post('column_id');
- if (empty($id)) {
- return responseMessage(2001, '参数错误!');
- }
- $columnInfo = DB::table($this->tableAssembleColumn)->find($id);
- $columnAr = get_object_vars($columnInfo);
- // 表名的前缀去掉
- $table = $columnAr['table'];
- $arr = explode('_', $table, 2);
- $columnAr['table'] = $arr[1];
- return responseMessage(1002, '', $columnAr);
- }
- ######################################################################
- /**
- * 获取系统字段
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function getSysColumnList(Request $request)
- {
- $page = $request->post('page', 1);
- $size = $request->post('size', 30);
- $keyword = $request->post('keyword');
- $find = DB::table($this->tableAssembleColumn)
- ->where('is_delete', 0)
- ->where('category_type', '<>', 1);
- if ($keyword) {
- $find->where('code', 'like', '%' . $keyword . '%');
- }
- $list = $find->offset(($page - 1) * $size)->limit($size)->get();
- $total = $find->count();
- return responseMessage(1002, '', ['list' => $list, 'total' => $total]);
- }
- /**
- * 创建
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function createColumnBySys(Request $request)
- {
- $assemble_id = $request->post('assemble_id');
- $column_id = $request->post('column_id');
- if (empty($assemble_id) || empty($column_id)) {
- return responseMessage(2001, '参数错误!');
- }
- // 获取集合信息
- $assembleInfoObj = DB::table($this->tableAssemble)->find($assemble_id);
- if (empty($assembleInfoObj)) {
- return responseMessage(2002, '参数错误!');
- }
- $infoObj = DB::table($this->tableAssembleColumn)->find($column_id);
- if (empty($infoObj)) {
- return responseMessage(2003, '参数错误!');
- }
- $info = get_object_vars($infoObj);
- unset($info['id']);
- unset($info['mid']);
- unset($info['created_at']);
- unset($info['updated_at']);
- $columnAssembleInfoObj = DB::table($this->tableAssemble)->find($info['assemble_id']);
- $category_type = $info['category_type'];
- $tableName = Str::replaceFirst($columnAssembleInfoObj->schema, '', $info['table']);
- $tableName = trim($tableName, '_');
- $requestData = [
- 'mid' => getRandNumber(),
- 'assemble_id' => $assemble_id,
- 'category_type' => $category_type,
- 'weight' => 0,
- 'is_delete' => 0,
- ];
- return $this->saveTableColumn(array_merge($info, $requestData), $assembleInfoObj->schema);
- }
- /**
- * 添加或修改表字段
- *
- * @param array $request
- * @param string $entityTable
- * @param int|null $id
- * @return JsonResponse
- */
- private function saveTableColumn(array $request, string $entityTable, ?int $id = null): JsonResponse
- {
- if ($id) {
- // 获取当前的字段信息
- $columnInfo = DB::table($this->tableAssembleColumn)->find($id);
- if (empty($columnInfo)) {
- return responseMessage(2005, '该字段不存在,或已经删除');
- }
- $currentCode = $columnInfo->code;
- $code = $request['code'];
- Schema::table($entityTable, function (Blueprint $table) use ($currentCode, $code, $request, $entityTable) {
- $request['code'] = $currentCode;
- $this->createColumn('update', $entityTable, $request, $table);
- if ($currentCode != $code) {
- $table->renameColumn($currentCode, $code);
- }
- });
- $request['code'] = $code;
- return $this->saveToDb('update', $request, $entityTable, $id);
- } else {
- Schema::table($entityTable, function (Blueprint $table) use ($request, $entityTable) {
- $this->createColumn('add', $entityTable, $request, $table);
- });
- return $this->saveToDb('add', $request, $entityTable);
- }
- }
- /**
- * @param $requestType
- * @param $columnData
- * @param $columnTableName
- * @param string $id
- * @return JsonResponse
- */
- private function saveToDb($requestType, $columnData, $columnTableName, $id = '')
- {
- $assemble_id = $columnData['assemble_id'];
- $code = $columnData['code'];
- if ($requestType == 'update') {
- // 判断是否已经存在
- $isExist = DB::table($this->tableAssembleColumn)->where('assemble_id', $assemble_id)->where('code', $code)->where('id', '<>', $id)->count();
- if ($isExist) {
- return responseMessage(2006, '该字段已经存在,不允许重复添加!');
- }
- $isSuccess = DB::table($this->tableAssembleColumn)->where('id', $id)->update($columnData);
- $str = '修改';
- } else {
- // 判断是否已经存在
- $isExist = DB::table($this->tableAssembleColumn)->where('assemble_id', $assemble_id)->where('code', $code)->count();
- if ($isExist) {
- return responseMessage(2006, '该字段已经存在,不允许重复添加!');
- }
- $isSuccess = DB::table($this->tableAssembleColumn)->insert($columnData);
- $str = '添加';
- }
- if ($isSuccess) {
- if (!Schema::hasTable($columnTableName)) {
- Schema::create($columnTableName, function (Blueprint $query) use ($columnTableName, $columnData, $requestType) {
- $query->id('id')->comment('编号');
- $query->bigInteger('entity_id')->comment('实体id');
- $query->bigInteger('column_id')->default(0)->comment('字段id');
- $this->createColumn($requestType, $columnTableName, $columnData, $query, true);
- });
- }
- return responseMessage(1001, '字段' . $str . '成功!');
- } else {
- return responseMessage(2007, '字段' . $str . '失败,请重试!');
- }
- }
- /**
- * @param string $requestType
- * @param string $columnTableName
- * @param array $requestData
- * @param Blueprint $query
- * @param bool $isExtend
- */
- private function createColumn(string $requestType, string $columnTableName, array $requestData, Blueprint $query, bool $isExtend = false)
- {
- if ($isExtend) {
- $code = 'value';
- } else {
- $code = $requestData['code'];
- }
- $type = $requestData['type'];
- $length = $requestData['length'];
- $decimal = $requestData['decimal'];
- $is_null = $requestData['is_null'];
- $default = $requestData['default'];
- $remark = $requestData['remark'];
- $columnService = new ColumnsService($requestData['assemble_id']);
- $type = strtolower($type);
- $function = $columnService->getColumnFn($type);
- // 获取类型
- if (in_array($function, ['char', 'varchar', 'string'])) {
- $obj = $query->$function($code, $length);
- } elseif (in_array($function, ['float', 'double', 'decimal'])) {
- $obj = $query->$function($code, $length ?: 8, $decimal ?: 2);
- } else {
- $obj = $query->$function($code);
- }
- if ($default || $default === 0) {
- $obj->default($default); // 设置默认值
- }
- if ($is_null) {
- $obj->nullable(); // 是否为空
- }
- if ($remark) {
- $obj->comment($remark); // 注释
- }
-
- if ($requestType == 'update') { // 修改
- $isExist = Schema::hasColumn($columnTableName, $code);
- if ($isExist) { // 判断该字段是否已经存在,不存在则添加
- $obj->change();
- }
- }
- }
- }
|