diff --git a/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java b/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java index 130ec63ca9..a20f6728db 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java +++ b/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java @@ -244,7 +244,8 @@ public class ChartDataServer implements ChartDataApi { HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String linkToken = httpServletRequest.getHeader(AuthConstant.LINK_TOKEN_KEY); LogUtil.info(request.getViewInfo().getId() + " " + StringUtils.isNotEmpty(linkToken) + " " + request.isDataEaseBi()); - if ((StringUtils.isNotEmpty(linkToken) && !request.isDataEaseBi()) || (request.isDataEaseBi() && StringUtils.isEmpty(linkToken))) { + boolean embeddedSyncExport = request.isDataEaseBi() && StringUtils.isEmpty(linkToken) && exportCenterManage.embeddedExportSync(); + if ((StringUtils.isNotEmpty(linkToken) && !request.isDataEaseBi()) || embeddedSyncExport) { OutputStream outputStream = response.getOutputStream(); try { Workbook wb = new SXSSFWorkbook(); diff --git a/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterManage.java b/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterManage.java index 5c2892d265..7e6e235010 100644 --- a/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterManage.java +++ b/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterManage.java @@ -21,6 +21,7 @@ import io.dataease.i18n.Translator; import io.dataease.license.config.XpackInteract; import io.dataease.log.DeLog; import io.dataease.model.ExportTaskDTO; +import io.dataease.constant.XpackSettingConstants; import io.dataease.system.manage.SysParameterManage; import io.dataease.utils.*; import io.dataease.visualization.dao.auto.entity.CoreStore; @@ -82,6 +83,11 @@ public class ExportCenterManage implements BaseExportApi { return dataFillingApi; } + public boolean embeddedExportSync() { + String mode = sysParameterManage.singleVal(XpackSettingConstants.EMBEDDED_EXPORT_MODE); + return !StringUtils.equalsIgnoreCase(mode, "async"); + } + public void download(String id, HttpServletResponse response) throws Exception { if (coreExportDownloadTaskMapper.selectById(id) == null) { diff --git a/core/core-backend/src/main/java/io/dataease/system/server/SysParameterServer.java b/core/core-backend/src/main/java/io/dataease/system/server/SysParameterServer.java index 922d6b8f5e..13317d2fad 100644 --- a/core/core-backend/src/main/java/io/dataease/system/server/SysParameterServer.java +++ b/core/core-backend/src/main/java/io/dataease/system/server/SysParameterServer.java @@ -78,6 +78,7 @@ public class SysParameterServer implements SysParameterApi { public Map defaultSettings() { Map map = new HashMap<>(); map.put(XpackSettingConstants.DEFAULT_SORT, "1"); + map.put(XpackSettingConstants.EMBEDDED_EXPORT_MODE, "sync"); List settingItemVOS = queryBasicSetting(); for (SettingItemVO settingItemVO : settingItemVOS) { @@ -87,6 +88,9 @@ public class SysParameterServer implements SysParameterApi { if (StringUtils.isNotBlank(settingItemVO.getPkey()) && settingItemVO.getPkey().equalsIgnoreCase(XpackSettingConstants.DEFAULT_OPEN) && StringUtils.isNotBlank(settingItemVO.getPval())) { map.put(XpackSettingConstants.DEFAULT_OPEN, settingItemVO.getPval()); } + if (StringUtils.isNotBlank(settingItemVO.getPkey()) && settingItemVO.getPkey().equalsIgnoreCase(XpackSettingConstants.EMBEDDED_EXPORT_MODE) && StringUtils.isNotBlank(settingItemVO.getPval())) { + map.put(XpackSettingConstants.EMBEDDED_EXPORT_MODE, settingItemVO.getPval()); + } } return map; } diff --git a/core/core-frontend/auto-imports.d.ts b/core/core-frontend/auto-imports.d.ts index 918aad8808..4b8291902a 100644 --- a/core/core-frontend/auto-imports.d.ts +++ b/core/core-frontend/auto-imports.d.ts @@ -4,5 +4,8 @@ // Generated by unplugin-auto-import export {} declare global { - + const ElForm: typeof import('element-plus-secondary/es')['ElForm'] + const ElFormItem: typeof import('element-plus-secondary/es')['ElFormItem'] + const ElInput: typeof import('element-plus-secondary/es')['ElInput'] + const ElMessageBox: typeof import('element-plus-secondary/es')['ElMessageBox'] } diff --git a/core/core-frontend/src/locales/en.ts b/core/core-frontend/src/locales/en.ts index bd938483f6..e9ec0419ea 100644 --- a/core/core-frontend/src/locales/en.ts +++ b/core/core-frontend/src/locales/en.ts @@ -3889,6 +3889,9 @@ export default { sharePeRequire: 'Sharing validity period password required', defaultSort: 'Default resource sorting method', defaultOpen: 'Page opening method', + embeddedExportMode: 'Embedded data export mode', + exportModeSync: 'Synchronous', + exportModeAsync: 'Asynchronous', loginLimit: 'Limit login', loginLimitRate: 'Limit login failure times (times)', loginLimitTime: 'Limit login failure time (minutes)', diff --git a/core/core-frontend/src/locales/tw.ts b/core/core-frontend/src/locales/tw.ts index f4972080d5..005784b15e 100644 --- a/core/core-frontend/src/locales/tw.ts +++ b/core/core-frontend/src/locales/tw.ts @@ -3777,6 +3777,9 @@ export default { sharePeRequire: '分享有效期限密碼必填', defaultSort: '資源預設排序方式', defaultOpen: '頁面開啟方式', + embeddedExportMode: '嵌入式資料匯出方式', + exportModeSync: '同步', + exportModeAsync: '異步', loginLimit: '限制登入', loginLimitRate: '限制登入失敗次數 (次)', loginLimitTime: '限制登入失敗時間 (分)', diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index 564dd05d7a..f05cc81aad 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -3783,6 +3783,9 @@ export default { sharePeRequire: '分享有效期密码必填', defaultSort: '资源默认排序方式', defaultOpen: '页面打开方式', + embeddedExportMode: '嵌入式数据导出方式', + exportModeSync: '同步', + exportModeAsync: '异步', loginLimit: '限制登录', loginLimitRate: '限制登录失败次数 (次)', loginLimitTime: '限制登录失败时间 (分)', diff --git a/core/core-frontend/src/pages/panel/main.ts b/core/core-frontend/src/pages/panel/main.ts index 786aae2228..41a980095f 100644 --- a/core/core-frontend/src/pages/panel/main.ts +++ b/core/core-frontend/src/pages/panel/main.ts @@ -130,6 +130,7 @@ const setupAll = async ( const { wsCache } = useCache() wsCache.set('TreeSort-backend', defaultSort['basic.defaultSort'] ?? '1') wsCache.set('open-backend', defaultSort['basic.defaultOpen'] ?? '0') + wsCache.set('embeddedExportMode-backend', defaultSort['basic.embeddedExportMode'] ?? 'sync') app.mount(dom) return app } diff --git a/core/core-frontend/src/permission.ts b/core/core-frontend/src/permission.ts index 7b15d80c7e..6439f23470 100644 --- a/core/core-frontend/src/permission.ts +++ b/core/core-frontend/src/permission.ts @@ -85,6 +85,7 @@ router.beforeEach(async (to, from, next) => { const defaultSort = await getDefaultSettings() wsCache.set('TreeSort-backend', defaultSort['basic.defaultSort'] ?? '1') wsCache.set('open-backend', defaultSort['basic.defaultOpen'] ?? '0') + wsCache.set('embeddedExportMode-backend', defaultSort['basic.embeddedExportMode'] ?? 'sync') if ((wsCache.get('user.token') || isDesktop) && !to.path.startsWith('/de-link/')) { if (!userStore.getUid) { await userStore.setUser() diff --git a/core/core-frontend/src/views/chart/components/js/util.ts b/core/core-frontend/src/views/chart/components/js/util.ts index 0a7835e632..9aec95114d 100644 --- a/core/core-frontend/src/views/chart/components/js/util.ts +++ b/core/core-frontend/src/views/chart/components/js/util.ts @@ -12,9 +12,11 @@ import { ElMessage } from 'element-plus-secondary' import { useI18n } from '@/hooks/web/useI18n' import { useLinkStoreWithOut } from '@/store/modules/link' import { useAppStoreWithOut } from '@/store/modules/app' +import { useCache } from '@/hooks/web/useCache' import { Decimal } from 'decimal.js' const appStore = useAppStoreWithOut() +const { wsCache } = useCache() const isDataEaseBi = computed(() => appStore.getIsDataEaseBi) const { t } = useI18n() @@ -607,6 +609,9 @@ export const exportExcelDownload = (chart, preFix, callBack?) => { } const linkStore = useLinkStoreWithOut() + const embeddedAsyncExport = + (isDataEaseBi.value || appStore.getIsIframe) && + wsCache.get('embeddedExportMode-backend') === 'async' if (isDataEaseBi.value || appStore.getIsIframe) { request.dataEaseBi = true @@ -617,7 +622,10 @@ export const exportExcelDownload = (chart, preFix, callBack?) => { } method(request) .then(res => { - if (linkStore.getLinkToken || isDataEaseBi.value || appStore.getIsIframe) { + if ( + linkStore.getLinkToken || + ((isDataEaseBi.value || appStore.getIsIframe) && !embeddedAsyncExport) + ) { const blob = new Blob([res.data], { type: 'application/vnd.ms-excel' }) const link = document.createElement('a') link.style.display = 'none' diff --git a/core/core-frontend/src/views/system/parameter/basic/BasicEdit.vue b/core/core-frontend/src/views/system/parameter/basic/BasicEdit.vue index 1c30359754..8233b932f2 100644 --- a/core/core-frontend/src/views/system/parameter/basic/BasicEdit.vue +++ b/core/core-frontend/src/views/system/parameter/basic/BasicEdit.vue @@ -28,6 +28,10 @@ const pvpOptions = [ { value: '3', label: t('commons.date.three_months') }, { value: '4', label: t('commons.date.one_month') } ] +const embeddedExportModeOptions = [ + { value: 'sync', label: t('setting_basic.exportModeSync') }, + { value: 'async', label: t('setting_basic.exportModeAsync') } +] const requireKeys = [ 'logLiveTime', 'thresholdLogLiveTime', @@ -439,6 +443,17 @@ defineExpose({ +
+ + + {{ item.label }} + + +
diff --git a/core/core-frontend/src/views/system/parameter/basic/BasicInfo.vue b/core/core-frontend/src/views/system/parameter/basic/BasicInfo.vue index c1ab6fe947..f82a9f43ff 100644 --- a/core/core-frontend/src/views/system/parameter/basic/BasicInfo.vue +++ b/core/core-frontend/src/views/system/parameter/basic/BasicInfo.vue @@ -70,6 +70,10 @@ const pvpOptions = [ { value: '3', label: t('commons.date.three_months') }, { value: '4', label: t('commons.date.one_month') } ] +const embeddedExportModeOptions = [ + { value: 'sync', label: t('setting_basic.exportModeSync') }, + { value: 'async', label: t('setting_basic.exportModeAsync') } +] const tooltips = [ { key: 'setting_basic.defaultOpen', @@ -243,6 +247,13 @@ const search = cb => { } else { item.pval = state.openOptions[0].label } + } else if (item.pkey === 'basic.embeddedExportMode') { + if (item.pval) { + const r = embeddedExportModeOptions.filter(cur => cur.value === item.pval) + item.pval = r?.length ? r[0].label : embeddedExportModeOptions[0].label + } else { + item.pval = embeddedExportModeOptions[0].label + } } else { item.pval = item.pval } diff --git a/sdk/common/src/main/java/io/dataease/constant/XpackSettingConstants.java b/sdk/common/src/main/java/io/dataease/constant/XpackSettingConstants.java index 09692b7ba3..70a2560a19 100644 --- a/sdk/common/src/main/java/io/dataease/constant/XpackSettingConstants.java +++ b/sdk/common/src/main/java/io/dataease/constant/XpackSettingConstants.java @@ -14,6 +14,7 @@ public class XpackSettingConstants { public static final String DATA_FILLING_LOG_LIVE_TIME = "basic.dataFillingLogLiveTime"; public static final String DEFAULT_SORT = "basic.defaultSort"; public static final String DEFAULT_OPEN = "basic.defaultOpen"; + public static final String EMBEDDED_EXPORT_MODE = "basic.embeddedExportMode"; public static final String LOGIN_LIMIT = "basic.loginLimit"; public static final String LOGIN_LIMIT_RATE = "basic.loginLimitRate"; public static final String LOGIN_LIMIT_TIME = "basic.loginLimitTime"; diff --git a/sdk/common/src/main/java/io/dataease/utils/SystemSettingUtils.java b/sdk/common/src/main/java/io/dataease/utils/SystemSettingUtils.java index 25be88ff46..5448d6fab8 100644 --- a/sdk/common/src/main/java/io/dataease/utils/SystemSettingUtils.java +++ b/sdk/common/src/main/java/io/dataease/utils/SystemSettingUtils.java @@ -17,6 +17,7 @@ public class SystemSettingUtils { XpackSettingConstants.DEFAULT_LOGIN, XpackSettingConstants.THRESHOLD_LOG_LIVE_TIME, XpackSettingConstants.DATA_FILLING_LOG_LIVE_TIME, + XpackSettingConstants.EMBEDDED_EXPORT_MODE, XpackSettingConstants.LOGIN_LIMIT, XpackSettingConstants.LOGIN_LIMIT_RATE, XpackSettingConstants.LOGIN_LIMIT_TIME,