package jnpf.base.util; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import jnpf.base.model.dbtable.vo.DbFieldVO; import jnpf.base.model.form.VisualTableModel; import jnpf.constant.GenerateConstant; import jnpf.constant.MsgCode; import jnpf.database.constant.DbFieldConst; import jnpf.database.datatype.viewshow.constant.DtViewConst; import jnpf.database.model.dbfield.DbFieldModel; import jnpf.database.model.dbtable.DbTableFieldModel; import jnpf.database.model.entity.DbLinkEntity; import jnpf.database.source.DbBase; import jnpf.database.util.DataSourceUtil; import jnpf.exception.DataException; import jnpf.exception.WorkFlowException; import jnpf.model.visualJson.FieLdsModel; import jnpf.model.visualJson.TableFields; import jnpf.model.visualJson.TableModel; import jnpf.model.visualJson.analysis.FormAllModel; import jnpf.model.visualJson.analysis.FormColumnTableModel; import jnpf.model.visualJson.analysis.FormEnum; import jnpf.util.*; import jnpf.util.visiual.JnpfKeyConsts; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.*; import java.util.stream.Collectors; /** * @author :JNPF开发平台组 * @version: V3.1.0 * @copyright 引迈信息技术有限公司 * @date :2022/3/25 9:30 */ @Slf4j @Component public class VisualDevTableCre { @Autowired private ServiceBaseUtil serviceUtil; @Autowired private DataSourceUtil dataSourceUtil; /** * 表单赋值tableName * * @param jsonArray * @param tableModels */ private void fieldsTableName(JSONArray jsonArray, List tableModels, Map tableNameList) { for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject = (JSONObject) jsonArray.get(i); String jnpfkey = jsonObject.getJSONObject("__config__").getString("jnpfKey"); List childrenListAll = new ArrayList() {{ add(FormEnum.card.getMessage()); add(FormEnum.row.getMessage()); add(FormEnum.tab.getMessage()); add(FormEnum.collapse.getMessage()); add(FormEnum.collapseItem.getMessage()); add(FormEnum.tabItem.getMessage()); add(FormEnum.tableGrid.getMessage()); add(FormEnum.tableGridTr.getMessage()); add(FormEnum.tableGridTd.getMessage()); add(FormEnum.STEPS.getMessage()); add(FormEnum.STEP_ITEM.getMessage()); }}; if (childrenListAll.contains(jnpfkey) || StringUtil.isEmpty(jnpfkey)) { JSONArray childArray = jsonObject.getJSONObject("__config__").getJSONArray("children"); this.fieldsTableName(childArray, tableModels, tableNameList); jsonObject.getJSONObject("__config__").put("children", childArray); } else if (FormEnum.table.getMessage().equals(jnpfkey)) { JSONArray childrenList = new JSONArray(); JSONArray children = jsonObject.getJSONObject("__config__").getJSONArray("children"); String tableModel = tableNameList.get(jsonObject.getString("__vModel__")); for (int k = 0; k < children.size(); k++) { JSONObject childrenObject = (JSONObject) children.get(k); this.fieldsModel(childrenObject, tableModels); if (StringUtil.isEmpty(tableModel)) { tableModel = childrenObject.getJSONObject("__config__").getString("relationTable"); } childrenList.add(childrenObject); } jsonObject.getJSONObject("__config__").put("tableName", tableModel); jsonObject.getJSONObject("__config__").put("children", childrenList); } else { this.fieldsModel(jsonObject, tableModels); } } } /** * 赋值table * * @param jsonObject * @param tableModels */ private TableModel fieldsModel(JSONObject jsonObject, List tableModels) { String vModel = jsonObject.getString("__vModel__"); String relationField = StringUtil.isNotEmpty(jsonObject.getString("relationField")) ? jsonObject.getString("relationField") : ""; String jnpfkey = jsonObject.getJSONObject("__config__").getString("jnpfKey"); TableModel tableName = tableModels.stream().filter(t -> "1".equals(t.getTypeId())).findFirst().orElse(null); if (tableName != null) { jsonObject.getJSONObject("__config__").put("tableName", tableName.getTable()); } List childTableAll = tableModels.stream().filter(t -> "0".equals(t.getTypeId())).collect(Collectors.toList()); TableModel childTableaa = childTableAll.stream().filter(t -> t.getFields().stream().filter(k -> k.getField().equals(vModel)).count() > 0).findFirst().orElse(null); if (childTableaa != null) { jsonObject.getJSONObject("__config__").put("relationTable", childTableaa.getTable()); } if (FormEnum.relationFormAttr.getMessage().equals(jnpfkey) || FormEnum.popupAttr.getMessage().equals(jnpfkey)) { if (StringUtil.isNotEmpty(relationField)) { Boolean isSubTable = jsonObject.getJSONObject("__config__").getBooleanValue("isSubTable"); String model = relationField.split("_jnpfTable_")[0]; jsonObject.put("relationField", model + "_jnpfTable_" + tableName.getTable() + (isSubTable ? "0" : "1")); } } if (JnpfKeyConsts.BILLRULE.equals(jnpfkey)) { if (StringUtil.isNotEmpty(relationField)) { Boolean isSubTable = jsonObject.getJSONObject("__config__").getBooleanValue("isSubTable"); String model = relationField.split("_jnpfTable_")[0]; jsonObject.put("relationField", model + "_jnpfTable_" + tableName.getTable() + (isSubTable ? "0" : "1")); } } return childTableaa; } /** * 验证表名合规性 * * @param tableName * @param dbLinkId * @return * @throws Exception */ public void checkName(String tableName, String dbLinkId) throws Exception { if (!RegexUtils.checkName(tableName)) { throw new DataException(MsgCode.VS030.get()); } if (tableName.length() > 30) { throw new DataException(MsgCode.VS031.get()); } if (serviceUtil.isExistTable(dbLinkId, tableName)) { throw new DataException(MsgCode.VS032.get()); } if (GenerateConstant.containKeyword(tableName)) { throw new DataException(MsgCode.SYS128.get(tableName)); } } /** * 创建表 * * @return */ public List tableList(VisualTableModel visualTableModel) throws Exception { JSONArray jsonArray = visualTableModel.getJsonArray(); List formAllModel = visualTableModel.getFormAllModel(); String table = visualTableModel.getTable(); String linkId = visualTableModel.getLinkId(); String fullName = visualTableModel.getFullName(); int primaryKey = visualTableModel.getPrimaryKey(); List tableModelList = new LinkedList<>(); Map tableNameList = new HashMap<>(); DbLinkEntity dbLink = serviceUtil.getDbLink(linkId); String type = dbLink != null ? dbLink.getDbType() : dataSourceUtil.getDbType(); boolean isUpperCase = (DbBase.DM.equals(type) || DbBase.ORACLE.equals(type)); boolean isLowerCase = (DbBase.POSTGRE_SQL.equals(type) || DbBase.KINGBASE_ES.equals(type)); table = tableName(table, isUpperCase, isLowerCase); String relationField = tableName(TableFeildsEnum.FID.getField(), isUpperCase, isLowerCase); String tableField = tableName(TableFeildsEnum.FOREIGN.getField(), isUpperCase, isLowerCase); List checkNameList = new ArrayList<>(); checkNameList.add(table); try { List fieldList = new ArrayList<>(); Map> tableListAll = new HashMap<>(); for (FormAllModel model : formAllModel) { if (FormEnum.mast.getMessage().equals(model.getJnpfKey())) { FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel(); this.fieldList(fieLdsModel, table, fieldList); } else if (FormEnum.table.getMessage().equals(model.getJnpfKey())) { String tableName = "ct" + RandomUtil.uuId(); tableName = tableName(tableName, isUpperCase, isLowerCase); FormColumnTableModel fieLdsModel = model.getChildList(); if (StringUtil.isNotEmpty(fieLdsModel.getTableName())) { tableName = fieLdsModel.getTableName(); checkName(tableName, linkId); if (checkNameList.contains(tableName)) { throw new DataException(MsgCode.VS032.get()); } else { checkNameList.add(tableName); } } List tableList = new ArrayList<>(); String tableModel = fieLdsModel.getTableModel(); List fieldsList = fieLdsModel.getChildList().stream().map(t -> t.getFieLdsModel()).collect(Collectors.toList()); for (FieLdsModel tableFieLdsModel : fieldsList) { this.fieldList(tableFieLdsModel, tableName, tableList); } this.dbTableField(tableList, true, primaryKey, isLowerCase, tableField, relationField); tableNameList.put(tableModel, tableName); tableListAll.put(tableModel, tableList); } } this.dbTableField(fieldList, false, primaryKey, isLowerCase, tableField, relationField); fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.TENANTID, isUpperCase, isLowerCase)); fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.FLOWID, isUpperCase, isLowerCase)); fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.VERSION, isUpperCase, isLowerCase)); fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.FLOWTASKID, isUpperCase, isLowerCase)); fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.FLOWSTATE, isUpperCase, isLowerCase)); if (visualTableModel.getLogicalDelete()) {//删除标志字段 fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETEMARK, isUpperCase, isLowerCase)); fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETETIME, isUpperCase, isLowerCase)); fieldList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETEUSERID, isUpperCase, isLowerCase)); } List dbTableList = new ArrayList<>(); //创建子表 for (String key : tableListAll.keySet()) { String tableName = tableName(tableNameList.get(key), isUpperCase, isLowerCase); List datableList = tableListAll.get(key); datableList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.TENANTID, isUpperCase, isLowerCase)); if (visualTableModel.getLogicalDelete()) {//删除标志字段 datableList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETEMARK, isUpperCase, isLowerCase)); datableList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETETIME, isUpperCase, isLowerCase)); datableList.add(ConcurrencyUtils.getDbFieldModel(TableFeildsEnum.DELETEUSERID, isUpperCase, isLowerCase)); } DbTableFieldModel dbTable = this.dbTable(linkId, tableName, datableList, true, fullName); dbTableList.add(dbTable); this.tableModel(tableModelList, datableList, tableName, table, true, tableField, relationField); } this.tableModel(tableModelList, fieldList, table, table, false, tableField, relationField); DbTableFieldModel dbTable = this.dbTable(linkId, table, fieldList, false, fullName); dbTableList.add(dbTable); serviceUtil.createTable(dbTableList); this.fieldsTableName(jsonArray, tableModelList, tableNameList); } catch (DataException e) { e.printStackTrace(); log.error("表新增错误:{}", e.getMessage()); throw new DataException(e.getMessage()); } catch (Exception e) { e.printStackTrace(); log.error("表新增错误:{}", e.getMessage()); throw new WorkFlowException(MsgCode.FM013.get(e.getMessage()), e); } return tableModelList; } /** * 表名 * * @param tableName * @param isUpperCase * @param isLowerCase * @return */ private String tableName(String tableName, boolean isUpperCase, boolean isLowerCase) { String resultName = isUpperCase ? tableName.toUpperCase() : isLowerCase ? tableName.toLowerCase() : tableName; return resultName; } /** * 获取表单字段 * * @param fieLdsModel * @param tableList */ private void fieldList(FieLdsModel fieLdsModel, String table, List tableList) { String vmodel = fieLdsModel.getVModel(); String lable = fieLdsModel.getConfig().getLabel(); String jnpfkey = fieLdsModel.getConfig().getJnpfKey(); fieLdsModel.getConfig().setTableName(table); if (StringUtil.isNotEmpty(vmodel)) { DbFieldModel fieldForm = new DbFieldModel(); fieldForm.setNullSign(DbFieldConst.NULL); fieldForm.setDataType(DtViewConst.VARCHAR); fieldForm.setLength("255"); fieldForm.setIsPrimaryKey(false); if (StringUtil.isNotEmpty(fieLdsModel.getVModel())) { if (JnpfKeyConsts.getTextField().contains(jnpfkey)) { fieldForm.setDataType(DtViewConst.TEXT); } List date = new ArrayList() {{ add(JnpfKeyConsts.MODIFYTIME); add(JnpfKeyConsts.CREATETIME); add(JnpfKeyConsts.DATE); add(JnpfKeyConsts.DATE_CALCULATE); }}; if (date.contains(jnpfkey)) { fieldForm.setDataType(DtViewConst.DATE_TIME); } if (JnpfKeyConsts.NUM_INPUT.equals(jnpfkey) || JnpfKeyConsts.CALCULATE.equals(jnpfkey) || JnpfKeyConsts.SLIDER.equals(jnpfkey)) { fieldForm.setDataType(DtViewConst.DECIMAL); String precision = "15"; if (fieLdsModel.getPrecision() != null) { precision = String.valueOf(fieLdsModel.getPrecision()); } fieldForm.setLength("38," + precision); //mysql 最大长度65,Oracle和postgresql最大长度38,精度0-最大长度内取值,当前系统默认给15最大 } if (JnpfKeyConsts.RATE.equals(jnpfkey)) { fieldForm.setDataType(DtViewConst.DECIMAL); fieldForm.setLength("38,1"); } if (JnpfKeyConsts.LOCATION.equals(jnpfkey)) { fieldForm.setLength("500"); } fieldForm.setField(vmodel); fieldForm.setComment(lable); tableList.add(fieldForm); } } } /** * 创建主外键字段 * * @param tableList * @param isforeign */ private void dbTableField(List tableList, boolean isforeign, int primaryKey, boolean isPostgreOrKingbase, String tableField, String relationField) { //是否自增 true自增 boolean autoPrimaryKey = primaryKey == 2; String dataType = autoPrimaryKey ? isPostgreOrKingbase ? DtViewConst.INT : DtViewConst.BIGINT : DtViewConst.VARCHAR; DbFieldModel tableKey = new DbFieldModel(); tableKey.setNullSign(DbFieldConst.NOT_NULL); tableKey.setDataType(dataType); tableKey.setLength(TableFeildsEnum.FID.getLength()); tableKey.setIsPrimaryKey(true); tableKey.setField(relationField); tableKey.setIsAutoIncrement(autoPrimaryKey); tableKey.setComment(TableFeildsEnum.FID.getComment()); tableList.add(tableKey); if (isforeign) { DbFieldModel tableForeignKey = new DbFieldModel(); tableForeignKey.setNullSign(DbFieldConst.NULL); tableForeignKey.setDataType(dataType); tableForeignKey.setLength(TableFeildsEnum.FOREIGN.getLength()); tableForeignKey.setIsPrimaryKey(false); tableForeignKey.setField(tableField); tableForeignKey.setComment(TableFeildsEnum.FOREIGN.getComment()); tableList.add(tableForeignKey); } } /** * 组装字段list * * @param tableModelList * @param dbtable * @param table * @param mastTable * @param isforeign */ private void tableModel(List tableModelList, List dbtable, String table, String mastTable, boolean isforeign, String tableField, String relationField) { TableModel tableModel = new TableModel(); tableModel.setRelationField(isforeign ? relationField : ""); tableModel.setRelationTable(isforeign ? mastTable : ""); tableModel.setTable(table); tableModel.setComment(isforeign ? "子表" : "主表"); tableModel.setTableField(isforeign ? tableField : ""); tableModel.setTypeId(isforeign ? "0" : "1"); List voList = dbtable.stream().map(DbFieldVO::new).collect(Collectors.toList()); tableModel.setFields(JsonUtil.getJsonToList(voList, TableFields.class)); tableModelList.add(tableModel); } /** * 组装创表字段 * * @param linkId * @param tableName * @param tableFieldList * @param isforeign * @return */ private DbTableFieldModel dbTable(String linkId, String tableName, List tableFieldList, boolean isforeign, String fullName) { DbTableFieldModel dbTable = new DbTableFieldModel(); dbTable.setDbLinkId(linkId); dbTable.setTable(tableName); dbTable.setDbFieldModelList(tableFieldList); String s = isforeign ? "子表" : "主表"; if (fullName.contains("&")) {//自动生成表备注的时候带&符号创建不成功问题 fullName = fullName.replace("&", " "); } dbTable.setComment(String.format("%s-%s", fullName, s)); return dbTable; } }