Merge pull request #9660 from dataease/pr@dev-v2@perf_report_not_finish

Pr@dev v2@perf report not finish
This commit is contained in:
fit2cloud-chenyw 2024-05-15 17:58:07 +08:00 committed by GitHub
commit d8164430dd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 343 additions and 40 deletions

View File

@ -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<ViewSelectorVO> queryViewOption(@Param("resourceId") Long resourceId);
}

View File

@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.dataease.api.chart.dto.*; import io.dataease.api.chart.dto.*;
import io.dataease.api.chart.vo.ViewSelectorVO;
import io.dataease.api.chart.filter.FilterTreeObj; import io.dataease.api.chart.filter.FilterTreeObj;
import io.dataease.api.dataset.union.model.SQLObj; import io.dataease.api.dataset.union.model.SQLObj;
import io.dataease.chart.dao.auto.entity.CoreChartView; import io.dataease.chart.dao.auto.entity.CoreChartView;
import io.dataease.chart.dao.auto.mapper.CoreChartViewMapper; 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.entity.CoreDatasetTableField;
import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper; import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper;
import io.dataease.dataset.manage.PermissionManage; import io.dataease.dataset.manage.PermissionManage;
@ -42,6 +44,9 @@ public class ChartViewManege {
@Resource @Resource
private PermissionManage permissionManage; private PermissionManage permissionManage;
@Resource
private ExtChartViewMapper extChartViewMapper;
private ObjectMapper objectMapper = new ObjectMapper(); private ObjectMapper objectMapper = new ObjectMapper();
@Transactional @Transactional
@ -272,4 +277,7 @@ public class ChartViewManege {
} }
public List<ViewSelectorVO> viewOption(Long resourceId) {
return extChartViewMapper.queryViewOption(resourceId);
}
} }

View File

@ -3,6 +3,7 @@ package io.dataease.chart.server;
import io.dataease.api.chart.ChartViewApi; import io.dataease.api.chart.ChartViewApi;
import io.dataease.api.chart.dto.ChartViewDTO; import io.dataease.api.chart.dto.ChartViewDTO;
import io.dataease.api.chart.dto.ChartViewFieldDTO; import io.dataease.api.chart.dto.ChartViewFieldDTO;
import io.dataease.api.chart.vo.ViewSelectorVO;
import io.dataease.chart.manage.ChartViewManege; import io.dataease.chart.manage.ChartViewManege;
import io.dataease.exception.DEException; import io.dataease.exception.DEException;
import io.dataease.result.ResultCode; import io.dataease.result.ResultCode;
@ -52,5 +53,8 @@ public class ChartViewServer implements ChartViewApi {
return chartViewManege.getDetails(id); return chartViewManege.getDetails(id);
} }
@Override
public List<ViewSelectorVO> viewOption(Long resourceId) {
return chartViewManege.viewOption(resourceId);
}
} }

View File

