Commit 061eb6c6c696f98ef4c56539d7a853229ff117f3

Authored by gesilong
1 parent 7c519eb5

commit: 设计大屏 增加SQL类型

... ... @@ -23,6 +23,26 @@ enum Api {
23 23 DEVICE_ATTR = '/device/attributes',
24 24 ALARM_LIST = '/alarm',
25 25 BASE_DELETE_URL = '/oss',
  26 + DATA_SQL = '/dbConnect',
  27 +}
  28 +
  29 +//sql选择列表
  30 +export const getDataViewSqlPage = (params: object) => {
  31 + return defHttp.get<PaginationResult<ConfigurationItemType>>({ url: `${Api.DATA_SQL}`, params })
  32 +}
  33 +//保存和更新组件SQL查询配置
  34 +export const saveDictItemByCode = (params: object) => {
  35 + return defHttp.post<DictItem[]>({
  36 + url: `${Api.DATA_SQL}/saveDataSet`,
  37 + params: params
  38 + })
  39 +}
  40 +//预览大屏查询组件数据
  41 +export const getDataView = (params: object) => {
  42 + return defHttp.post<DictItem[]>({
  43 + url: `${Api.DATA_SQL}/getDataView`,
  44 + params: params
  45 + })
26 46 }
27 47
28 48 export const getDictItemByCode = (value: string) => {
... ...
... ... @@ -13,6 +13,7 @@ import { RequestDataPondItemType } from '@/store/modules/chartEditStore/chartEdi
13 13 import { JSONParse, convertToCascadingData, findItemByLabel } from '@/utils/external/utils'
14 14 import { CascaderOption } from 'naive-ui'
15 15 import { useUserStore } from '@/store/external/modules/user'
  16 +import {getDataView} from "@/api/external/common";
16 17
17 18
18 19 // 获取类型
... ... @@ -135,7 +136,13 @@ export const useChartDataFetch = (
135 136 const unit = targetInterval && targetInterval.value ? targetUnit.value :pondRequestGlobalIntervalUnit?.value?pondRequestGlobalIntervalUnit?.value: globalUnit.value
136 137 setInterval(handleExecuteRequest, intervalUnitHandle(time, (unit as unknown as any)))
137 138 //
138   - const res = await customRequest(toRaw(targetComponent.request))
  139 + let res:any;
  140 + if (targetComponent.request?.requestContentType === 1) {
  141 + // @ts-ignore
  142 + res = await getDataView({id: targetComponent.request?.id || '',paramMap:targetComponent.request?.requestParams?.Params})
  143 + }else {
  144 + res = await customRequest(toRaw(targetComponent.request))
  145 + }
139 146 if (res) {
140 147 try {
141 148 const filter = targetComponent.filter
... ...
... ... @@ -198,6 +198,7 @@ export interface ChartCustomColor {
198 198
199 199
200 200 export interface CreateComponentType extends PublicConfigType, requestConfig {
  201 + id?: string
201 202 key: string
202 203 chartConfig: ConfigType
203 204 option: GlobalThemeJsonType
... ...
... ... @@ -218,6 +218,10 @@ export interface RequestConfigType extends RequestPublicConfigType {
218 218 requestContentType: RequestContentTypeEnum
219 219 // 请求体类型
220 220 requestParamsBodyType: RequestBodyEnum
  221 + // 选择SQL请求 地址
  222 + sqlRequestHttpType: string
  223 + // 选择SQL请求 ID
  224 + requestSQLId: string
221 225 // SQL 请求对象
222 226 requestSQLContent: {
223 227 sql: string
... ...
1 1 <script setup lang="ts">
2 2 import { NInput, NInputNumber, NInputGroup, NSelect, SelectOption, NTabs, NTabPane } from 'naive-ui'
3   -import { SettingItem, SettingItemBox } from '@/components/Pages/ChartItemSetting';
4   -import { selectTimeOptions, selectTypeOptions } from '../../../index.d';
5   -import { RequestBodyEnum, RequestContentTypeEnum, RequestDataTypeEnum, RequestHttpEnum, RequestHttpIntervalEnum, RequestParams } from '@/enums/httpEnum';
6   -import { ref, unref } from 'vue';
7   -import DefaultRequestContent from './DefaultRequestContent.vue';
8   -import SqlConfiguration from './SqlConfiguration.vue';
9   -import { RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d';
  3 +import { SettingItem, SettingItemBox } from '@/components/Pages/ChartItemSetting'
  4 +import { selectTimeOptions, selectTypeOptions } from '../../../index.d'
  5 +import {
  6 + RequestBodyEnum,
  7 + RequestContentTypeEnum,
  8 + RequestDataTypeEnum,
  9 + RequestHttpEnum,
  10 + RequestHttpIntervalEnum,
  11 + RequestParams
  12 +} from '@/enums/httpEnum'
  13 +import { onMounted, ref, unref } from 'vue'
  14 +import DefaultRequestContent from './DefaultRequestContent.vue'
  15 +import SqlConfiguration from './SqlConfiguration.vue'
  16 +import { RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
  17 +import { getDataViewSqlPage } from '@/api/external/common'
10 18
11 19 const t = window['$t']
12 20
13 21 const requestContentTypeRef = ref(RequestContentTypeEnum.DEFAULT)
14 22
15 23 const requestHttpTypeRef = ref(RequestHttpEnum.GET)
  24 +const sqlRequestHttpTypeRef = ref('')
  25 +const requestSQLIdRef = ref('')
16 26
17 27 const requestIntervalRef = ref<number | undefined>(20)
18 28
... ... @@ -20,16 +30,23 @@ const requestIntervalUnitRef = ref(RequestHttpIntervalEnum.SECOND)
20 30
21 31 const requestSQLContentRef = ref('select * from where')
22 32
23   -const requestParamsRef = ref({ Header: {}, Params: {}, Body: { 'form-data': {}, 'json': '', 'x-www-form-urlencoded': {}, 'xml': '' } } as RequestParams)
  33 +const requestParamsRef = ref({
  34 + Header: {},
  35 + Params: {},
  36 + Body: { 'form-data': {}, json: '', 'x-www-form-urlencoded': {}, xml: '' }
  37 +} as RequestParams)
24 38
25 39 const requestParamsBodyTypeRef = ref(RequestBodyEnum.NONE)
26 40
27 41 const requestUrlRef = ref<string>()
28 42
  43 +const sqlSelectOptionsList = ref<SelectOption[]>([])
  44 +
29 45 const getConfigurationData = (): RequestConfigType => {
30 46 return {
31 47 requestContentType: unref(requestContentTypeRef),
32 48 requestHttpType: unref(requestHttpTypeRef),
  49 + sqlRequestHttpType: unref(sqlRequestHttpTypeRef),
33 50 requestInterval: unref(requestIntervalRef),
34 51 requestIntervalUnit: unref(requestIntervalUnitRef),
35 52 requestDataType: RequestDataTypeEnum.AJAX,
... ... @@ -38,52 +55,113 @@ const getConfigurationData = (): RequestConfigType => {
38 55 sql: unref(requestSQLContentRef)
39 56 },
40 57 requestParams: unref(requestParamsRef),
41   - requestUrl: `${unref(requestUrlRef)}`
  58 + requestUrl: `${unref(requestUrlRef)}`,
  59 + requestSQLId: unref(requestSQLIdRef)
42 60 }
43 61 }
44 62
45   -
46 63 const setConfigurationData = (request: RequestConfigType) => {
47   - const { requestContentType, requestHttpType, requestInterval, requestIntervalUnit, requestParamsBodyType, requestSQLContent, requestParams, requestUrl } = request
  64 + const {
  65 + requestContentType,
  66 + requestHttpType,
  67 + requestInterval,
  68 + requestIntervalUnit,
  69 + requestParamsBodyType,
  70 + requestSQLContent,
  71 + requestParams,
  72 + requestUrl,
  73 + sqlRequestHttpType,
  74 + requestSQLId
  75 + } = request
  76 + sqlRequestHttpTypeRef.value = sqlRequestHttpType
48 77 requestContentTypeRef.value = requestContentType
49 78 requestHttpTypeRef.value = requestHttpType
50 79 requestIntervalRef.value = requestInterval
51 80 requestIntervalUnitRef.value = requestIntervalUnit
52 81 requestParamsBodyTypeRef.value = requestParamsBodyType
53 82 requestSQLContentRef.value = requestSQLContent.sql
54   - requestParamsRef.value = requestParams
  83 + requestParamsRef.value = requestParams
55 84 requestUrlRef.value = requestUrl
  85 + requestSQLIdRef.value = requestSQLId
56 86 }
57 87
58 88 defineExpose({
59 89 getConfigurationData,
60   - setConfigurationData
  90 + setConfigurationData,
  91 + requestContentTypeRef
  92 +})
  93 +
  94 +onMounted(() => {
  95 + getData({ page: 1, pageSize: 999 })
61 96 })
62 97
  98 +const getData = async (params: object) => {
  99 + const { items } = await getDataViewSqlPage(params)
  100 + const _list = items.map((item: any) => {
  101 + return {
  102 + label: item.name,
  103 + value: item.id
  104 + }
  105 + })
  106 +
  107 + sqlSelectOptionsList.value = _list
  108 +}
63 109 </script>
64 110
65 111 <template>
66   - <SettingItemBox :name="t('external.data.address')" :itemRightStyle="{
67   - gridTemplateColumns: '5fr 2fr 1fr'
68   - }">
  112 + <SettingItemBox
  113 + v-if="requestContentTypeRef === RequestContentTypeEnum.DEFAULT"
  114 + :name="t('external.data.address')"
  115 + :itemRightStyle="{
  116 + gridTemplateColumns: '5fr 2fr 1fr'
  117 + }"
  118 + >
69 119 <SettingItem :name="t('external.data.requestUrl')">
70 120 <NInputGroup>
71   - <NSelect v-model:value="requestHttpTypeRef" style="width: 150px;" size="small"
72   - :options="(selectTypeOptions as SelectOption[])" />
73   - <NInput v-model:value="requestUrlRef" class="select-time-number" size="small" min="0" :show-button="false"
74   - :placeholder="t('external.data.placeURL')" />
  121 + <NSelect
  122 + v-model:value="requestHttpTypeRef"
  123 + style="width: 150px"
  124 + size="small"
  125 + :options="(selectTypeOptions as SelectOption[])"
  126 + />
  127 + <NInput
  128 + v-model:value="requestUrlRef"
  129 + class="select-time-number"
  130 + size="small"
  131 + min="0"
  132 + :show-button="false"
  133 + :placeholder="t('external.data.placeURL')"
  134 + />
75 135 </NInputGroup>
76 136 </SettingItem>
77 137 <SettingItem :name="t('external.data.updateInterval')">
78 138 <NInputGroup>
79   - <NInputNumber v-model:value="requestIntervalRef" class="select-time-number" size="small" min="0"
80   - :show-button="false" :placeholder="t('external.data.placeNumber')" />
  139 + <NInputNumber
  140 + v-model:value="requestIntervalRef"
  141 + class="select-time-number"
  142 + size="small"
  143 + min="0"
  144 + :show-button="false"
  145 + :placeholder="t('external.data.placeNumber')"
  146 + />
81 147 <!-- 单位 -->
82   - <NSelect v-model:value="requestIntervalUnitRef" class="select-time-options" size="small"
83   - :options="(selectTimeOptions as SelectOption[])" />
  148 + <NSelect
  149 + v-model:value="requestIntervalUnitRef"
  150 + class="select-time-options"
  151 + size="small"
  152 + :options="(selectTimeOptions as SelectOption[])"
  153 + />
84 154 </NInputGroup>
85 155 </SettingItem>
86 156 </SettingItemBox>
  157 + <SettingItemBox v-if="requestContentTypeRef === RequestContentTypeEnum.SQL" :name="t('external.data.address')">
  158 + <NSelect
  159 + v-model:value="sqlRequestHttpTypeRef"
  160 + style="width: 100%"
  161 + size="small"
  162 + :options="(sqlSelectOptionsList as SelectOption[])"
  163 + />
  164 + </SettingItemBox>
87 165 <SettingItemBox :name="t('external.data.selectMode')">
88 166 <NTabs v-model:value="requestContentTypeRef" type="segment" size="small">
89 167 <NTabPane :name="RequestContentTypeEnum.DEFAULT" :tab="t('external.data.ordinary')" />
... ... @@ -91,8 +169,14 @@ defineExpose({
91 169 </NTabs>
92 170 </SettingItemBox>
93 171 <SettingItemBox>
94   - <DefaultRequestContent v-if="requestContentTypeRef === RequestContentTypeEnum.DEFAULT"
95   - v-model:value="requestParamsRef" v-model:request-params-body-type="requestParamsBodyTypeRef" />
96   - <SqlConfiguration v-model:value="requestSQLContentRef" v-if="requestContentTypeRef === RequestContentTypeEnum.SQL" />
  172 + <DefaultRequestContent
  173 + v-if="requestContentTypeRef === RequestContentTypeEnum.DEFAULT"
  174 + v-model:value="requestParamsRef"
  175 + v-model:request-params-body-type="requestParamsBodyTypeRef"
  176 + />
  177 + <SqlConfiguration
  178 + v-model:value="requestSQLContentRef"
  179 + v-if="requestContentTypeRef === RequestContentTypeEnum.SQL"
  180 + />
97 181 </SettingItemBox>
98 182 </template>
... ...
... ... @@ -6,7 +6,7 @@ import { CreateComponentGroupType } from '@/packages/index.d'
6 6 import { RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
7 7 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
8 8 import { NButton, NDivider, NModal, NSpace, NTag } from 'naive-ui'
9   -import { ref, unref, computed, nextTick } from 'vue'
  9 +import { ref, unref, computed, nextTick, watch } from 'vue'
10 10 import { PublicInterfaceForm } from '../PublicInterfaceForm'
11 11 import ComponentConfiguration from './ComponentConfiguration.vue'
12 12 import GlobalPublicConfiguration from './GlobalPublicConfiguration.vue'
... ... @@ -16,12 +16,14 @@ import { useFetchTargetData } from '@/hooks/external/useFetchTargetData'
16 16 import { useFilterFn } from '@/hooks/external/useFilterFn'
17 17 import { JSONParse } from '@/utils/external/utils'
18 18 import { isArray } from '@/utils/external/is'
  19 +import {getDataView, saveDictItemByCode} from "@/api/external/common";
19 20
20 21 const t = window['$t']
21 22
22 23 const requestDataType = ref<RequestDataTypeEnum>(RequestDataTypeEnum.AJAX)
23 24
24 25 const showModal = ref(false)
  26 +const requestContentType = ref<number>(0)
25 27
26 28 const chartEditStore = useChartEditStore()
27 29
... ... @@ -34,6 +36,13 @@ const getRequestTypeName = computed(() => {
34 36 })
35 37
36 38 const { prefixCls } = useDesign('chart-data-request')
  39 +watch(
  40 + () => componentConfigurationEl.value?.requestContentTypeRef,
  41 + (newVal) => {
  42 + requestContentType.value = newVal;
  43 + },
  44 + { immediate: true }
  45 +)
37 46
38 47 const openModal = async (flag = true, type: RequestDataTypeEnum) => {
39 48 requestDataType.value = type
... ... @@ -75,12 +84,17 @@ const getResult = () => {
75 84 const { targetData } = useTargetData()
76 85 const { fetchTargetData } = useFetchTargetData()
77 86 // 发送请求
78   -const sendHandle = async () => {
79   - if (!targetData.value?.request || !targetData.value.request.requestUrl) {
80   - window['$message'].warning(t('external.data.configMethod'))
81   - return
  87 +const sendHandle = async (requestContentType: number,id?: string) => {
  88 + let res:any;
  89 + if (requestContentType !== 1) {
  90 + if (!targetData.value?.request || !targetData.value.request.requestUrl) {
  91 + window['$message'].warning(t('external.data.configMethod'))
  92 + return
  93 + }
  94 + res = await fetchTargetData()
  95 + }else {
  96 + res = await getDataView({id: id || ''})
82 97 }
83   - const res = await fetchTargetData()
84 98 if (res) {
85 99 const { value } = useFilterFn(targetData.value.filter, res)
86 100 //分组更新下面子组件
... ... @@ -99,11 +113,31 @@ const sendHandle = async () => {
99 113 targetData.value.option.dataset = value
100 114 return
101 115 }
  116 + showModal.value = false
102 117 }
103 118
104 119 const handleSaveAction = async () => {
105 120 if (!(await validate())) return
106 121 let value = getResult()
  122 + let _dataId = ''
  123 + if (value?.requestContentType === 1) {
  124 + const params = {
  125 + id: value?.requestSQLId || '',
  126 + componentCode: value?.componentCode || 'componentCode',
  127 + connectId: value?.sqlRequestHttpType || '',
  128 + sql: value?.requestSQLContent?.sql || '',
  129 + }
  130 + const res:any = await saveDictItemByCode(params)
  131 + showModal.value = false
  132 +
  133 + if (res) {
  134 + _dataId = res?.id
  135 + value = {
  136 + ...value,
  137 + id: res?.id
  138 + }
  139 + }
  140 + }
107 141 value.pondRequestGlobalTokenKey = targetData.value.request.pondRequestGlobalTokenKey
108 142 value.pondRequestGlobalTokenSuffix = targetData.value.request.pondRequestGlobalTokenSuffix
109 143 value.pondRequestInterval = targetData.value.request.pondRequestInterval
... ... @@ -123,10 +157,10 @@ const handleSaveAction = async () => {
123 157 request: value as RequestConfigType
124 158 })
125 159 }
126   - showModal.value = false
127   - sendHandle()
  160 + sendHandle(value?.requestContentType,_dataId)
128 161 }
129 162
  163 +
130 164 createRequestModalContext({
131 165 requestDataType
132 166 })
... ... @@ -138,7 +172,7 @@ defineExpose({
138 172
139 173 <template>
140 174 <NModal :class="prefixCls" v-model:show="showModal" preset="card" style="width: 1000px" :title="t('common.requestConfig')">
141   - <GlobalPublicConfiguration v-if="requestDataType === RequestDataTypeEnum.AJAX" />
  175 + <GlobalPublicConfiguration v-if="requestDataType === RequestDataTypeEnum.AJAX && requestContentType === 0" />
142 176 <NDivider v-if="requestDataType === RequestDataTypeEnum.AJAX" />
143 177 <ComponentConfiguration v-if="requestDataType === RequestDataTypeEnum.AJAX" ref="componentConfigurationEl" />
144 178 <PublicInterfaceForm v-if="requestDataType === RequestDataTypeEnum.Pond" ref="publicInterfaceFormEl" />
... ...
... ... @@ -112,11 +112,11 @@
112 112 <div v-if="!interactActionsIsPageChange">
113 113 <setting-item-box
114 114 :name="requestParamsItem"
115   - v-for="requestParamsItem in requestParamsTypeList"
  115 + v-for="requestParamsItem in (isCustomSqlRequest?.request?.requestContentType === 0 ? requestParamsTypeList:sqlRequestParamsTypeList)"
116 116 :key="requestParamsItem"
117 117 >
118 118 <setting-item
119   - v-for="(ovlValue, ovlKey, index) in fnGetRequest(item.interactComponentId, requestParamsItem)"
  119 + v-for="(ovlValue, ovlKey, index) in (isCustomSqlRequest?.request?.requestContentType === 0 ? fnGetRequest(item.interactComponentId, requestParamsItem) : fnGetSqlRequest(item.interactComponentId, isCustomSqlRequest?.request) )"
120 120 :key="index"
121 121 :name="`${ovlKey}`"
122 122 >
... ... @@ -125,7 +125,7 @@
125 125 v-model:value="item.interactFn[ovlKey]"
126 126 :options="fnDimensionsAndSource(item.interactOn, item.interactComponentId!, requestParamsItem)"
127 127 clearable
128   - multiple
  128 + multiple
129 129 @update:value="(value: string, options: Recordable[])=>handleSelectInteract(value,options,item.interactOn,requestParamsItem)"
130 130 ></n-select>
131 131 </setting-item>
... ... @@ -143,11 +143,11 @@
143 143 </template>
144 144
145 145 <script lang="ts" setup>
146   -import { VNodeChild, computed } from 'vue'
  146 +import {VNodeChild, computed, ref} from 'vue'
147 147 import { SelectOption, SelectGroupOption } from 'naive-ui'
148   -import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
  148 +import { SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
149 149 import { CreateComponentType, CreateComponentGroupType, ChartFrameEnum } from '@/packages/index.d'
150   -import { RequestParamsTypeEnum, RequestDataTypeEnum } from '@/enums/httpEnum'
  150 +import { RequestParamsTypeEnum } from '@/enums/httpEnum'
151 151 import { InteractEventOn, COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum'
152 152 import { icon } from '@/plugins'
153 153 import noData from '@/assets/images/canvas/noData.png'
... ... @@ -158,9 +158,20 @@ import {PageChartEditStoreType} from '@/store/modules/chartEditStore/chartEditSt
158 158 const { CloseIcon, AddIcon, HelpOutlineIcon } = icon.ionicons5
159 159 const { targetData, chartEditStore } = useTargetData()
160 160 const requestParamsTypeList = [RequestParamsTypeEnum.PARAMS, RequestParamsTypeEnum.BODY, RequestParamsTypeEnum.HEADER]
  161 +const sqlRequestParamsTypeList = [RequestParamsTypeEnum.PARAMS]
  162 +const selectEventsComponentId = ref('')
161 163
162 164 const t = window['$t']
163 165
  166 +// //判断是否 自定义sql请求
  167 +const isCustomSqlRequest = computed(() => {
  168 + const eventsComponentId = selectEventsComponentId.value
  169 + const _getComponentList = chartEditStore.getComponentList
  170 + if (!eventsComponentId) return []
  171 +
  172 + return _getComponentList.find( (item:any) => item.id === eventsComponentId)
  173 +})
  174 +
164 175 // THINGS_KIT 修改多画布切换相关代码 用于切换画布
165 176 const interactActionsIsPageChange = computed(() => {
166 177 const interactActions = targetData.value.interactActions
... ... @@ -186,6 +197,7 @@ const option = computed(() => {
186 197 // 绑定组件数据 request
187 198 const fnGetRequest = (id: string | undefined, key: RequestParamsTypeEnum) => {
188 199 if (!id) return {}
  200 + selectEventsComponentId.value = id;
189 201 const globalConfigPindApr = chartEditStore.getRequestGlobalConfig.requestDataPond.find(item => {
190 202 return item.dataPondId === id
191 203 })?.dataPondRequestConfig.requestParams
... ... @@ -193,6 +205,20 @@ const fnGetRequest = (id: string | undefined, key: RequestParamsTypeEnum) => {
193 205 return chartEditStore.getComponentList[chartEditStore.fetchTargetIndex(id)]?.request.requestParams[key]
194 206 }
195 207
  208 +const fnGetSqlRequest = (id: string | undefined, request: any) => {
  209 + if (!id || !request) return {}
  210 + const sql = request?.requestSQLContent?.sql
  211 + // 1. 定义正则表达式匹配 ${...} 模式
  212 + const regex = /\$\{([a-zA-Z0-9_]+)\}/g;
  213 + const variables = [...new Set(Array.from(sql?.matchAll(regex), m => m[1]))];
  214 +// 2. 转换为 { key: undefined } 格式
  215 + const result = variables.reduce((obj, key) => {
  216 + obj[key] = undefined;
  217 + return obj;
  218 + }, {});
  219 + return result
  220 +}
  221 +
196 222 const handleSelectInteract = (value: string, options: SelectOption[], interactOn: InteractEventOn | undefined, requestParamsItem: RequestParamsTypeEnum | null) => {
197 223 console.log(value)
198 224 console.log(options)
... ...