From f52faaff3c6d4fbc1654b5ba84ee2aaba98da9ce Mon Sep 17 00:00:00 2001 From: Jerry <707344974@qq.com> Date: Mon, 9 Sep 2024 21:29:28 +0800 Subject: [PATCH] =?UTF-8?q?commit=EF=BC=9A=E6=94=AF=E6=8C=81=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E6=89=A9=E5=B1=95=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/cache/CacheConfig.java | 4 + .../FlowOnlineOperationController.java | 3 + .../controller/OnlineOperationController.java | 16 +- .../online/dao/mapper/OnlinePageMapper.xml | 5 +- .../common/online/dto/OnlinePageDto.java | 6 + .../common/online/model/OnlinePage.java | 6 + .../object/BaseOnlineExtendExecutor.java | 157 ++++++++++++ .../common/online/object/OnlinePageExtra.java | 18 ++ .../impl/OnlineOperationServiceImpl.java | 89 +++++-- .../online/util/OnlineExtendExecutorUtil.java | 242 ++++++++++++++++++ .../online/util/OnlineOperationHelper.java | 56 +++- .../common/online/vo/OnlinePageVo.java | 6 + .../db-scripts/zzdemo-online-open.sql | 17 +- .../common/core/cache/CacheConfig.java | 4 + .../FlowOnlineOperationController.java | 3 + .../controller/OnlineOperationController.java | 15 +- .../online/dao/mapper/OnlinePageMapper.xml | 5 +- .../common/online/dto/OnlinePageDto.java | 6 + .../common/online/model/OnlinePage.java | 6 + .../object/BaseOnlineExtendExecutor.java | 157 ++++++++++++ .../common/online/object/OnlinePageExtra.java | 18 ++ .../impl/OnlineOperationServiceImpl.java | 90 +++++-- .../online/util/OnlineExtendExecutorUtil.java | 242 ++++++++++++++++++ .../online/util/OnlineOperationHelper.java | 55 +++- .../common/online/vo/OnlinePageVo.java | 6 + .../db-scripts/zzdemo-online-open.sql | 17 +- 26 files changed, 1140 insertions(+), 109 deletions(-) create mode 100644 OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/object/BaseOnlineExtendExecutor.java create mode 100644 OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/object/OnlinePageExtra.java create mode 100644 OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineExtendExecutorUtil.java create mode 100644 OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/object/BaseOnlineExtendExecutor.java create mode 100644 OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/object/OnlinePageExtra.java create mode 100644 OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineExtendExecutorUtil.java diff --git a/OrangeFormsOpen-MybatisFlex/common/common-core/src/main/java/com/orangeforms/common/core/cache/CacheConfig.java b/OrangeFormsOpen-MybatisFlex/common/common-core/src/main/java/com/orangeforms/common/core/cache/CacheConfig.java index 203eafd1..6a0f1764 100644 --- a/OrangeFormsOpen-MybatisFlex/common/common-core/src/main/java/com/orangeforms/common/core/cache/CacheConfig.java +++ b/OrangeFormsOpen-MybatisFlex/common/common-core/src/main/java/com/orangeforms/common/core/cache/CacheConfig.java @@ -53,6 +53,10 @@ public class CacheConfig { * 在线表单组件渲染数据缓存。 */ ONLINE_FORM_RENDER_CACCHE(300, 100), + /** + * 在线表单扩展执行器对象的缓存。 + */ + ONLINE_EXTEND_EXECUTOR_CACHE(300, 100), /** * 报表表单组件渲染数据缓存。 */ diff --git a/OrangeFormsOpen-MybatisFlex/common/common-flow-online/src/main/java/com/orangeforms/common/flow/online/controller/FlowOnlineOperationController.java b/OrangeFormsOpen-MybatisFlex/common/common-flow-online/src/main/java/com/orangeforms/common/flow/online/controller/FlowOnlineOperationController.java index cdeb15bb..a8b44c8d 100644 --- a/OrangeFormsOpen-MybatisFlex/common/common-flow-online/src/main/java/com/orangeforms/common/flow/online/controller/FlowOnlineOperationController.java +++ b/OrangeFormsOpen-MybatisFlex/common/common-flow-online/src/main/java/com/orangeforms/common/flow/online/controller/FlowOnlineOperationController.java @@ -262,6 +262,7 @@ public class FlowOnlineOperationController { } taskVariableData.put(FlowConstant.COPY_DATA_KEY, copyData); } + onlineOperationHelper.enableOnlineExtendExecutor(datasource.getDatasourceId()); FlowTaskComment flowTaskComment = BeanUtil.copyProperties(flowTaskCommentDto, FlowTaskComment.class); if (StrUtil.isBlank(dataId)) { return this.submitNewTask(processInstanceId, taskId, @@ -653,6 +654,7 @@ public class FlowOnlineOperationController { taskVariableData.put(FlowConstant.COPY_DATA_KEY, copyData); } FlowTaskComment flowTaskComment = BeanUtil.copyProperties(flowTaskCommentDto, FlowTaskComment.class); + onlineOperationHelper.enableOnlineExtendExecutor(datasource.getDatasourceId()); // 保存在线表单提交的数据,同时启动流程和自动完成第一个用户任务。 if (slaveData == null) { flowOnlineOperationService.saveNewAndStartProcess( @@ -846,6 +848,7 @@ public class FlowOnlineOperationController { private JSONObject buildUserTaskData( String businessKey, OnlineDatasource datasource, List relationList) { + onlineOperationHelper.enableOnlineExtendExecutor(datasource.getDatasourceId()); OnlineTable masterTable = datasource.getMasterTable(); JSONObject jsonData = new JSONObject(); List oneToOneRelationList = relationList.stream() diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java index 64786ae1..773ff1f2 100644 --- a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java @@ -5,7 +5,6 @@ import cn.hutool.core.text.StrFormatter; import cn.hutool.core.map.MapUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.*; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.orangeforms.common.core.annotation.MyRequestBody; import com.orangeforms.common.core.constant.ErrorCodeEnum; @@ -110,6 +109,7 @@ public class OnlineOperationController { return ResponseResult.error(ErrorCodeEnum.NO_OPERATION_PERMISSION); } OnlineTable masterTable = datasource.getMasterTable(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); if (slaveData == null) { onlineOperationService.saveNew(masterTable, masterData); } else { @@ -145,8 +145,8 @@ public class OnlineOperationController { if (!verifyResult.isSuccess()) { return ResponseResult.errorFrom(verifyResult); } - OnlineDatasourceRelation relation = verifyResult.getData(); - onlineOperationService.saveNew(relation.getSlaveTable(), slaveData); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); + onlineOperationService.saveNew(verifyResult.getData().getSlaveTable(), slaveData); return ResponseResult.success(); } @@ -178,6 +178,7 @@ public class OnlineOperationController { return ResponseResult.error(ErrorCodeEnum.NO_OPERATION_PERMISSION); } OnlineTable masterTable = datasource.getMasterTable(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); if (slaveData == null) { if (!onlineOperationService.update(masterTable, masterData)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); @@ -217,6 +218,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(verifyResult); } OnlineTable slaveTable = verifyResult.getData().getSlaveTable(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); if (!onlineOperationService.update(slaveTable, slaveData)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); } @@ -328,6 +330,7 @@ public class OnlineOperationController { List allRelationList = relationListResult.getData(); List oneToOneRelationList = allRelationList.stream() .filter(r -> r.getRelationType().equals(RelationType.ONE_TO_ONE)).collect(Collectors.toList()); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); Map result = onlineOperationService.getMasterData( datasource.getMasterTable(), oneToOneRelationList, allRelationList, dataId); return ResponseResult.success(result); @@ -354,6 +357,7 @@ public class OnlineOperationController { if (!verifyResult.isSuccess()) { return ResponseResult.errorFrom(verifyResult); } + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); Map result = onlineOperationService.getSlaveData(verifyResult.getData(), dataId); return ResponseResult.success(result); } @@ -546,6 +550,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(orderByResult); } String orderBy = orderByResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); MyPageData> pageData = onlineOperationService.getMasterDataList( masterTable, oneToOneRelationList, allRelationList, filterDtoList, orderBy, pageParam); return ResponseResult.success(pageData); @@ -605,6 +610,7 @@ public class OnlineOperationController { ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, orderByResult); } String orderBy = orderByResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); MyPageData> pageData = onlineOperationService.getMasterDataList( masterTable, oneToOneRelationList, allRelationList, filterDtoList, orderBy, null); Map headerMap = this.makeExportHeaderMap(masterTable, allRelationList, exportInfoList); @@ -663,6 +669,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(orderByResult); } String orderBy = orderByResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); MyPageData> pageData = onlineOperationService.getSlaveDataList(relation, filterDtoList, orderBy, pageParam); return ResponseResult.success(pageData); @@ -715,6 +722,7 @@ public class OnlineOperationController { return; } String orderBy = orderByResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); MyPageData> pageData = onlineOperationService.getSlaveDataList(relation, filterDtoList, orderBy, null); Map headerMap = @@ -812,6 +820,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(relationListResult); } List relationList = relationListResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); for (String dataId : dataIdList) { if (!onlineOperationService.delete(masterTable, relationList, dataId)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); @@ -828,6 +837,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(verifyResult); } OnlineDatasourceRelation relation = verifyResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); for (String dataId : dataIdList) { if (!onlineOperationService.delete(relation.getSlaveTable(), null, dataId)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml index 86aeeb21..0df7cd33 100644 --- a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml @@ -8,6 +8,7 @@ + @@ -61,10 +62,10 @@ diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/dto/OnlinePageDto.java b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/dto/OnlinePageDto.java index 309c3bf4..a614727e 100644 --- a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/dto/OnlinePageDto.java +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/dto/OnlinePageDto.java @@ -48,6 +48,12 @@ public class OnlinePageDto { @ConstDictRef(constDictClass = PageType.class, message = "数据验证失败,页面类型为无效值!") private Integer pageType; + /** + * 扩展数据。 + */ + @Schema(description = "扩展数据") + private String extraJson; + /** * 页面编辑状态。 */ diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/model/OnlinePage.java b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/model/OnlinePage.java index a4138a60..2e2cb2ce 100644 --- a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/model/OnlinePage.java +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/model/OnlinePage.java @@ -55,6 +55,12 @@ public class OnlinePage { @Column(value = "page_type") private Integer pageType; + /** + * 扩展数据。 + */ + @Column(value = "extra_json") + private String extraJson; + /** * 页面编辑状态。 */ diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/object/BaseOnlineExtendExecutor.java b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/object/BaseOnlineExtendExecutor.java new file mode 100644 index 00000000..3561409b --- /dev/null +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/object/BaseOnlineExtendExecutor.java @@ -0,0 +1,157 @@ +package com.orangeforms.common.online.object; + +import com.alibaba.fastjson.JSONObject; +import com.orangeforms.common.core.object.CallResult; +import com.orangeforms.common.online.dto.OnlineFilterDto; +import com.orangeforms.common.online.model.OnlineTable; + +import java.util.List; +import java.util.Map; + +/** + * 在线表单后台扩展可执行接口,所有在线表单的后台扩展类都需要继承该接口。 + * + * @author Jerry + * @date 2024-04-15 + */ +public class BaseOnlineExtendExecutor { + + /** + * 主从表数据级联插入之前执行的操作。通常可以做一些数据插入之前的验证操作,或者是对待插入的数据,根据需要进行调整和计算。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。key是字段名,value是字段值。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。key是关联从表对象。 + * value是关联的从表数据列表。value是JSONObject对象列表,每个JSONObject的key是从表字段名,value是从表字段值。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeInsertWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + return CallResult.ok(); + } + + /** + * 主从表数据级联插入之后执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。key是字段名,value是字段值。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。key是关联从表对象。 + * value是关联的从表数据列表。value是JSONObject对象列表,每个JSONObject的key是从表字段名,value是从表字段值。 + */ + public void afterInsertWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + } + + /** + * 表数据插入之前执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。key是字段名,value是字段值。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeInsert(OnlineTable table, JSONObject data) { + return CallResult.ok(); + } + + /** + * 表数据插入之后执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。key是字段名,value是字段值。 + */ + public void afterInsert(OnlineTable table, JSONObject data) { + } + + /** + * 主从表数据级联更新之前执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。key是字段名,value是字段值。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。key是关联从表对象。 + * value是关联的从表数据列表。value是JSONObject对象列表,每个JSONObject的key是从表字段名,value是从表字段值。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeUpdateWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + return CallResult.ok(); + } + + /** + * 主从表数据级联更新之后执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。key是字段名,value是字段值。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。key是关联从表对象。 + * value是关联的从表数据列表。value是JSONObject对象列表,每个JSONObject的key是从表字段名,value是从表字段值。 + */ + public void afterUpdateWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + } + + /** + * 表数据更新之前执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。key是字段名,value是字段值。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeUpdate(OnlineTable table, JSONObject data) { + return CallResult.ok(); + } + + /** + * 表数据更新之后执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。key是字段名,value是字段值。 + */ + public void afterUpdate(OnlineTable table, JSONObject data) { + } + + /** + * 表数据删除之前执行的操作。 + * + * @param table 表对象。 + * @param dataId 表数据主键Id。对象类型和实际字段值类型一致。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeDelete(OnlineTable table, Object dataId) { + return CallResult.ok(); + } + + /** + * 表数据删除之后执行的操作。 + * + * @param table 表对象。 + * @param dataId 表数据主键Id。对象类型和实际字段值类型一致。 + */ + public void afterDelete(OnlineTable table, Object dataId) { + } + + /** + * 表数据列表查询之前执行的操作。 + * + * @param table 表对象。 + * @param filterList 过滤条件。如果有新的过滤条件,可直接添加到该过滤列表。 + */ + public void beforeSelectList(OnlineTable table, List filterList) { + } + + /** + * 表数据列表查询之后执行的操作。 + * + * @param table 表对象。 + * @param resultList 查询结果。如果有修改,可直接在当前参数修改后即可生效。 + */ + public void afterSelectList(OnlineTable table, List> resultList) { + } + + /** + * 表数据单条详情查询之后执行的操作。 + * + * @param table 表对象。 + * @param result 查询结果。如果有修改,可直接在当前参数修改后即可生效。 + */ + public void afterSelectOne(OnlineTable table, Map result) { + } +} diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/object/OnlinePageExtra.java b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/object/OnlinePageExtra.java new file mode 100644 index 00000000..e150b815 --- /dev/null +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/object/OnlinePageExtra.java @@ -0,0 +1,18 @@ +package com.orangeforms.common.online.object; + +import lombok.Data; + +/** + * 在线表单页面的扩展数据对象。 + * + * @author Jerry + * @date 2024-04-15 + */ +@Data +public class OnlinePageExtra { + + /** + * 后台扩展类。 + */ + private String extendClass; +} diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java index 28898e0e..165936b3 100644 --- a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java @@ -95,6 +95,8 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { private CacheManager cacheManager; @Autowired private OnlineDataSourceUtil dataSourceUtil; + @Autowired + private OnlineExtendExecutorUtil onlineExtendExecutorUtil; private static final String DICT_MAP_SUFFIX = "DictMap"; private static final String DICT_MAP_LIST_SUFFIX = "DictMapList"; @@ -148,6 +150,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { } } } + onlineExtendExecutorUtil.doBeforeInsert(table, data); onlineOperationMapper.insert(table.getTableName(), columnNames, columnValueList); return id; } @@ -159,25 +162,27 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { OnlineTable masterTable, JSONObject masterData, Map> slaveDataListMap) { + Map> slaveDataMap = this.convertToSlaveTableAndDataList(slaveDataListMap); + onlineExtendExecutorUtil.doBeforeInsertWithRelation(masterTable, masterData, slaveDataMap); Object id = this.saveNew(masterTable, masterData); - if (slaveDataListMap == null) { - return id; - } - // 迭代多个关联列表。 - for (Map.Entry> entry : slaveDataListMap.entrySet()) { - Long masterColumnId = entry.getKey().getMasterColumnId(); - OnlineColumn masterColumn = masterTable.getColumnMap().get(masterColumnId); - Object columnValue = masterData.get(masterColumn.getColumnName()); - OnlineTable slaveTable = entry.getKey().getSlaveTable(); - OnlineColumn slaveColumn = slaveTable.getColumnMap().get(entry.getKey().getSlaveColumnId()); - // 迭代关联中的数据集合 - for (JSONObject slaveData : entry.getValue()) { - if (!slaveData.containsKey(slaveTable.getPrimaryKeyColumn().getColumnName())) { - slaveData.put(slaveColumn.getColumnName(), columnValue); - this.saveNew(slaveTable, slaveData); + if (slaveDataListMap != null) { + // 迭代多个关联列表。 + for (Map.Entry> entry : slaveDataListMap.entrySet()) { + Long masterColumnId = entry.getKey().getMasterColumnId(); + OnlineColumn masterColumn = masterTable.getColumnMap().get(masterColumnId); + Object columnValue = masterData.get(masterColumn.getColumnName()); + OnlineTable slaveTable = entry.getKey().getSlaveTable(); + OnlineColumn slaveColumn = slaveTable.getColumnMap().get(entry.getKey().getSlaveColumnId()); + // 迭代关联中的数据集合 + for (JSONObject slaveData : entry.getValue()) { + if (!slaveData.containsKey(slaveTable.getPrimaryKeyColumn().getColumnName())) { + slaveData.put(slaveColumn.getColumnName(), columnValue); + this.saveNew(slaveTable, slaveData); + } } } } + onlineExtendExecutorUtil.doAfterInsertWithRelation(masterTable, masterData, slaveDataMap); return id; } @@ -219,7 +224,10 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { return true; } String dataPermFilter = this.buildDataPermFilter(table); - return this.doUpdate(table, updateColumnList, filterList, dataPermFilter); + onlineExtendExecutorUtil.doBeforeUpdate(table, data); + boolean r = this.doUpdate(table, updateColumnList, filterList, dataPermFilter); + onlineExtendExecutorUtil.doAfterUpdate(table, data); + return r; } @MultiDatabaseWriteMethod @@ -244,16 +252,18 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { JSONObject masterData, Long datasourceId, Map> slaveDataListMap) { + Map> slaveDataMap = this.convertToSlaveTableAndDataList(slaveDataListMap); + onlineExtendExecutorUtil.doBeforeUpdateWithRelationn(masterTable, masterData, slaveDataMap); this.update(masterTable, masterData); - if (slaveDataListMap == null) { - return; - } - String masterDataId = masterData.get(masterTable.getPrimaryKeyColumn().getColumnName()).toString(); - for (Map.Entry> relationEntry : slaveDataListMap.entrySet()) { - Long relationId = relationEntry.getKey().getRelationId(); - this.updateRelationData( - masterTable, masterData, masterDataId, datasourceId, relationId, relationEntry.getValue()); + if (slaveDataListMap != null) { + String masterDataId = masterData.get(masterTable.getPrimaryKeyColumn().getColumnName()).toString(); + for (Map.Entry> relationEntry : slaveDataListMap.entrySet()) { + Long relationId = relationEntry.getKey().getRelationId(); + this.updateRelationData( + masterTable, masterData, masterDataId, datasourceId, relationId, relationEntry.getValue()); + } } + onlineExtendExecutorUtil.doAfterUpdateWithRelationn(masterTable, masterData, slaveDataMap); } @MultiDatabaseWriteMethod @@ -296,6 +306,9 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { List filterList = this.makeDefaultFilter(table, table.getPrimaryKeyColumn(), dataId); String dataPermFilter = this.buildDataPermFilter(table); + OnlineColumn pkCol = table.getPrimaryKeyColumn(); + Object id = onlineOperationHelper.convertToTypeValue(pkCol, dataId); + onlineExtendExecutorUtil.doBeforeDelete(table, id); if (table.getLogicDeleteColumn() == null) { if (this.doDelete(table, filterList, dataPermFilter) != 1) { return false; @@ -304,6 +317,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { this.doLogicDelete(table, table.getPrimaryKeyColumn(), dataId, dataPermFilter); } if (CollUtil.isEmpty(relationList)) { + onlineExtendExecutorUtil.doAfterDelete(table, id); return true; } Map masterData = getMasterData(table, null, null, dataId); @@ -327,6 +341,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { this.doLogicDelete(slaveTable, slaveColumn, columnValue, null); } } + onlineExtendExecutorUtil.doAfterDelete(table, id); return true; } @@ -387,7 +402,9 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { this.buildVirtualColumn(resultList, table, toManyRelationList); } this.reformatResultListWithOneToOneRelation(resultList, oneToOneRelationList); - return resultList.get(0); + Map result = resultList.get(0); + onlineExtendExecutorUtil.doAfterSelectOne(table, result); + return result; } @Override @@ -402,7 +419,11 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { slaveTable, null, selectFields, filterList, dataPermFilter, null, null); List> resultList = pageData.getDataList(); this.buildDataListWithDict(resultList, slaveTable); - return CollUtil.isEmpty(resultList) ? null : resultList.get(0); + Map result = CollUtil.isEmpty(resultList) ? null : resultList.get(0); + if (result != null) { + onlineExtendExecutorUtil.doAfterSelectOne(slaveTable, result); + } + return result; } @Override @@ -414,6 +435,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { String orderBy, MyPageParam pageParam) { this.normalizeFilterList(table, oneToOneRelationList, filterList); + onlineExtendExecutorUtil.doBeforeSelectList(table, filterList); // 组件表关联数据。 List joinInfoList = this.makeJoinInfoList(table, oneToOneRelationList); // 拼接关联表的select fields字段。 @@ -433,6 +455,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { this.buildVirtualColumn(resultList, table, toManyRelationList); } this.reformatResultListWithOneToOneRelation(resultList, oneToOneRelationList); + onlineExtendExecutorUtil.doAfterSelectList(table, resultList); return pageData; } @@ -440,6 +463,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { public MyPageData> getSlaveDataList( OnlineDatasourceRelation relation, List filterList, String orderBy, MyPageParam pageParam) { OnlineTable slaveTable = relation.getSlaveTable(); + onlineExtendExecutorUtil.doBeforeSelectList(slaveTable, filterList); this.normalizeFilterList(slaveTable, null, filterList); // 拼接关联表的select fields字段。 String selectFields = this.makeSelectFields(slaveTable, null); @@ -447,6 +471,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { MyPageData> pageData = this.getList(slaveTable, null, selectFields, filterList, dataPermFilter, orderBy, pageParam); this.buildDataListWithDict(pageData.getDataList(), slaveTable); + onlineExtendExecutorUtil.doAfterSelectList(slaveTable, pageData.getDataList()); return pageData; } @@ -1232,6 +1257,18 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { return joinInfoList; } + private Map> convertToSlaveTableAndDataList( + Map> slaveDataListMap) { + Map> resultMap = MapUtil.newHashMap(); + if (slaveDataListMap == null) { + return resultMap; + } + for (Map.Entry> entry : slaveDataListMap.entrySet()) { + resultMap.put(entry.getKey().getSlaveTable(), entry.getValue()); + } + return resultMap; + } + private String makeSelectFields(OnlineTable table, String relationVariable) { DataSourceProvider provider = dataSourceUtil.getProvider(table.getDblinkId()); StringBuilder selectFieldBuider = new StringBuilder(512); diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineExtendExecutorUtil.java b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineExtendExecutorUtil.java new file mode 100644 index 00000000..49dd9268 --- /dev/null +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineExtendExecutorUtil.java @@ -0,0 +1,242 @@ +package com.orangeforms.common.online.util; + +import com.alibaba.fastjson.JSONObject; +import com.orangeforms.common.core.object.CallResult; +import com.orangeforms.common.core.util.ContextUtil; +import com.orangeforms.common.online.dto.OnlineFilterDto; +import com.orangeforms.common.online.exception.OnlineRuntimeException; +import com.orangeforms.common.online.model.OnlineTable; +import com.orangeforms.common.online.object.BaseOnlineExtendExecutor; +import com.orangeforms.common.online.service.OnlineTableService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * 在线表单后台扩展执行接口工具类。 + * + * @author Jerry + * @date 2024-04-15 + */ +@Slf4j +@Component +public class OnlineExtendExecutorUtil { + + @Autowired + private OnlineTableService onlineTableService; + @Autowired + private OnlineOperationHelper onlineOperationHelper; + + /** + * 设置后台扩展执行器到线程本地化对象。 + * + * @param e 后台扩展执行器。 + */ + public static void setOnlineExtendExecutorToLocal(BaseOnlineExtendExecutor e) { + ContextUtil.getHttpRequest().setAttribute(BaseOnlineExtendExecutor.class.getSimpleName(), e); + } + + /** + * 获取当前线程的后台扩展执行器。 + * + * @return 当前线程的后台扩展执行器。 + */ + public static BaseOnlineExtendExecutor getOnlineExtendExecutorFromLocal() { + return (BaseOnlineExtendExecutor) ContextUtil.getHttpRequest().getAttribute(BaseOnlineExtendExecutor.class.getSimpleName()); + } + + /** + * 执行插入前操作。 + * + * @param table 数据表对象。 + * @param data 表数据。 + */ + public void doBeforeInsert(OnlineTable table, JSONObject data) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeInsert(table, data); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 执行插入后操作。 + * + * @param table 数据表对象。 + * @param data 表数据。 + */ + public void doAfterInsert(OnlineTable table, JSONObject data) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterInsert(table, data); + } + } + + /** + * 主从表数据级联插入之前执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。 + */ + public void doBeforeInsertWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeInsertWithRelation(masterTable, masterData, slaveTableAndDataMap); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 主从表数据级联插入之后执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。 + */ + public void doAfterInsertWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterInsertWithRelation(masterTable, masterData, slaveTableAndDataMap); + } + } + + /** + * 表数据更新之前执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。 + */ + public void doBeforeUpdate(OnlineTable table, JSONObject data) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeUpdate(table, data); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 表数据更新之后执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。 + */ + public void doAfterUpdate(OnlineTable table, JSONObject data) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterUpdate(table, data); + } + } + + /** + * 主从表数据级联更新之前执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。 + */ + public void doBeforeUpdateWithRelationn( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeUpdateWithRelation(masterTable, masterData, slaveTableAndDataMap); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 主从表数据级联更新之后执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。 + */ + public void doAfterUpdateWithRelationn( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterUpdateWithRelation(masterTable, masterData, slaveTableAndDataMap); + } + } + + /** + * 表数据删除之前执行的操作。 + * + * @param table 表对象。 + * @param dataId 表数据主键Id。 + */ + public void doBeforeDelete(OnlineTable table, Object dataId) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeDelete(table, dataId); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 表数据删除之后执行的操作。 + * + * @param table 表对象。 + * @param dataId 表数据主键Id。 + */ + public void doAfterDelete(OnlineTable table, Object dataId) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterDelete(table, dataId); + } + } + + /** + * 表数据单条详情查询之后执行的操作。 + * + * @param table 表对象。 + * @param result 即将返回给前端的结果数据。 + */ + public void doAfterSelectOne(OnlineTable table, Map result) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterSelectOne(table, result); + } + } + + /** + * 表数据列表查询之前执行的操作。 + * + * @param table 表对象。 + * @param filterList 过滤条件,如果有新的过滤条件,可直接添加到该过滤列表。 + */ + public void doBeforeSelectList(OnlineTable table, List filterList) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.beforeSelectList(table, filterList); + } + } + + /** + * 表数据列表查询之后执行的操作。 + * + * @param table 表对象。 + * @param resultList 即将返回给前端的结果数据。 + */ + public void doAfterSelectList(OnlineTable table, List> resultList) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterSelectList(table, resultList); + } + } +} diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java index 4fe6a307..17a72f77 100644 --- a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java @@ -6,35 +6,40 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.orangeforms.common.core.cache.CacheConfig; import com.orangeforms.common.core.constant.ObjectFieldType; import com.orangeforms.common.core.constant.ErrorCodeEnum; +import com.orangeforms.common.core.exception.MyRuntimeException; import com.orangeforms.common.core.object.ResponseResult; import com.orangeforms.common.core.object.TokenData; import com.orangeforms.common.core.upload.BaseUpDownloader; import com.orangeforms.common.core.upload.UpDownloaderFactory; import com.orangeforms.common.core.upload.UploadResponseInfo; import com.orangeforms.common.core.upload.UploadStoreTypeEnum; +import com.orangeforms.common.core.util.ApplicationContextHolder; import com.orangeforms.common.online.config.OnlineProperties; -import com.orangeforms.common.online.model.OnlineColumn; -import com.orangeforms.common.online.model.OnlineDatasource; -import com.orangeforms.common.online.model.OnlineDatasourceRelation; -import com.orangeforms.common.online.model.OnlineTable; +import com.orangeforms.common.online.model.*; import com.orangeforms.common.online.model.constant.FieldKind; import com.orangeforms.common.online.model.constant.RelationType; +import com.orangeforms.common.online.object.BaseOnlineExtendExecutor; import com.orangeforms.common.online.object.ColumnData; -import com.orangeforms.common.online.service.OnlineDatasourceRelationService; -import com.orangeforms.common.online.service.OnlineDatasourceService; -import com.orangeforms.common.online.service.OnlineOperationService; -import com.orangeforms.common.online.service.OnlineTableService; +import com.orangeforms.common.online.object.OnlinePageExtra; +import com.orangeforms.common.online.service.*; import com.orangeforms.common.redis.cache.SessionCacheHelper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; import org.springframework.stereotype.Component; +import org.springframework.util.Assert; import org.springframework.web.multipart.MultipartFile; import jakarta.servlet.http.HttpServletResponse; + +import jakarta.annotation.Resource; import java.io.Serializable; import java.io.IOException; import java.util.*; @@ -57,6 +62,8 @@ public class OnlineOperationHelper { @Autowired private OnlineTableService onlineTableService; @Autowired + private OnlinePageService onlinePageService; + @Autowired private OnlineOperationService onlineOperationService; @Autowired private OnlineProperties onlineProperties; @@ -64,6 +71,8 @@ public class OnlineOperationHelper { private UpDownloaderFactory upDownloaderFactory; @Autowired private SessionCacheHelper cacheHelper; + @Resource(name = "caffeineCacheManager") + private CacheManager cacheManager; /** * 验证并获取数据源数据。 @@ -361,6 +370,37 @@ public class OnlineOperationHelper { ResponseResult.output(ResponseResult.success(responseInfo)); } + /** + * 将与指定数据源Id关联的OnlinePage对象中,配置的在线表单后台扩展执行器对象写入本地现成。 + * + * @param datasourceId 数据源Id。 + */ + public void enableOnlineExtendExecutor(Long datasourceId) { + Cache cache = cacheManager.getCache(CacheConfig.CacheEnum.ONLINE_EXTEND_EXECUTOR_CACHE.name()); + Assert.notNull(cache, "Cache ONLINE_EXTEND_EXECUTOR_CACHE can't be NULL"); + BaseOnlineExtendExecutor executor = cache.get(datasourceId, BaseOnlineExtendExecutor.class); + if (executor != null) { + OnlineExtendExecutorUtil.setOnlineExtendExecutorToLocal(executor); + } + OnlinePage page = onlinePageService.getOnlinePageListByDatasourceId(datasourceId).get(0); + if (StrUtil.isNotBlank(page.getExtraJson())) { + OnlinePageExtra pageExtra = JSON.parseObject(page.getExtraJson(), OnlinePageExtra.class); + if (StrUtil.isNotBlank(pageExtra.getExtendClass())) { + try { + Object extendClass = ApplicationContextHolder.getBean(Class.forName(pageExtra.getExtendClass())); + if (!(extendClass instanceof BaseOnlineExtendExecutor)) { + throw new MyRuntimeException("在线表单扩展类没有实现 [BaseOnlineExtendExecutor] 接口!"); + } + executor = (BaseOnlineExtendExecutor) extendClass; + } catch (ClassNotFoundException e) { + throw new MyRuntimeException("在线表单扩展类没有实现 [BaseOnlineExtendExecutor] 接口!"); + } + } + } + cache.put(datasourceId, executor); + OnlineExtendExecutorUtil.setOnlineExtendExecutorToLocal(executor); + } + private ResponseResult doVerifyUpDownloadFileColumn( OnlineTable table, String fieldName, Boolean asImage) { OnlineColumn column = this.getOnlineColumnByName(table, fieldName); diff --git a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/vo/OnlinePageVo.java b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/vo/OnlinePageVo.java index bd80de12..13b1c277 100644 --- a/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/vo/OnlinePageVo.java +++ b/OrangeFormsOpen-MybatisFlex/common/common-online/src/main/java/com/orangeforms/common/online/vo/OnlinePageVo.java @@ -46,6 +46,12 @@ public class OnlinePageVo { @Schema(description = "页面类型") private Integer pageType; + /** + * 扩展数据。 + */ + @Schema(description = "扩展数据") + private String extraJson; + /** * 页面编辑状态。 */ diff --git a/OrangeFormsOpen-MybatisFlex/zz-resource/db-scripts/zzdemo-online-open.sql b/OrangeFormsOpen-MybatisFlex/zz-resource/db-scripts/zzdemo-online-open.sql index dac5f5c1..13226282 100644 --- a/OrangeFormsOpen-MybatisFlex/zz-resource/db-scripts/zzdemo-online-open.sql +++ b/OrangeFormsOpen-MybatisFlex/zz-resource/db-scripts/zzdemo-online-open.sql @@ -1,19 +1,3 @@ -/* - Navicat Premium Data Transfer - - Source Server : hw-test - Source Server Type : MySQL - Source Server Version : 80024 - Source Host : localhost:3306 - Source Schema : zzdemo-online-open - - Target Server Type : MySQL - Target Server Version : 80024 - File Encoding : 65001 - - Date: 05/07/2024 22:26:38 -*/ - SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; @@ -1896,6 +1880,7 @@ CREATE TABLE `zz_online_page` ( `page_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '页面编码', `page_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '页面名称', `page_type` int NOT NULL COMMENT '页面类型', + `extra_json` varchar(2048) COLLATE utf8mb4_bin COMMENT '扩展数据', `status` int NOT NULL COMMENT '页面编辑状态', `published` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否发布', `create_time` datetime NOT NULL COMMENT '创建时间', diff --git a/OrangeFormsOpen-MybatisPlus/common/common-core/src/main/java/com/orangeforms/common/core/cache/CacheConfig.java b/OrangeFormsOpen-MybatisPlus/common/common-core/src/main/java/com/orangeforms/common/core/cache/CacheConfig.java index 203eafd1..6a0f1764 100644 --- a/OrangeFormsOpen-MybatisPlus/common/common-core/src/main/java/com/orangeforms/common/core/cache/CacheConfig.java +++ b/OrangeFormsOpen-MybatisPlus/common/common-core/src/main/java/com/orangeforms/common/core/cache/CacheConfig.java @@ -53,6 +53,10 @@ public class CacheConfig { * 在线表单组件渲染数据缓存。 */ ONLINE_FORM_RENDER_CACCHE(300, 100), + /** + * 在线表单扩展执行器对象的缓存。 + */ + ONLINE_EXTEND_EXECUTOR_CACHE(300, 100), /** * 报表表单组件渲染数据缓存。 */ diff --git a/OrangeFormsOpen-MybatisPlus/common/common-flow-online/src/main/java/com/orangeforms/common/flow/online/controller/FlowOnlineOperationController.java b/OrangeFormsOpen-MybatisPlus/common/common-flow-online/src/main/java/com/orangeforms/common/flow/online/controller/FlowOnlineOperationController.java index 94dbf0c1..44badcfa 100644 --- a/OrangeFormsOpen-MybatisPlus/common/common-flow-online/src/main/java/com/orangeforms/common/flow/online/controller/FlowOnlineOperationController.java +++ b/OrangeFormsOpen-MybatisPlus/common/common-flow-online/src/main/java/com/orangeforms/common/flow/online/controller/FlowOnlineOperationController.java @@ -269,6 +269,7 @@ public class FlowOnlineOperationController { } taskVariableData.put(FlowConstant.COPY_DATA_KEY, copyData); } + onlineOperationHelper.enableOnlineExtendExecutor(datasource.getDatasourceId()); FlowTaskComment flowTaskComment = BeanUtil.copyProperties(flowTaskCommentDto, FlowTaskComment.class); if (StrUtil.isBlank(dataId)) { return this.submitNewTask(processInstanceId, taskId, @@ -660,6 +661,7 @@ public class FlowOnlineOperationController { taskVariableData.put(FlowConstant.COPY_DATA_KEY, copyData); } FlowTaskComment flowTaskComment = BeanUtil.copyProperties(flowTaskCommentDto, FlowTaskComment.class); + onlineOperationHelper.enableOnlineExtendExecutor(datasource.getDatasourceId()); // 保存在线表单提交的数据,同时启动流程和自动完成第一个用户任务。 if (slaveData == null) { flowOnlineOperationService.saveNewAndStartProcess( @@ -853,6 +855,7 @@ public class FlowOnlineOperationController { private JSONObject buildUserTaskData( String businessKey, OnlineDatasource datasource, List relationList) { + onlineOperationHelper.enableOnlineExtendExecutor(datasource.getDatasourceId()); OnlineTable masterTable = datasource.getMasterTable(); JSONObject jsonData = new JSONObject(); List oneToOneRelationList = relationList.stream() diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java index 92638650..cbbd8b98 100644 --- a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java @@ -111,6 +111,7 @@ public class OnlineOperationController { return ResponseResult.error(ErrorCodeEnum.NO_OPERATION_PERMISSION); } OnlineTable masterTable = datasource.getMasterTable(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); if (slaveData == null) { onlineOperationService.saveNew(masterTable, masterData); } else { @@ -146,8 +147,8 @@ public class OnlineOperationController { if (!verifyResult.isSuccess()) { return ResponseResult.errorFrom(verifyResult); } - OnlineDatasourceRelation relation = verifyResult.getData(); - onlineOperationService.saveNew(relation.getSlaveTable(), slaveData); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); + onlineOperationService.saveNew(verifyResult.getData().getSlaveTable(), slaveData); return ResponseResult.success(); } @@ -179,6 +180,7 @@ public class OnlineOperationController { return ResponseResult.error(ErrorCodeEnum.NO_OPERATION_PERMISSION); } OnlineTable masterTable = datasource.getMasterTable(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); if (slaveData == null) { if (!onlineOperationService.update(masterTable, masterData)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); @@ -218,6 +220,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(verifyResult); } OnlineTable slaveTable = verifyResult.getData().getSlaveTable(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); if (!onlineOperationService.update(slaveTable, slaveData)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); } @@ -329,6 +332,7 @@ public class OnlineOperationController { List allRelationList = relationListResult.getData(); List oneToOneRelationList = allRelationList.stream() .filter(r -> r.getRelationType().equals(RelationType.ONE_TO_ONE)).collect(Collectors.toList()); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); Map result = onlineOperationService.getMasterData( datasource.getMasterTable(), oneToOneRelationList, allRelationList, dataId); return ResponseResult.success(result); @@ -355,6 +359,7 @@ public class OnlineOperationController { if (!verifyResult.isSuccess()) { return ResponseResult.errorFrom(verifyResult); } + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); Map result = onlineOperationService.getSlaveData(verifyResult.getData(), dataId); return ResponseResult.success(result); } @@ -547,6 +552,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(orderByResult); } String orderBy = orderByResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); MyPageData> pageData = onlineOperationService.getMasterDataList( masterTable, oneToOneRelationList, allRelationList, filterDtoList, orderBy, pageParam); return ResponseResult.success(pageData); @@ -606,6 +612,7 @@ public class OnlineOperationController { ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, orderByResult); } String orderBy = orderByResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); MyPageData> pageData = onlineOperationService.getMasterDataList( masterTable, oneToOneRelationList, allRelationList, filterDtoList, orderBy, null); Map headerMap = this.makeExportHeaderMap(masterTable, allRelationList, exportInfoList); @@ -664,6 +671,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(orderByResult); } String orderBy = orderByResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); MyPageData> pageData = onlineOperationService.getSlaveDataList(relation, filterDtoList, orderBy, pageParam); return ResponseResult.success(pageData); @@ -716,6 +724,7 @@ public class OnlineOperationController { return; } String orderBy = orderByResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); MyPageData> pageData = onlineOperationService.getSlaveDataList(relation, filterDtoList, orderBy, null); Map headerMap = @@ -813,6 +822,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(relationListResult); } List relationList = relationListResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); for (String dataId : dataIdList) { if (!onlineOperationService.delete(masterTable, relationList, dataId)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); @@ -829,6 +839,7 @@ public class OnlineOperationController { return ResponseResult.errorFrom(verifyResult); } OnlineDatasourceRelation relation = verifyResult.getData(); + onlineOperationHelper.enableOnlineExtendExecutor(datasourceId); for (String dataId : dataIdList) { if (!onlineOperationService.delete(relation.getSlaveTable(), null, dataId)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml index 86aeeb21..0df7cd33 100644 --- a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml @@ -8,6 +8,7 @@ + @@ -61,10 +62,10 @@ diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/dto/OnlinePageDto.java b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/dto/OnlinePageDto.java index 309c3bf4..a614727e 100644 --- a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/dto/OnlinePageDto.java +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/dto/OnlinePageDto.java @@ -48,6 +48,12 @@ public class OnlinePageDto { @ConstDictRef(constDictClass = PageType.class, message = "数据验证失败,页面类型为无效值!") private Integer pageType; + /** + * 扩展数据。 + */ + @Schema(description = "扩展数据") + private String extraJson; + /** * 页面编辑状态。 */ diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/model/OnlinePage.java b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/model/OnlinePage.java index f39e9448..1fedd36f 100644 --- a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/model/OnlinePage.java +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/model/OnlinePage.java @@ -55,6 +55,12 @@ public class OnlinePage { @TableField(value = "page_type") private Integer pageType; + /** + * 扩展数据。 + */ + @TableField(value = "extra_json") + private String extraJson; + /** * 页面编辑状态。 */ diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/object/BaseOnlineExtendExecutor.java b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/object/BaseOnlineExtendExecutor.java new file mode 100644 index 00000000..3561409b --- /dev/null +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/object/BaseOnlineExtendExecutor.java @@ -0,0 +1,157 @@ +package com.orangeforms.common.online.object; + +import com.alibaba.fastjson.JSONObject; +import com.orangeforms.common.core.object.CallResult; +import com.orangeforms.common.online.dto.OnlineFilterDto; +import com.orangeforms.common.online.model.OnlineTable; + +import java.util.List; +import java.util.Map; + +/** + * 在线表单后台扩展可执行接口,所有在线表单的后台扩展类都需要继承该接口。 + * + * @author Jerry + * @date 2024-04-15 + */ +public class BaseOnlineExtendExecutor { + + /** + * 主从表数据级联插入之前执行的操作。通常可以做一些数据插入之前的验证操作,或者是对待插入的数据,根据需要进行调整和计算。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。key是字段名,value是字段值。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。key是关联从表对象。 + * value是关联的从表数据列表。value是JSONObject对象列表,每个JSONObject的key是从表字段名,value是从表字段值。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeInsertWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + return CallResult.ok(); + } + + /** + * 主从表数据级联插入之后执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。key是字段名,value是字段值。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。key是关联从表对象。 + * value是关联的从表数据列表。value是JSONObject对象列表,每个JSONObject的key是从表字段名,value是从表字段值。 + */ + public void afterInsertWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + } + + /** + * 表数据插入之前执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。key是字段名,value是字段值。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeInsert(OnlineTable table, JSONObject data) { + return CallResult.ok(); + } + + /** + * 表数据插入之后执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。key是字段名,value是字段值。 + */ + public void afterInsert(OnlineTable table, JSONObject data) { + } + + /** + * 主从表数据级联更新之前执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。key是字段名,value是字段值。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。key是关联从表对象。 + * value是关联的从表数据列表。value是JSONObject对象列表,每个JSONObject的key是从表字段名,value是从表字段值。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeUpdateWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + return CallResult.ok(); + } + + /** + * 主从表数据级联更新之后执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。key是字段名,value是字段值。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。key是关联从表对象。 + * value是关联的从表数据列表。value是JSONObject对象列表,每个JSONObject的key是从表字段名,value是从表字段值。 + */ + public void afterUpdateWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + } + + /** + * 表数据更新之前执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。key是字段名,value是字段值。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeUpdate(OnlineTable table, JSONObject data) { + return CallResult.ok(); + } + + /** + * 表数据更新之后执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。key是字段名,value是字段值。 + */ + public void afterUpdate(OnlineTable table, JSONObject data) { + } + + /** + * 表数据删除之前执行的操作。 + * + * @param table 表对象。 + * @param dataId 表数据主键Id。对象类型和实际字段值类型一致。 + * @return 返回调用结果对象,成功则继续执行,否则调用时会抛出异常,异常信息为具体的错误信息。 + */ + public CallResult beforeDelete(OnlineTable table, Object dataId) { + return CallResult.ok(); + } + + /** + * 表数据删除之后执行的操作。 + * + * @param table 表对象。 + * @param dataId 表数据主键Id。对象类型和实际字段值类型一致。 + */ + public void afterDelete(OnlineTable table, Object dataId) { + } + + /** + * 表数据列表查询之前执行的操作。 + * + * @param table 表对象。 + * @param filterList 过滤条件。如果有新的过滤条件,可直接添加到该过滤列表。 + */ + public void beforeSelectList(OnlineTable table, List filterList) { + } + + /** + * 表数据列表查询之后执行的操作。 + * + * @param table 表对象。 + * @param resultList 查询结果。如果有修改,可直接在当前参数修改后即可生效。 + */ + public void afterSelectList(OnlineTable table, List> resultList) { + } + + /** + * 表数据单条详情查询之后执行的操作。 + * + * @param table 表对象。 + * @param result 查询结果。如果有修改,可直接在当前参数修改后即可生效。 + */ + public void afterSelectOne(OnlineTable table, Map result) { + } +} diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/object/OnlinePageExtra.java b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/object/OnlinePageExtra.java new file mode 100644 index 00000000..e150b815 --- /dev/null +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/object/OnlinePageExtra.java @@ -0,0 +1,18 @@ +package com.orangeforms.common.online.object; + +import lombok.Data; + +/** + * 在线表单页面的扩展数据对象。 + * + * @author Jerry + * @date 2024-04-15 + */ +@Data +public class OnlinePageExtra { + + /** + * 后台扩展类。 + */ + private String extendClass; +} diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java index 8dde618f..980e7697 100644 --- a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java @@ -97,6 +97,8 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { private CacheManager cacheManager; @Autowired private OnlineDataSourceUtil dataSourceUtil; + @Autowired + private OnlineExtendExecutorUtil onlineExtendExecutorUtil; private static final String DICT_MAP_SUFFIX = "DictMap"; private static final String DICT_MAP_LIST_SUFFIX = "DictMapList"; @@ -150,7 +152,9 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { } } } + onlineExtendExecutorUtil.doBeforeInsert(table, data); onlineOperationMapper.insert(table.getTableName(), columnNames, columnValueList); + onlineExtendExecutorUtil.doAfterInsert(table, data); return id; } @@ -161,25 +165,27 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { OnlineTable masterTable, JSONObject masterData, Map> slaveDataListMap) { + Map> slaveDataMap = this.convertToSlaveTableAndDataList(slaveDataListMap); + onlineExtendExecutorUtil.doBeforeInsertWithRelation(masterTable, masterData, slaveDataMap); Object id = this.saveNew(masterTable, masterData); - if (slaveDataListMap == null) { - return id; - } - // 迭代多个关联列表。 - for (Map.Entry> entry : slaveDataListMap.entrySet()) { - Long masterColumnId = entry.getKey().getMasterColumnId(); - OnlineColumn masterColumn = masterTable.getColumnMap().get(masterColumnId); - Object columnValue = masterData.get(masterColumn.getColumnName()); - OnlineTable slaveTable = entry.getKey().getSlaveTable(); - OnlineColumn slaveColumn = slaveTable.getColumnMap().get(entry.getKey().getSlaveColumnId()); - // 迭代关联中的数据集合 - for (JSONObject slaveData : entry.getValue()) { - if (!slaveData.containsKey(slaveTable.getPrimaryKeyColumn().getColumnName())) { - slaveData.put(slaveColumn.getColumnName(), columnValue); - this.saveNew(slaveTable, slaveData); + if (slaveDataListMap != null) { + // 迭代多个关联列表。 + for (Map.Entry> entry : slaveDataListMap.entrySet()) { + Long masterColumnId = entry.getKey().getMasterColumnId(); + OnlineColumn masterColumn = masterTable.getColumnMap().get(masterColumnId); + Object columnValue = masterData.get(masterColumn.getColumnName()); + OnlineTable slaveTable = entry.getKey().getSlaveTable(); + OnlineColumn slaveColumn = slaveTable.getColumnMap().get(entry.getKey().getSlaveColumnId()); + // 迭代关联中的数据集合 + for (JSONObject slaveData : entry.getValue()) { + if (!slaveData.containsKey(slaveTable.getPrimaryKeyColumn().getColumnName())) { + slaveData.put(slaveColumn.getColumnName(), columnValue); + this.saveNew(slaveTable, slaveData); + } } } } + onlineExtendExecutorUtil.doAfterInsertWithRelation(masterTable, masterData, slaveDataMap); return id; } @@ -221,7 +227,10 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { return true; } String dataPermFilter = this.buildDataPermFilter(table); - return this.doUpdate(table, updateColumnList, filterList, dataPermFilter); + onlineExtendExecutorUtil.doBeforeUpdate(table, data); + boolean r = this.doUpdate(table, updateColumnList, filterList, dataPermFilter); + onlineExtendExecutorUtil.doAfterUpdate(table, data); + return r; } @MultiDatabaseWriteMethod @@ -246,16 +255,18 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { JSONObject masterData, Long datasourceId, Map> slaveDataListMap) { + Map> slaveDataMap = this.convertToSlaveTableAndDataList(slaveDataListMap); + onlineExtendExecutorUtil.doBeforeUpdateWithRelationn(masterTable, masterData, slaveDataMap); this.update(masterTable, masterData); - if (slaveDataListMap == null) { - return; - } - String masterDataId = masterData.get(masterTable.getPrimaryKeyColumn().getColumnName()).toString(); - for (Map.Entry> relationEntry : slaveDataListMap.entrySet()) { - Long relationId = relationEntry.getKey().getRelationId(); - this.updateRelationData( - masterTable, masterData, masterDataId, datasourceId, relationId, relationEntry.getValue()); + if (slaveDataListMap != null) { + String masterDataId = masterData.get(masterTable.getPrimaryKeyColumn().getColumnName()).toString(); + for (Map.Entry> relationEntry : slaveDataListMap.entrySet()) { + Long relationId = relationEntry.getKey().getRelationId(); + this.updateRelationData( + masterTable, masterData, masterDataId, datasourceId, relationId, relationEntry.getValue()); + } } + onlineExtendExecutorUtil.doAfterUpdateWithRelationn(masterTable, masterData, slaveDataMap); } @MultiDatabaseWriteMethod @@ -298,6 +309,9 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { List filterList = this.makeDefaultFilter(table, table.getPrimaryKeyColumn(), dataId); String dataPermFilter = this.buildDataPermFilter(table); + OnlineColumn pkCol = table.getPrimaryKeyColumn(); + Object id = onlineOperationHelper.convertToTypeValue(pkCol, dataId); + onlineExtendExecutorUtil.doBeforeDelete(table, id); if (table.getLogicDeleteColumn() == null) { if (this.doDelete(table, filterList, dataPermFilter) != 1) { return false; @@ -306,6 +320,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { this.doLogicDelete(table, table.getPrimaryKeyColumn(), dataId, dataPermFilter); } if (CollUtil.isEmpty(relationList)) { + onlineExtendExecutorUtil.doAfterDelete(table, id); return true; } Map masterData = getMasterData(table, null, null, dataId); @@ -329,6 +344,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { this.doLogicDelete(slaveTable, slaveColumn, columnValue, null); } } + onlineExtendExecutorUtil.doAfterDelete(table, id); return true; } @@ -389,7 +405,9 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { this.buildVirtualColumn(resultList, table, toManyRelationList); } this.reformatResultListWithOneToOneRelation(resultList, oneToOneRelationList); - return resultList.get(0); + Map result = resultList.get(0); + onlineExtendExecutorUtil.doAfterSelectOne(table, result); + return result; } @Override @@ -404,7 +422,11 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { slaveTable, null, selectFields, filterList, dataPermFilter, null, null); List> resultList = pageData.getDataList(); this.buildDataListWithDict(resultList, slaveTable); - return CollUtil.isEmpty(resultList) ? null : resultList.get(0); + Map result = CollUtil.isEmpty(resultList) ? null : resultList.get(0); + if (result != null) { + onlineExtendExecutorUtil.doAfterSelectOne(slaveTable, result); + } + return result; } @Override @@ -416,6 +438,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { String orderBy, MyPageParam pageParam) { this.normalizeFilterList(table, oneToOneRelationList, filterList); + onlineExtendExecutorUtil.doBeforeSelectList(table, filterList); // 组件表关联数据。 List joinInfoList = this.makeJoinInfoList(table, oneToOneRelationList); // 拼接关联表的select fields字段。 @@ -435,6 +458,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { this.buildVirtualColumn(resultList, table, toManyRelationList); } this.reformatResultListWithOneToOneRelation(resultList, oneToOneRelationList); + onlineExtendExecutorUtil.doAfterSelectList(table, resultList); return pageData; } @@ -442,6 +466,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { public MyPageData> getSlaveDataList( OnlineDatasourceRelation relation, List filterList, String orderBy, MyPageParam pageParam) { OnlineTable slaveTable = relation.getSlaveTable(); + onlineExtendExecutorUtil.doBeforeSelectList(slaveTable, filterList); this.normalizeFilterList(slaveTable, null, filterList); // 拼接关联表的select fields字段。 String selectFields = this.makeSelectFields(slaveTable, null); @@ -449,6 +474,7 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { MyPageData> pageData = this.getList(slaveTable, null, selectFields, filterList, dataPermFilter, orderBy, pageParam); this.buildDataListWithDict(pageData.getDataList(), slaveTable); + onlineExtendExecutorUtil.doAfterSelectList(slaveTable, pageData.getDataList()); return pageData; } @@ -1234,6 +1260,18 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { return joinInfoList; } + private Map> convertToSlaveTableAndDataList( + Map> slaveDataListMap) { + Map> resultMap = MapUtil.newHashMap(); + if (slaveDataListMap == null) { + return resultMap; + } + for (Map.Entry> entry : slaveDataListMap.entrySet()) { + resultMap.put(entry.getKey().getSlaveTable(), entry.getValue()); + } + return resultMap; + } + private String makeSelectFields(OnlineTable table, String relationVariable) { DataSourceProvider provider = dataSourceUtil.getProvider(table.getDblinkId()); StringBuilder selectFieldBuider = new StringBuilder(512); diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineExtendExecutorUtil.java b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineExtendExecutorUtil.java new file mode 100644 index 00000000..49dd9268 --- /dev/null +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineExtendExecutorUtil.java @@ -0,0 +1,242 @@ +package com.orangeforms.common.online.util; + +import com.alibaba.fastjson.JSONObject; +import com.orangeforms.common.core.object.CallResult; +import com.orangeforms.common.core.util.ContextUtil; +import com.orangeforms.common.online.dto.OnlineFilterDto; +import com.orangeforms.common.online.exception.OnlineRuntimeException; +import com.orangeforms.common.online.model.OnlineTable; +import com.orangeforms.common.online.object.BaseOnlineExtendExecutor; +import com.orangeforms.common.online.service.OnlineTableService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * 在线表单后台扩展执行接口工具类。 + * + * @author Jerry + * @date 2024-04-15 + */ +@Slf4j +@Component +public class OnlineExtendExecutorUtil { + + @Autowired + private OnlineTableService onlineTableService; + @Autowired + private OnlineOperationHelper onlineOperationHelper; + + /** + * 设置后台扩展执行器到线程本地化对象。 + * + * @param e 后台扩展执行器。 + */ + public static void setOnlineExtendExecutorToLocal(BaseOnlineExtendExecutor e) { + ContextUtil.getHttpRequest().setAttribute(BaseOnlineExtendExecutor.class.getSimpleName(), e); + } + + /** + * 获取当前线程的后台扩展执行器。 + * + * @return 当前线程的后台扩展执行器。 + */ + public static BaseOnlineExtendExecutor getOnlineExtendExecutorFromLocal() { + return (BaseOnlineExtendExecutor) ContextUtil.getHttpRequest().getAttribute(BaseOnlineExtendExecutor.class.getSimpleName()); + } + + /** + * 执行插入前操作。 + * + * @param table 数据表对象。 + * @param data 表数据。 + */ + public void doBeforeInsert(OnlineTable table, JSONObject data) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeInsert(table, data); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 执行插入后操作。 + * + * @param table 数据表对象。 + * @param data 表数据。 + */ + public void doAfterInsert(OnlineTable table, JSONObject data) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterInsert(table, data); + } + } + + /** + * 主从表数据级联插入之前执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。 + */ + public void doBeforeInsertWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeInsertWithRelation(masterTable, masterData, slaveTableAndDataMap); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 主从表数据级联插入之后执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。 + */ + public void doAfterInsertWithRelation( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterInsertWithRelation(masterTable, masterData, slaveTableAndDataMap); + } + } + + /** + * 表数据更新之前执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。 + */ + public void doBeforeUpdate(OnlineTable table, JSONObject data) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeUpdate(table, data); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 表数据更新之后执行的操作。 + * + * @param table 表对象。 + * @param data 表数据。 + */ + public void doAfterUpdate(OnlineTable table, JSONObject data) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterUpdate(table, data); + } + } + + /** + * 主从表数据级联更新之前执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。 + */ + public void doBeforeUpdateWithRelationn( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeUpdateWithRelation(masterTable, masterData, slaveTableAndDataMap); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 主从表数据级联更新之后执行的操作。 + * + * @param masterTable 主表对象。 + * @param masterData 主表数据。 + * @param slaveTableAndDataMap 从表对象和数据的映射关系。 + */ + public void doAfterUpdateWithRelationn( + OnlineTable masterTable, JSONObject masterData, Map> slaveTableAndDataMap) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterUpdateWithRelation(masterTable, masterData, slaveTableAndDataMap); + } + } + + /** + * 表数据删除之前执行的操作。 + * + * @param table 表对象。 + * @param dataId 表数据主键Id。 + */ + public void doBeforeDelete(OnlineTable table, Object dataId) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + CallResult r = executor.beforeDelete(table, dataId); + if (!r.isSuccess()) { + throw new OnlineRuntimeException(r.getErrorMessage()); + } + } + } + + /** + * 表数据删除之后执行的操作。 + * + * @param table 表对象。 + * @param dataId 表数据主键Id。 + */ + public void doAfterDelete(OnlineTable table, Object dataId) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterDelete(table, dataId); + } + } + + /** + * 表数据单条详情查询之后执行的操作。 + * + * @param table 表对象。 + * @param result 即将返回给前端的结果数据。 + */ + public void doAfterSelectOne(OnlineTable table, Map result) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterSelectOne(table, result); + } + } + + /** + * 表数据列表查询之前执行的操作。 + * + * @param table 表对象。 + * @param filterList 过滤条件,如果有新的过滤条件,可直接添加到该过滤列表。 + */ + public void doBeforeSelectList(OnlineTable table, List filterList) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.beforeSelectList(table, filterList); + } + } + + /** + * 表数据列表查询之后执行的操作。 + * + * @param table 表对象。 + * @param resultList 即将返回给前端的结果数据。 + */ + public void doAfterSelectList(OnlineTable table, List> resultList) { + BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal(); + if (executor != null) { + executor.afterSelectList(table, resultList); + } + } +} diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java index c0013375..00f84a14 100644 --- a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java @@ -6,35 +6,39 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.orangeforms.common.core.cache.CacheConfig; import com.orangeforms.common.core.constant.ErrorCodeEnum; import com.orangeforms.common.core.constant.ObjectFieldType; +import com.orangeforms.common.core.exception.MyRuntimeException; import com.orangeforms.common.core.object.ResponseResult; import com.orangeforms.common.core.object.TokenData; import com.orangeforms.common.core.upload.BaseUpDownloader; import com.orangeforms.common.core.upload.UpDownloaderFactory; import com.orangeforms.common.core.upload.UploadResponseInfo; import com.orangeforms.common.core.upload.UploadStoreTypeEnum; +import com.orangeforms.common.core.util.ApplicationContextHolder; import com.orangeforms.common.online.config.OnlineProperties; -import com.orangeforms.common.online.model.OnlineColumn; -import com.orangeforms.common.online.model.OnlineDatasource; -import com.orangeforms.common.online.model.OnlineDatasourceRelation; -import com.orangeforms.common.online.model.OnlineTable; +import com.orangeforms.common.online.model.*; import com.orangeforms.common.online.model.constant.FieldKind; import com.orangeforms.common.online.model.constant.RelationType; +import com.orangeforms.common.online.object.BaseOnlineExtendExecutor; import com.orangeforms.common.online.object.ColumnData; -import com.orangeforms.common.online.service.OnlineDatasourceRelationService; -import com.orangeforms.common.online.service.OnlineDatasourceService; -import com.orangeforms.common.online.service.OnlineOperationService; -import com.orangeforms.common.online.service.OnlineTableService; +import com.orangeforms.common.online.object.OnlinePageExtra; +import com.orangeforms.common.online.service.*; import com.orangeforms.common.redis.cache.SessionCacheHelper; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; import org.springframework.stereotype.Component; +import org.springframework.util.Assert; import org.springframework.web.multipart.MultipartFile; +import jakarta.annotation.Resource; import java.io.IOException; import java.io.Serializable; import java.util.*; @@ -57,6 +61,8 @@ public class OnlineOperationHelper { @Autowired private OnlineTableService onlineTableService; @Autowired + private OnlinePageService onlinePageService; + @Autowired private OnlineOperationService onlineOperationService; @Autowired private OnlineProperties onlineProperties; @@ -64,6 +70,8 @@ public class OnlineOperationHelper { private UpDownloaderFactory upDownloaderFactory; @Autowired private SessionCacheHelper cacheHelper; + @Resource(name = "caffeineCacheManager") + private CacheManager cacheManager; /** * 验证并获取数据源数据。 @@ -361,6 +369,37 @@ public class OnlineOperationHelper { ResponseResult.output(ResponseResult.success(responseInfo)); } + /** + * 将与指定数据源Id关联的OnlinePage对象中,配置的在线表单后台扩展执行器对象写入本地现成。 + * + * @param datasourceId 数据源Id。 + */ + public void enableOnlineExtendExecutor(Long datasourceId) { + Cache cache = cacheManager.getCache(CacheConfig.CacheEnum.ONLINE_EXTEND_EXECUTOR_CACHE.name()); + Assert.notNull(cache, "Cache ONLINE_EXTEND_EXECUTOR_CACHE can't be NULL"); + BaseOnlineExtendExecutor executor = cache.get(datasourceId, BaseOnlineExtendExecutor.class); + if (executor != null) { + OnlineExtendExecutorUtil.setOnlineExtendExecutorToLocal(executor); + } + OnlinePage page = onlinePageService.getOnlinePageListByDatasourceId(datasourceId).get(0); + if (StrUtil.isNotBlank(page.getExtraJson())) { + OnlinePageExtra pageExtra = JSON.parseObject(page.getExtraJson(), OnlinePageExtra.class); + if (StrUtil.isNotBlank(pageExtra.getExtendClass())) { + try { + Object extendClass = ApplicationContextHolder.getBean(Class.forName(pageExtra.getExtendClass())); + if (!(extendClass instanceof BaseOnlineExtendExecutor)) { + throw new MyRuntimeException("在线表单扩展类没有实现 [BaseOnlineExtendExecutor] 接口!"); + } + executor = (BaseOnlineExtendExecutor) extendClass; + } catch (ClassNotFoundException e) { + throw new MyRuntimeException("在线表单扩展类没有实现 [BaseOnlineExtendExecutor] 接口!"); + } + } + } + cache.put(datasourceId, executor); + OnlineExtendExecutorUtil.setOnlineExtendExecutorToLocal(executor); + } + private ResponseResult doVerifyUpDownloadFileColumn( OnlineTable table, String fieldName, Boolean asImage) { OnlineColumn column = this.getOnlineColumnByName(table, fieldName); diff --git a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/vo/OnlinePageVo.java b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/vo/OnlinePageVo.java index bd80de12..13b1c277 100644 --- a/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/vo/OnlinePageVo.java +++ b/OrangeFormsOpen-MybatisPlus/common/common-online/src/main/java/com/orangeforms/common/online/vo/OnlinePageVo.java @@ -46,6 +46,12 @@ public class OnlinePageVo { @Schema(description = "页面类型") private Integer pageType; + /** + * 扩展数据。 + */ + @Schema(description = "扩展数据") + private String extraJson; + /** * 页面编辑状态。 */ diff --git a/OrangeFormsOpen-MybatisPlus/zz-resource/db-scripts/zzdemo-online-open.sql b/OrangeFormsOpen-MybatisPlus/zz-resource/db-scripts/zzdemo-online-open.sql index dac5f5c1..13226282 100644 --- a/OrangeFormsOpen-MybatisPlus/zz-resource/db-scripts/zzdemo-online-open.sql +++ b/OrangeFormsOpen-MybatisPlus/zz-resource/db-scripts/zzdemo-online-open.sql @@ -1,19 +1,3 @@ -/* - Navicat Premium Data Transfer - - Source Server : hw-test - Source Server Type : MySQL - Source Server Version : 80024 - Source Host : localhost:3306 - Source Schema : zzdemo-online-open - - Target Server Type : MySQL - Target Server Version : 80024 - File Encoding : 65001 - - Date: 05/07/2024 22:26:38 -*/ - SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; @@ -1896,6 +1880,7 @@ CREATE TABLE `zz_online_page` ( `page_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '页面编码', `page_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '页面名称', `page_type` int NOT NULL COMMENT '页面类型', + `extra_json` varchar(2048) COLLATE utf8mb4_bin COMMENT '扩展数据', `status` int NOT NULL COMMENT '页面编辑状态', `published` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否发布', `create_time` datetime NOT NULL COMMENT '创建时间',