@ -34,7 +34,7 @@ public class CronUtils {
return date; return date;
} }
public static String cron() { public static String tempCron() {
Calendar instance = Calendar.getInstance(); Calendar instance = Calendar.getInstance();
instance.add(Calendar.SECOND, 5); instance.add(Calendar.SECOND, 5);
return instance.get(Calendar.SECOND) + " " + return instance.get(Calendar.SECOND) + " " +

View File

@ -10,32 +10,34 @@ import org.quartz.TriggerKey;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date; import java.util.Date;
import java.util.Map;
@Component @Component("deTaskExecutor")
public class DeTaskExecutor { public class DeTaskExecutor {
protected static final String IS_TEMP_TASK = "isTempTask"; 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 @Resource
private ScheduleManager scheduleManager; private ScheduleManager scheduleManager;
@XpackInteract(value = "xpackTaskExecutor", replace = true) @XpackInteract(value = "xpackTaskExecutor", replace = true)
public boolean execute(Long taskId) { public boolean execute(Map<String, Object> taskData) {
return false; return false;
} }
@XpackInteract(value = "xpackTaskExecutor", replace = true) @XpackInteract(value = "xpackTaskExecutor", replace = true)
public boolean executeTemplate(Long taskId) { public void init() {}
return false;
}
public void addOrUpdateTask(Long taskId, String cron, Long startTime, Long endTime) { public void addOrUpdateTask(Long taskId, String cron, Long startTime, Long endTime) {
if (CronUtils.taskExpire(endTime)) { if (CronUtils.taskExpire(endTime)) {
return; return;
} }
String key = taskId.toString(); String key = taskId.toString();
JobKey jobKey = new JobKey(key, key); JobKey jobKey = new JobKey(key, JOB_GROUP);
TriggerKey triggerKey = new TriggerKey(key, key); TriggerKey triggerKey = new TriggerKey(key, JOB_GROUP);
JobDataMap jobDataMap = new JobDataMap(); JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("taskId", taskId); jobDataMap.put("taskId", taskId);
jobDataMap.put(IS_TEMP_TASK, false); 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); 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(); String key = taskId.toString();
JobKey jobKey = new JobKey(key, key); JobKey jobKey = new JobKey(key, JOB_GROUP);
scheduleManager.fireNow(jobKey); scheduleManager.fireNow(jobKey);
} }
public void addTempTask(Long taskId, Long startTime) { public void addTempTask(Long taskId, Long startTime) {
String key = taskId.toString(); String key = taskId.toString();
JobKey jobKey = new JobKey(key, key); JobKey jobKey = new JobKey(key, TEMP_JOB_GROUP);
TriggerKey triggerKey = new TriggerKey(key, key); TriggerKey triggerKey = new TriggerKey(key, TEMP_JOB_GROUP);
JobDataMap jobDataMap = new JobDataMap(); JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(IS_TEMP_TASK, true); jobDataMap.put(IS_TEMP_TASK, true);
String cron = CronUtils.cron(); String cron = CronUtils.tempCron();
jobDataMap.put("taskId", taskId); jobDataMap.put("taskId", taskId);
scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, DeXpackScheduleJob.class, cron, new Date(startTime), null, jobDataMap); 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(); String key = taskId.toString();
JobKey jobKey = new JobKey(key); JobKey jobKey = new JobKey(key, isTemp ? TEMP_JOB_GROUP : JOB_GROUP);
TriggerKey triggerKey = new TriggerKey(key); TriggerKey triggerKey = new TriggerKey(key, isTemp ? TEMP_JOB_GROUP : JOB_GROUP);
scheduleManager.removeJob(jobKey, triggerKey); scheduleManager.removeJob(jobKey, triggerKey);
} }
} }

View File

@ -1,5 +1,6 @@
package io.dataease.job.schedule; package io.dataease.job.schedule;
import io.dataease.license.utils.LicenseUtil;
import io.dataease.utils.CommonBeanFactory; import io.dataease.utils.CommonBeanFactory;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.quartz.*; import org.quartz.*;
@ -9,26 +10,19 @@ import java.util.Objects;
@Component @Component
public class DeXpackScheduleJob implements Job { public class DeXpackScheduleJob implements Job {
@Resource
private DeTaskExecutor deTaskExecutor;
@Override @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
Trigger trigger = jobExecutionContext.getTrigger(); Trigger trigger = jobExecutionContext.getTrigger();
JobKey jobKey = trigger.getJobKey(); JobKey jobKey = trigger.getJobKey();
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap(); JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
Long taskId = jobDataMap.getLong("taskId"); DeTaskExecutor deTaskExecutor = CommonBeanFactory.getBean(DeTaskExecutor.class);
boolean isTempTask = jobDataMap.getBoolean("isTempTask"); assert deTaskExecutor != null;
boolean taskLoaded = false; LicenseUtil.validate();
if (isTempTask) { boolean taskLoaded = deTaskExecutor.execute(jobDataMap);
taskLoaded = deTaskExecutor.executeTemplate(taskId);
} else {
taskLoaded = deTaskExecutor.execute(taskId);
}
if (!taskLoaded) { if (!taskLoaded) {
Objects.requireNonNull(CommonBeanFactory.getBean(ScheduleManager.class)).removeJob(jobKey, trigger.getKey()); Objects.requireNonNull(CommonBeanFactory.getBean(ScheduleManager.class)).removeJob(jobKey, trigger.getKey());
} }
} }
} }

View File

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

View File

