ColumnController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <?php
  2. namespace App\Http\Admin;
  3. use App\Http\Admin\Requests\ColumnForm;
  4. use Txj\Elastic\Services\ColumnsService;
  5. use Txj\Elastic\Table\Assemble;
  6. use Illuminate\Database\Schema\Blueprint;
  7. use Illuminate\Http\JsonResponse;
  8. use Illuminate\Http\Request;
  9. use Illuminate\Support\Facades\DB;
  10. use Illuminate\Support\Facades\Schema;
  11. use Illuminate\Support\Str;
  12. class ColumnController extends AdminBaseController
  13. {
  14. protected string $tableAssemble = 'sys_assemble';
  15. protected string $tableAssembleColumn = 'sys_assemble_column';
  16. public function __construct()
  17. {
  18. parent::__construct();
  19. if (PHP_SAPI != 'cli') {
  20. $this->setWebsite(__NAMESPACE__);
  21. $this->isLoginJson();
  22. }
  23. }
  24. public function showColumnList(Request $request)
  25. {
  26. $mid = $request->post('mid');
  27. $id = $request->post('id');
  28. if (empty($mid) && empty($id)) {
  29. return responseMessage(2001, '参数错误!');
  30. }
  31. if ($id) {
  32. $infoObj = DB::table('sys_assemble')->find($id);
  33. } else {
  34. $infoObj = DB::table('sys_assemble')->where('mid', $mid)->first();
  35. }
  36. if (empty($infoObj)) {
  37. return responseMessage(2002, '参数错误!');
  38. }
  39. $listObj = DB::table($this->tableAssembleColumn)->where('is_delete', 0)->where('assemble_id', $infoObj->id)->get();
  40. $list = array_map('get_object_vars', $listObj->toArray());
  41. return responseMessage(1002, '', $list);
  42. }
  43. /**
  44. * @param ColumnForm $request
  45. * @return JsonResponse
  46. */
  47. public function save(ColumnForm $request)
  48. {
  49. $column_id = $request->post('id');
  50. $assemble_mid = $request->post('assemble_mid');
  51. // 获取集合信息
  52. if (PHP_SAPI == 'cli') {
  53. $assemble_id = $request->post('assemble_id');
  54. if (empty($assemble_id)) {
  55. return responseMessage(2000, '参数错误!');
  56. }
  57. $assembleInfo = DB::table($this->tableAssemble)->find($assemble_id);
  58. } else {
  59. $assembleInfo = DB::table($this->tableAssemble)->where('mid', $assemble_mid)->first();
  60. }
  61. if (empty($assembleInfo)) {
  62. return responseMessage(2001, '参数错误,集合不存在!');
  63. }
  64. // 清除缓存
  65. $assemble = new Assemble($assembleInfo->schema);
  66. $assemble->clearColumnsCache();
  67. $type = $request->post('type');
  68. $code = $request->post('code');
  69. $length = $request->post('length');
  70. $decimal = $request->post('decimal');
  71. $is_null = $request->post('is_null');
  72. $default = $request->post('default');
  73. $remark = $request->post('remark');
  74. $assemble_id = $assembleInfo->id;
  75. $tableName = $request->post('table');
  76. $length = intval($length);
  77. $is_null = intval($is_null);
  78. $requestData = [
  79. 'mid' => getRandNumber(),
  80. 'assemble_id' => $assemble_id,
  81. 'title' => $request->post('title'),
  82. 'code' => $code,
  83. 'type' => $type,
  84. 'length' => $length,
  85. 'decimal' => $decimal,
  86. 'is_null' => $is_null, //是否可以为空 1是 0否
  87. 'default' => $default,
  88. 'remark' => $remark,
  89. 'weight' => $request->post('weight'),
  90. 'is_delete' => 0,
  91. 'created_at' => time(),
  92. 'updated_at' => time(),
  93. ];
  94. return $this->saveTableColumn($requestData, $assembleInfo->schema, $column_id);
  95. }
  96. /**
  97. * 获取字段信息
  98. *
  99. * @param Request $request
  100. * @return JsonResponse
  101. */
  102. public function getColumnInfo(Request $request)
  103. {
  104. $id = $request->post('column_id');
  105. if (empty($id)) {
  106. return responseMessage(2001, '参数错误!');
  107. }
  108. $columnInfo = DB::table($this->tableAssembleColumn)->find($id);
  109. $columnAr = get_object_vars($columnInfo);
  110. // 表名的前缀去掉
  111. $table = $columnAr['table'];
  112. $arr = explode('_', $table, 2);
  113. $columnAr['table'] = $arr[1];
  114. return responseMessage(1002, '', $columnAr);
  115. }
  116. ######################################################################
  117. /**
  118. * 获取系统字段
  119. *
  120. * @param Request $request
  121. * @return JsonResponse
  122. */
  123. public function getSysColumnList(Request $request)
  124. {
  125. $page = $request->post('page', 1);
  126. $size = $request->post('size', 30);
  127. $keyword = $request->post('keyword');
  128. $find = DB::table($this->tableAssembleColumn)
  129. ->where('is_delete', 0)
  130. ->where('category_type', '<>', 1);
  131. if ($keyword) {
  132. $find->where('code', 'like', '%' . $keyword . '%');
  133. }
  134. $list = $find->offset(($page - 1) * $size)->limit($size)->get();
  135. $total = $find->count();
  136. return responseMessage(1002, '', ['list' => $list, 'total' => $total]);
  137. }
  138. /**
  139. * 创建
  140. *
  141. * @param Request $request
  142. * @return JsonResponse
  143. */
  144. public function createColumnBySys(Request $request)
  145. {
  146. $assemble_id = $request->post('assemble_id');
  147. $column_id = $request->post('column_id');
  148. if (empty($assemble_id) || empty($column_id)) {
  149. return responseMessage(2001, '参数错误!');
  150. }
  151. // 获取集合信息
  152. $assembleInfoObj = DB::table($this->tableAssemble)->find($assemble_id);
  153. if (empty($assembleInfoObj)) {
  154. return responseMessage(2002, '参数错误!');
  155. }
  156. $infoObj = DB::table($this->tableAssembleColumn)->find($column_id);
  157. if (empty($infoObj)) {
  158. return responseMessage(2003, '参数错误!');
  159. }
  160. $info = get_object_vars($infoObj);
  161. unset($info['id']);
  162. unset($info['mid']);
  163. unset($info['created_at']);
  164. unset($info['updated_at']);
  165. $columnAssembleInfoObj = DB::table($this->tableAssemble)->find($info['assemble_id']);
  166. $category_type = $info['category_type'];
  167. $tableName = Str::replaceFirst($columnAssembleInfoObj->schema, '', $info['table']);
  168. $tableName = trim($tableName, '_');
  169. $requestData = [
  170. 'mid' => getRandNumber(),
  171. 'assemble_id' => $assemble_id,
  172. 'category_type' => $category_type,
  173. 'weight' => 0,
  174. 'is_delete' => 0,
  175. ];
  176. return $this->saveTableColumn(array_merge($info, $requestData), $assembleInfoObj->schema);
  177. }
  178. /**
  179. * 添加或修改表字段
  180. *
  181. * @param array $request
  182. * @param string $entityTable
  183. * @param int|null $id
  184. * @return JsonResponse
  185. */
  186. private function saveTableColumn(array $request, string $entityTable, ?int $id = null): JsonResponse
  187. {
  188. if ($id) {
  189. // 获取当前的字段信息
  190. $columnInfo = DB::table($this->tableAssembleColumn)->find($id);
  191. if (empty($columnInfo)) {
  192. return responseMessage(2005, '该字段不存在,或已经删除');
  193. }
  194. $currentCode = $columnInfo->code;
  195. $code = $request['code'];
  196. Schema::table($entityTable, function (Blueprint $table) use ($currentCode, $code, $request, $entityTable) {
  197. $request['code'] = $currentCode;
  198. $this->createColumn('update', $entityTable, $request, $table);
  199. if ($currentCode != $code) {
  200. $table->renameColumn($currentCode, $code);
  201. }
  202. });
  203. $request['code'] = $code;
  204. return $this->saveToDb('update', $request, $entityTable, $id);
  205. } else {
  206. Schema::table($entityTable, function (Blueprint $table) use ($request, $entityTable) {
  207. $this->createColumn('add', $entityTable, $request, $table);
  208. });
  209. return $this->saveToDb('add', $request, $entityTable);
  210. }
  211. }
  212. /**
  213. * @param $requestType
  214. * @param $columnData
  215. * @param $columnTableName
  216. * @param string $id
  217. * @return JsonResponse
  218. */
  219. private function saveToDb($requestType, $columnData, $columnTableName, $id = '')
  220. {
  221. $assemble_id = $columnData['assemble_id'];
  222. $code = $columnData['code'];
  223. if ($requestType == 'update') {
  224. // 判断是否已经存在
  225. $isExist = DB::table($this->tableAssembleColumn)->where('assemble_id', $assemble_id)->where('code', $code)->where('id', '<>', $id)->count();
  226. if ($isExist) {
  227. return responseMessage(2006, '该字段已经存在,不允许重复添加!');
  228. }
  229. $isSuccess = DB::table($this->tableAssembleColumn)->where('id', $id)->update($columnData);
  230. $str = '修改';
  231. } else {
  232. // 判断是否已经存在
  233. $isExist = DB::table($this->tableAssembleColumn)->where('assemble_id', $assemble_id)->where('code', $code)->count();
  234. if ($isExist) {
  235. return responseMessage(2006, '该字段已经存在,不允许重复添加!');
  236. }
  237. $isSuccess = DB::table($this->tableAssembleColumn)->insert($columnData);
  238. $str = '添加';
  239. }
  240. if ($isSuccess) {
  241. if (!Schema::hasTable($columnTableName)) {
  242. Schema::create($columnTableName, function (Blueprint $query) use ($columnTableName, $columnData, $requestType) {
  243. $query->id('id')->comment('编号');
  244. $query->bigInteger('entity_id')->comment('实体id');
  245. $query->bigInteger('column_id')->default(0)->comment('字段id');
  246. $this->createColumn($requestType, $columnTableName, $columnData, $query, true);
  247. });
  248. }
  249. return responseMessage(1001, '字段' . $str . '成功!');
  250. } else {
  251. return responseMessage(2007, '字段' . $str . '失败,请重试!');
  252. }
  253. }
  254. /**
  255. * @param string $requestType
  256. * @param string $columnTableName
  257. * @param array $requestData
  258. * @param Blueprint $query
  259. * @param bool $isExtend
  260. */
  261. private function createColumn(string $requestType, string $columnTableName, array $requestData, Blueprint $query, bool $isExtend = false)
  262. {
  263. if ($isExtend) {
  264. $code = 'value';
  265. } else {
  266. $code = $requestData['code'];
  267. }
  268. $type = $requestData['type'];
  269. $length = $requestData['length'];
  270. $decimal = $requestData['decimal'];
  271. $is_null = $requestData['is_null'];
  272. $default = $requestData['default'];
  273. $remark = $requestData['remark'];
  274. $columnService = new ColumnsService($requestData['assemble_id']);
  275. $type = strtolower($type);
  276. $function = $columnService->getColumnFn($type);
  277. // 获取类型
  278. if (in_array($function, ['char', 'varchar', 'string'])) {
  279. $obj = $query->$function($code, $length);
  280. } elseif (in_array($function, ['float', 'double', 'decimal'])) {
  281. $obj = $query->$function($code, $length ?: 8, $decimal ?: 2);
  282. } else {
  283. $obj = $query->$function($code);
  284. }
  285. if ($default || $default === 0) {
  286. $obj->default($default); // 设置默认值
  287. }
  288. if ($is_null) {
  289. $obj->nullable(); // 是否为空
  290. }
  291. if ($remark) {
  292. $obj->comment($remark); // 注释
  293. }
  294. if ($requestType == 'update') { // 修改
  295. $isExist = Schema::hasColumn($columnTableName, $code);
  296. if ($isExist) { // 判断该字段是否已经存在,不存在则添加
  297. $obj->change();
  298. }
  299. }
  300. }
  301. }