commit:支持后台扩展类

This commit is contained in:
Jerry
2024-09-09 21:29:28 +08:00
parent 7fe3091e6e
commit f52faaff3c
26 changed files with 1140 additions and 109 deletions

View File

@@ -53,6 +53,10 @@ public class CacheConfig {
* 在线表单组件渲染数据缓存。
*/
ONLINE_FORM_RENDER_CACCHE(300, 100),
/**
* 在线表单扩展执行器对象的缓存。
*/
ONLINE_EXTEND_EXECUTOR_CACHE(300, 100),
/**
* 报表表单组件渲染数据缓存。
*/

View File

@@ -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<OnlineDatasourceRelation> relationList) {
onlineOperationHelper.enableOnlineExtendExecutor(datasource.getDatasourceId());
OnlineTable masterTable = datasource.getMasterTable();
JSONObject jsonData = new JSONObject();
List<OnlineDatasourceRelation> oneToOneRelationList = relationList.stream()

View File

@@ -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<OnlineDatasourceRelation> allRelationList = relationListResult.getData();
List<OnlineDatasourceRelation> oneToOneRelationList = allRelationList.stream()
.filter(r -> r.getRelationType().equals(RelationType.ONE_TO_ONE)).collect(Collectors.toList());
onlineOperationHelper.enableOnlineExtendExecutor(datasourceId);
Map<String, Object> 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<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> pageData = onlineOperationService.getMasterDataList(
masterTable, oneToOneRelationList, allRelationList, filterDtoList, orderBy, null);
Map<String, String> 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<Map<String, Object>> 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<Map<String, Object>> pageData =
onlineOperationService.getSlaveDataList(relation, filterDtoList, orderBy, null);
Map<String, String> headerMap =
@@ -813,6 +822,7 @@ public class OnlineOperationController {
return ResponseResult.errorFrom(relationListResult);
}
List<OnlineDatasourceRelation> 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);

View File

@@ -8,6 +8,7 @@
<result column="page_code" jdbcType="VARCHAR" property="pageCode"/>
<result column="page_name" jdbcType="VARCHAR" property="pageName"/>
<result column="page_type" jdbcType="INTEGER" property="pageType"/>
<result column="extra_json" jdbcType="VARCHAR" property="extraJson"/>
<result column="status" jdbcType="INTEGER" property="status"/>
<result column="published" jdbcType="BOOLEAN" property="published"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
@@ -61,10 +62,10 @@
</select>
<select id="getOnlinePageListByDatasourceId" resultMap="BaseResultMap">
SELECT a.* FROM zz_online_page a, zz_online_page_datasource b
SELECT zz_online_page.* FROM zz_online_page, zz_online_page_datasource b
<where>
<include refid="filterRef"/>
AND b.datasource_id = #{datasourceI} AND b.page_id = a.page_id
AND b.datasource_id = #{datasourceId} AND b.page_id = zz_online_page.page_id
</where>
</select>
</mapper>

View File

@@ -48,6 +48,12 @@ public class OnlinePageDto {
@ConstDictRef(constDictClass = PageType.class, message = "数据验证失败,页面类型为无效值!")
private Integer pageType;
/**
* 扩展数据。
*/
@Schema(description = "扩展数据")
private String extraJson;
/**
* 页面编辑状态。
*/

View File

@@ -55,6 +55,12 @@ public class OnlinePage {
@TableField(value = "page_type")
private Integer pageType;
/**
* 扩展数据。
*/
@TableField(value = "extra_json")
private String extraJson;
/**
* 页面编辑状态。
*/

View File

@@ -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<OnlineTable, List<JSONObject>> 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<OnlineTable, List<JSONObject>> 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<OnlineTable, List<JSONObject>> 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<OnlineTable, List<JSONObject>> 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<OnlineFilterDto> filterList) {
}
/**
* 表数据列表查询之后执行的操作。
*
* @param table 表对象。
* @param resultList 查询结果。如果有修改,可直接在当前参数修改后即可生效。
*/
public void afterSelectList(OnlineTable table, List<Map<String, Object>> resultList) {
}
/**
* 表数据单条详情查询之后执行的操作。
*
* @param table 表对象。
* @param result 查询结果。如果有修改,可直接在当前参数修改后即可生效。
*/
public void afterSelectOne(OnlineTable table, Map<String, Object> result) {
}
}