@ -1 +1,3 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M104.185 95.254c8.161 7.574 13.145 17.441 13.145 28.28 0 1.508-.098 2.998-.285 4.466h-10.784c.238-1.465.403-2.948.403-4.465 0-8.983-4.36-17.115-11.419-23.216C86 104.66 75.355 107.162 64 107.162c-11.344 0-21.98-2.495-31.22-6.83-7.064 6.099-11.444 14.218-11.444 23.203 0 1.517.165 3 .403 4.465H10.955a35.444 35.444 0 0 1-.285-4.465c0-10.838 4.974-20.713 13.127-28.291C9.294 85.42.003 70.417.003 53.58.003 23.99 28.656.001 64 .001s63.997 23.988 63.997 53.58c0 16.842-9.299 31.85-23.812 41.673zM64 36.867c-29.454 0-53.33-10.077-53.33 15.342 0 25.418 23.876 46.023 53.33 46.023 29.454 0 53.33-20.605 53.33-46.023 0-25.419-23.876-15.342-53.33-15.342zm24.888 25.644c-3.927 0-7.111-2.665-7.111-5.953 0-3.288 3.184-5.954 7.11-5.954 3.928 0 7.111 2.666 7.111 5.954s-3.183 5.953-7.11 5.953zm-3.556 16.372c0 4.11-9.55 7.442-21.332 7.442-11.781 0-21.332-3.332-21.332-7.442 0-1.06.656-2.064 1.8-2.976 3.295 2.626 10.79 4.465 19.532 4.465 8.743 0 16.237-1.84 19.531-4.465 1.145.912 1.801 1.916 1.801 2.976zm-46.22-16.372c-3.927 0-7.11-2.665-7.11-5.953 0-3.288 3.183-5.954 7.11-5.954 3.927 0 7.111 2.666 7.111 5.954s-3.184 5.953-7.11 5.953z"/></svg> <svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M104.185 95.254c8.161 7.574 13.145 17.441 13.145 28.28 0 1.508-.098 2.998-.285 4.466h-10.784c.238-1.465.403-2.948.403-4.465 0-8.983-4.36-17.115-11.419-23.216C86 104.66 75.355 107.162 64 107.162c-11.344 0-21.98-2.495-31.22-6.83-7.064 6.099-11.444 14.218-11.444 23.203 0 1.517.165 3 .403 4.465H10.955a35.444 35.444 0 0 1-.285-4.465c0-10.838 4.974-20.713 13.127-28.291C9.294 85.42.003 70.417.003 53.58.003 23.99 28.656.001 64 .001s63.997 23.988 63.997 53.58c0 16.842-9.299 31.85-23.812 41.673zM64 36.867c-29.454 0-53.33-10.077-53.33 15.342 0 25.418 23.876 46.023 53.33 46.023 29.454 0 53.33-20.605 53.33-46.023 0-25.419-23.876-15.342-53.33-15.342zm24.888 25.644c-3.927 0-7.111-2.665-7.111-5.953 0-3.288 3.184-5.954 7.11-5.954 3.928 0 7.111 2.666 7.111 5.954s-3.183 5.953-7.11 5.953zm-3.556 16.372c0 4.11-9.55 7.442-21.332 7.442-11.781 0-21.332-3.332-21.332-7.442 0-1.06.656-2.064 1.8-2.976 3.295 2.626 10.79 4.465 19.532 4.465 8.743 0 16.237-1.84 19.531-4.465 1.145.912 1.801 1.916 1.801 2.976zm-46.22-16.372c-3.927 0-7.11-2.665-7.11-5.953 0-3.288 3.183-5.954 7.11-5.954 3.927 0 7.111 2.666 7.111 5.954s-3.184 5.953-7.11 5.953z"/></svg><svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.25 6.58317H7.75C9.36083 6.58317 11.25 7.70816 11.25 9.73317V11.3082C11.25 11.5981 10.9888 11.8332 10.6667 11.8332H1.33333C1.01117 11.8332 0.75 11.5981 0.75 11.3082V9.73317C0.75 7.70986 2.63917 6.58317 4.25 6.58317ZM10.0833 10.6665V9.69428C10.0833 8.46841 8.84142 7.74984 7.75 7.74984H4.25C3.18248 7.74984 1.91667 8.43333 1.91667 9.69428V10.6665H10.0833ZM6 5.99984C4.38917 5.99984 3.08333 4.694 3.08333 3.08317C3.08333 1.47234 4.38917 0.166504 6 0.166504C7.61083 0.166504 8.91667 1.47234 8.91667 3.08317C8.91667 4.694 7.61083 5.99984 6 5.99984ZM6 4.83317C6.9665 4.83317 7.75 4.04967 7.75 3.08317C7.75 2.11667 6.9665 1.33317 6 1.33317C5.0335 1.33317 4.25 2.11667 4.25 3.08317C4.25 4.04967 5.0335 4.83317 6 4.83317Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,3 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="" xmlns="http://www.w3.org/2000/svg">
<path d="M4.25 6.58317H7.75C9.36083 6.58317 11.25 7.70816 11.25 9.73317V11.3082C11.25 11.5981 10.9888 11.8332 10.6667 11.8332H1.33333C1.01117 11.8332 0.75 11.5981 0.75 11.3082V9.73317C0.75 7.70986 2.63917 6.58317 4.25 6.58317ZM10.0833 10.6665V9.69428C10.0833 8.46841 8.84142 7.74984 7.75 7.74984H4.25C3.18248 7.74984 1.91667 8.43333 1.91667 9.69428V10.6665H10.0833ZM6 5.99984C4.38917 5.99984 3.08333 4.694 3.08333 3.08317C3.08333 1.47234 4.38917 0.166504 6 0.166504C7.61083 0.166504 8.91667 1.47234 8.91667 3.08317C8.91667 4.694 7.61083 5.99984 6 5.99984ZM6 4.83317C6.9665 4.83317 7.75 4.04967 7.75 3.08317C7.75 2.11667 6.9665 1.33317 6 1.33317C5.0335 1.33317 4.25 2.11667 4.25 3.08317C4.25 4.04967 5.0335 4.83317 6 4.83317Z" fill=""/>
</svg>

