| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- 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<TableModel> tableModels, Map<String, String> tableNameList) {
- for (int i = 0; i < jsonArray.size(); i++) {
- JSONObject jsonObject = (JSONObject) jsonArray.get(i);
- String jnpfkey = jsonObject.getJSONObject("__config__").getString("jnpfKey");
- List<String> 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<TableModel> 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<TableModel> 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<TableModel> tableList(VisualTableModel visualTableModel) throws Exception {
- JSONArray jsonArray = visualTableModel.getJsonArray();
- List<FormAllModel> formAllModel = visualTableModel.getFormAllModel();
- String table = visualTableModel.getTable();
- String linkId = visualTableModel.getLinkId();
- String fullName = visualTableModel.getFullName();
- int primaryKey = visualTableModel.getPrimaryKey();
- List<TableModel> tableModelList = new LinkedList<>();
- Map<String, String> 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<String> checkNameList = new ArrayList<>();
- checkNameList.add(table);
- try {
- List<DbFieldModel> fieldList = new ArrayList<>();
- Map<String, List<DbFieldModel>> 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<DbFieldModel> tableList = new ArrayList<>();
- String tableModel = fieLdsModel.getTableModel();
- List<FieLdsModel> 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<DbTableFieldModel> dbTableList = new ArrayList<>();
- //创建子表
- for (String key : tableListAll.keySet()) {
- String tableName = tableName(tableNameList.get(key), isUpperCase, isLowerCase);
- List<DbFieldModel> 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<DbFieldModel> 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<String> 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<DbFieldModel> 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<TableModel> tableModelList, List<DbFieldModel> 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<DbFieldVO> 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<DbFieldModel> 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;
- }
- }
|