VisualDevInfoServiceImpl.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. package jnpf.onlinedev.service.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import jnpf.base.entity.VisualdevEntity;
  4. import jnpf.base.mapper.FlowFormDataMapper;
  5. import jnpf.base.model.ColumnDataModel;
  6. import jnpf.base.model.OnlineImport.VisualdevModelDataInfoVO;
  7. import jnpf.base.model.VisualConst;
  8. import jnpf.base.model.form.ModuleFormModel;
  9. import jnpf.base.service.DbLinkService;
  10. import jnpf.base.util.FlowFormDataUtil;
  11. import jnpf.base.util.FormPublicUtils;
  12. import jnpf.constant.JnpfConst;
  13. import jnpf.database.model.entity.DbLinkEntity;
  14. import jnpf.database.util.ConnUtil;
  15. import jnpf.database.util.DynamicDataSourceUtil;
  16. import jnpf.model.visualJson.*;
  17. import jnpf.model.visualJson.analysis.*;
  18. import jnpf.onlinedev.model.OnlineInfoModel;
  19. import jnpf.onlinedev.service.VisualDevInfoService;
  20. import jnpf.onlinedev.util.onlineDevUtil.OnlinePublicUtils;
  21. import jnpf.onlinedev.util.onlineDevUtil.OnlineSwapDataUtils;
  22. import jnpf.permissions.PermissionInterfaceImpl;
  23. import jnpf.util.*;
  24. import jnpf.util.visiual.JnpfKeyConsts;
  25. import lombok.Cleanup;
  26. import org.apache.commons.collections4.CollectionUtils;
  27. import org.apache.commons.collections4.map.CaseInsensitiveMap;
  28. import org.mybatis.dynamic.sql.BasicColumn;
  29. import org.mybatis.dynamic.sql.SqlBuilder;
  30. import org.mybatis.dynamic.sql.SqlColumn;
  31. import org.mybatis.dynamic.sql.SqlTable;
  32. import org.mybatis.dynamic.sql.render.RenderingStrategies;
  33. import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
  34. import org.mybatis.dynamic.sql.select.SelectModel;
  35. import org.mybatis.dynamic.sql.select.join.EqualTo;
  36. import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
  37. import org.springframework.beans.factory.annotation.Autowired;
  38. import org.springframework.stereotype.Service;
  39. import java.sql.Connection;
  40. import java.util.*;
  41. import java.util.stream.Collectors;
  42. /**
  43. * @author JNPF开发平台组
  44. * @version V3.2
  45. * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com)
  46. * @date 2021/10/26
  47. */
  48. @Service
  49. public class VisualDevInfoServiceImpl implements VisualDevInfoService {
  50. @Autowired
  51. private DbLinkService dblinkService;
  52. @Autowired
  53. private FlowFormDataMapper flowFormDataMapper;
  54. @Autowired
  55. private OnlineSwapDataUtils onlineSwapDataUtils;
  56. @Autowired
  57. private FlowFormDataUtil flowDataUtil;
  58. @Override
  59. public VisualdevModelDataInfoVO getEditDataInfo(String id, VisualdevEntity visualdevEntity, OnlineInfoModel model) {
  60. VisualdevModelDataInfoVO vo = new VisualdevModelDataInfoVO();
  61. Map<String, Object> editDataInfo = flowDataUtil.getEditDataInfo(visualdevEntity, id, model);
  62. if (editDataInfo != null && editDataInfo.size() > 0) {
  63. vo.setId(editDataInfo.get(FlowFormConstant.ID));
  64. vo.setData(JsonUtilEx.getObjectToString(editDataInfo));
  65. }
  66. return vo;
  67. }
  68. @Override
  69. public VisualdevModelDataInfoVO getDetailsDataInfo(String id, VisualdevEntity visualdevEntity) {
  70. return this.getDetailsDataInfo(id, visualdevEntity, OnlineInfoModel.builder().needRlationFiled(true).needSwap(true).build());
  71. }
  72. @Override
  73. public VisualdevModelDataInfoVO getDetailsDataInfo(String id, VisualdevEntity visualdevEntity, OnlineInfoModel infoModel) {
  74. VisualdevModelDataInfoVO vo = new VisualdevModelDataInfoVO();
  75. Map<String, Object> allDataMap = new HashMap<>();
  76. Map<String, Object> allDataResMap = new HashMap<>();
  77. FormDataModel formData = JsonUtil.getJsonToBean(visualdevEntity.getFormData(), FormDataModel.class);
  78. Boolean logicalDelete = formData.getLogicalDelete();
  79. //权限参数
  80. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  81. Boolean needP = false;
  82. List<String> formPerList = new ArrayList<>();
  83. if (columnDataModel != null && StringUtil.isNotEmpty(infoModel.getMenuId())) {
  84. needP = columnDataModel.getUseFormPermission();
  85. Map<String, Object> pMap = PermissionInterfaceImpl.getFormMap();
  86. if (pMap.get(infoModel.getMenuId()) != null) {
  87. formPerList = JsonUtil.getJsonToList(pMap.get(infoModel.getMenuId()), ModuleFormModel.class).stream()
  88. .map(ModuleFormModel::getEnCode).collect(Collectors.toList());
  89. }
  90. }
  91. List<FieLdsModel> list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  92. List<TableModel> tableModelList = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class);
  93. List<FormAllModel> formAllModel = new ArrayList<>();
  94. if (CollectionUtils.isNotEmpty(infoModel.getFormAllModel())) {
  95. formAllModel = infoModel.getFormAllModel();
  96. } else {
  97. RecursionForm recursionForm = new RecursionForm(list, tableModelList);
  98. FormCloumnUtil.recursionForm(recursionForm, formAllModel);
  99. }
  100. //form的属性
  101. List<FormAllModel> mast = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  102. List<FormAllModel> table = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  103. List<FormAllModel> mastTable = formAllModel.stream().filter(t -> FormEnum.mastTable.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  104. List<String> relationFiled = new ArrayList() {{
  105. add(JnpfKeyConsts.RELATIONFORM);
  106. add(JnpfKeyConsts.RELATIONFORM_ATTR);
  107. }};
  108. TableModel mainTable = tableModelList.stream().filter(t -> t.getTypeId().equals("1")).findFirst().orElse(null);
  109. DbLinkEntity linkEntity = "0".equals(visualdevEntity.getDbLinkId()) ? null : dblinkService.getInfo(visualdevEntity.getDbLinkId());
  110. try {
  111. DynamicDataSourceUtil.switchToDataSource(linkEntity);
  112. @Cleanup Connection conn = ConnUtil.getConnOrDefault(linkEntity);
  113. String databaseProductName = conn.getMetaData().getDatabaseProductName();
  114. String dbType = conn.getMetaData().getDatabaseProductName().trim();
  115. boolean toUpperCase = databaseProductName.equalsIgnoreCase("oracle") || databaseProductName.equalsIgnoreCase("DM DBMS");
  116. //获取主键
  117. TableFields tableFields = mainTable.getFields().stream().filter(t -> Objects.equals(t.getPrimaryKey(), 1)
  118. && !t.getField().toLowerCase().contains(TableFeildsEnum.TENANTID.getField())).findFirst().orElse(null);
  119. String pKeyName = Objects.nonNull(tableFields) ? tableFields.getField() : toUpperCase ? TableFeildsEnum.FID.getField().toUpperCase() : TableFeildsEnum.FID.getField();
  120. SqlTable mainSqlTable = SqlTable.of(mainTable.getTable());
  121. //查询主表数据
  122. Map<String, Object> mainAllMap = searchMainData(id, infoModel, mainTable, tableModelList);
  123. if (mainAllMap.size() == 0) {
  124. return vo;
  125. }
  126. //是否去除关联表单及关联表单字段
  127. if (!infoModel.isNeedRlationFiled()) {
  128. mast = mast.stream().filter(t -> !relationFiled.contains(t.getFormColumnModel().getFieLdsModel().getConfig().getJnpfKey())).collect(Collectors.toList());
  129. }
  130. //主表
  131. List<String> mainTableFields = mast.stream().filter(m -> StringUtil.isNotEmpty(m.getFormColumnModel().getFieLdsModel().getVModel()))
  132. .map(s -> s.getFormColumnModel().getFieLdsModel().getVModel()).collect(Collectors.toList());
  133. //开启权限移除字段
  134. if (needP) {
  135. if (CollectionUtils.isEmpty(formPerList)) {
  136. mainTableFields = Collections.EMPTY_LIST;
  137. } else {
  138. List<String> newList = new ArrayList<>();
  139. for (String item : mainTableFields) {
  140. if (formPerList.contains(item)) {
  141. newList.add(item);
  142. }
  143. }
  144. mainTableFields = newList;
  145. }
  146. }
  147. List<BasicColumn> mainTableBasicColumn = mainTableFields.stream().map(m -> SqlTable.of(mainTable.getTable()).column(m)).collect(Collectors.toList());
  148. //无字段时查询主键
  149. mainTableBasicColumn.add(SqlTable.of(mainTable.getTable()).column(pKeyName));
  150. SelectStatementProvider mainRender = SqlBuilder.select(mainTableBasicColumn).from(mainSqlTable).where(mainSqlTable.column(pKeyName),
  151. SqlBuilder.isEqualTo(mainAllMap.get(pKeyName))).build().render(RenderingStrategies.MYBATIS3);
  152. List<Map<String, Object>> mapList = flowFormDataMapper.selectManyMappedRows(mainRender);
  153. if (ObjectUtil.isNotEmpty(mapList) && mapList.size() > 0) {
  154. allDataMap.putAll(mapList.get(0));
  155. }
  156. //列表子表
  157. Map<String, List<FormMastTableModel>> groupByTableNames = mastTable.stream().map(mt -> mt.getFormMastTableModel()).collect(Collectors.groupingBy(ma -> ma.getTable()));
  158. Iterator<Map.Entry<String, List<FormMastTableModel>>> entryIterator = groupByTableNames.entrySet().iterator();
  159. while (entryIterator.hasNext()) {
  160. Map.Entry<String, List<FormMastTableModel>> next = entryIterator.next();
  161. String childTableName = next.getKey();
  162. List<FormMastTableModel> childMastTableList = next.getValue();
  163. //是否去除关联表单及关联表单字段
  164. if (!infoModel.isNeedRlationFiled()) {
  165. childMastTableList = childMastTableList.stream().filter(t -> !relationFiled.contains(t.getMastTable().getFieLdsModel().getConfig().getJnpfKey())).collect(Collectors.toList());
  166. }
  167. //开启权限移除字段
  168. if (needP) {
  169. if (CollectionUtils.isEmpty(formPerList)) {
  170. childMastTableList = Collections.EMPTY_LIST;
  171. } else {
  172. List<FormMastTableModel> newList = new ArrayList<>();
  173. for (FormMastTableModel item : childMastTableList) {
  174. if (formPerList.contains(item.getVModel())) {
  175. newList.add(item);
  176. }
  177. }
  178. childMastTableList = newList;
  179. }
  180. }
  181. TableModel childTableModel = tableModelList.stream().filter(t -> t.getTable().equals(childTableName)).findFirst().orElse(null);
  182. SqlTable mastSqlTable = SqlTable.of(childTableName);
  183. List<BasicColumn> mastTableBasicColumn = childMastTableList.stream().filter(m -> StringUtil.isNotEmpty(m.getField()))
  184. .map(m -> mastSqlTable.column(m.getField())).collect(Collectors.toList());
  185. //添加副表关联字段,不然数据会空没有字段名称
  186. mastTableBasicColumn.add(mastSqlTable.column(childTableModel.getTableField()));
  187. //主表主键
  188. String mainField = childTableModel.getRelationField();
  189. Object mainValue = new CaseInsensitiveMap(mainAllMap).get(mainField);
  190. //子表外键
  191. String childFoIdFiled = childTableModel.getTableField();
  192. //外键字段是否varchar转换
  193. TableFields fogIdField = childTableModel.getFields().stream().filter(t -> t.getField().equals(childFoIdFiled)).findFirst().orElse(null);
  194. boolean fogIdTypeString = Objects.nonNull(fogIdField) ? fogIdField.getDataType().toLowerCase().contains("varchar") : false;
  195. if (fogIdTypeString) {
  196. mainValue = mainValue.toString();
  197. }
  198. SelectStatementProvider mastRender = SqlBuilder.select(mastTableBasicColumn).from(mastSqlTable).where(mastSqlTable.column(childFoIdFiled),
  199. SqlBuilder.isEqualTo(mainValue)).build().render(RenderingStrategies.MYBATIS3);
  200. List<Map<String, Object>> childMapList = flowFormDataMapper.selectManyMappedRows(mastRender);
  201. if (CollectionUtils.isNotEmpty(childMapList)) {
  202. Map<String, Object> soloDataMap = childMapList.get(0);
  203. Map<String, Object> renameKeyMap = new HashMap<>();
  204. for (Map.Entry entry : soloDataMap.entrySet()) {
  205. FormMastTableModel model = childMastTableList.stream().filter(child -> child.getField().equalsIgnoreCase(String.valueOf(entry.getKey()))).findFirst().orElse(null);
  206. if (model != null) {
  207. renameKeyMap.put(model.getVModel(), entry.getValue());
  208. }
  209. }
  210. List<Map<String, Object>> mapList1 = new ArrayList<>();
  211. mapList1.add(renameKeyMap);
  212. allDataMap.putAll(mapList1.get(0));
  213. }
  214. }
  215. //设计子表
  216. Boolean finalNeedP = needP;
  217. List<String> finalFormPerList = formPerList;
  218. table.stream().map(t -> t.getChildList()).forEach(
  219. t1 -> {
  220. String childTableName = t1.getTableName();
  221. TableModel tableModel = tableModelList.stream().filter(tm -> tm.getTable().equals(childTableName)).findFirst().orElse(null);
  222. SqlTable childSqlTable = SqlTable.of(childTableName);
  223. List<FormColumnModel> chilFieldList = t1.getChildList().stream().filter(t2 -> StringUtil.isNotEmpty(t2.getFieLdsModel().getVModel())).collect(Collectors.toList());
  224. String tableModelName = t1.getTableModel();
  225. //开启权限移除字段
  226. if (finalNeedP) {
  227. if (CollectionUtils.isEmpty(finalFormPerList)) {
  228. chilFieldList = Collections.EMPTY_LIST;
  229. } else {
  230. List<FormColumnModel> newList = new ArrayList<>();
  231. for (FormColumnModel item : chilFieldList) {
  232. if (finalFormPerList.contains(tableModelName + "-" + item.getFieLdsModel().getVModel())) {
  233. newList.add(item);
  234. }
  235. }
  236. chilFieldList = newList;
  237. }
  238. }
  239. List<BasicColumn> childFields = chilFieldList.stream().map(t2 -> childSqlTable.column(t2.getFieLdsModel().getVModel())).collect(Collectors.toList());
  240. childFields.add(childSqlTable.column(tableModel.getTableField()));
  241. String childKeyName = flowDataUtil.getKey(tableModel, dbType);
  242. childFields.add(childSqlTable.column(childKeyName));
  243. //主表主键
  244. String mainField = tableModel.getRelationField();
  245. Object mainValue = new CaseInsensitiveMap(mainAllMap).get(mainField);
  246. //子表外键
  247. String childFoIdFiled = tableModel.getTableField();
  248. //外键字段是否varchar转换
  249. TableFields fogIdField = tableModel.getFields().stream().filter(t -> t.getField().equals(childFoIdFiled)).findFirst().orElse(null);
  250. boolean fogIdTypeString = Objects.nonNull(fogIdField) ? fogIdField.getDataType().toLowerCase().contains("varchar") : false;
  251. if (fogIdTypeString) {
  252. mainValue = mainValue.toString();
  253. }
  254. //todo
  255. QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder childWhere = SqlBuilder.select(childFields).from(childSqlTable).where();
  256. childWhere.and(childSqlTable.column(tableModel.getTableField()), SqlBuilder.isEqualTo(mainValue));
  257. //逻辑删除不展示
  258. if (logicalDelete) {
  259. childWhere.and(childSqlTable.column(TableFeildsEnum.DELETEMARK.getField()), SqlBuilder.isNull());
  260. }
  261. SelectStatementProvider childRender = childWhere.build().render(RenderingStrategies.MYBATIS3);
  262. List<Map<String, Object>> childMapList = flowFormDataMapper.selectManyMappedRows(childRender);
  263. if (ObjectUtil.isNotEmpty(childMapList)) {
  264. Map<String, Object> childMap = new HashMap<>(1);
  265. childMap.put(t1.getTableModel(), childMapList);
  266. allDataMap.putAll(childMap);
  267. }
  268. }
  269. );
  270. //数据转换
  271. List<FieLdsModel> fields = new ArrayList<>();
  272. OnlinePublicUtils.recursionFields(fields, list);
  273. //添加id属性
  274. List<Map<String, Object>> dataList = FormPublicUtils.addIdToList(new ArrayList() {{
  275. add(allDataMap);
  276. }}, pKeyName);
  277. //详情没有区分行内编辑
  278. if (infoModel.isNeedSwap()) {
  279. allDataResMap = (Map<String, Object>) onlineSwapDataUtils.getSwapInfo(dataList, fields, visualdevEntity.getId(), false, null).get(0);
  280. } else {
  281. allDataResMap = allDataMap;
  282. }
  283. } catch (Exception e) {
  284. throw new RuntimeException(e);
  285. } finally {
  286. DynamicDataSourceUtil.clearSwitchDataSource();
  287. }
  288. vo.setId(allDataResMap.get(FlowFormConstant.ID));
  289. vo.setData(JsonUtilEx.getObjectToString(allDataResMap));
  290. return vo;
  291. }
  292. /**
  293. * 根据指定字段查询主表数据
  294. *
  295. * @param id
  296. * @param model
  297. * @param mainTable
  298. * @param tableModelList
  299. * @return
  300. */
  301. private Map<String, Object> searchMainData(String id, OnlineInfoModel model, TableModel mainTable, List<TableModel> tableModelList) {
  302. SqlTable mainSqlTable = SqlTable.of(mainTable.getTable());
  303. TableFields mainKeyModel = mainTable.getFields().stream().filter(t -> Objects.equals(t.getPrimaryKey(), 1)
  304. && !t.getField().toLowerCase().contains(TableFeildsEnum.TENANTID.getField())).findFirst().orElse(null);
  305. String propsValue = model.getPropsValue();
  306. SqlColumn column = null;
  307. TableFields storedFieldModel = null;
  308. if (StringUtil.isNotEmpty(propsValue)) {
  309. if (propsValue.contains(JnpfConst.SIDE_MARK)) {
  310. String[] split = propsValue.split(JnpfConst.SIDE_MARK);
  311. String thisTable = split[0].substring(5);
  312. String thisField = split[1];
  313. TableModel thisTableModel = tableModelList.stream().filter(t -> t.getTable().equalsIgnoreCase(thisTable)).findFirst().orElse(null);
  314. storedFieldModel = thisTableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(thisField)).findFirst().orElse(null);
  315. SqlTable sqlTable = SqlTable.of(split[0].substring(5));
  316. column = sqlTable.column(storedFieldModel.getField());
  317. } else {
  318. storedFieldModel = mainTable.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(propsValue)).findFirst().orElse(null);
  319. column = mainSqlTable.column(storedFieldModel.getField());
  320. }
  321. } else {
  322. storedFieldModel = mainKeyModel;
  323. column = mainSqlTable.column(storedFieldModel.getField());
  324. }
  325. //查询的字段-字段类型转换
  326. Object idObj = id;
  327. if (VisualConst.DB_INT_ALL.contains(storedFieldModel.getDataType().toLowerCase())) {
  328. idObj = Long.parseLong(id);
  329. }
  330. QueryExpressionDSL<SelectModel> from = SqlBuilder.select(mainSqlTable.allColumns()).from(mainSqlTable);
  331. QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder where = from.where(column, SqlBuilder.isEqualTo(idObj));
  332. SelectStatementProvider render = where.build().render(RenderingStrategies.MYBATIS3);
  333. List<Map<String, Object>> maps = flowFormDataMapper.selectManyMappedRows(render);
  334. if (CollectionUtils.isNotEmpty(maps)) {
  335. return maps.get(0);
  336. }
  337. return new HashMap<>();
  338. }
  339. }