After

Width:  |  Height:  |  Size: 835 B

View File

@ -5,6 +5,7 @@ import { ref, onMounted, toRefs, getCurrentInstance, computed } from 'vue'
import findComponent from '@/utils/components' import findComponent from '@/utils/components'
import { downloadCanvas, imgUrlTrans } from '@/utils/imgUtils' import { downloadCanvas, imgUrlTrans } from '@/utils/imgUtils'
import ComponentEditBar from '@/components/visualization/ComponentEditBar.vue' import ComponentEditBar from '@/components/visualization/ComponentEditBar.vue'
import ComponentSelector from '@/components/visualization/ComponentSelector.vue'
import { useEmitt } from '@/hooks/web/useEmitt' import { useEmitt } from '@/hooks/web/useEmitt'
const componentWrapperInnerRef = ref(null) const componentWrapperInnerRef = ref(null)
@ -72,6 +73,10 @@ const props = defineProps({
type: Number, type: Number,
required: false, required: false,
default: 100 default: 100
},
isSelector: {
type: Boolean,
default: false
} }
}) })
const { config, showPosition, index, canvasStyleData, canvasViewInfo, dvInfo, searchCount, scale } = const { config, showPosition, index, canvasStyleData, canvasViewInfo, dvInfo, searchCount, scale } =
@ -187,7 +192,7 @@ const deepScale = computed(() => scale.value / 100)
@mouseenter="onMouseEnter" @mouseenter="onMouseEnter"
> >
<component-edit-bar <component-edit-bar
v-if="!showPosition.includes('canvas') && dvInfo.type === 'dashboard'" v-if="!showPosition.includes('canvas') && dvInfo.type === 'dashboard' && !props.isSelector"
class="wrapper-edit-bar" class="wrapper-edit-bar"
ref="componentEditBarRef" ref="componentEditBarRef"
:class="{ 'wrapper-edit-bar-active': active }" :class="{ 'wrapper-edit-bar-active': active }"
@ -197,6 +202,10 @@ const deepScale = computed(() => scale.value / 100)
:show-position="showPosition" :show-position="showPosition"
@userViewEnlargeOpen="opt => emits('userViewEnlargeOpen', opt)" @userViewEnlargeOpen="opt => emits('userViewEnlargeOpen', opt)"
></component-edit-bar> ></component-edit-bar>
<component-selector
v-if="props.isSelector && config.component === 'UserView'"
:resource-id="config.id"
/>
<div class="wrapper-inner" ref="componentWrapperInnerRef" :style="componentBackgroundStyle"> <div class="wrapper-inner" ref="componentWrapperInnerRef" :style="componentBackgroundStyle">
<!--边框背景--> <!--边框背景-->
<Icon <Icon

View File