View File

@@ -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;
}

View File

@@ -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<OnlineDatasourceRelation, List<JSONObject>> slaveDataListMap) {
Map<OnlineTable, List<JSONObject>> slaveDataMap = this.convertToSlaveTableAndDataList(slaveDataListMap);
onlineExtendExecutorUtil.doBeforeInsertWithRelation(masterTable, masterData, slaveDataMap);
Object id = this.saveNew(masterTable, masterData);
if (slaveDataListMap == null) {
return id;
}
// 迭代多个关联列表。
for (Map.Entry<OnlineDatasourceRelation, List<JSONObject>> 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<OnlineDatasourceRelation, List<JSONObject>> 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<OnlineDatasourceRelation, List<JSONObject>> slaveDataListMap) {
Map<OnlineTable, List<JSONObject>> 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<OnlineDatasourceRelation, List<JSONObject>> 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<OnlineDatasourceRelation, List<JSONObject>> 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<OnlineFilterDto> 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<String, Object> 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<String, Object> 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<Map<String, Object>> resultList = pageData.getDataList();
this.buildDataListWithDict(resultList, slaveTable);
return CollUtil.isEmpty(resultList) ? null : resultList.get(0);
Map<String, Object> 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<JoinTableInfo> 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<Map<String, Object>> getSlaveDataList(
OnlineDatasourceRelation relation, List<OnlineFilterDto> 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<Map<String, Object>> 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<OnlineTable, List<JSONObject>> convertToSlaveTableAndDataList(
Map<OnlineDatasourceRelation, List<JSONObject>> slaveDataListMap) {
Map<OnlineTable, List<JSONObject>> resultMap = MapUtil.newHashMap();
if (slaveDataListMap == null) {
return resultMap;
}
for (Map.Entry<OnlineDatasourceRelation, List<JSONObject>> 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);

View File

@@ -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<OnlineTable, List<JSONObject>> 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<OnlineTable, List<JSONObject>> 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<OnlineTable, List<JSONObject>> 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<OnlineTable, List<JSONObject>> 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<String, Object> result) {
BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal();
if (executor != null) {
executor.afterSelectOne(table, result);
}
}
/**
* 表数据列表查询之前执行的操作。
*
* @param table 表对象。
* @param filterList 过滤条件,如果有新的过滤条件,可直接添加到该过滤列表。
*/
public void doBeforeSelectList(OnlineTable table, List<OnlineFilterDto> filterList) {
BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal();
if (executor != null) {
executor.beforeSelectList(table, filterList);
}
}
/**
* 表数据列表查询之后执行的操作。
*
* @param table 表对象。
* @param resultList 即将返回给前端的结果数据。
*/
public void doAfterSelectList(OnlineTable table, List<Map<String, Object>> resultList) {
BaseOnlineExtendExecutor executor = getOnlineExtendExecutorFromLocal();
if (executor != null) {
executor.afterSelectList(table, resultList);
}
}
}

View File

@@ -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<OnlineColumn> doVerifyUpDownloadFileColumn(
OnlineTable table, String fieldName, Boolean asImage) {
OnlineColumn column = this.getOnlineColumnByName(table, fieldName);

View File

@@ -46,6 +46,12 @@ public class OnlinePageVo {
@Schema(description = "页面类型")
private Integer pageType;
/**
* 扩展数据。
*/
@Schema(description = "扩展数据")
private String extraJson;
/**
* 页面编辑状态。
*/