AssembleController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?php
  2. namespace App\Http\Admin;
  3. use App\Http\Admin\Requests\AssembleForm;
  4. use Txj\Elastic\Table\Assemble;
  5. use Illuminate\Database\Schema\Blueprint;
  6. use Illuminate\Http\JsonResponse;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Facades\DB;
  9. use Illuminate\Support\Facades\Schema;
  10. class AssembleController extends AdminBaseController
  11. {
  12. public function __construct()
  13. {
  14. parent::__construct();
  15. if (PHP_SAPI != 'cli') {
  16. $this->setWebsite(__NAMESPACE__);
  17. $this->isLoginJson();
  18. }
  19. }
  20. /**
  21. * 集合列表
  22. */
  23. public function showList(Request $request)
  24. {
  25. $currentPage = $request->post('page', 1);
  26. $size = $request->post('size', 20);
  27. $title = $request->post('title');
  28. $find = DB::table('sys_assemble');
  29. $find->where('is_delete', 0);
  30. $find->orderBy('id', 'desc');
  31. if ($title) {
  32. // 转义特殊字符
  33. $title = str_replace("_", "\_", $title);
  34. $title = str_replace("*", "\*", $title);
  35. $find->where('title', 'like', '%' . $title . '%');
  36. $find->orWhere('schema', 'like', '%' . $title . '%');
  37. }
  38. // dd($find->toSql());
  39. $total = $find->count();
  40. $list = $find->offset(($currentPage - 1) * $size)->limit($size)->get();
  41. return responseMessage(1002, 'success', ['list' => $list, 'total' => $total]);
  42. }
  43. public function info(Request $request)
  44. {
  45. $mid = $request->post('mid');
  46. if (empty($mid)) {
  47. return responseMessage(2001, '参数错误!');
  48. }
  49. $info = DB::table('sys_assemble')->where('mid', $mid)->first();
  50. if ($info) {
  51. return responseMessage(1002, '', get_object_vars($info));
  52. } else {
  53. return responseMessage(2001, '数据不存在,请重试!');
  54. }
  55. }
  56. /**
  57. * 通过id获取信息
  58. * @param Request $request
  59. * @return JsonResponse
  60. */
  61. public function infoById(Request $request)
  62. {
  63. $id = $request->post('id');
  64. if (empty($id)) {
  65. return responseMessage(2001, '参数错误!');
  66. }
  67. $info = DB::table('sys_assemble')->find($id);
  68. if ($info) {
  69. return responseMessage(1002, '', $info);
  70. } else {
  71. return responseMessage(2001, '数据不存在,请重试!');
  72. }
  73. }
  74. /**
  75. * @param AssembleForm $request
  76. * @return JsonResponse
  77. */
  78. public function save(AssembleForm $request)
  79. {
  80. $isUpdate = false;
  81. $table = 'sys_assemble';
  82. $schema = strtolower($request->post('schema'));
  83. $data = [
  84. 'title' => $request->post('title'),
  85. 'schema' => $schema,
  86. 'connect_db_id' => $request->post('connect_db_id'),
  87. 'remark' => $request->post('remark'),
  88. 'updated_at' => time()
  89. ];
  90. if ($id = $request->post('id')) {
  91. // 获取信息
  92. $info = DB::table($table)->find($id);
  93. if ($info) {
  94. if ($info->schema != $schema) {
  95. $isUpdate = true;
  96. }
  97. $isSuccess = DB::table($table)->where('id', $id)->update($data);
  98. } else {
  99. return responseMessage(2001, '数据不存在,请重试!');
  100. }
  101. } else {
  102. // 判断名称是否唯一
  103. $isExist = DB::table($table)->where('schema', $schema)->count();
  104. if ($isExist) {
  105. return responseMessage(2002, '该集合名称已经存在!');
  106. }
  107. $data['mid'] = getRandNumber();
  108. $data['created_at'] = time();
  109. $isSuccess = DB::table($table)->insertGetId($data);
  110. }
  111. // 清除旧索引的缓存
  112. $assemble = new Assemble($schema);
  113. $assemble->clearColumnsCache();
  114. if ($isSuccess) {
  115. if ($isUpdate) {
  116. // 其他扩展表的表名,也需要修改
  117. $columnList = DB::table('sys_assemble_column')->where('assemble_id', $id)->get();
  118. foreach ($columnList as $row) {
  119. $table = preg_replace('/^' . $info->schema . '/', $data['schema'], $row->table);
  120. DB::table('sys_assemble_column')->where('id', $row->id)->update(['table' => $table]);
  121. }
  122. $tableArr = array_map('get_object_vars', $columnList->toArray());
  123. $tableArr = array_column($tableArr, 'table');
  124. $tableArr = array_unique($tableArr);
  125. foreach ($tableArr as $row) {
  126. $table = preg_replace('/^' . $info->schema . '/', $data['schema'], $row);
  127. Schema::rename($row, $table);
  128. }
  129. } else {
  130. if (!Schema::hasTable($data['schema'])) {
  131. Schema::create($data['schema'], function (Blueprint $table) {
  132. $table->id('id')->comment('编号');
  133. $table->string('mid', 16)->comment('唯一标识符'); // 随机
  134. $table->decimal('weight')->default(0)->comment('排序,权重');
  135. $table->tinyInteger('is_delete')->unsigned()->default(0)->comment('是否删除 1 删除');
  136. $table->unsignedBigInteger('created_at', false)->unsigned()->comment('创建时间,时间戳');
  137. $table->unsignedBigInteger('updated_at', false)->unsigned()->comment('更新时间,时间戳');
  138. });
  139. // 插入默认的系统字段
  140. $this->initData($isSuccess);
  141. }
  142. }
  143. return responseMessage(1001, '操作成功!');
  144. } else {
  145. return responseMessage(2001, '操作失败!');
  146. }
  147. }
  148. /**
  149. * 保存es索引信息
  150. *
  151. * @param Request $request
  152. * @return JsonResponse
  153. */
  154. public function saveEsIndex(Request $request)
  155. {
  156. $esIndex = $request->post('es_index');
  157. $id = $request->post('id');
  158. if (empty($id)) {
  159. return responseMessage(2001, '参数错误!');
  160. }
  161. if (empty($esIndex)) {
  162. return responseMessage(2002, '参数错误!');
  163. }
  164. $existInfo = DB::table('sys_assemble')->find($id);
  165. if (empty($existInfo)) {
  166. return responseMessage(2003, '参数错误!');
  167. }
  168. // 清除旧索引的缓存
  169. $assemble = new Assemble($existInfo->schema);
  170. $assemble->clearColumnsCache();
  171. $info = DB::table('sys_assemble')->where('id', $id)->update(['es_index' => $esIndex, 'updated_at' => time()]);
  172. if ($info) {
  173. return responseMessage(1001, '保存成功!');
  174. } else {
  175. return responseMessage(2001, '数据不存在,请重试!');
  176. }
  177. }
  178. /**
  179. * 删除集合
  180. */
  181. public function deleteItem()
  182. {
  183. $id = $this->requestData['id'] ?? '';
  184. if (empty($id)) {
  185. return responseMessage(2001, '参数错误!');
  186. }
  187. return $this->fakeDeleteData('sys_assemble', [['id', '=', $id]]);
  188. }
  189. private function initData(int $assembleId)
  190. {
  191. $data = [
  192. [
  193. 'mid' => getRandNumber(12),
  194. 'assemble_id' => $assembleId,
  195. 'title' => '编号',
  196. 'code' => 'id',
  197. 'type' => 'uBigint',
  198. 'length' => 20,
  199. 'decimal' => 0,
  200. 'is_null' => 0, //是否可以为空 1是 0否
  201. 'is_unsigned' => 1, //是否为无符号类型 1是 0否
  202. 'default' => '',
  203. 'remark' => '',
  204. 'weight' => 0,
  205. 'is_delete' => 0,
  206. 'created_at' => time(),
  207. 'updated_at' => time(),
  208. ],
  209. [
  210. 'mid' => getRandNumber(12),
  211. 'assemble_id' => $assembleId,
  212. 'title' => '唯一标识符',
  213. 'code' => 'mid',
  214. 'type' => 'varchar',
  215. 'length' => 255,
  216. 'decimal' => 0,
  217. 'is_null' => 0, //是否可以为空 1是 0否
  218. 'is_unsigned' => 0, //是否为无符号类型 1是 0否
  219. 'default' => '',
  220. 'remark' => '',
  221. 'weight' => 0,
  222. 'is_delete' => 0,
  223. 'created_at' => time(),
  224. 'updated_at' => time(),
  225. ],
  226. [
  227. 'mid' => getRandNumber(12),
  228. 'assemble_id' => $assembleId,
  229. 'title' => '权重',
  230. 'code' => 'weight',
  231. 'type' => 'decimal',
  232. 'length' => 8,
  233. 'decimal' => 2,
  234. 'is_null' => 0, //是否可以为空 1是 0否
  235. 'is_unsigned' => 1, //是否为无符号类型 1是 0否
  236. 'default' => 0,
  237. 'remark' => '',
  238. 'weight' => 0,
  239. 'is_delete' => 0,
  240. 'created_at' => time(),
  241. 'updated_at' => time(),
  242. ],
  243. [
  244. 'mid' => getRandNumber(12),
  245. 'assemble_id' => $assembleId,
  246. 'title' => '是否删除',
  247. 'code' => 'is_delete',
  248. 'type' => 'tinyint',
  249. 'length' => 3,
  250. 'decimal' => 0,
  251. 'is_null' => 0, //是否可以为空 1是 0否
  252. 'is_unsigned' => 1, //是否为无符号类型 1是 0否
  253. 'default' => 0,
  254. 'remark' => '',
  255. 'weight' => 0,
  256. 'is_delete' => 0,
  257. 'created_at' => time(),
  258. 'updated_at' => time(),
  259. ],
  260. [
  261. 'mid' => getRandNumber(12),
  262. 'assemble_id' => $assembleId,
  263. 'title' => '添加时间',
  264. 'code' => 'created_at',
  265. 'type' => 'date_es',
  266. 'length' => 10,
  267. 'decimal' => 0,
  268. 'is_null' => 0, //是否可以为空 1是 0否
  269. 'is_unsigned' => 1, //是否为无符号类型 1是 0否
  270. 'default' => '',
  271. 'remark' => '',
  272. 'weight' => 0,
  273. 'is_delete' => 0,
  274. 'created_at' => time(),
  275. 'updated_at' => time(),
  276. ],
  277. [
  278. 'mid' => getRandNumber(12),
  279. 'assemble_id' => $assembleId,
  280. 'title' => '修改时间',
  281. 'code' => 'updated_at',
  282. 'type' => 'date_es',
  283. 'length' => 10,
  284. 'decimal' => 0,
  285. 'is_null' => 0, //是否可以为空 1是 0否
  286. 'is_unsigned' => 1, //是否为无符号类型 1是 0否
  287. 'default' => '',
  288. 'remark' => '',
  289. 'weight' => 0,
  290. 'is_delete' => 0,
  291. 'created_at' => time(),
  292. 'updated_at' => time(),
  293. ],
  294. ];
  295. DB::table('sys_assemble_column')->insert($data);
  296. }
  297. }