VisualDevTableCre.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. package jnpf.base.util;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import jnpf.base.model.dbtable.vo.DbFieldVO;
  5. import jnpf.base.model.form.VisualTableModel;
  6. import jnpf.constant.GenerateConstant;
  7. import jnpf.constant.MsgCode;
  8. import jnpf.database.constant.DbFieldConst;
  9. import jnpf.database.datatype.viewshow.constant.DtViewConst;
  10. import jnpf.database.model.dbfield.DbFieldModel;
  11. import jnpf.database.model.dbtable.DbTableFieldModel;
  12. import jnpf.database.model.entity.DbLinkEntity;
  13. import jnpf.database.source.DbBase;
  14. import jnpf.database.util.DataSourceUtil;
  15. import jnpf.exception.DataException;
  16. import jnpf.exception.WorkFlowException;
  17. import jnpf.model.visualJson.FieLdsModel;
  18. import jnpf.model.visualJson.TableFields;
  19. import jnpf.model.visualJson.TableModel;
  20. import jnpf.model.visualJson.analysis.FormAllModel;
  21. import jnpf.model.visualJson.analysis.FormColumnTableModel;
  22. import jnpf.model.visualJson.analysis.FormEnum;
  23. import jnpf.util.*;
  24. import jnpf.util.visiual.JnpfKeyConsts;
  25. import lombok.extern.slf4j.Slf4j;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.stereotype.Component;
  28. import java.util.*;
  29. import java.util.stream.Collectors;
  30. /**
  31. * @author :JNPF开发平台组
  32. * @version: V3.1.0
  33. * @copyright 引迈信息技术有限公司
  34. * @date :2022/3/25 9:30
  35. */
  36. @Slf4j
  37. @Component
  38. public class VisualDevTableCre {
  39. @Autowired
  40. private ServiceBaseUtil serviceUtil;
  41. @Autowired
  42. private DataSourceUtil dataSourceUtil;
  43. /**
  44. * 表单赋值tableName
  45. *
  46. * @param jsonArray
  47. * @param tableModels
  48. */
  49. private void fieldsTableName(JSONArray jsonArray, List<TableModel> tableModels, Map<String, String> tableNameList) {
  50. for (int i = 0; i < jsonArray.size(); i++) {
  51. JSONObject jsonObject = (JSONObject) jsonArray.get(i);
  52. String jnpfkey = jsonObject.getJSONObject("__config__").getString("jnpfKey");
  53. List<String> childrenListAll = new ArrayList() {{
  54. add(FormEnum.card.getMessage());
  55. add(FormEnum.row.getMessage());
  56. add(FormEnum.tab.getMessage());
  57. add(FormEnum.collapse.getMessage());
  58. add(FormEnum.collapseItem.getMessage());
  59. add(FormEnum.tabItem.getMessage());
  60. add(FormEnum.tableGrid.getMessage());
  61. add(FormEnum.tableGridTr.getMessage());
  62. add(FormEnum.tableGridTd.getMessage());
  63. add(FormEnum.STEPS.getMessage());
  64. add(FormEnum.STEP_ITEM.getMessage());
  65. }};
  66. if (childrenListAll.contains(jnpfkey) || StringUtil.isEmpty(jnpfkey)) {
  67. JSONArray childArray = jsonObject.getJSONObject("__config__").getJSONArray("children");
  68. this.fieldsTableName(childArray, tableModels, tableNameList);
  69. jsonObject.getJSONObject("__config__").put("children", childArray);
  70. } else if (FormEnum.table.getMessage().equals(jnpfkey)) {
  71. JSONArray childrenList = new JSONArray();
  72. JSONArray children = jsonObject.getJSONObject("__config__").getJSONArray("children");
  73. String tableModel = tableNameList.get(jsonObject.getString("__vModel__"));
  74. for (int k = 0; k < children.size(); k++) {
  75. JSONObject childrenObject = (JSONObject) children.get(k);
  76. this.fieldsModel(childrenObject, tableModels);
  77. if (StringUtil.isEmpty(tableModel)) {
  78. tableModel = childrenObject.getJSONObject("__config__").getString("relationTable");
  79. }
  80. childrenList.add(childrenObject);
  81. }
  82. jsonObject.getJSONObject("__config__").put("tableName", tableModel);
  83. jsonObject.getJSONObject("__config__").put("children", childrenList);
  84. } else {
  85. this.fieldsModel(jsonObject, tableModels);
  86. }
  87. }
  88. }
  89. /**
  90. * 赋值table
  91. *
  92. * @param jsonObject
  93. * @param tableModels
  94. */
  95. private TableModel fieldsModel(JSONObject jsonObject, List<TableModel> tableModels) {
  96. String vModel = jsonObject.getString("__vModel__");
  97. String relationField = StringUtil.isNotEmpty(jsonObject.getString("relationField")) ? jsonObject.getString("relationField") : "";
  98. String jnpfkey = jsonObject.getJSONObject("__config__").getString("jnpfKey");
  99. TableModel tableName = tableModels.stream().filter(t -> "1".equals(t.getTypeId())).findFirst().orElse(null);
  100. if (tableName != null) {
  101. jsonObject.getJSONObject("__config__").put("tableName", tableName.getTable());
  102. }
  103. List<TableModel> childTableAll = tableModels.stream().filter(t -> "0".equals(t.getTypeId())).collect(Collectors.toList());
  104. TableModel childTableaa = childTableAll.stream().filter(t -> t.getFields().stream().filter(k -> k.getField().equals(vModel)).count() > 0).findFirst().orElse(null);
  105. if (childTableaa != null) {
  106. jsonObject.getJSONObject("__config__").put("relationTable", childTableaa.getTable());
  107. }
  108. if (FormEnum.relationFormAttr.getMessage().equals(jnpfkey) || FormEnum.popupAttr.getMessage().equals(jnpfkey)) {
  109. if (StringUtil.isNotEmpty(relationField)) {
  110. Boolean isSubTable = jsonObject.getJSONObject("__config__").getBooleanValue("isSubTable");
  111. String model = relationField.split("_jnpfTable_")[0];
  112. jsonObject.put("relationField", model + "_jnpfTable_" + tableName.getTable() + (isSubTable ? "0" : "1"));
  113. }
  114. }
  115. if (JnpfKeyConsts.BILLRULE.equals(jnpfkey)) {
  116. if (StringUtil.isNotEmpty(relationField)) {
  117. Boolean isSubTable = jsonObject.getJSONObject("__config__").getBooleanValue("isSubTable");
  118. String model = relationField.split("_jnpfTable_")[0];
  119. jsonObject.put("relationField", model + "_jnpfTable_" + tableName.getTable() + (isSubTable ? "0" : "1"));
  120. }
  121. }
  122. return childTableaa;
  123. }
  124. /**
  125. * 验证表名合规性
  126. *
  127. * @param tableName
  128. * @param dbLinkId
  129. * @return
  130. * @throws Exception
  131. */
  132. public void checkName(String tableName, String dbLinkId) throws Exception {
  133. if (!RegexUtils.checkName(tableName)) {
  134. throw new DataException(MsgCode.VS030.get());
  135. }
  136. if (tableName.length() > 30) {
  137. throw new DataException(MsgCode.VS031.get());
  138. }
  139. if (serviceUtil.isExistTable(dbLinkId, tableName)) {
  140. throw new DataException(MsgCode.VS032.get());
  141. }
  142. if (GenerateConstant.containKeyword(tableName)) {
  143. throw new DataException(MsgCode.SYS128.get(tableName));
  144. }
  145. }
  146. /**
  147. * 创建表
  148. *
  149. * @return
  150. */
  151. public List<TableModel> tableList(VisualTableModel visualTableModel) throws Exception {
  152. JSONArray jsonArray = visualTableModel.getJsonArray();
  153. List<FormAllModel> formAllModel = visualTableModel.getFormAllModel();
  154. String table = visualTableModel.getTable();
  155. String linkId = visualTableModel.getLinkId();
  156. String fullName = visualTableModel.getFullName();
  157. int primaryKey = visualTableModel.getPrimaryKey();
  158. List<TableModel> tableModelList = new LinkedList<>();
  159. Map<String, String> tableNameList = new HashMap<>();
  160. DbLinkEntity dbLink = serviceUtil.getDbLink(linkId);
  161. String type = dbLink != null ? dbLink.getDbType() : dataSourceUtil.getDbType();
  162. boolean isUpperCase = (DbBase.DM.equals(type) || DbBase.ORACLE.equals(type));
  163. boolean isLowerCase = (DbBase.POSTGRE_SQL.equals(type) || DbBase.KINGBASE_ES.equals(type));
  164. table = tableName(table, isUpperCase, isLowerCase);
  165. String relationField = tableName(TableFeildsEnum.FID.getField(), isUpperCase, isLowerCase);
  166. String tableField = tableName(TableFeildsEnum.FOREIGN.getField(), isUpperCase, isLowerCase);
  167. List<String> checkNameList = new ArrayList<>();
  168. checkNameList.add(table);
  169. try {
  170. List<DbFieldModel> fieldList = new ArrayList<>();
  171. Map<String, List<DbFieldModel>> tableListAll = new HashMap<>();
  172. for (FormAllModel model : formAllModel) {
  173. if (FormEnum.mast.getMessage().equals(model.getJnpfKey())) {
  174. FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel();
  175. this.fieldList(fieLdsModel, table, fieldList);
  176. } else if (FormEnum.table.getMessage().equals(model.getJnpfKey())) {
  177. String tableName = "ct" + RandomUtil.uuId();
  178. tableName = tableName(tableName, isUpperCase, isLowerCase);
  179. FormColumnTableModel fieLdsModel = model.getChildList();
  180. if (StringUtil.isNotEmpty(fieLdsModel.getTableName())) {
  181. tableName = fieLdsModel.getTableName();
  182. checkName(tableName, linkId);
  183. if (checkNameList.contains(tableName)) {
  184. throw new DataException(MsgCode.VS032.get());
  185. } else {
  186. checkNameList.add(tableName);
  187. }
  188. }
  189. List<DbFieldModel> tableList = new ArrayList<>();
  190. String tableModel = fieLdsModel.getTableModel();
  191. List<FieLdsModel> fieldsList = fieLdsModel.getChildList().stream().map(t -> t.getFieLdsModel()).collect(Collectors.toList());
  192. for (FieLdsModel tableFieLdsModel : fieldsList) {
  193. this.fieldList(tableFieLdsModel, tableName, tableList);
  194. }
  195. this.dbTableField(tableList, true, primaryKey, isLowerCase, tableField, relationField);
  196. tableNameList.put(tableModel, tableName);
  197. tableListAll.put(tableModel, tableList);
  198. }
  199. }
  200. this.dbTableField(fieldList, false, primaryKey, isLowerCase, tableField, relationField);
  201. fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.TENANTID, isUpperCase, isLowerCase));
  202. fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.FLOWID, isUpperCase, isLowerCase));
  203. fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.VERSION, isUpperCase, isLowerCase));
  204. fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.FLOWTASKID, isUpperCase, isLowerCase));
  205. fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.FLOWSTATE, isUpperCase, isLowerCase));
  206. if (visualTableModel.getLogicalDelete()) {//删除标志字段
  207. fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETEMARK, isUpperCase, isLowerCase));
  208. fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETETIME, isUpperCase, isLowerCase));
  209. fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETEUSERID, isUpperCase, isLowerCase));
  210. }
  211. List<DbTableFieldModel> dbTableList = new ArrayList<>();
  212. //创建子表
  213. for (String key : tableListAll.keySet()) {
  214. String tableName = tableName(tableNameList.get(key), isUpperCase, isLowerCase);
  215. List<DbFieldModel> datableList = tableListAll.get(key);
  216. datableList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.TENANTID, isUpperCase, isLowerCase));
  217. if (visualTableModel.getLogicalDelete()) {//删除标志字段
  218. datableList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETEMARK, isUpperCase, isLowerCase));
  219. datableList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETETIME, isUpperCase, isLowerCase));
  220. datableList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETEUSERID, isUpperCase, isLowerCase));
  221. }
  222. DbTableFieldModel dbTable = this.dbTable(linkId, tableName, datableList, true, fullName);
  223. dbTableList.add(dbTable);
  224. this.tableModel(tableModelList, datableList, tableName, table, true, tableField, relationField);
  225. }
  226. this.tableModel(tableModelList, fieldList, table, table, false, tableField, relationField);
  227. DbTableFieldModel dbTable = this.dbTable(linkId, table, fieldList, false, fullName);
  228. dbTableList.add(dbTable);
  229. serviceUtil.createTable(dbTableList);
  230. this.fieldsTableName(jsonArray, tableModelList, tableNameList);
  231. } catch (DataException e) {
  232. e.printStackTrace();
  233. log.error("表新增错误:{}", e.getMessage());
  234. throw new DataException(e.getMessage());
  235. } catch (Exception e) {
  236. e.printStackTrace();
  237. log.error("表新增错误:{}", e.getMessage());
  238. throw new WorkFlowException(MsgCode.FM013.get(e.getMessage()), e);
  239. }
  240. return tableModelList;
  241. }
  242. /**
  243. * 表名
  244. *
  245. * @param tableName
  246. * @param isUpperCase
  247. * @param isLowerCase
  248. * @return
  249. */
  250. private String tableName(String tableName, boolean isUpperCase, boolean isLowerCase) {
  251. String resultName = isUpperCase ? tableName.toUpperCase() : isLowerCase ? tableName.toLowerCase() : tableName;
  252. return resultName;
  253. }
  254. /**
  255. * 获取表单字段
  256. *
  257. * @param fieLdsModel
  258. * @param tableList
  259. */
  260. private void fieldList(FieLdsModel fieLdsModel, String table, List<DbFieldModel> tableList) {
  261. String vmodel = fieLdsModel.getVModel();
  262. String lable = fieLdsModel.getConfig().getLabel();
  263. String jnpfkey = fieLdsModel.getConfig().getJnpfKey();
  264. fieLdsModel.getConfig().setTableName(table);
  265. if (StringUtil.isNotEmpty(vmodel)) {
  266. DbFieldModel fieldForm = new DbFieldModel();
  267. fieldForm.setNullSign(DbFieldConst.NULL);
  268. fieldForm.setDataType(DtViewConst.VARCHAR);
  269. fieldForm.setLength("255");
  270. fieldForm.setIsPrimaryKey(false);
  271. if (StringUtil.isNotEmpty(fieLdsModel.getVModel())) {
  272. if (JnpfKeyConsts.getTextField().contains(jnpfkey)) {
  273. fieldForm.setDataType(DtViewConst.TEXT);
  274. }
  275. List<String> date = new ArrayList() {{
  276. add(JnpfKeyConsts.MODIFYTIME);
  277. add(JnpfKeyConsts.CREATETIME);
  278. add(JnpfKeyConsts.DATE);
  279. add(JnpfKeyConsts.DATE_CALCULATE);
  280. }};
  281. if (date.contains(jnpfkey)) {
  282. fieldForm.setDataType(DtViewConst.DATE_TIME);
  283. }
  284. if (JnpfKeyConsts.NUM_INPUT.equals(jnpfkey) || JnpfKeyConsts.CALCULATE.equals(jnpfkey) || JnpfKeyConsts.SLIDER.equals(jnpfkey)) {
  285. fieldForm.setDataType(DtViewConst.DECIMAL);
  286. String precision = "15";
  287. if (fieLdsModel.getPrecision() != null) {
  288. precision = String.valueOf(fieLdsModel.getPrecision());
  289. }
  290. fieldForm.setLength("38," + precision);
  291. //mysql 最大长度65,Oracle和postgresql最大长度38,精度0-最大长度内取值,当前系统默认给15最大
  292. }
  293. if (JnpfKeyConsts.RATE.equals(jnpfkey)) {
  294. fieldForm.setDataType(DtViewConst.DECIMAL);
  295. fieldForm.setLength("38,1");
  296. }
  297. if (JnpfKeyConsts.LOCATION.equals(jnpfkey)) {
  298. fieldForm.setLength("500");
  299. }
  300. fieldForm.setField(vmodel);
  301. fieldForm.setComment(lable);
  302. tableList.add(fieldForm);
  303. }
  304. }
  305. }
  306. /**
  307. * 创建主外键字段
  308. *
  309. * @param tableList
  310. * @param isforeign
  311. */
  312. private void dbTableField(List<DbFieldModel> tableList, boolean isforeign, int primaryKey, boolean isPostgreOrKingbase, String tableField, String relationField) {
  313. //是否自增 true自增
  314. boolean autoPrimaryKey = primaryKey == 2;
  315. String dataType = autoPrimaryKey ? isPostgreOrKingbase ? DtViewConst.INT : DtViewConst.BIGINT : DtViewConst.VARCHAR;
  316. DbFieldModel tableKey = new DbFieldModel();
  317. tableKey.setNullSign(DbFieldConst.NOT_NULL);
  318. tableKey.setDataType(dataType);
  319. tableKey.setLength(TableFeildsEnum.FID.getLength());
  320. tableKey.setIsPrimaryKey(true);
  321. tableKey.setField(relationField);
  322. tableKey.setIsAutoIncrement(autoPrimaryKey);
  323. tableKey.setComment(TableFeildsEnum.FID.getComment());
  324. tableList.add(tableKey);
  325. if (isforeign) {
  326. DbFieldModel tableForeignKey = new DbFieldModel();
  327. tableForeignKey.setNullSign(DbFieldConst.NULL);
  328. tableForeignKey.setDataType(dataType);
  329. tableForeignKey.setLength(TableFeildsEnum.FOREIGN.getLength());
  330. tableForeignKey.setIsPrimaryKey(false);
  331. tableForeignKey.setField(tableField);
  332. tableForeignKey.setComment(TableFeildsEnum.FOREIGN.getComment());
  333. tableList.add(tableForeignKey);
  334. }
  335. }
  336. /**
  337. * 组装字段list
  338. *
  339. * @param tableModelList
  340. * @param dbtable
  341. * @param table
  342. * @param mastTable
  343. * @param isforeign
  344. */
  345. private void tableModel(List<TableModel> tableModelList, List<DbFieldModel> dbtable, String table, String mastTable, boolean isforeign, String tableField, String relationField) {
  346. TableModel tableModel = new TableModel();
  347. tableModel.setRelationField(isforeign ? relationField : "");
  348. tableModel.setRelationTable(isforeign ? mastTable : "");
  349. tableModel.setTable(table);
  350. tableModel.setComment(isforeign ? "子表" : "主表");
  351. tableModel.setTableField(isforeign ? tableField : "");
  352. tableModel.setTypeId(isforeign ? "0" : "1");
  353. List<DbFieldVO> voList = dbtable.stream().map(DbFieldVO::new).collect(Collectors.toList());
  354. tableModel.setFields(JsonUtil.getJsonToList(voList, TableFields.class));
  355. tableModelList.add(tableModel);
  356. }
  357. /**
  358. * 组装创表字段
  359. *
  360. * @param linkId
  361. * @param tableName
  362. * @param tableFieldList
  363. * @param isforeign
  364. * @return
  365. */
  366. private DbTableFieldModel dbTable(String linkId, String tableName, List<DbFieldModel> tableFieldList, boolean isforeign, String fullName) {
  367. DbTableFieldModel dbTable = new DbTableFieldModel();
  368. dbTable.setDbLinkId(linkId);
  369. dbTable.setTable(tableName);
  370. dbTable.setDbFieldModelList(tableFieldList);
  371. String s = isforeign ? "子表" : "主表";
  372. if (fullName.contains("&")) {//自动生成表备注的时候带&符号创建不成功问题
  373. fullName = fullName.replace("&", " ");
  374. }
  375. dbTable.setComment(String.format("%s-%s", fullName, s));
  376. return dbTable;
  377. }
  378. }