@ -12,6 +12,7 @@ import CanvasOptBar from '@/components/visualization/CanvasOptBar.vue'
import { isMainCanvas } from '@/utils/canvasUtils' import { isMainCanvas } from '@/utils/canvasUtils'
import { activeWatermark } from '@/components/watermark/watermark' import { activeWatermark } from '@/components/watermark/watermark'
import { personInfoApi } from '@/api/user' import { personInfoApi } from '@/api/user'
import router from '@/router'
const dvMainStore = dvMainStoreWithOut() const dvMainStore = dvMainStoreWithOut()
const { pcMatrixCount, curComponent, mobileInPc } = storeToRefs(dvMainStore) const { pcMatrixCount, curComponent, mobileInPc } = storeToRefs(dvMainStore)
@ -58,6 +59,10 @@ const props = defineProps({
type: Number, type: Number,
required: false, required: false,
default: 1 default: 1
},
isSelector: {
type: Boolean,
default: false
} }
}) })
@ -85,7 +90,9 @@ const userInfo = ref(null)
const dashboardActive = computed(() => { const dashboardActive = computed(() => {
return dvInfo.value.type === 'dashboard' return dvInfo.value.type === 'dashboard'
}) })
const isReport = computed(() => {
return !!router.currentRoute.value.query?.report
})
const canvasStyle = computed(() => { const canvasStyle = computed(() => {
let style = {} let style = {}
if (canvasStyleData.value && canvasStyleData.value.width && isMainCanvas(canvasId.value)) { if (canvasStyleData.value && canvasStyleData.value.width && isMainCanvas(canvasId.value)) {
@ -105,6 +112,12 @@ const canvasStyle = computed(() => {
}) })
const getDownloadStatusMainHeight = () => { const getDownloadStatusMainHeight = () => {
if (!previewCanvas.value?.childNodes) {
nextTick(() => {
canvasStyle.value.height = getDownloadStatusMainHeight()
})
return '100%'
}
const children = previewCanvas.value.childNodes const children = previewCanvas.value.childNodes
let maxHeight = 0 let maxHeight = 0
@ -126,7 +139,7 @@ watch(
} }
) )
const restore = () => { const resetLayout = () => {
if (downloadStatus.value) { if (downloadStatus.value) {
return return
} }
@ -152,6 +165,12 @@ const restore = () => {
} }
}) })
} }
const restore = () => {
if (isReport.value) {
return
}
resetLayout()
}
const getShapeItemShowStyle = item => { const getShapeItemShowStyle = item => {
return getShapeItemStyle(item, { return getShapeItemStyle(item, {
@ -219,7 +238,7 @@ const initWatermark = (waterDomId = 'preview-canvas-main') => {
onMounted(() => { onMounted(() => {
initRefreshTimer() initRefreshTimer()
restore() resetLayout()
window.addEventListener('resize', restore) window.addEventListener('resize', restore)
const erd = elementResizeDetectorMaker() const erd = elementResizeDetectorMaker()
erd.listenTo(document.getElementById(domId), () => { erd.listenTo(document.getElementById(domId), () => {
@ -276,6 +295,7 @@ defineExpose({
:show-position="showPosition" :show-position="showPosition"
:search-count="searchCount" :search-count="searchCount"
:scale="mobileInPc ? 100 : scaleWidth" :scale="mobileInPc ? 100 : scaleWidth"
:is-selector="props.isSelector"
@userViewEnlargeOpen="userViewEnlargeOpen($event, item)" @userViewEnlargeOpen="userViewEnlargeOpen($event, item)"
/> />
<user-view-enlarge ref="userViewEnlargeRef"></user-view-enlarge> <user-view-enlarge ref="userViewEnlargeRef"></user-view-enlarge>

View File

@ -53,6 +53,7 @@ defineExpose({
<style lang="less" scope> <style lang="less" scope>
.filter { .filter {
display: flex; display: flex;
align-items: center;
min-height: 46px; min-height: 46px;
> :nth-child(1) { > :nth-child(1) {
@ -84,7 +85,7 @@ defineExpose({
border-radius: 2px; border-radius: 2px;
cursor: pointer; cursor: pointer;
display: inline-block; display: inline-block;
margin-bottom: 12px; // margin-bottom: 12px;
} }
.active, .active,

View File

@ -70,6 +70,7 @@ defineExpose({
<style lang="less" scope> <style lang="less" scope>
.filter { .filter {
display: flex; display: flex;
align-items: center;
min-height: 46px; min-height: 46px;
> :nth-child(1) { > :nth-child(1) {

View File

@ -84,6 +84,7 @@ defineExpose({
<style lang="less" scope> <style lang="less" scope>
.filter { .filter {
display: flex; display: flex;
align-items: center;
min-height: 32px; min-height: 32px;
> :nth-child(1) { > :nth-child(1) {
@ -94,7 +95,7 @@ defineExpose({
line-height: 24px; line-height: 24px;
white-space: nowrap; white-space: nowrap;
width: 116px; width: 116px;
margin-top: 5px; // margin-top: 5px;
} }
.filter-item { .filter-item {

View File

@ -99,6 +99,7 @@ defineExpose({
<style lang="less" scope> <style lang="less" scope>
.filter { .filter {
display: flex; display: flex;
align-items: center;
min-height: 46px; min-height: 46px;
> :nth-child(1) { > :nth-child(1) {

View File

@ -0,0 +1,43 @@
<template>
<div class="bar-main">
<el-checkbox v-model="checked" @change="checkChange" />
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue'
import { useViewSelectorStoreWithOut } from '@/store/modules/data-visualization/viewSelector'
const viewSelectorStore = useViewSelectorStoreWithOut()
const checked = ref(false)
const props = defineProps({
resourceId: {
type: String,
required: false
}
})
onMounted(() => {
checked.value = viewSelectorStore.getViewIdList.includes(props.resourceId)
})
const checkChange = val => {
if (val) {
viewSelectorStore.add(props.resourceId)
} else {
viewSelectorStore.remove(props.resourceId)
}
}
</script>
<style lang="less" scoped>
.bar-main {
position: absolute;
float: right;
right: 10px;
z-index: 10;
border-radius: 2px;
cursor: pointer !important;
font-size: 16px !important;
}
</style>

View File

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

View File

@ -599,7 +599,12 @@ const iconSize = computed<string>(() => {
</script> </script>
<template> <template>
<div class="chart-area" v-loading="loadingFlag" element-loading-background="rgba(0,0,0,0)"> <div
class="chart-area report-load"
:class="{ 'report-load-finish': !loadingFlag }"
v-loading="loadingFlag"
element-loading-background="rgba(0,0,0,0)"
>
<div <div
class="title-container" class="title-container"
:style="{ 'justify-content': titleAlign, 'margin-bottom': marginBottom }" :style="{ 'justify-content': titleAlign, 'margin-bottom': marginBottom }"

View File

@ -25,6 +25,10 @@ const props = defineProps({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
},
isSelector: {
type: Boolean,
default: false
} }
}) })
@ -119,6 +123,7 @@ defineExpose({
:canvas-view-info="state.canvasViewInfoPreview" :canvas-view-info="state.canvasViewInfoPreview"
:dv-info="state.dvInfo" :dv-info="state.dvInfo"
:cur-gap="state.curPreviewGap" :cur-gap="state.curPreviewGap"
:is-selector="props.isSelector"
></de-preview> ></de-preview>
</div> </div>
<XpackComponent <XpackComponent

@ -1 +1 @@
Subproject commit 1ce831779b69626bdb865b36454b7f91ce17eeb7 Subproject commit 498d9457e56bc4db7cb2d639d0ff674b6df816cf

View File

@ -3,6 +3,7 @@ package io.dataease.api.chart;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.dataease.api.chart.dto.ChartViewDTO; import io.dataease.api.chart.dto.ChartViewDTO;
import io.dataease.api.chart.dto.ChartViewFieldDTO; import io.dataease.api.chart.dto.ChartViewFieldDTO;
import io.dataease.api.chart.vo.ViewSelectorVO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -38,4 +39,8 @@ public interface ChartViewApi {
@Operation(summary = "查询图表详情") @Operation(summary = "查询图表详情")
@PostMapping("getDetail/{id}") @PostMapping("getDetail/{id}")
ChartViewDTO getDetail(@PathVariable Long id); ChartViewDTO getDetail(@PathVariable Long id);
@Operation(summary = "查询仪表板下视图项")
@GetMapping("/viewOption/{resourceId}")
List<ViewSelectorVO> viewOption(@PathVariable("resourceId") Long resourceId);
} }

View File

@ -0,0 +1,24 @@
package io.dataease.api.chart.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
public class ViewSelectorVO implements Serializable {
@Serial
private static final long serialVersionUID = -7163837502596313691L;
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private String title;
private String type;
@JsonSerialize(using = ToStringSerializer.class)
private Long pid;
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.dataease.api.report.dto.*; import io.dataease.api.report.dto.*;
import io.dataease.api.report.vo.ReportGridVO; import io.dataease.api.report.vo.ReportGridVO;
import io.dataease.api.report.vo.ReportInfoVO;
import io.dataease.api.report.vo.ReportInstanceVO; import io.dataease.api.report.vo.ReportInstanceVO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@ -46,6 +47,10 @@ public interface ReportApi {
@PostMapping("/stop/{taskId}") @PostMapping("/stop/{taskId}")
void stopNow(@PathVariable("taskId") Long taskId); void stopNow(@PathVariable("taskId") Long taskId);
@Operation(summary = "启用")
@PostMapping("/start/{taskId}")
void start(@PathVariable("taskId") Long taskId);
@Operation(summary = "删除") @Operation(summary = "删除")
@PostMapping("/delete") @PostMapping("/delete")
void delete(@RequestBody List<Long> taskIdList); void delete(@RequestBody List<Long> taskIdList);
@ -53,7 +58,7 @@ public interface ReportApi {
@Operation(summary = "查询详情") @Operation(summary = "查询详情")
@GetMapping("/info/{taskId}") @GetMapping("/info/{taskId}")
ReportEditor info(@PathVariable("taskId") Long taskId); ReportInfoVO info(@PathVariable("taskId") Long taskId);
@Operation(summary = "查询日志列表") @Operation(summary = "查询日志列表")
@Parameters({ @Parameters({
@ -68,6 +73,6 @@ public interface ReportApi {
@PostMapping("/deleteLog") @PostMapping("/deleteLog")
void deleteInstance(@RequestBody ReportInstanceDelRequest request); void deleteInstance(@RequestBody ReportInstanceDelRequest request);
@GetMapping("/logMsg") @PostMapping("/logMsg")
String logMsg(@RequestBody ReportInstanceMsgRequest request); String logMsg(@RequestBody ReportInstanceMsgRequest request);
} }

View File

@ -13,4 +13,6 @@ public class ReportInstanceDelRequest implements Serializable {
private Long instanceId; private Long instanceId;
private Integer timeFlag; private Integer timeFlag;
private Long taskId;
} }

View File

@ -18,4 +18,6 @@ public class ReportInstanceRequest implements Serializable {
private List<Long> timeList; private List<Long> timeList;
private String keyword; private String keyword;
private Boolean timeDesc;
} }

View File

@ -0,0 +1,57 @@
package io.dataease.api.report.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
public class ReportInfoVO implements Serializable {
@Serial
private static final long serialVersionUID = 2287397931951305464L;
@JsonSerialize(using = ToStringSerializer.class)
private Long taskId;
private String name;
private String title;
private String content;
private Integer rtid;
@JsonSerialize(using = ToStringSerializer.class)
private Long rid;
private Integer format;
private List<String> viewIdList;
private Integer viewDataRange;
private String pixel;
private List<Integer> reciFlagList;
private List<String> uidList;
private List<String> ridList;
private List<String> emailList;
private List<String> larkGroupList;
private Integer extWaitTime;
private Integer rateType;
private String rateVal;
private Long startTime;
private Long endTime;
}

View File

@ -1,5 +1,7 @@
package io.dataease.api.report.vo; package io.dataease.api.report.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data; import lombok.Data;
import java.io.Serial; import java.io.Serial;
@ -10,6 +12,7 @@ public class ReportInstanceVO implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -7845204306008848053L; private static final long serialVersionUID = -7845204306008848053L;
@JsonSerialize(using= ToStringSerializer.class)
private Long id; private Long id;
private String name; private String name;

View File

@ -181,4 +181,8 @@ public interface UserApi {
@Hidden @Hidden
@GetMapping("/getRecipient") @GetMapping("/getRecipient")
List<Map<String, Object>> getRecipient(@RequestBody UserReciRequest request); List<Map<String, Object>> getRecipient(@RequestBody UserReciRequest request);
@Hidden
@GetMapping("/orgAdmin")
boolean orgAdmin();
} }