package jnpf.base.util; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import jnpf.base.UserInfo; import jnpf.base.entity.VisualdevEntity; import jnpf.base.mapper.FlowFormDataMapper; import jnpf.base.model.ColumnDataModel; import jnpf.base.model.VisualConst; import jnpf.base.model.VisualDevJsonModel; import jnpf.base.model.flow.DataModel; import jnpf.base.model.form.ModuleFormModel; import jnpf.config.ConfigValueUtil; import jnpf.constant.MsgCode; import jnpf.database.model.dbtable.JdbcTableModel; import jnpf.database.model.entity.DbLinkEntity; import jnpf.database.util.ConnUtil; import jnpf.database.util.DbTypeUtil; import jnpf.database.util.DynamicDataSourceUtil; import jnpf.database.util.TenantDataSourceUtil; import jnpf.exception.DataException; import jnpf.exception.WorkFlowException; import jnpf.model.visualJson.*; import jnpf.model.visualJson.analysis.*; import jnpf.onlinedev.model.OnlineInfoModel; import jnpf.permission.entity.OrganizeEntity; import jnpf.permission.entity.UserEntity; import jnpf.permissions.PermissionInterfaceImpl; import jnpf.util.*; import jnpf.util.visiual.JnpfKeyConsts; import lombok.Cleanup; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.mybatis.dynamic.sql.AndOrCriteriaGroup; import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.SqlBuilder; import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider; import org.mybatis.dynamic.sql.insert.GeneralInsertDSL; import org.mybatis.dynamic.sql.insert.render.GeneralInsertStatementProvider; import org.mybatis.dynamic.sql.render.RenderingStrategies; import org.mybatis.dynamic.sql.select.QueryExpressionDSL; import org.mybatis.dynamic.sql.select.SelectModel; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.update.UpdateDSL; import org.mybatis.dynamic.sql.update.UpdateModel; import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.sql.Connection; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @Component @Slf4j public class FlowFormDataUtil { @Autowired private ConfigValueUtil configValueUtil; @Autowired private ServiceBaseUtil serviceUtil; @Autowired private FlowFormDataMapper flowFormDataMapper; @Autowired private FormInfoUtils formInfoUtils; @Autowired private VisualBillUtil visualBillUtil; /** * 从数据库取表主键 * * @param conn * @param tableName 表名 * @return */ public String getTableKey(Connection conn, String tableName) throws SQLException { String pKeyName = JdbcTableModel.getPrimaryExculde(conn, tableName, configValueUtil.getMultiTenantColumn()); if (StringUtil.isEmpty(pKeyName)) { pKeyName = TableFeildsEnum.FID.getField(); } String databaseProductName = conn.getMetaData().getDatabaseProductName().trim(); if (DbTypeUtil.needToUpperCase(databaseProductName)) { pKeyName = pKeyName.toUpperCase(); } return pKeyName; } /** * 从配置取主键 * * @param tableModel * @return String */ public String getKey(TableModel tableModel, String databaseProductName) { boolean toUpperCase = false; if (StringUtil.isNotEmpty(databaseProductName)) { if (DbTypeUtil.needToUpperCase(databaseProductName)) { toUpperCase = !toUpperCase; } } String pKeyName = toUpperCase ? TableFeildsEnum.FID.getField().toUpperCase() : TableFeildsEnum.FID.getField(); if (tableModel != null && tableModel.getFields() != null) { TableFields tableFields = tableModel.getFields().stream().filter(t -> Objects.equals(t.getPrimaryKey(), 1) && !t.getField().toLowerCase().contains(TableFeildsEnum.TENANTID.getField())).findFirst().orElse(null); pKeyName = Objects.nonNull(tableFields) ? tableFields.getField() : pKeyName; } return pKeyName; } /** * 获取流程任务id原字段 flowTaskId * * @param tableModel * @param databaseProductName * @return */ public String getFlowTaskId(TableModel tableModel, String databaseProductName) { boolean toUpperCase = false; if (StringUtil.isNotEmpty(databaseProductName)) { if (DbTypeUtil.needToUpperCase(databaseProductName)) { toUpperCase = !toUpperCase; } } String pKeyName = toUpperCase ? TableFeildsEnum.FLOWTASKID.getField().toUpperCase() : TableFeildsEnum.FLOWTASKID.getField(); if (tableModel != null && tableModel.getFields() != null) { TableFields tableFields = tableModel.getFields().stream().filter(t -> t.getField().toLowerCase().contains(TableFeildsEnum.FLOWTASKID.getField())).findFirst().orElse(null); pKeyName = Objects.nonNull(tableFields) ? tableFields.getField() : pKeyName; } return pKeyName; } //---------------------------------------------信息--------------------------------------------- /** * 获取编辑页数据 * * @param visualdevEntity * @param id * @return */ public Map getEditDataInfo(VisualdevEntity visualdevEntity, String id, OnlineInfoModel infoModel) { Map allDataMap = new HashMap<>(); FormDataModel formData = JsonUtil.getJsonToBean(visualdevEntity.getFormData(), FormDataModel.class); Boolean logicalDelete = formData.getLogicalDelete(); //权限参数 ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class); Boolean needP = false; List formPerList = new ArrayList<>(); if (columnDataModel != null && StringUtil.isNotEmpty(infoModel.getMenuId())) { needP = columnDataModel.getUseFormPermission(); Map pMap = PermissionInterfaceImpl.getFormMap(); if (pMap.get(infoModel.getMenuId()) != null) { formPerList = JsonUtil.getJsonToList(pMap.get(infoModel.getMenuId()), ModuleFormModel.class).stream() .map(ModuleFormModel::getEnCode).collect(Collectors.toList()); } } Object mainId = id; boolean autoIncrement = Objects.equals(formData.getPrimaryKeyPolicy(), 2); if (autoIncrement) { mainId = Long.parseLong(id); } //是否开启并发锁 String version = ""; if (formData.getConcurrencyLock()) { //查询 version = TableFeildsEnum.VERSION.getField(); } List list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class); List tableModelList = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class); RecursionForm recursionForm = new RecursionForm(); recursionForm.setList(list); recursionForm.setTableModelList(tableModelList); List formAllModel = new ArrayList<>(); FormCloumnUtil.recursionForm(recursionForm, formAllModel); //form的属性 List mast = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); List table = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); List mastTable = formAllModel.stream().filter(t -> FormEnum.mastTable.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); TableModel mainTable = tableModelList.stream().filter(t -> t.getTypeId().equals("1")).findFirst().orElse(null); DbLinkEntity linkEntity = serviceUtil.getDbLink(visualdevEntity.getDbLinkId()); try { DynamicDataSourceUtil.switchToDataSource(linkEntity); @Cleanup Connection conn = ConnUtil.getConnOrDefault(linkEntity); String dbType = conn.getMetaData().getDatabaseProductName(); String pKeyName = this.getKey(mainTable, dbType); SqlTable mainSqlTable = SqlTable.of(mainTable.getTable()); String flowTaskId = this.getFlowTaskId(mainTable, dbType); List groupList = new ArrayList<>(); groupList.add(SqlBuilder.or(mainSqlTable.column(flowTaskId), SqlBuilder.isEqualTo(mainId.toString()))); SelectStatementProvider render = SqlBuilder.select(mainSqlTable.allColumns()) .from(mainSqlTable) .where(mainSqlTable.column(pKeyName), SqlBuilder.isEqualTo(mainId), groupList) .build().render(RenderingStrategies.MYBATIS3); Map mainAllMap = Optional.ofNullable(flowFormDataMapper.selectOneMappedRow(render)).orElse(new HashMap<>()); if (mainAllMap.size() == 0) { return new HashMap<>(); } //主表 List mainTableFields = mast.stream().filter(m -> StringUtil.isNotEmpty(m.getFormColumnModel().getFieLdsModel().getVModel())) .map(s -> s.getFormColumnModel().getFieLdsModel().getVModel()).collect(Collectors.toList()); //开启权限移除字段 if (needP) { if (CollectionUtils.isEmpty(formPerList)) { mainTableFields = Collections.EMPTY_LIST; } else { List newList = new ArrayList<>(); for (String item : mainTableFields) { if (formPerList.contains(item)) { newList.add(item); } } mainTableFields = newList; } } if (StringUtil.isNotEmpty(version)) { mainTableFields.add(version); } mainTableFields.add(pKeyName); mainTableFields.add(flowTaskId); List mainTableBasicColumn = mainTableFields.stream().map(m -> SqlTable.of(mainTable.getTable()).column(m)).collect(Collectors.toList()); SelectStatementProvider mainRender = SqlBuilder.select(mainTableBasicColumn) .from(mainSqlTable) .where(mainSqlTable.column(pKeyName), SqlBuilder.isEqualTo(mainId), groupList) .build().render(RenderingStrategies.MYBATIS3); Map mainMap = flowFormDataMapper.selectOneMappedRow(mainRender); if (ObjectUtil.isNotEmpty(mainMap)) { //转换主表里的数据 List mainFieldList = mast.stream().filter(m -> StringUtil.isNotEmpty(m.getFormColumnModel().getFieLdsModel().getVModel())) .map(t -> t.getFormColumnModel().getFieLdsModel()).collect(Collectors.toList()); mainMap = formInfoUtils.swapDataInfoType(mainFieldList, mainMap); allDataMap.putAll(mainMap); allDataMap.put(FlowFormConstant.FLOWTASKID, mainMap.get(flowTaskId)); } //副表 Map> groupByTableNames = mastTable.stream().map(mt -> mt.getFormMastTableModel()).collect(Collectors.groupingBy(ma -> ma.getTable())); Iterator>> entryIterator = groupByTableNames.entrySet().iterator(); while (entryIterator.hasNext()) { Map.Entry> next = entryIterator.next(); String childTableName = next.getKey(); List childMastTableList = next.getValue(); //开启权限移除字段 if (needP) { if (CollectionUtils.isEmpty(formPerList)) { childMastTableList = Collections.EMPTY_LIST; } else { List newList = new ArrayList<>(); for (FormMastTableModel item : childMastTableList) { if (formPerList.contains(item.getVModel())) { newList.add(item); } } childMastTableList = newList; } } TableModel childTableModel = tableModelList.stream().filter(t -> t.getTable().equals(childTableName)).findFirst().orElse(null); SqlTable mastSqlTable = SqlTable.of(childTableName); List mastTableBasicColumn = childMastTableList.stream().filter(m -> StringUtil.isNotEmpty(m.getField())) .map(m -> mastSqlTable.column(m.getField())).collect(Collectors.toList()); //添加副表关联字段,不然数据会空没有字段名称 mastTableBasicColumn.add(mastSqlTable.column(childTableModel.getTableField())); //主表主键 String mainField = childTableModel.getRelationField(); Object mainValue = new CaseInsensitiveMap(mainAllMap).get(mainField); //子表外键 String childFoIdFiled = childTableModel.getTableField(); //外键字段是否varchar转换 TableFields fogIdField = childTableModel.getFields().stream().filter(t -> t.getField().equals(childFoIdFiled)).findFirst().orElse(null); boolean fogIdTypeString = Objects.nonNull(fogIdField) ? fogIdField.getDataType().toLowerCase().contains("varchar") : false; if (fogIdTypeString) { mainValue = mainValue.toString(); } QueryExpressionDSL.QueryExpressionWhereBuilder mastWhere = SqlBuilder.select(mastTableBasicColumn).from(mastSqlTable).where(); mastWhere.and(mastSqlTable.column(childFoIdFiled), SqlBuilder.isEqualTo(mainValue)); //逻辑删除不展示 if (logicalDelete) { mastWhere.and(mastSqlTable.column(TableFeildsEnum.DELETEMARK.getField()), SqlBuilder.isNull()); } SelectStatementProvider mastRender = mastWhere.build().render(RenderingStrategies.MYBATIS3); List> childMapList = flowFormDataMapper.selectManyMappedRows(mastRender); if (CollectionUtils.isNotEmpty(childMapList)) { Map soloDataMap = childMapList.get(0); Map renameKeyMap = new HashMap<>(); for (Map.Entry entry : soloDataMap.entrySet()) { FormMastTableModel model = childMastTableList.stream().filter(child -> child.getField().equalsIgnoreCase(String.valueOf(entry.getKey()))).findFirst().orElse(null); if (model != null) renameKeyMap.put(model.getVModel(), entry.getValue()); } List columnChildFields = childMastTableList.stream().map(cl -> cl.getMastTable().getFieLdsModel()).collect(Collectors.toList()); renameKeyMap = formInfoUtils.swapDataInfoType(columnChildFields, renameKeyMap); allDataMap.putAll(renameKeyMap); } } //设计子表 Boolean finalNeedP = needP; List finalFormPerList = formPerList; table.stream().map(t -> t.getChildList()).forEach( t1 -> { try { String childTableName = t1.getTableName(); TableModel tableModel = tableModelList.stream().filter(tm -> tm.getTable().equals(childTableName)).findFirst().orElse(null); SqlTable childSqlTable = SqlTable.of(childTableName); List chilFieldList = t1.getChildList().stream().filter(t2 -> StringUtil.isNotEmpty(t2.getFieLdsModel().getVModel())).collect(Collectors.toList()); String tableModelName = t1.getTableModel(); //开启权限移除字段 if (finalNeedP) { if (CollectionUtils.isEmpty(finalFormPerList)) { chilFieldList = Collections.EMPTY_LIST; } else { List newList = new ArrayList<>(); for (FormColumnModel item : chilFieldList) { if (finalFormPerList.contains(tableModelName + "-" + item.getFieLdsModel().getVModel())) { newList.add(item); } } chilFieldList = newList; } } List childFields = chilFieldList.stream().map(t2 -> childSqlTable.column(t2.getFieLdsModel().getVModel())).collect(Collectors.toList()); childFields.add(childSqlTable.column(tableModel.getTableField())); String childKeyName = this.getKey(tableModel, dbType); childFields.add(childSqlTable.column(childKeyName)); //主表主键 String mainField = tableModel.getRelationField(); Object mainValue = new CaseInsensitiveMap(mainAllMap).get(mainField); //子表外键 String childFoIdFiled = tableModel.getTableField(); TableFields fogIdField = tableModel.getFields().stream().filter(t -> t.getField().equals(childFoIdFiled)).findFirst().orElse(null); if (VisualConst.DB_INT_ALL.contains(fogIdField.getField().toLowerCase())) { mainValue = Long.parseLong(String.valueOf(mainValue)); } QueryExpressionDSL.QueryExpressionWhereBuilder childWhere = SqlBuilder.select(childFields).from(childSqlTable).where(); childWhere.and(childSqlTable.column(childFoIdFiled), SqlBuilder.isEqualTo(mainValue)); //逻辑删除不展示 if (logicalDelete) { childWhere.and(childSqlTable.column(TableFeildsEnum.DELETEMARK.getField()), SqlBuilder.isNull()); } SelectStatementProvider childRender = childWhere.build().render(RenderingStrategies.MYBATIS3); List> childMapList = flowFormDataMapper.selectManyMappedRows(childRender); if (ObjectUtil.isNotEmpty(childMapList)) { List childFieldModels = t1.getChildList().stream().map(t2 -> t2.getFieLdsModel()).collect(Collectors.toList()); childMapList = childMapList.stream().map(c1 -> { try { return formInfoUtils.swapDataInfoType(childFieldModels, c1); } catch (Exception e) { e.printStackTrace(); } return c1; }).collect(Collectors.toList()); Map childMap = new HashMap<>(1); childMap.put(t1.getTableModel(), childMapList); allDataMap.putAll(childMap); } } catch (Exception e) { e.printStackTrace(); } } ); for (String key : allDataMap.keySet()) { if (pKeyName.equalsIgnoreCase(key)) { allDataMap.put("id", allDataMap.get(key)); break; } } } catch (Exception e) { e.printStackTrace(); } finally { DynamicDataSourceUtil.clearSwitchDataSource(); } return allDataMap; } //---------------------------------------------新增--------------------------------------------- /** * 新增数据处理 **/ @DSTransactional public Map create(DataModel dataModel) throws WorkFlowException { try { //处理好的数据 Map result = this.createDataList(dataModel); return result; } catch (DataException dataException) { throw new WorkFlowException(dataException.getMessage()); } catch (Exception e) { //close e.printStackTrace(); log.error("新增异常:{}", e.getMessage()); throw new WorkFlowException(MsgCode.FA028.get(), e.getMessage()); } } /** * 新增数据 **/ public Map createDataList(DataModel dataModel) throws SQLException, DataException { //处理好的数据 Map result = new HashMap<>(16); List tableModelList = dataModel.getTableModelList(); List formAllModel = dataModel.getFormAllModel(); //有表数据处理 if (tableModelList.size() > 0) { DbLinkEntity link = dataModel.getLink(); DynamicDataSourceUtil.switchToDataSource(link); try { @Cleanup Connection conn = ConnUtil.getConnOrDefault(link); String dbType = conn.getMetaData().getDatabaseProductName().trim(); dataModel.setDbType(dbType); //主表 this.createMast(formAllModel, dataModel, result); //子表 this.createTable(formAllModel, dataModel, result); //副表 this.createMastTable(formAllModel, dataModel, result); } finally { DynamicDataSourceUtil.clearSwitchDataSource(); } } else { //无表数据处理 result = this.createAll(dataModel, formAllModel); } return result; } /** * 子表数据 **/ private void createTable(List formAllModel, DataModel dataModel, Map result) throws SQLException { List tableModelList = dataModel.getTableModelList(); Map dataNewMap = dataModel.getDataNewMap(); boolean autoIncrement = Objects.equals(dataModel.getPrimaryKeyPolicy(), 2); String flowId = ""; if (dataNewMap.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(dataNewMap.get(FlowFormConstant.FLOWID).toString())) { flowId = dataNewMap.get(FlowFormConstant.FLOWID).toString(); } UserEntity userEntity = dataModel.getUserEntity(); //子表 List tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); for (FormAllModel itemModel : tableForm) { FormColumnTableModel childModel = itemModel.getChildList(); if (childModel.getDisabled()) continue; String key = childModel.getTableModel(); String tableName = childModel.getTableName(); //子表数据 List> chidList = dataNewMap.get(key) != null ? (List>) dataNewMap.get(key) : new ArrayList<>(); List formColumnModels = childModel.getChildList().stream().filter(g -> StringUtil.isNotEmpty(g.getFieLdsModel().getVModel())).collect(Collectors.toList()); // if (CollectionUtils.isEmpty(formColumnModels)) continue; if (Objects.equals(childModel.getIsNumLimit(), true) && chidList.size() > childModel.getNumLimit()) { throw new DataException(MsgCode.VS033.get(childModel.getLabel())); } //子表主键 TableModel tableModel = tableModelList.stream().filter(k -> k.getTable().equals(tableName)).findFirst().orElse(null); String table = tableModel.getTable(); //子表主键 String childKeyName = this.getKey(tableModel, dataModel.getDbType()); //子表外键字段 String foreignKey = tableModel.getTableField(); TableFields foreignField = tableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(foreignKey)).findFirst().orElse(null); if (foreignField == null) { throw new SQLException(MsgCode.COD001.get()); } //主表关联字段 Object foreignValue = dataNewMap.get(tableModel.getRelationField()); if (VisualConst.DB_INT_ALL.contains(foreignField.getDataType())) { foreignValue = Long.parseLong(String.valueOf(foreignValue)); } SqlTable sqlTable = SqlTable.of(table); for (Map objectMap : chidList) { if (StringUtil.isNotEmpty(flowId)) { objectMap.put(FlowFormConstant.FLOWID, flowId); } GeneralInsertDSL generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(foreignKey)).toValue(foreignValue); for (FormColumnModel column : formColumnModels) { FieLdsModel fieLdsModel = column.getFieLdsModel(); String childKey = fieLdsModel.getVModel(); //表单字段和外键字段重复不写入(写入外键值) if (Objects.equals(foreignKey, childKey)) { continue; } Object data = objectMap.get(childKey); String fieldKey = fieLdsModel.getConfig().getParentVModel() + "-" + childKey; //流程表单权限 if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) { boolean hasOperate = isHasOperate(dataModel, fieldKey); if (!hasOperate) { continue; } } else if (dataModel.getNeedPermission()) { if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) { if (!dataModel.getFormPerList().contains(fieldKey)) { continue; } } else { continue; } } //处理系统自动生成 data = this.create(fieLdsModel, data, true, userEntity, dataModel.isLinkOpen()); data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, objectMap, data); getDSL(sqlTable, null, generalInsertDSL, fieLdsModel.getFormat(), childKey, data); } if (!autoIncrement) { generalInsertDSL = generalInsertDSL.set(sqlTable.column(childKeyName)).toValue(RandomUtil.uuId()); } //租户信息 addTenantId(generalInsertDSL, sqlTable); GeneralInsertStatementProvider insertRender = generalInsertDSL.build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.generalInsert(insertRender); } } } /** * 副表数据 **/ private void createMastTable(List formAllModel, DataModel dataModel, Map result) throws SQLException { List tableModelList = dataModel.getTableModelList(); Map dataNewMap = dataModel.getDataNewMap(); Integer primaryKeyPolicy = dataModel.getPrimaryKeyPolicy(); UserEntity userEntity = dataModel.getUserEntity(); //副表 Map> mastTableAll = formAllModel.stream().filter(t -> FormEnum.mastTable.getMessage().equals(t.getJnpfKey())).collect(Collectors.groupingBy(e -> e.getFormMastTableModel().getTable())); for (String key : mastTableAll.keySet()) { Optional first = tableModelList.stream().filter(t -> t.getTable().equals(key)).findFirst(); if (!first.isPresent()) { throw new SQLException(MsgCode.COD001.get()); } TableModel tableModel = first.get(); String tableModelTable = tableModel.getTable(); String childKeyName = this.getKey(tableModel, dataModel.getDbType()); //副表外键字段 String foreignKey = tableModel.getTableField(); TableFields foreignField = tableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(foreignKey)).findFirst().orElse(null); if (foreignField == null) { throw new SQLException(MsgCode.COD001.get()); } //主表关联字段 Object foreignValue = dataNewMap.get(tableModel.getRelationField()); if (VisualConst.DB_INT_ALL.contains(foreignField.getDataType())) { foreignValue = Long.parseLong(String.valueOf(foreignValue)); } List masTableList = mastTableAll.get(key); SqlTable sqlTable = SqlTable.of(tableModelTable); GeneralInsertDSL generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(foreignKey)).toValue(foreignValue); for (FormAllModel model : masTableList) { FormMastTableModel formMastTableModel = model.getFormMastTableModel(); FormColumnModel mastTable = formMastTableModel.getMastTable(); FieLdsModel fieLdsModel = mastTable.getFieLdsModel(); String mostTableKey = fieLdsModel.getVModel(); String field = formMastTableModel.getField(); //表单字段和外键字段重复不写入(写入外键值) if (StringUtil.isEmpty(mostTableKey) || Objects.equals(foreignKey, field)) { continue; } Object data = dataNewMap.get(mostTableKey); //流程表单权限 if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) { boolean hasOperate = isHasOperate(dataModel, mostTableKey); if (!hasOperate) { continue; } } else if (dataModel.getNeedPermission()) { if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) { if (!dataModel.getFormPerList().contains(mostTableKey)) { continue; } } else { continue; } } //处理系统自动生成 data = this.create(fieLdsModel, data, true, userEntity, dataModel.isLinkOpen()); data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, dataNewMap, data); //返回值 result.put(mostTableKey, data); getDSL(sqlTable, null, generalInsertDSL, fieLdsModel.getFormat(), field, data); } //sql主键 if (primaryKeyPolicy == 1) { generalInsertDSL = generalInsertDSL.set(sqlTable.column(childKeyName)).toValue(RandomUtil.uuId()); } //租户信息 addTenantId(generalInsertDSL, sqlTable); GeneralInsertStatementProvider insertRender = generalInsertDSL.build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.generalInsert(insertRender); } } /** * 主表数据 **/ private void createMast(List formAllModel, DataModel dataModel, Map result) throws SQLException { List tableModelList = dataModel.getTableModelList(); Map dataNewMap = dataModel.getDataNewMap(); Object mainId = dataModel.getMainId(); boolean autoIncrement = Objects.equals(dataModel.getPrimaryKeyPolicy(), 2); if (autoIncrement) { mainId = Long.parseLong(dataModel.getMainId()); } UserEntity userEntity = dataModel.getUserEntity(); Optional first = tableModelList.stream().filter(t -> "1".equals(t.getTypeId())).findFirst(); if (!first.isPresent()) { throw new SQLException(MsgCode.COD001.get()); } TableModel tableModel = first.get(); String mastTableName = tableModel.getTable(); List mastForm = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).filter(t -> StringUtil.isNotEmpty(t.getFormColumnModel().getFieLdsModel().getVModel())).collect(Collectors.toList()); //新增字段 String keyName = this.getKey(tableModel, dataModel.getDbType()); SqlTable sqlTable = SqlTable.of(mastTableName); String flowTaskId = this.getFlowTaskId(tableModel, dataModel.getDbType()); GeneralInsertDSL generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(keyName)).toValue(mainId) .set(sqlTable.column(flowTaskId)).toValue(mainId.toString()); if (autoIncrement) { generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(flowTaskId)).toValue(mainId.toString()); } for (FormAllModel model : mastForm) { FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel(); String field = fieLdsModel.getVModel(); Object data = dataNewMap.get(field); data = data instanceof List ? JsonUtil.getObjectToString(data) : data; //流程表单权限 if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) { boolean hasOperate = isHasOperate(dataModel, field); if (!hasOperate) { continue; } } else if (dataModel.getNeedPermission()) { if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) { if (!dataModel.getFormPerList().contains(field)) { continue; } } else { continue; } } //处理系统自动生成 data = this.create(fieLdsModel, data, true, userEntity, dataModel.isLinkOpen()); data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, dataNewMap, data); if (JnpfKeyConsts.BILLRULE.equals(fieLdsModel.getConfig().getJnpfKey())) dataNewMap.put(field, data); getDSL(sqlTable, null, generalInsertDSL, fieLdsModel.getFormat(), field, data); } //判断是否开启锁 if (dataModel.getConcurrencyLock()) { generalInsertDSL = generalInsertDSL.set(sqlTable.column(TableFeildsEnum.VERSION.getField())).toValue(dataNewMap.get(TableFeildsEnum.VERSION.getField())); } //添加流程引擎信息 if (dataNewMap.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(dataNewMap.get(FlowFormConstant.FLOWID).toString())) { generalInsertDSL = generalInsertDSL.set(sqlTable.column(TableFeildsEnum.FLOWID.getField())).toValue(dataNewMap.get(FlowFormConstant.FLOWID)); } //租户信息 addTenantId(generalInsertDSL, sqlTable); GeneralInsertStatementProvider insertRender = generalInsertDSL.build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.generalInsert(insertRender); //设置实际主键id getRealMainId(dataModel, tableModel, keyName, autoIncrement, mastTableName, mainId); dataNewMap.put(keyName, dataModel.getMainId()); } /** * 获取实际主键id * * @param dataModel * @param realIdKey 主表主键 * @param autoIncrement 自增设置id * @param mastTableName * @throws SQLException */ private void getRealMainId(DataModel dataModel, TableModel tableModel, String realIdKey, boolean autoIncrement, String mastTableName, Object flowTaskId) { if (autoIncrement) { String flowTaskKey = this.getFlowTaskId(tableModel, dataModel.getDbType()); List mastFile = new ArrayList<>(); mastFile.add(flowTaskKey); mastFile.add(realIdKey); SqlTable mastSqlTable = SqlTable.of(mastTableName); SelectStatementProvider mastRender = SqlBuilder.select(mastFile.stream().map(m -> mastSqlTable.column(m)).collect(Collectors.toList())) .from(mastSqlTable) .where(mastSqlTable.column(flowTaskKey), SqlBuilder.isEqualTo(flowTaskId.toString())) .build().render(RenderingStrategies.MYBATIS3); Map map = flowFormDataMapper.selectOneMappedRow(mastRender); dataModel.setMainId(map.get(realIdKey) != null ? map.get(realIdKey).toString() : dataModel.getMainId()); } } /** * 新增系统赋值 **/ private Object create(FieLdsModel fieLdsModel, Object dataValue, boolean isTable, UserEntity userEntity, boolean isLink) { UserInfo user = UserProvider.getUser(); String jnpfKey = fieLdsModel.getConfig().getJnpfKey(); String rule = fieLdsModel.getConfig().getRule(); String format = DateTimeFormatConstant.getFormat(fieLdsModel.getFormat()); Object value = dataValue; //外链跳过系统参数生成 if (isLink) { List systemAttList = new ArrayList<>(); systemAttList.add(JnpfKeyConsts.CREATEUSER); systemAttList.add(JnpfKeyConsts.CURRORGANIZE); systemAttList.add(JnpfKeyConsts.CURRPOSITION); systemAttList.add(JnpfKeyConsts.CURRDEPT); systemAttList.add(JnpfKeyConsts.MODIFYUSER); if (systemAttList.contains(jnpfKey)) { return null; } } switch (jnpfKey) { case JnpfKeyConsts.CREATEUSER: value = userEntity.getId(); break; case JnpfKeyConsts.CREATETIME: value = new Date(); break; case JnpfKeyConsts.CURRORGANIZE: case JnpfKeyConsts.CURRDEPT: if (user != null && CollectionUtil.isNotEmpty(user.getOrganizeIds())) { value = JsonUtil.getObjectToString(user.getOrganizeIds()); } break; case JnpfKeyConsts.MODIFYTIME: value = null; break; case JnpfKeyConsts.MODIFYUSER: value = null; break; case JnpfKeyConsts.CURRPOSITION: if (user != null && CollectionUtil.isNotEmpty(user.getPositionIds())) { value = JsonUtil.getObjectToString(user.getPositionIds()); } break; case JnpfKeyConsts.BILLRULE: if (fieLdsModel.getConfig().getRuleType() == null || Objects.equals(fieLdsModel.getConfig().getRuleType(), 1)) { try { value = serviceUtil.getBillNumber(rule); } catch (Exception e) { value = null; } } break; case JnpfKeyConsts.DATE: case JnpfKeyConsts.DATE_CALCULATE: if (isTable) { try { if (dataValue == null || "".equals(dataValue)) { return null; } if (dataValue instanceof String) { try { SimpleDateFormat formatter = new SimpleDateFormat(format); value = formatter.parse(dataValue.toString()); } catch (ParseException var3) { return null; } } else { value = new Date(Long.valueOf(String.valueOf(dataValue))); } } catch (Exception e) { } } break; case JnpfKeyConsts.NUM_INPUT: case JnpfKeyConsts.CALCULATE: if (isTable) { try { value = new BigDecimal(String.valueOf(dataValue)); } catch (Exception e) { } } break; default: if (isTable) { value = this.valueToNull(value); } break; } return value; } /** * 无表插入数据 **/ private Map createAll(DataModel dataModel, List formAllModel) { Map dataNewMap = dataModel.getDataNewMap(); UserEntity userEntity = dataModel.getUserEntity(); //处理好的数据 Map result = new HashMap<>(16); List mastForm = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); List tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); for (String key : dataNewMap.keySet()) { FormAllModel model = mastForm.stream().filter(t -> key.equals(t.getFormColumnModel().getFieLdsModel().getVModel())).findFirst().orElse(null); if (model != null) { FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel(); Object data = dataNewMap.get(key); //处理系统自动生成 data = this.create(fieLdsModel, data, false, userEntity, dataModel.isLinkOpen()); result.put(key, data); } else { FormAllModel childModel = tableForm.stream().filter(t -> key.equals(t.getChildList().getTableModel())).findFirst().orElse(null); if (childModel != null) { //子表主键 List childList = childModel.getChildList().getChildList(); List> childDataMap = (List>) dataNewMap.get(key); //子表处理的数据 List> childResult = new ArrayList<>(); for (Map objectMap : childDataMap) { //子表单体处理的数据 Map childOneResult = new HashMap<>(16); for (String childKey : objectMap.keySet()) { FormColumnModel columnModel = childList.stream().filter(t -> childKey.equals(t.getFieLdsModel().getVModel())).findFirst().orElse(null); if (columnModel != null) { FieLdsModel fieLdsModel = columnModel.getFieLdsModel(); Object data = objectMap.get(childKey); //处理系统自动生成 data = this.create(fieLdsModel, data, false, userEntity, dataModel.isLinkOpen()); childOneResult.put(childKey, data); } } childResult.add(childOneResult); } result.put(key, childResult); } } } return result; } //--------------------------------------------修改 ---------------------------------------------------- /** * 修改数据处理 **/ @DSTransactional public Map update(DataModel dataModel) throws WorkFlowException { try { //处理好的数据 Map result = this.updateDataList(dataModel); return result; } catch (DataException dataException) { throw new WorkFlowException(dataException.getMessage()); } catch (Exception e) { //close e.printStackTrace(); log.error("修改异常:{}", e.getMessage()); throw new WorkFlowException(MsgCode.FA029.get(), e.getMessage()); } } /** * 修改数据 **/ public Map updateDataList(DataModel dataModel) throws SQLException, DataException { //处理好的数据 Map result = new HashMap<>(16); List tableModelList = dataModel.getTableModelList(); List formAllModel = dataModel.getFormAllModel(); //有表数据处理 if (tableModelList.size() > 0) { DbLinkEntity link = dataModel.getLink(); DynamicDataSourceUtil.switchToDataSource(link); try { //系统数据 @Cleanup Connection conn = ConnUtil.getConnOrDefault(link); String dbType = conn.getMetaData().getDatabaseProductName().trim(); dataModel.setDbType(dbType); conn.setAutoCommit(false); //主表 this.updateMast(formAllModel, dataModel, conn, result); //子表 this.updateTable(formAllModel, dataModel, conn, result); //副表 this.updateMastTable(formAllModel, dataModel, conn, result); } finally { DynamicDataSourceUtil.clearSwitchDataSource(); } } else { //无表数据处理 result = this.updateAll(dataModel, formAllModel); } return result; } /** * 子表数据 **/ private void updateTable(List formAllModel, DataModel dataModel, Connection conn, Map result) throws SQLException { Boolean onlyUpdate = dataModel.getOnlyUpdate(); Boolean logicalDelete = dataModel.getLogicalDelete(); List tableModelList = dataModel.getTableModelList(); Map dataNewMap = dataModel.getDataNewMap(); Map oldMainData = dataModel.getOldMainData(); if (MapUtils.isEmpty(oldMainData)) { return; } boolean autoIncrement = Objects.equals(dataModel.getPrimaryKeyPolicy(), 2); String flowId = ""; if (dataNewMap.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(dataNewMap.get(FlowFormConstant.FLOWID).toString())) { flowId = dataNewMap.get(FlowFormConstant.FLOWID).toString(); } //子表 List tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); for (FormAllModel itemModel : tableForm) { FormColumnTableModel childModel = itemModel.getChildList(); if (childModel.getDisabled()) continue; String key = childModel.getTableModel(); String tableName = childModel.getTableName(); //子表数据 List> chidList = dataNewMap.get(key) != null ? (List>) dataNewMap.get(key) : new ArrayList<>(); List formColumnModels = childModel.getChildList().stream().filter(g -> StringUtil.isNotEmpty(g.getFieLdsModel().getVModel())).collect(Collectors.toList()); // if (CollectionUtils.isEmpty(formColumnModels)) continue; if (Objects.equals(childModel.getIsNumLimit(), true) && chidList.size() > childModel.getNumLimit()) { throw new DataException(MsgCode.VS033.get(childModel.getLabel())); } //子表主键 TableModel tableModel = tableModelList.stream().filter(k -> k.getTable().equals(tableName)).findFirst().orElse(null); String table = tableModel.getTable(); SqlTable sqlTable = SqlTable.of(table); String childPrimary = this.getKey(tableModel, dataModel.getDbType()); //子表表外键字段 String foreignKey = tableModel.getTableField(); TableFields foreignField = tableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(foreignKey)).findFirst().orElse(null); if (foreignField == null) { throw new SQLException(MsgCode.COD001.get()); } //主表关联字段 Object foreignValue = dataNewMap.get(tableModel.getRelationField()); Object oldForeignValue = oldMainData.get(tableModel.getRelationField()); if (VisualConst.DB_INT_ALL.contains(foreignField.getDataType())) { foreignValue = Long.parseLong(String.valueOf(foreignValue)); oldForeignValue = Long.parseLong(String.valueOf(oldForeignValue)); } //查询旧的子表数据 SelectStatementProvider render = SqlBuilder.select(sqlTable.column(childPrimary)) .from(sqlTable) .where(sqlTable.column(foreignKey), SqlBuilder.isEqualTo(oldForeignValue)) .build().render(RenderingStrategies.MYBATIS3); List childIdList = flowFormDataMapper.selectManyMappedRows(render).stream().map(t -> new CaseInsensitiveMap(t).get(childPrimary)).collect(Collectors.toList()); List formDataIdList = chidList.stream().filter(t -> new CaseInsensitiveMap(t).containsKey(childPrimary)).map(t -> new CaseInsensitiveMap(t).get(childPrimary)).collect(Collectors.toList()); List deleteList = childIdList.stream().filter(t -> { List jsonToList = JsonUtil.getJsonToList(formDataIdList, String.class); if (!jsonToList.contains(String.valueOf(t))) { return true; } return false; }).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(deleteList) && !onlyUpdate) {//删除子表id数据 //是否开启逻辑删除 if (logicalDelete) { UpdateDSL updateModelUpdateDSL = SqlBuilder.update(sqlTable); updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.DELETEMARK.getField())).equalTo(1); updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.DELETETIME.getField())).equalTo(new Date()); updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.DELETEUSERID.getField())).equalTo(UserProvider.getUser().getUserId()); UpdateStatementProvider updateRender = updateModelUpdateDSL .where(sqlTable.column(childPrimary), SqlBuilder.isIn(deleteList)) .build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.update(updateRender); } else { DeleteStatementProvider deleteRender = SqlBuilder.deleteFrom(sqlTable) .where(sqlTable.column(childPrimary), SqlBuilder.isIn(deleteList)) .build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.delete(deleteRender); } } for (Map objectMap : chidList) { objectMap = new CaseInsensitiveMap(objectMap); boolean isUpdate = false; if (CollectionUtil.isNotEmpty(childIdList)) { List jsonToList = JsonUtil.getJsonToList(childIdList, String.class); if (objectMap.get(childPrimary) != null && jsonToList.contains(String.valueOf(objectMap.get(childPrimary)))) { isUpdate = true; } } if (StringUtil.isNotEmpty(flowId)) { objectMap.put(FlowFormConstant.FLOWID, flowId); } GeneralInsertDSL generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(foreignKey)).toValue(foreignValue); UpdateDSL updateModelUpdateDSL = SqlBuilder.update(sqlTable).set(sqlTable.column(foreignKey)).equalTo(foreignValue); for (FormColumnModel column : formColumnModels) { FieLdsModel fieLdsModel = column.getFieLdsModel(); String childKey = fieLdsModel.getVModel(); String jnpfkey = fieLdsModel.getConfig().getJnpfKey(); Object data = objectMap.get(childKey); String fieldKey = fieLdsModel.getConfig().getParentVModel() + "-" + childKey; if (foreignKey.equalsIgnoreCase(childKey)) { continue; } //流程表单权限 if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) { boolean hasOperate = isHasOperate(dataModel, fieldKey); if (!hasOperate) { continue; } } else if (dataModel.getNeedPermission()) { if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) { if (!dataModel.getFormPerList().contains(fieldKey)) { continue; } } else { continue; } } if (isUpdate) { if (JnpfKeyConsts.CURRORGANIZE.equals(jnpfkey) || JnpfKeyConsts.CURRPOSITION.equals(jnpfkey) || JnpfKeyConsts.CREATETIME.equals(jnpfkey) || JnpfKeyConsts.CREATEUSER.equals(jnpfkey)) { continue; } } else { if (JnpfKeyConsts.MODIFYUSER.equals(jnpfkey) || JnpfKeyConsts.MODIFYTIME.equals(jnpfkey)) { continue; } } //处理系统自动生成 data = this.update(fieLdsModel, data, true, objectMap.get(childPrimary) == null); data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, objectMap, data); getDSL(sqlTable, null, generalInsertDSL, fieLdsModel.getFormat(), childKey, data); getDSL(sqlTable, updateModelUpdateDSL, null, fieLdsModel.getFormat(), childKey, data); } if (isUpdate) {//修改 updateModelUpdateDSL.where(sqlTable.column(childPrimary), SqlBuilder.isEqualTo(objectMap.get(childPrimary))); UpdateStatementProvider render1 = updateModelUpdateDSL.build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.update(render1); } else {//新增 //添加主键值和外键值 if (!autoIncrement) { generalInsertDSL = generalInsertDSL.set(sqlTable.column(childPrimary)).toValue(RandomUtil.uuId()); } //租户信息 addTenantId(generalInsertDSL, sqlTable); GeneralInsertStatementProvider insertRender = generalInsertDSL.build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.generalInsert(insertRender); } } } } /** * 副表数据 **/ private void updateMastTable(List formAllModel, DataModel dataModel, Connection conn, Map result) throws SQLException { List tableModelList = dataModel.getTableModelList(); Map dataNewMap = dataModel.getDataNewMap(); Map oldMainData = dataModel.getOldMainData(); if (MapUtils.isEmpty(oldMainData)) { return; } //副表 Map> mastTableAll = formAllModel.stream().filter(t -> FormEnum.mastTable.getMessage().equals(t.getJnpfKey())).collect(Collectors.groupingBy(e -> e.getFormMastTableModel().getTable())); for (String key : mastTableAll.keySet()) { List masTableList = mastTableAll.get(key); //副表 Optional first = tableModelList.stream().filter(t -> t.getTable().equals(key)).findFirst(); if (!first.isPresent()) { throw new SQLException(MsgCode.COD001.get()); } TableModel tableModel = first.get(); String tableModelTable = tableModel.getTable(); SqlTable sqlTable = SqlTable.of(tableModelTable); String childKeyName = this.getKey(tableModel, dataModel.getDbType()); //副表外键字段 String foreignKey = tableModel.getTableField(); TableFields foreignField = tableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(foreignKey)).findFirst().orElse(null); if (foreignField == null) { throw new SQLException(MsgCode.COD001.get()); } //主表关联字段 Object foreignValue = dataNewMap.get(tableModel.getRelationField()); Object oldForeignValue = oldMainData.get(tableModel.getRelationField()); if (VisualConst.DB_INT_ALL.contains(foreignField.getDataType())) { foreignValue = Long.parseLong(String.valueOf(foreignValue)); oldForeignValue = Long.parseLong(String.valueOf(oldForeignValue)); } UpdateDSL updateModelUpdateDSL = SqlBuilder.update(sqlTable).set(sqlTable.column(foreignKey)).equalTo(foreignValue); for (FormAllModel model : masTableList) { FormMastTableModel formMastTableModel = model.getFormMastTableModel(); FormColumnModel mastTable = formMastTableModel.getMastTable(); FieLdsModel fieLdsModel = mastTable.getFieLdsModel(); String mostTableKey = fieLdsModel.getVModel(); String jnpfkey = fieLdsModel.getConfig().getJnpfKey(); Object data = dataNewMap.get(mostTableKey); String field = formMastTableModel.getField(); //外键值写入不覆盖 if (foreignKey.equalsIgnoreCase(field)) { continue; } //流程表单权限 if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) { boolean hasOperate = isHasOperate(dataModel, mostTableKey); if (!hasOperate) { continue; } } else if (dataModel.getNeedPermission()) { if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) { if (!dataModel.getFormPerList().contains(mostTableKey)) { continue; } } else { continue; } } if (JnpfKeyConsts.CURRORGANIZE.equals(jnpfkey) || JnpfKeyConsts.CURRPOSITION.equals(jnpfkey) || JnpfKeyConsts.CREATETIME.equals(jnpfkey) || JnpfKeyConsts.CREATEUSER.equals(jnpfkey)) { continue; } //处理系统自动生成 data = this.update(fieLdsModel, data, true, false); data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, dataNewMap, data); getDSL(sqlTable, updateModelUpdateDSL, null, fieLdsModel.getFormat(), field, data); } UpdateStatementProvider updateStatementProvider = updateModelUpdateDSL .where(sqlTable.column(foreignKey), SqlBuilder.isEqualTo(oldForeignValue)) .build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.update(updateStatementProvider); } } /** * 主表数据 **/ private void updateMast(List formAllModel, DataModel dataModel, Connection conn, Map result) throws SQLException { List tableModelList = dataModel.getTableModelList(); Map dataNewMap = dataModel.getDataNewMap(); List mastForm = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).filter( t -> StringUtil.isNotEmpty(t.getFormColumnModel().getFieLdsModel().getVModel())).collect(Collectors.toList()); Optional first = tableModelList.stream().filter(t -> "1".equals(t.getTypeId())).findFirst(); if (!first.isPresent()) { throw new SQLException(MsgCode.COD001.get()); } TableModel tableModel = first.get(); String mastTableName = tableModel.getTable(); SqlTable sqlTable = SqlTable.of(mastTableName); TableFields keyFieldModel = tableModel.getFields().stream().filter(t -> Objects.equals(t.getPrimaryKey(), 1) && !t.getField().toLowerCase().contains(TableFeildsEnum.TENANTID.getField())).findFirst().orElse(null); if (keyFieldModel == null) { throw new SQLException(MsgCode.COD001.get()); } String keyName = keyFieldModel.getField(); //设置实际主键id Object mainId = dataModel.getMainId(); if (VisualConst.DB_INT_ALL.contains(keyFieldModel.getDataType().toLowerCase())) { mainId = Long.parseLong(dataModel.getMainId()); } dataNewMap.put(keyName, mainId); //查询旧的主表数据(用于确定修改时外键字段信息) SelectStatementProvider render = SqlBuilder.select(sqlTable.allColumns()) .from(sqlTable) .where(sqlTable.column(keyName), SqlBuilder.isEqualTo(mainId)) .build().render(RenderingStrategies.MYBATIS3); List> maps = flowFormDataMapper.selectManyMappedRows(render); if (CollectionUtils.isEmpty(maps)) { return; } dataModel.setOldMainData(maps.get(0)); UpdateDSL updateModelUpdateDSL = SqlBuilder.update(sqlTable); int num = 0; for (FormAllModel model : mastForm) { FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel(); String jnpfkey = fieLdsModel.getConfig().getJnpfKey(); String field = fieLdsModel.getVModel(); Object data = dataNewMap.get(field); //流程表单权限 if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) { boolean hasOperate = isHasOperate(dataModel, field); if (!hasOperate) { continue; } } else if (dataModel.getNeedPermission()) { if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) { if (!dataModel.getFormPerList().contains(field)) { continue; } } else { continue; } } if (JnpfKeyConsts.CURRORGANIZE.equals(jnpfkey) || JnpfKeyConsts.CURRPOSITION.equals(jnpfkey) || JnpfKeyConsts.CREATETIME.equals(jnpfkey) || JnpfKeyConsts.CREATEUSER.equals(jnpfkey)) { continue; } //处理系统自动生成 data = this.update(fieLdsModel, data, true, false); data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, dataNewMap, data); getDSL(sqlTable, updateModelUpdateDSL, null, fieLdsModel.getFormat(), field, data); num++; } //判断是否开启锁 if (dataModel.getConcurrencyLock()) { updateModelUpdateDSL = updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.VERSION.getField())).equalTo(dataNewMap.get(TableFeildsEnum.VERSION.getField())); } //添加流程引擎信息 if (dataNewMap.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(dataNewMap.get(FlowFormConstant.FLOWID).toString())) { updateModelUpdateDSL = updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.FLOWID.getField())).equalTo(dataNewMap.get(FlowFormConstant.FLOWID)); } UpdateStatementProvider updateStatementProvider = updateModelUpdateDSL .where(sqlTable.column(keyName), SqlBuilder.isEqualTo(mainId)) .build().render(RenderingStrategies.MYBATIS3); if (num > 0) { flowFormDataMapper.update(updateStatementProvider); } } /** * 修改无表数据 **/ private Map updateAll(DataModel dataModel, List formAllModel) { Map dataNewMap = dataModel.getDataNewMap(); //处理好的数据 Map result = new HashMap<>(16); //系统数据 List mastForm = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); List tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); for (String key : dataNewMap.keySet()) { FormAllModel model = mastForm.stream().filter(t -> key.equals(t.getFormColumnModel().getFieLdsModel().getVModel())).findFirst().orElse(null); if (model != null) { FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel(); Object data = dataNewMap.get(key); //处理系统自动生成 data = this.update(fieLdsModel, data, false, false); result.put(key, data); } else { FormAllModel childModel = tableForm.stream().filter(t -> key.equals(t.getChildList().getTableModel())).findFirst().orElse(null); if (childModel != null) { List> childDataMap = (List>) dataNewMap.get(key); //子表处理的数据 List> childResult = new ArrayList<>(); for (Map objectMap : childDataMap) { //子表单体处理的数据 Map childOneResult = new HashMap<>(16); for (String childKey : objectMap.keySet()) { FormColumnModel columnModel = childModel.getChildList().getChildList().stream().filter(t -> childKey.equals(t.getFieLdsModel().getVModel())).findFirst().orElse(null); if (columnModel != null) { FieLdsModel fieLdsModel = columnModel.getFieLdsModel(); Object data = objectMap.get(childKey); data = this.update(fieLdsModel, data, false, false); childOneResult.put(childKey, data); } } childResult.add(childOneResult); } result.put(key, childResult); } } } return result; } /** * childNeedAdd子表id为空需要生成单据规则(除子表外其他都是false) * 修改系统赋值 **/ private Object update(FieLdsModel fieLdsModel, Object dataValue, boolean isTable, boolean childNeedAdd) { String jnpfKey = fieLdsModel.getConfig().getJnpfKey(); String rule = fieLdsModel.getConfig().getRule(); String format = DateTimeFormatConstant.getFormat(fieLdsModel.getFormat()); UserInfo user = UserProvider.getUser(); Object value = dataValue; switch (jnpfKey) { case JnpfKeyConsts.CREATEUSER: value = user.getUserId(); break; case JnpfKeyConsts.CREATETIME: value = new Date(); break; case JnpfKeyConsts.CURRORGANIZE: case JnpfKeyConsts.CURRDEPT: if (user != null && CollectionUtil.isNotEmpty(user.getOrganizeIds())) { value = JsonUtil.getObjectToString(user.getOrganizeIds()); } break; case JnpfKeyConsts.MODIFYTIME: if (!childNeedAdd) { value = new Date(); } break; case JnpfKeyConsts.MODIFYUSER: if (!childNeedAdd) { value = user.getUserId(); } break; case JnpfKeyConsts.CURRPOSITION: if (user != null && CollectionUtil.isNotEmpty(user.getPositionIds())) { value = JsonUtil.getObjectToString(user.getPositionIds()); } break; case JnpfKeyConsts.BILLRULE: if (Objects.equals(fieLdsModel.getConfig().getRuleType(), 1) && (childNeedAdd || ObjectUtil.isEmpty(dataValue))) { try { value = serviceUtil.getBillNumber(rule); } catch (Exception e) { value = null; } } break; case JnpfKeyConsts.DATE: case JnpfKeyConsts.DATE_CALCULATE: if (isTable) { try { if (dataValue == null || "".equals(dataValue)) { return null; } if (dataValue instanceof String) { try { SimpleDateFormat formatter = new SimpleDateFormat(format); value = formatter.parse(dataValue.toString()); } catch (ParseException var3) { return null; } } else { value = new Date(Long.valueOf(String.valueOf(dataValue))); } } catch (Exception e) { } } break; case JnpfKeyConsts.NUM_INPUT: case JnpfKeyConsts.CALCULATE: if (isTable) { try { value = new BigDecimal(String.valueOf(dataValue)); } catch (Exception e) { } } break; default: if (isTable) { value = this.valueToNull(value); } break; } return value; } /** * 删除有表单条数据 * * @param id * @param visualDevJsonModel * @return * @throws SQLException * @throws DataException */ @DSTransactional public boolean deleteTable(String id, VisualDevJsonModel visualDevJsonModel, DbLinkEntity linkEntity) throws Exception { Boolean logicalDelete = visualDevJsonModel.getFormData().getLogicalDelete(); Integer primaryKeyPolicy = visualDevJsonModel.getFormData().getPrimaryKeyPolicy(); List tableModels = visualDevJsonModel.getVisualTables(); List list = JsonUtil.getJsonToList(visualDevJsonModel.getFormData().getFields(), FieLdsModel.class); RecursionForm recursionForm = new RecursionForm(list, tableModels); List formAllModel = new ArrayList<>(); FormCloumnUtil.recursionForm(recursionForm, formAllModel); List tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList()); Map disableMap = new HashMap<>(); for (FormAllModel allModel : tableForm) { disableMap.put(allModel.getChildList().getTableName(), allModel.getChildList().getDisabled()); } //主表 TableModel mainTableModel = tableModels.stream().filter(t -> "1".equals(t.getTypeId())).findFirst().orElse(null); String mainTable = mainTableModel.getTable(); DynamicDataSourceUtil.switchToDataSource(linkEntity); try { @Cleanup Connection conn = ConnUtil.getConnOrDefault(linkEntity); String dbType = conn.getMetaData().getDatabaseProductName().trim(); String pKeyName = this.getKey(mainTableModel, dbType); String flowTaskId = this.getFlowTaskId(mainTableModel, dbType); List groupList = new ArrayList<>(); groupList.add(SqlBuilder.or(SqlTable.of(mainTable).column(flowTaskId), SqlBuilder.isEqualTo(id))); boolean autoIncrement = Objects.equals(primaryKeyPolicy, 2); Object selectId = id; if (autoIncrement) { selectId = Long.parseLong(id); } SelectStatementProvider queryMain = SqlBuilder.select(SqlTable.of(mainTable).allColumns()) .from(SqlTable.of(mainTable)) .where(SqlTable.of(mainTable).column(pKeyName), SqlBuilder.isEqualTo(selectId), groupList) .build().render(RenderingStrategies.MYBATIS3); Map mainMap = flowFormDataMapper.selectOneMappedRow(queryMain); if (MapUtils.isNotEmpty(mainMap)) { Object realId = mainMap.get(pKeyName); //是否开启逻辑删除 if (logicalDelete) { SqlTable sqlt = SqlTable.of(mainTable); UpdateDSL updateModelUpdateDSL = SqlBuilder.update(sqlt); updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEMARK.getField())).equalTo(1); updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETETIME.getField())).equalTo(new Date()); updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEUSERID.getField())).equalTo(UserProvider.getUser().getUserId()); UpdateStatementProvider mainUpdate = updateModelUpdateDSL .where(SqlTable.of(mainTable).column(pKeyName), SqlBuilder.isEqualTo(realId)) .build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.update(mainUpdate); } else { DeleteStatementProvider mainDelete = SqlBuilder.deleteFrom(SqlTable.of(mainTable)) .where(SqlTable.of(mainTable).column(pKeyName), SqlBuilder.isEqualTo(realId)) .build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.delete(mainDelete); } if (tableModels.size() > 1) { //去除主表 tableModels.remove(mainTableModel); for (TableModel table : tableModels) { if (CollectionUtil.isNotEmpty(disableMap) && disableMap.get(table.getTable()) != null && disableMap.get(table.getTable())) { continue; } //主表关联-字段值 Object relationFieldValue = mainMap.get(table.getRelationField()); //子表字段-key String tableField = table.getTableField(); if (logicalDelete) { SqlTable sqlt = SqlTable.of(table.getTable()); UpdateDSL updateModelUpdateDSL = SqlBuilder.update(sqlt); updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEMARK.getField())).equalTo(1); updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETETIME.getField())).equalTo(new Date()); updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEUSERID.getField())).equalTo(UserProvider.getUser().getUserId()); UpdateStatementProvider mainUpdate = updateModelUpdateDSL .where(SqlTable.of(table.getTable()).column(tableField), SqlBuilder.isEqualTo(relationFieldValue)) .build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.update(mainUpdate); } else { DeleteStatementProvider childDeleteProvider = SqlBuilder.deleteFrom(SqlTable.of(table.getTable())) .where(SqlTable.of(table.getTable()).column(tableField), SqlBuilder.isEqualTo(relationFieldValue)) .build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.delete(childDeleteProvider); } } } } } finally { DynamicDataSourceUtil.clearSwitchDataSource(); } return true; } /** * 获取锁字段信息 * * @param table * @param linkEntity * @param dataMap * @param id * @return */ public Boolean getVersion(String table, DbLinkEntity linkEntity, Map dataMap, Object id) { boolean canUpdate = true; try { DynamicDataSourceUtil.switchToDataSource(linkEntity); @Cleanup Connection conn = ConnUtil.getConnOrDefault(linkEntity); String pKeyName = this.getTableKey(conn, table); SqlTable sqlTable = SqlTable.of(table); SelectStatementProvider render = SqlBuilder.select(sqlTable.column(TableFeildsEnum.VERSION.getField())) .from(sqlTable) .where(sqlTable.column(pKeyName), SqlBuilder.isEqualTo(id)) .and(sqlTable.column(TableFeildsEnum.VERSION.getField()), SqlBuilder.isEqualTo(dataMap.get(TableFeildsEnum.VERSION.getField()))) .build().render(RenderingStrategies.MYBATIS3); int count = flowFormDataMapper.selectManyMappedRows(render).size(); canUpdate = count > 0; } catch (DataException | SQLException e) { log.error("切换数据源异常"); } finally { DynamicDataSourceUtil.clearSwitchDataSource(); } return canUpdate; } /** * 添加sql语句 * * @param * @return * @copyright 引迈信息技术有限公司 * @date 2023/3/29 */ private void getDSL(SqlTable sqlTable, UpdateDSL updateModelUpdateDSL, GeneralInsertDSL generalInsertDSL, String format, String field, Object data) { boolean dataTimestamp = StringUtil.isNotEmpty(format) ? format.length() > 10 : true; String dateFunc = dataTimestamp ? "to_timestamp" : "to_date"; if (data == null || StringUtil.isEmpty(data.toString())) { if (generalInsertDSL != null) { generalInsertDSL = generalInsertDSL.set(sqlTable.column(field)).toNull(); } else { updateModelUpdateDSL = updateModelUpdateDSL.set(sqlTable.column(field)).equalToNull(); } } else { if (generalInsertDSL != null) { generalInsertDSL = generalInsertDSL.set(sqlTable.column(field)).toValue(data); } else { updateModelUpdateDSL = updateModelUpdateDSL.set(sqlTable.column(field)).equalTo(data); } } } /** * 判断数据为空或空数组转换成null * * @param value * @return */ private Object valueToNull(Object value) { if (value instanceof List || value instanceof String[][]) { List l = (List) value; if (l.size() > 0) { value = JsonUtil.getObjectToString(value); } else { value = null; } } else if (value instanceof CharSequence) { if (StrUtil.isEmpty((CharSequence) value) || "[]".equals(value)) { value = null; } } return value; } /** * 获取当前组织完整路径 * * @param orgId * @return */ public String getCurrentOrgIds(String orgId, String showLevel) { String orgIds = null; OrganizeEntity organizeEntity = serviceUtil.getOrganizeInfo(orgId); if (organizeEntity != null) { if (StringUtil.isNotEmpty(organizeEntity.getOrganizeIdTree())) { String[] split = organizeEntity.getOrganizeIdTree().split(","); orgIds = split.length > 0 ? JsonUtil.getObjectToString(Arrays.asList(split)) : null; } } if (!"all".equals(showLevel) && organizeEntity != null && "company".equals(organizeEntity.getCategory())) { orgIds = null; } return orgIds; } /** * 是否有流程表单权限 * * @param dataModel * @param field * @return false 没有权限(需要跳过) */ private boolean isHasOperate(DataModel dataModel, String field) { boolean hasOperate = true; for (Map item : dataModel.getFlowFormOperates()) { if (field.equals(item.get("id")) && (item.get("write") == null || "false".equals(item.get("write").toString()))) { hasOperate = false; } } return hasOperate; } /** * 添加租户信息 * * @param generalInsertDSL * @param sqlTable */ private void addTenantId(GeneralInsertDSL generalInsertDSL, SqlTable sqlTable) { //租户信息 String tenantId = TenantDataSourceUtil.getTenantColumn(); generalInsertDSL.set(sqlTable.column(TableFeildsEnum.TENANTID.getField())).toValue(tenantId); } public void saveState(VisualdevEntity visualdevEntity, String flowTaskId, Integer flowState) { List tableModels = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class); TableModel mainT = tableModels.stream().filter(t -> t.getTypeId().equals("1")).findFirst().orElse(null); DbLinkEntity linkEntity = serviceUtil.getDbLink(visualdevEntity.getDbLinkId()); try { DynamicDataSourceUtil.switchToDataSource(linkEntity); SqlTable sqlt = SqlTable.of(mainT.getTable()); UpdateDSL updateModelUpdateDSL = SqlBuilder.update(sqlt); updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.FLOWSTATE.getField())).equalTo(flowState); UpdateStatementProvider mainUpdate = updateModelUpdateDSL .where(SqlTable.of(mainT.getTable()).column(TableFeildsEnum.FLOWTASKID.getField()), SqlBuilder.isEqualTo(flowTaskId)) .build().render(RenderingStrategies.MYBATIS3); flowFormDataMapper.update(mainUpdate); } catch (Exception e) { e.printStackTrace(); } finally { DynamicDataSourceUtil.clearSwitchDataSource(); } } }