diff --git a/core/core-backend/src/main/java/io/dataease/chart/dao/ext/mapper/ExtChartViewMapper.java b/core/core-backend/src/main/java/io/dataease/chart/dao/ext/mapper/ExtChartViewMapper.java new file mode 100644 index 0000000000..b77aee6e59 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/chart/dao/ext/mapper/ExtChartViewMapper.java @@ -0,0 +1,17 @@ +package io.dataease.chart.dao.ext.mapper; + +import io.dataease.api.chart.vo.ViewSelectorVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface ExtChartViewMapper { + + @Select(""" + select id, scene_id as pid, title, type from core_chart_view where scene_id = #{resourceId} + """) + List queryViewOption(@Param("resourceId") Long resourceId); +} diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java index d1e6e049ec..9bb1cc8812 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java +++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java @@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.dataease.api.chart.dto.*; +import io.dataease.api.chart.vo.ViewSelectorVO; import io.dataease.api.chart.filter.FilterTreeObj; import io.dataease.api.dataset.union.model.SQLObj; import io.dataease.chart.dao.auto.entity.CoreChartView; import io.dataease.chart.dao.auto.mapper.CoreChartViewMapper; +import io.dataease.chart.dao.ext.mapper.ExtChartViewMapper; import io.dataease.dataset.dao.auto.entity.CoreDatasetTableField; import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper; import io.dataease.dataset.manage.PermissionManage; @@ -42,6 +44,9 @@ public class ChartViewManege { @Resource private PermissionManage permissionManage; + @Resource + private ExtChartViewMapper extChartViewMapper; + private ObjectMapper objectMapper = new ObjectMapper(); @Transactional @@ -272,4 +277,7 @@ public class ChartViewManege { } + public List viewOption(Long resourceId) { + return extChartViewMapper.queryViewOption(resourceId); + } } diff --git a/core/core-backend/src/main/java/io/dataease/chart/server/ChartViewServer.java b/core/core-backend/src/main/java/io/dataease/chart/server/ChartViewServer.java index b477617a39..d4c3213266 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/server/ChartViewServer.java +++ b/core/core-backend/src/main/java/io/dataease/chart/server/ChartViewServer.java @@ -3,6 +3,7 @@ package io.dataease.chart.server; import io.dataease.api.chart.ChartViewApi; import io.dataease.api.chart.dto.ChartViewDTO; import io.dataease.api.chart.dto.ChartViewFieldDTO; +import io.dataease.api.chart.vo.ViewSelectorVO; import io.dataease.chart.manage.ChartViewManege; import io.dataease.exception.DEException; import io.dataease.result.ResultCode; @@ -52,5 +53,8 @@ public class ChartViewServer implements ChartViewApi { return chartViewManege.getDetails(id); } - + @Override + public List viewOption(Long resourceId) { + return chartViewManege.viewOption(resourceId); + } } diff --git a/core/core-backend/src/main/java/io/dataease/commons/utils/CronUtils.java b/core/core-backend/src/main/java/io/dataease/commons/utils/CronUtils.java index 34116dc693..41c38ac9d0 100644 --- a/core/core-backend/src/main/java/io/dataease/commons/utils/CronUtils.java +++ b/core/core-backend/src/main/java/io/dataease/commons/utils/CronUtils.java @@ -34,7 +34,7 @@ public class CronUtils { return date; } - public static String cron() { + public static String tempCron() { Calendar instance = Calendar.getInstance(); instance.add(Calendar.SECOND, 5); return instance.get(Calendar.SECOND) + " " + diff --git a/core/core-backend/src/main/java/io/dataease/job/schedule/DeTaskExecutor.java b/core/core-backend/src/main/java/io/dataease/job/schedule/DeTaskExecutor.java index 083576fde7..bb10e7e004 100644 --- a/core/core-backend/src/main/java/io/dataease/job/schedule/DeTaskExecutor.java +++ b/core/core-backend/src/main/java/io/dataease/job/schedule/DeTaskExecutor.java @@ -10,32 +10,34 @@ import org.quartz.TriggerKey; import org.springframework.stereotype.Component; import java.util.Date; +import java.util.Map; -@Component +@Component("deTaskExecutor") public class DeTaskExecutor { protected static final String IS_TEMP_TASK = "isTempTask"; + private static final String JOB_GROUP = "REPORT_TASK"; + private static final String TEMP_JOB_GROUP = "TEMP_REPORT_TASK"; + @Resource private ScheduleManager scheduleManager; @XpackInteract(value = "xpackTaskExecutor", replace = true) - public boolean execute(Long taskId) { + public boolean execute(Map taskData) { return false; } @XpackInteract(value = "xpackTaskExecutor", replace = true) - public boolean executeTemplate(Long taskId) { - return false; - } + public void init() {} public void addOrUpdateTask(Long taskId, String cron, Long startTime, Long endTime) { if (CronUtils.taskExpire(endTime)) { return; } String key = taskId.toString(); - JobKey jobKey = new JobKey(key, key); - TriggerKey triggerKey = new TriggerKey(key, key); + JobKey jobKey = new JobKey(key, JOB_GROUP); + TriggerKey triggerKey = new TriggerKey(key, JOB_GROUP); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("taskId", taskId); jobDataMap.put(IS_TEMP_TASK, false); @@ -44,27 +46,27 @@ public class DeTaskExecutor { scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, DeXpackScheduleJob.class, cron, new Date(startTime), end, jobDataMap); } - public void fireNow(Long taskId) throws Exception{ + public void fireNow(Long taskId) throws Exception { String key = taskId.toString(); - JobKey jobKey = new JobKey(key, key); + JobKey jobKey = new JobKey(key, JOB_GROUP); scheduleManager.fireNow(jobKey); } public void addTempTask(Long taskId, Long startTime) { String key = taskId.toString(); - JobKey jobKey = new JobKey(key, key); - TriggerKey triggerKey = new TriggerKey(key, key); + JobKey jobKey = new JobKey(key, TEMP_JOB_GROUP); + TriggerKey triggerKey = new TriggerKey(key, TEMP_JOB_GROUP); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put(IS_TEMP_TASK, true); - String cron = CronUtils.cron(); + String cron = CronUtils.tempCron(); jobDataMap.put("taskId", taskId); scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, DeXpackScheduleJob.class, cron, new Date(startTime), null, jobDataMap); } - public void removeTask(Long taskId) { + public void removeTask(Long taskId, boolean isTemp) { String key = taskId.toString(); - JobKey jobKey = new JobKey(key); - TriggerKey triggerKey = new TriggerKey(key); + JobKey jobKey = new JobKey(key, isTemp ? TEMP_JOB_GROUP : JOB_GROUP); + TriggerKey triggerKey = new TriggerKey(key, isTemp ? TEMP_JOB_GROUP : JOB_GROUP); scheduleManager.removeJob(jobKey, triggerKey); } } diff --git a/core/core-backend/src/main/java/io/dataease/job/schedule/DeXpackScheduleJob.java b/core/core-backend/src/main/java/io/dataease/job/schedule/DeXpackScheduleJob.java index 2b57f6cc2f..a8cf377930 100644 --- a/core/core-backend/src/main/java/io/dataease/job/schedule/DeXpackScheduleJob.java +++ b/core/core-backend/src/main/java/io/dataease/job/schedule/DeXpackScheduleJob.java @@ -1,5 +1,6 @@ package io.dataease.job.schedule; +import io.dataease.license.utils.LicenseUtil; import io.dataease.utils.CommonBeanFactory; import jakarta.annotation.Resource; import org.quartz.*; @@ -9,26 +10,19 @@ import java.util.Objects; @Component public class DeXpackScheduleJob implements Job { - @Resource - private DeTaskExecutor deTaskExecutor; + @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { Trigger trigger = jobExecutionContext.getTrigger(); JobKey jobKey = trigger.getJobKey(); JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap(); - Long taskId = jobDataMap.getLong("taskId"); - boolean isTempTask = jobDataMap.getBoolean("isTempTask"); - boolean taskLoaded = false; - if (isTempTask) { - taskLoaded = deTaskExecutor.executeTemplate(taskId); - } else { - taskLoaded = deTaskExecutor.execute(taskId); - } + DeTaskExecutor deTaskExecutor = CommonBeanFactory.getBean(DeTaskExecutor.class); + assert deTaskExecutor != null; + LicenseUtil.validate(); + boolean taskLoaded = deTaskExecutor.execute(jobDataMap); if (!taskLoaded) { Objects.requireNonNull(CommonBeanFactory.getBean(ScheduleManager.class)).removeJob(jobKey, trigger.getKey()); } - - } } diff --git a/core/core-backend/src/main/java/io/dataease/listener/XpackTaskStarter.java b/core/core-backend/src/main/java/io/dataease/listener/XpackTaskStarter.java new file mode 100644 index 0000000000..0154a29f6f --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/listener/XpackTaskStarter.java @@ -0,0 +1,28 @@ +package io.dataease.listener; + +import io.dataease.job.schedule.DeTaskExecutor; +import io.dataease.license.utils.LicenseUtil; +import io.dataease.utils.LogUtil; +import jakarta.annotation.Resource; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(value = 4) +public class XpackTaskStarter implements ApplicationRunner { + + @Resource + private DeTaskExecutor deTaskExecutor; + + @Override + public void run(ApplicationArguments args) { + try { + LicenseUtil.validate(); + deTaskExecutor.init(); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e.getCause()); + } + } +} diff --git a/core/core-frontend/src/assets/svg/people.svg b/core/core-frontend/src/assets/svg/people.svg index 2bd54aeb72..26d9c9986a 100644 --- a/core/core-frontend/src/assets/svg/people.svg +++ b/core/core-frontend/src/assets/svg/people.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/core/core-frontend/src/assets/svg/user-reci.svg b/core/core-frontend/src/assets/svg/user-reci.svg new file mode 100644 index 0000000000..a6d141f057 --- /dev/null +++ b/core/core-frontend/src/assets/svg/user-reci.svg @@ -0,0 +1,3 @@ + + + diff --git a/core/core-frontend/src/components/data-visualization/canvas/ComponentWrapper.vue b/core/core-frontend/src/components/data-visualization/canvas/ComponentWrapper.vue index a54d5bee10..1fdada09b5 100644 --- a/core/core-frontend/src/components/data-visualization/canvas/ComponentWrapper.vue +++ b/core/core-frontend/src/components/data-visualization/canvas/ComponentWrapper.vue @@ -5,6 +5,7 @@ import { ref, onMounted, toRefs, getCurrentInstance, computed } from 'vue' import findComponent from '@/utils/components' import { downloadCanvas, imgUrlTrans } from '@/utils/imgUtils' import ComponentEditBar from '@/components/visualization/ComponentEditBar.vue' +import ComponentSelector from '@/components/visualization/ComponentSelector.vue' import { useEmitt } from '@/hooks/web/useEmitt' const componentWrapperInnerRef = ref(null) @@ -72,6 +73,10 @@ const props = defineProps({ type: Number, required: false, default: 100 + }, + isSelector: { + type: Boolean, + default: false } }) const { config, showPosition, index, canvasStyleData, canvasViewInfo, dvInfo, searchCount, scale } = @@ -187,7 +192,7 @@ const deepScale = computed(() => scale.value / 100) @mouseenter="onMouseEnter" > scale.value / 100) :show-position="showPosition" @userViewEnlargeOpen="opt => emits('userViewEnlargeOpen', opt)" > +
{ return dvInfo.value.type === 'dashboard' }) - +const isReport = computed(() => { + return !!router.currentRoute.value.query?.report +}) const canvasStyle = computed(() => { let style = {} if (canvasStyleData.value && canvasStyleData.value.width && isMainCanvas(canvasId.value)) { @@ -105,6 +112,12 @@ const canvasStyle = computed(() => { }) const getDownloadStatusMainHeight = () => { + if (!previewCanvas.value?.childNodes) { + nextTick(() => { + canvasStyle.value.height = getDownloadStatusMainHeight() + }) + return '100%' + } const children = previewCanvas.value.childNodes let maxHeight = 0 @@ -126,7 +139,7 @@ watch( } ) -const restore = () => { +const resetLayout = () => { if (downloadStatus.value) { return } @@ -152,6 +165,12 @@ const restore = () => { } }) } +const restore = () => { + if (isReport.value) { + return + } + resetLayout() +} const getShapeItemShowStyle = item => { return getShapeItemStyle(item, { @@ -219,7 +238,7 @@ const initWatermark = (waterDomId = 'preview-canvas-main') => { onMounted(() => { initRefreshTimer() - restore() + resetLayout() window.addEventListener('resize', restore) const erd = elementResizeDetectorMaker() erd.listenTo(document.getElementById(domId), () => { @@ -276,6 +295,7 @@ defineExpose({ :show-position="showPosition" :search-count="searchCount" :scale="mobileInPc ? 100 : scaleWidth" + :is-selector="props.isSelector" @userViewEnlargeOpen="userViewEnlargeOpen($event, item)" /> diff --git a/core/core-frontend/src/components/drawer-filter/src/DrawerEnumFilter.vue b/core/core-frontend/src/components/drawer-filter/src/DrawerEnumFilter.vue index ce21719bde..faed0b30cb 100644 --- a/core/core-frontend/src/components/drawer-filter/src/DrawerEnumFilter.vue +++ b/core/core-frontend/src/components/drawer-filter/src/DrawerEnumFilter.vue @@ -53,6 +53,7 @@ defineExpose({ diff --git a/core/core-frontend/src/store/modules/data-visualization/viewSelector.ts b/core/core-frontend/src/store/modules/data-visualization/viewSelector.ts new file mode 100644 index 0000000000..666d7c8adc --- /dev/null +++ b/core/core-frontend/src/store/modules/data-visualization/viewSelector.ts @@ -0,0 +1,57 @@ +import { defineStore } from 'pinia' +import { store } from '@/store/index' + +interface ViewSelectorState { + enable: boolean + viewIdList: string[] +} + +export const viewSelectorStore = defineStore('viewSelectorStore', { + state: (): ViewSelectorState => { + return { + enable: false, + viewIdList: [] + } + }, + getters: { + getEnable(): boolean { + return this.enable + }, + getViewIdList(): string[] { + return this.viewIdList + } + }, + actions: { + setEnable(enable: boolean) { + this.enable = enable + }, + remove(id?: string) { + let len = this.viewIdList.length + if (!len) { + return + } + if (!id) { + this.viewIdList = [] + return + } + while (len--) { + if (this.viewIdList[len] === id) { + this.viewIdList.splice(len, 1) + } + } + }, + add(id: string) { + if (!this.viewIdList.includes(id)) { + this.viewIdList.push(id) + } + }, + clear() { + this.enable = false + this.viewIdList = [] + } + } +}) + +export const useViewSelectorStoreWithOut = () => { + return viewSelectorStore(store) +} diff --git a/core/core-frontend/src/views/chart/components/views/index.vue b/core/core-frontend/src/views/chart/components/views/index.vue index f2f93c3c8c..b23431d3c2 100644 --- a/core/core-frontend/src/views/chart/components/views/index.vue +++ b/core/core-frontend/src/views/chart/components/views/index.vue @@ -599,7 +599,12 @@ const iconSize = computed(() => {