| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- package jnpf.onlinedev.service.impl;
- import cn.hutool.core.util.ObjectUtil;
- import jnpf.base.entity.VisualdevEntity;
- import jnpf.base.mapper.FlowFormDataMapper;
- import jnpf.base.model.ColumnDataModel;
- import jnpf.base.model.OnlineImport.VisualdevModelDataInfoVO;
- import jnpf.base.model.VisualConst;
- import jnpf.base.model.form.ModuleFormModel;
- import jnpf.base.service.DbLinkService;
- import jnpf.base.util.FlowFormDataUtil;
- import jnpf.base.util.FormPublicUtils;
- import jnpf.constant.JnpfConst;
- import jnpf.database.model.entity.DbLinkEntity;
- import jnpf.database.util.ConnUtil;
- import jnpf.database.util.DynamicDataSourceUtil;
- import jnpf.model.visualJson.*;
- import jnpf.model.visualJson.analysis.*;
- import jnpf.onlinedev.model.OnlineInfoModel;
- import jnpf.onlinedev.service.VisualDevInfoService;
- import jnpf.onlinedev.util.onlineDevUtil.OnlinePublicUtils;
- import jnpf.onlinedev.util.onlineDevUtil.OnlineSwapDataUtils;
- import jnpf.permissions.PermissionInterfaceImpl;
- import jnpf.util.*;
- import jnpf.util.visiual.JnpfKeyConsts;
- import lombok.Cleanup;
- import org.apache.commons.collections4.CollectionUtils;
- import org.apache.commons.collections4.map.CaseInsensitiveMap;
- import org.mybatis.dynamic.sql.BasicColumn;
- import org.mybatis.dynamic.sql.SqlBuilder;
- import org.mybatis.dynamic.sql.SqlColumn;
- import org.mybatis.dynamic.sql.SqlTable;
- 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.join.EqualTo;
- import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import java.sql.Connection;
- import java.util.*;
- import java.util.stream.Collectors;
- /**
- * @author JNPF开发平台组
- * @version V3.2
- * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com)
- * @date 2021/10/26
- */
- @Service
- public class VisualDevInfoServiceImpl implements VisualDevInfoService {
- @Autowired
- private DbLinkService dblinkService;
- @Autowired
- private FlowFormDataMapper flowFormDataMapper;
- @Autowired
- private OnlineSwapDataUtils onlineSwapDataUtils;
- @Autowired
- private FlowFormDataUtil flowDataUtil;
- @Override
- public VisualdevModelDataInfoVO getEditDataInfo(String id, VisualdevEntity visualdevEntity, OnlineInfoModel model) {
- VisualdevModelDataInfoVO vo = new VisualdevModelDataInfoVO();
- Map<String, Object> editDataInfo = flowDataUtil.getEditDataInfo(visualdevEntity, id, model);
- if (editDataInfo != null && editDataInfo.size() > 0) {
- vo.setId(editDataInfo.get(FlowFormConstant.ID));
- vo.setData(JsonUtilEx.getObjectToString(editDataInfo));
- }
- return vo;
- }
- @Override
- public VisualdevModelDataInfoVO getDetailsDataInfo(String id, VisualdevEntity visualdevEntity) {
- return this.getDetailsDataInfo(id, visualdevEntity, OnlineInfoModel.builder().needRlationFiled(true).needSwap(true).build());
- }
- @Override
- public VisualdevModelDataInfoVO getDetailsDataInfo(String id, VisualdevEntity visualdevEntity, OnlineInfoModel infoModel) {
- VisualdevModelDataInfoVO vo = new VisualdevModelDataInfoVO();
- Map<String, Object> allDataMap = new HashMap<>();
- Map<String, Object> allDataResMap = 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<String> formPerList = new ArrayList<>();
- if (columnDataModel != null && StringUtil.isNotEmpty(infoModel.getMenuId())) {
- needP = columnDataModel.getUseFormPermission();
- Map<String, Object> 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());
- }
- }
- List<FieLdsModel> list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
- List<TableModel> tableModelList = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class);
- List<FormAllModel> formAllModel = new ArrayList<>();
- if (CollectionUtils.isNotEmpty(infoModel.getFormAllModel())) {
- formAllModel = infoModel.getFormAllModel();
- } else {
- RecursionForm recursionForm = new RecursionForm(list, tableModelList);
- FormCloumnUtil.recursionForm(recursionForm, formAllModel);
- }
- //form的属性
- List<FormAllModel> mast = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
- List<FormAllModel> table = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
- List<FormAllModel> mastTable = formAllModel.stream().filter(t -> FormEnum.mastTable.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
- List<String> relationFiled = new ArrayList() {{
- add(JnpfKeyConsts.RELATIONFORM);
- add(JnpfKeyConsts.RELATIONFORM_ATTR);
- }};
- TableModel mainTable = tableModelList.stream().filter(t -> t.getTypeId().equals("1")).findFirst().orElse(null);
- DbLinkEntity linkEntity = "0".equals(visualdevEntity.getDbLinkId()) ? null : dblinkService.getInfo(visualdevEntity.getDbLinkId());
- try {
- DynamicDataSourceUtil.switchToDataSource(linkEntity);
- @Cleanup Connection conn = ConnUtil.getConnOrDefault(linkEntity);
- String databaseProductName = conn.getMetaData().getDatabaseProductName();
- String dbType = conn.getMetaData().getDatabaseProductName().trim();
- boolean toUpperCase = databaseProductName.equalsIgnoreCase("oracle") || databaseProductName.equalsIgnoreCase("DM DBMS");
- //获取主键
- TableFields tableFields = mainTable.getFields().stream().filter(t -> Objects.equals(t.getPrimaryKey(), 1)
- && !t.getField().toLowerCase().contains(TableFeildsEnum.TENANTID.getField())).findFirst().orElse(null);
- String pKeyName = Objects.nonNull(tableFields) ? tableFields.getField() : toUpperCase ? TableFeildsEnum.FID.getField().toUpperCase() : TableFeildsEnum.FID.getField();
- SqlTable mainSqlTable = SqlTable.of(mainTable.getTable());
- //查询主表数据
- Map<String, Object> mainAllMap = searchMainData(id, infoModel, mainTable, tableModelList);
- if (mainAllMap.size() == 0) {
- return vo;
- }
- //是否去除关联表单及关联表单字段
- if (!infoModel.isNeedRlationFiled()) {
- mast = mast.stream().filter(t -> !relationFiled.contains(t.getFormColumnModel().getFieLdsModel().getConfig().getJnpfKey())).collect(Collectors.toList());
- }
- //主表
- List<String> 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<String> newList = new ArrayList<>();
- for (String item : mainTableFields) {
- if (formPerList.contains(item)) {
- newList.add(item);
- }
- }
- mainTableFields = newList;
- }
- }
- List<BasicColumn> mainTableBasicColumn = mainTableFields.stream().map(m -> SqlTable.of(mainTable.getTable()).column(m)).collect(Collectors.toList());
- //无字段时查询主键
- mainTableBasicColumn.add(SqlTable.of(mainTable.getTable()).column(pKeyName));
- SelectStatementProvider mainRender = SqlBuilder.select(mainTableBasicColumn).from(mainSqlTable).where(mainSqlTable.column(pKeyName),
- SqlBuilder.isEqualTo(mainAllMap.get(pKeyName))).build().render(RenderingStrategies.MYBATIS3);
- List<Map<String, Object>> mapList = flowFormDataMapper.selectManyMappedRows(mainRender);
- if (ObjectUtil.isNotEmpty(mapList) && mapList.size() > 0) {
- allDataMap.putAll(mapList.get(0));
- }
- //列表子表
- Map<String, List<FormMastTableModel>> groupByTableNames = mastTable.stream().map(mt -> mt.getFormMastTableModel()).collect(Collectors.groupingBy(ma -> ma.getTable()));
- Iterator<Map.Entry<String, List<FormMastTableModel>>> entryIterator = groupByTableNames.entrySet().iterator();
- while (entryIterator.hasNext()) {
- Map.Entry<String, List<FormMastTableModel>> next = entryIterator.next();
- String childTableName = next.getKey();
- List<FormMastTableModel> childMastTableList = next.getValue();
- //是否去除关联表单及关联表单字段
- if (!infoModel.isNeedRlationFiled()) {
- childMastTableList = childMastTableList.stream().filter(t -> !relationFiled.contains(t.getMastTable().getFieLdsModel().getConfig().getJnpfKey())).collect(Collectors.toList());
- }
- //开启权限移除字段
- if (needP) {
- if (CollectionUtils.isEmpty(formPerList)) {
- childMastTableList = Collections.EMPTY_LIST;
- } else {
- List<FormMastTableModel> 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<BasicColumn> 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();
- }
- SelectStatementProvider mastRender = SqlBuilder.select(mastTableBasicColumn).from(mastSqlTable).where(mastSqlTable.column(childFoIdFiled),
- SqlBuilder.isEqualTo(mainValue)).build().render(RenderingStrategies.MYBATIS3);
- List<Map<String, Object>> childMapList = flowFormDataMapper.selectManyMappedRows(mastRender);
- if (CollectionUtils.isNotEmpty(childMapList)) {
- Map<String, Object> soloDataMap = childMapList.get(0);
- Map<String, Object> 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<Map<String, Object>> mapList1 = new ArrayList<>();
- mapList1.add(renameKeyMap);
- allDataMap.putAll(mapList1.get(0));
- }
- }
- //设计子表
- Boolean finalNeedP = needP;
- List<String> finalFormPerList = formPerList;
- table.stream().map(t -> t.getChildList()).forEach(
- t1 -> {
- String childTableName = t1.getTableName();
- TableModel tableModel = tableModelList.stream().filter(tm -> tm.getTable().equals(childTableName)).findFirst().orElse(null);
- SqlTable childSqlTable = SqlTable.of(childTableName);
- List<FormColumnModel> 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<FormColumnModel> newList = new ArrayList<>();
- for (FormColumnModel item : chilFieldList) {
- if (finalFormPerList.contains(tableModelName + "-" + item.getFieLdsModel().getVModel())) {
- newList.add(item);
- }
- }
- chilFieldList = newList;
- }
- }
- List<BasicColumn> childFields = chilFieldList.stream().map(t2 -> childSqlTable.column(t2.getFieLdsModel().getVModel())).collect(Collectors.toList());
- childFields.add(childSqlTable.column(tableModel.getTableField()));
- String childKeyName = flowDataUtil.getKey(tableModel, dbType);
- childFields.add(childSqlTable.column(childKeyName));
- //主表主键
- String mainField = tableModel.getRelationField();
- Object mainValue = new CaseInsensitiveMap(mainAllMap).get(mainField);
- //子表外键
- String childFoIdFiled = tableModel.getTableField();
- //外键字段是否varchar转换
- TableFields fogIdField = tableModel.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();
- }
- //todo
- QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder childWhere = SqlBuilder.select(childFields).from(childSqlTable).where();
- childWhere.and(childSqlTable.column(tableModel.getTableField()), SqlBuilder.isEqualTo(mainValue));
- //逻辑删除不展示
- if (logicalDelete) {
- childWhere.and(childSqlTable.column(TableFeildsEnum.DELETEMARK.getField()), SqlBuilder.isNull());
- }
- SelectStatementProvider childRender = childWhere.build().render(RenderingStrategies.MYBATIS3);
- List<Map<String, Object>> childMapList = flowFormDataMapper.selectManyMappedRows(childRender);
- if (ObjectUtil.isNotEmpty(childMapList)) {
- Map<String, Object> childMap = new HashMap<>(1);
- childMap.put(t1.getTableModel(), childMapList);
- allDataMap.putAll(childMap);
- }
- }
- );
- //数据转换
- List<FieLdsModel> fields = new ArrayList<>();
- OnlinePublicUtils.recursionFields(fields, list);
- //添加id属性
- List<Map<String, Object>> dataList = FormPublicUtils.addIdToList(new ArrayList() {{
- add(allDataMap);
- }}, pKeyName);
- //详情没有区分行内编辑
- if (infoModel.isNeedSwap()) {
- allDataResMap = (Map<String, Object>) onlineSwapDataUtils.getSwapInfo(dataList, fields, visualdevEntity.getId(), false, null).get(0);
- } else {
- allDataResMap = allDataMap;
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- DynamicDataSourceUtil.clearSwitchDataSource();
- }
- vo.setId(allDataResMap.get(FlowFormConstant.ID));
- vo.setData(JsonUtilEx.getObjectToString(allDataResMap));
- return vo;
- }
- /**
- * 根据指定字段查询主表数据
- *
- * @param id
- * @param model
- * @param mainTable
- * @param tableModelList
- * @return
- */
- private Map<String, Object> searchMainData(String id, OnlineInfoModel model, TableModel mainTable, List<TableModel> tableModelList) {
- SqlTable mainSqlTable = SqlTable.of(mainTable.getTable());
- TableFields mainKeyModel = mainTable.getFields().stream().filter(t -> Objects.equals(t.getPrimaryKey(), 1)
- && !t.getField().toLowerCase().contains(TableFeildsEnum.TENANTID.getField())).findFirst().orElse(null);
- String propsValue = model.getPropsValue();
- SqlColumn column = null;
- TableFields storedFieldModel = null;
- if (StringUtil.isNotEmpty(propsValue)) {
- if (propsValue.contains(JnpfConst.SIDE_MARK)) {
- String[] split = propsValue.split(JnpfConst.SIDE_MARK);
- String thisTable = split[0].substring(5);
- String thisField = split[1];
- TableModel thisTableModel = tableModelList.stream().filter(t -> t.getTable().equalsIgnoreCase(thisTable)).findFirst().orElse(null);
- storedFieldModel = thisTableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(thisField)).findFirst().orElse(null);
- SqlTable sqlTable = SqlTable.of(split[0].substring(5));
- column = sqlTable.column(storedFieldModel.getField());
- } else {
- storedFieldModel = mainTable.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(propsValue)).findFirst().orElse(null);
- column = mainSqlTable.column(storedFieldModel.getField());
- }
- } else {
- storedFieldModel = mainKeyModel;
- column = mainSqlTable.column(storedFieldModel.getField());
- }
- //查询的字段-字段类型转换
- Object idObj = id;
- if (VisualConst.DB_INT_ALL.contains(storedFieldModel.getDataType().toLowerCase())) {
- idObj = Long.parseLong(id);
- }
- QueryExpressionDSL<SelectModel> from = SqlBuilder.select(mainSqlTable.allColumns()).from(mainSqlTable);
- QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder where = from.where(column, SqlBuilder.isEqualTo(idObj));
- SelectStatementProvider render = where.build().render(RenderingStrategies.MYBATIS3);
- List<Map<String, Object>> maps = flowFormDataMapper.selectManyMappedRows(render);
- if (CollectionUtils.isNotEmpty(maps)) {
- return maps.get(0);
- }
- return new HashMap<>();
- }
- }
|