liyu-pc-base 1.0.554 → 1.0.560

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncExportRawData-D1i3W5JO.js","names":[],"sources":["../src/components/lysync/syncConditionGroup.vue","../src/components/lysync/syncConditionGroup.vue","../src/components/lysync/syncExportRawData.vue","../src/components/lysync/syncExportRawData.vue"],"sourcesContent":["<template>\n <div class=\"qb-group\">\n <div class=\"qb-group-head\">\n <a-select\n style=\"width: 110px\"\n :value=\"group.type || 'and'\"\n :options=\"[\n { label: '并且', value: 'and' },\n { label: '或者', value: 'or' },\n ]\"\n @update:value=\"(v:string) => (group.type = v)\"\n />\n <a-button\n size=\"small\"\n @click=\"addRule\"\n >\n 添加条件\n </a-button>\n <a-button\n size=\"small\"\n style=\"margin-left: 8px\"\n @click=\"addGroup\"\n >\n 添加分组\n </a-button>\n </div>\n\n <div class=\"qb-group-body\">\n <template\n v-for=\"(child, idx) in group.conditions\"\n :key=\"idx\"\n >\n <!-- 分组 -->\n <div\n v-if=\"child && typeof child === 'object' && 'type' in child\"\n class=\"qb-subgroup\"\n >\n <ConditionGroup\n :group=\"child\"\n :columns=\"columns\"\n />\n <a-button\n danger\n size=\"small\"\n style=\"margin: 4px 0\"\n @click=\"removeAt(idx)\"\n >\n 删除分组\n </a-button>\n </div>\n <!-- 规则 -->\n <div\n v-else\n class=\"qb-rule\"\n >\n <a-select\n :value=\"child.field\"\n style=\"min-width: 200px\"\n placeholder=\"选择字段\"\n :options=\"fieldOptions\"\n @update:value=\"(v:string)=> (child.field = v)\"\n />\n <a-select\n :value=\"child.op\"\n style=\"width: 200px\"\n :options=\"operators\"\n @update:value=\"(v:string)=> (child.op = v)\"\n />\n\n <!-- 值输入区域 -->\n <template v-if=\"child.op === 'in'\">\n <a-select\n mode=\"tags\"\n style=\"min-width: 220px\"\n :value=\"Array.isArray(child.value) ? child.value : []\"\n placeholder=\"输入多个值后回车\"\n @update:value=\"(v:any)=> (child.value = v)\"\n />\n </template>\n <template v-else-if=\"child.op === 'between'\">\n <a-space :size=\"4\">\n <a-input\n style=\"width: 120px\"\n :value=\"Array.isArray(child.value) ? child.value?.[0] : undefined\"\n placeholder=\"起始值\"\n @update:value=\"(v:any)=> updateBetween(child, 0, v)\"\n />\n <span style=\"padding: 0 4px; color: #999\">~</span>\n <a-input\n style=\"width: 120px\"\n :value=\"Array.isArray(child.value) ? child.value?.[1] : undefined\"\n placeholder=\"结束值\"\n @update:value=\"(v:any)=> updateBetween(child, 1, v)\"\n />\n </a-space>\n </template>\n <template v-else-if=\"child.op === 'is'\">\n <a-select\n style=\"min-width: 160px\"\n :value=\"child.value\"\n placeholder=\"选择 NULL/TRUE/FALSE\"\n @update:value=\"(v:any)=> (child.value = v)\"\n >\n <a-select-option :value=\"null\">NULL</a-select-option>\n <a-select-option :value=\"true\">TRUE</a-select-option>\n <a-select-option :value=\"false\">FALSE</a-select-option>\n </a-select>\n </template>\n <template v-else>\n <a-input\n style=\"min-width: 220px\"\n :value=\"child.value\"\n placeholder=\"输入值\"\n @update:value=\"(v:any)=> (child.value = v)\"\n />\n </template>\n\n <a-button\n danger\n size=\"small\"\n @click=\"removeAt(idx)\"\n >\n 删除\n </a-button>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed } from 'vue';\n\nexport default defineComponent({\n name: 'ConditionGroup',\n props: {\n group: { type: Object as any, required: true },\n columns: { type: Array as any, required: true },\n isRoot: { type: Boolean, default: false },\n },\n setup(props) {\n const operators = [\n { label: '等于', value: '=' },\n { label: '不等于', value: '!=' },\n { label: '大于', value: '>' },\n { label: '大于或等于', value: '>=' },\n { label: '小于', value: '<' },\n { label: '小于或等于', value: '<=' },\n { label: '包含', value: 'in' },\n { label: '模糊匹配', value: 'like' },\n { label: '介于', value: 'between' },\n ];\n\n const fieldOptions = computed(() =>\n (props.columns as any[]).map((c: any) => ({ label: c.title, value: c.dataIndex })),\n );\n\n const addRule = () => {\n (props.group as any).conditions.push({ field: '', op: '=', value: '' });\n };\n const addGroup = () => {\n (props.group as any).conditions.push({ type: 'and', conditions: [] });\n };\n const removeAt = (idx: number) => {\n (props.group as any).conditions.splice(idx, 1);\n };\n const updateBetween = (rule: any, pos: number, v: any) => {\n const arr = Array.isArray(rule.value) ? rule.value : [undefined, undefined];\n arr[pos] = v;\n rule.value = arr;\n };\n\n return {\n operators,\n fieldOptions,\n addRule,\n addGroup,\n removeAt,\n updateBetween,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.qb-group {\n border-left: 2px solid #f0f0f0;\n padding-left: 8px;\n}\n.qb-group-head {\n display: flex;\n gap: 8px;\n margin-bottom: 8px;\n}\n.qb-group-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.qb-rule {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.qb-subgroup {\n padding: 6px 0 6px 8px;\n border-left: 2px dashed #f0f0f0;\n}\n</style>\n","<template>\n <div class=\"qb-group\">\n <div class=\"qb-group-head\">\n <a-select\n style=\"width: 110px\"\n :value=\"group.type || 'and'\"\n :options=\"[\n { label: '并且', value: 'and' },\n { label: '或者', value: 'or' },\n ]\"\n @update:value=\"(v:string) => (group.type = v)\"\n />\n <a-button\n size=\"small\"\n @click=\"addRule\"\n >\n 添加条件\n </a-button>\n <a-button\n size=\"small\"\n style=\"margin-left: 8px\"\n @click=\"addGroup\"\n >\n 添加分组\n </a-button>\n </div>\n\n <div class=\"qb-group-body\">\n <template\n v-for=\"(child, idx) in group.conditions\"\n :key=\"idx\"\n >\n <!-- 分组 -->\n <div\n v-if=\"child && typeof child === 'object' && 'type' in child\"\n class=\"qb-subgroup\"\n >\n <ConditionGroup\n :group=\"child\"\n :columns=\"columns\"\n />\n <a-button\n danger\n size=\"small\"\n style=\"margin: 4px 0\"\n @click=\"removeAt(idx)\"\n >\n 删除分组\n </a-button>\n </div>\n <!-- 规则 -->\n <div\n v-else\n class=\"qb-rule\"\n >\n <a-select\n :value=\"child.field\"\n style=\"min-width: 200px\"\n placeholder=\"选择字段\"\n :options=\"fieldOptions\"\n @update:value=\"(v:string)=> (child.field = v)\"\n />\n <a-select\n :value=\"child.op\"\n style=\"width: 200px\"\n :options=\"operators\"\n @update:value=\"(v:string)=> (child.op = v)\"\n />\n\n <!-- 值输入区域 -->\n <template v-if=\"child.op === 'in'\">\n <a-select\n mode=\"tags\"\n style=\"min-width: 220px\"\n :value=\"Array.isArray(child.value) ? child.value : []\"\n placeholder=\"输入多个值后回车\"\n @update:value=\"(v:any)=> (child.value = v)\"\n />\n </template>\n <template v-else-if=\"child.op === 'between'\">\n <a-space :size=\"4\">\n <a-input\n style=\"width: 120px\"\n :value=\"Array.isArray(child.value) ? child.value?.[0] : undefined\"\n placeholder=\"起始值\"\n @update:value=\"(v:any)=> updateBetween(child, 0, v)\"\n />\n <span style=\"padding: 0 4px; color: #999\">~</span>\n <a-input\n style=\"width: 120px\"\n :value=\"Array.isArray(child.value) ? child.value?.[1] : undefined\"\n placeholder=\"结束值\"\n @update:value=\"(v:any)=> updateBetween(child, 1, v)\"\n />\n </a-space>\n </template>\n <template v-else-if=\"child.op === 'is'\">\n <a-select\n style=\"min-width: 160px\"\n :value=\"child.value\"\n placeholder=\"选择 NULL/TRUE/FALSE\"\n @update:value=\"(v:any)=> (child.value = v)\"\n >\n <a-select-option :value=\"null\">NULL</a-select-option>\n <a-select-option :value=\"true\">TRUE</a-select-option>\n <a-select-option :value=\"false\">FALSE</a-select-option>\n </a-select>\n </template>\n <template v-else>\n <a-input\n style=\"min-width: 220px\"\n :value=\"child.value\"\n placeholder=\"输入值\"\n @update:value=\"(v:any)=> (child.value = v)\"\n />\n </template>\n\n <a-button\n danger\n size=\"small\"\n @click=\"removeAt(idx)\"\n >\n 删除\n </a-button>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed } from 'vue';\n\nexport default defineComponent({\n name: 'ConditionGroup',\n props: {\n group: { type: Object as any, required: true },\n columns: { type: Array as any, required: true },\n isRoot: { type: Boolean, default: false },\n },\n setup(props) {\n const operators = [\n { label: '等于', value: '=' },\n { label: '不等于', value: '!=' },\n { label: '大于', value: '>' },\n { label: '大于或等于', value: '>=' },\n { label: '小于', value: '<' },\n { label: '小于或等于', value: '<=' },\n { label: '包含', value: 'in' },\n { label: '模糊匹配', value: 'like' },\n { label: '介于', value: 'between' },\n ];\n\n const fieldOptions = computed(() =>\n (props.columns as any[]).map((c: any) => ({ label: c.title, value: c.dataIndex })),\n );\n\n const addRule = () => {\n (props.group as any).conditions.push({ field: '', op: '=', value: '' });\n };\n const addGroup = () => {\n (props.group as any).conditions.push({ type: 'and', conditions: [] });\n };\n const removeAt = (idx: number) => {\n (props.group as any).conditions.splice(idx, 1);\n };\n const updateBetween = (rule: any, pos: number, v: any) => {\n const arr = Array.isArray(rule.value) ? rule.value : [undefined, undefined];\n arr[pos] = v;\n rule.value = arr;\n };\n\n return {\n operators,\n fieldOptions,\n addRule,\n addGroup,\n removeAt,\n updateBetween,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.qb-group {\n border-left: 2px solid #f0f0f0;\n padding-left: 8px;\n}\n.qb-group-head {\n display: flex;\n gap: 8px;\n margin-bottom: 8px;\n}\n.qb-group-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.qb-rule {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.qb-subgroup {\n padding: 6px 0 6px 8px;\n border-left: 2px dashed #f0f0f0;\n}\n</style>\n","<template>\n <a-modal\n title=\"原始数据 (仅返回50条数据)\"\n width=\"1300px\"\n v-model:open=\"open\"\n :maskClosable=\"false\"\n centered\n @cancel=\"handleCancel\"\n >\n <div>\n <a-card\n size=\"small\"\n :bordered=\"false\"\n style=\"margin-bottom: 12px\"\n >\n <a-space\n direction=\"vertical\"\n :size=\"8\"\n style=\"width: 100%\"\n >\n <div style=\"display: flex; justify-content: space-between; align-items: center\">\n <div style=\"font-weight: 600\">查询条件</div>\n <div>\n <a-button\n size=\"small\"\n @click=\"resetConditions\"\n >\n 重置\n </a-button>\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"margin-left: 8px\"\n @click=\"applySearch\"\n >\n 查询\n </a-button>\n </div>\n </div>\n <div class=\"conditions-scroll\">\n <ConditionGroup\n :group=\"conditionsRoot\"\n :columns=\"column\"\n :is-root=\"true\"\n />\n </div>\n <div class=\"time-range-row\">\n <span class=\"field-label\">时间范围:</span>\n <a-range-picker\n v-model:value=\"timeRange\"\n :show-time=\"{ format: 'HH:mm:ss' }\"\n format=\"YYYY-MM-DD HH:mm:ss\"\n value-format=\"YYYY-MM-DD HH:mm:ss\"\n :placeholder=\"['开始时间', '结束时间']\"\n style=\"width: 440px\"\n />\n </div>\n </a-space>\n </a-card>\n <a-spin :spinning=\"loading\">\n <a-table\n :columns=\"column\"\n :dataSource=\"datasource\"\n rowKey=\"id\"\n :pagination=\"false\"\n :scroll=\"{ y: height, x: width }\"\n @change=\"handleTableChange\"\n ></a-table>\n </a-spin>\n </div>\n <template #footer>\n <a-button\n key=\"back\"\n @click=\"handleCancel\"\n >\n 关闭\n </a-button>\n <a-button\n key=\"ok\"\n type=\"primary\"\n @click=\"handleCancel\"\n >\n 确定\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onUnmounted, ref, onMounted, computed } from 'vue';\nimport { debounce } from 'lodash';\nimport ConditionGroup from './syncConditionGroup.vue';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport dayjs from 'dayjs';\n\nexport default defineComponent({\n name: 'ExportRawData',\n components: { ConditionGroup },\n props: {\n title: {\n type: String,\n required: false,\n default: () => '',\n },\n record: {\n type: Object,\n required: false,\n default: () => ({}),\n },\n },\n setup(props, { emit }) {\n const height = ref(window.innerHeight - 550);\n const onresize: any = debounce(() => {\n height.value = window.innerHeight - 550;\n }, 200);\n const loading = ref(false);\n\n const datasource = ref<any[]>([]);\n const open = ref(true);\n const titleMap = ref({});\n\n const column = computed(() => {\n const res = [];\n if (datasource.value?.length) {\n for (const key of Object.keys(datasource.value[0])) {\n const title = titleMap.value[key] || key;\n res.push({\n title: title,\n dataIndex: key,\n key: key,\n });\n }\n }\n return res;\n });\n\n const get_column_config = async () => {\n const res: any = await getApiData(\n {\n export_task_id: (props as any).record?.id,\n },\n `${props.record.model_app}/query_sync_model_field_list`,\n );\n if (res?.data?.length) {\n for (const item of res.data) {\n titleMap.value[item.field_name] = item.name;\n }\n }\n };\n const current = ref<number>(1);\n const pageSize = ref<number>(10);\n const total = ref<number>(0);\n const width = computed(() => {\n let w = column.value.length * 200;\n return w < 1000 ? 1000 : w;\n });\n const pageOptions = ref<string[]>([\n '10',\n '20',\n '50',\n '100',\n '500',\n '1000',\n '2000',\n '5000',\n '10000',\n ]);\n\n // 条件构建器根\n const conditionsRoot = ref<any>({ type: 'and', conditions: [] });\n\n // 时间范围([start, end] 字符串,格式 YYYY-MM-DD HH:mm:ss;用于后端 start_time/end_time)\n const timeRange = ref<any>(null);\n\n // 排序状态 - 支持多字段排序\n const sortFields = ref<Array<{ field: string; order: string }>>([]);\n\n const handleCancel = () => {\n emit('cancel');\n };\n\n const get_datasource = async () => {\n loading.value = true;\n try {\n const params: any = {\n export_task_id: (props as any).record?.id,\n current: current.value,\n pageSize: pageSize.value,\n conditions: conditionsRoot.value,\n sort_fields: sortFields.value.length > 0 ? sortFields.value : undefined,\n };\n // 时间范围:前端传则带上(供后端作为 start_time/end_time 渲染 SQL),不传则回退默认区间\n if (\n timeRange.value &&\n timeRange.value.length === 2 &&\n timeRange.value[0] &&\n timeRange.value[1]\n ) {\n params.time_range = timeRange.value;\n }\n const res: any = await getApiData(params, `${props.record.model_app}/query_raw_data`);\n datasource.value = res?.data || [];\n current.value = res?.current ?? current.value;\n pageSize.value = res?.pageSize ?? pageSize.value;\n total.value = res?.total ?? 0;\n } finally {\n loading.value = false;\n }\n };\n\n const handlePageChange = (page: number, size?: number) => {\n current.value = page;\n if (size && size !== pageSize.value) pageSize.value = size;\n get_datasource();\n };\n\n const handleTableChange = (pagination: any, filters: any, sorter: any, { action }: any) => {\n if (action === 'sort') {\n if (sorter?.field) {\n const field = sorter.field;\n const order = sorter.order === 'ascend' ? 'asc' : 'desc';\n sortFields.value = [{ field: field, order: order }];\n } else {\n // 清除所有排序\n sortFields.value = [];\n }\n\n // 重置到第一页并重新查询\n current.value = 1;\n get_datasource();\n }\n };\n\n const resetConditions = () => {\n conditionsRoot.value = { type: 'and', conditions: [] };\n timeRange.value = null;\n };\n const applySearch = () => {\n current.value = 1;\n get_datasource();\n };\n\n onMounted(() => {\n window.addEventListener('resize', onresize);\n onresize();\n get_column_config();\n let start_time = '';\n if (props.record?.data_start_date) {\n start_time = props.record?.data_start_date + ' 00:00:00';\n } else {\n start_time = dayjs().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss');\n }\n timeRange.value = [start_time, dayjs().format('YYYY-MM-DD HH:mm:ss')];\n });\n onUnmounted(() => {\n window.removeEventListener('resize', onresize);\n });\n return {\n height,\n handleCancel,\n open,\n column,\n width,\n datasource,\n current,\n pageSize,\n total,\n handlePageChange,\n pageOptions,\n // 条件\n conditionsRoot,\n resetConditions,\n applySearch,\n loading,\n handleTableChange,\n // 时间范围\n timeRange,\n };\n },\n});\n</script>\n<style lang=\"less\" scoped>\n.qb-group {\n border-left: 2px solid #f0f0f0;\n padding-left: 8px;\n}\n.qb-group-head {\n display: flex;\n gap: 8px;\n margin-bottom: 8px;\n}\n.qb-group-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.qb-rule {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.qb-subgroup {\n padding: 6px 0 6px 8px;\n border-left: 2px dashed #f0f0f0;\n}\n.conditions-scroll {\n max-height: 200px;\n overflow-y: auto;\n padding-right: 8px;\n}\n.time-range-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n}\n.field-label {\n font-weight: 500;\n color: rgba(0, 0, 0, 0.85);\n}\n</style>\n","<template>\n <a-modal\n title=\"原始数据 (仅返回50条数据)\"\n width=\"1300px\"\n v-model:open=\"open\"\n :maskClosable=\"false\"\n centered\n @cancel=\"handleCancel\"\n >\n <div>\n <a-card\n size=\"small\"\n :bordered=\"false\"\n style=\"margin-bottom: 12px\"\n >\n <a-space\n direction=\"vertical\"\n :size=\"8\"\n style=\"width: 100%\"\n >\n <div style=\"display: flex; justify-content: space-between; align-items: center\">\n <div style=\"font-weight: 600\">查询条件</div>\n <div>\n <a-button\n size=\"small\"\n @click=\"resetConditions\"\n >\n 重置\n </a-button>\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"margin-left: 8px\"\n @click=\"applySearch\"\n >\n 查询\n </a-button>\n </div>\n </div>\n <div class=\"conditions-scroll\">\n <ConditionGroup\n :group=\"conditionsRoot\"\n :columns=\"column\"\n :is-root=\"true\"\n />\n </div>\n <div class=\"time-range-row\">\n <span class=\"field-label\">时间范围:</span>\n <a-range-picker\n v-model:value=\"timeRange\"\n :show-time=\"{ format: 'HH:mm:ss' }\"\n format=\"YYYY-MM-DD HH:mm:ss\"\n value-format=\"YYYY-MM-DD HH:mm:ss\"\n :placeholder=\"['开始时间', '结束时间']\"\n style=\"width: 440px\"\n />\n </div>\n </a-space>\n </a-card>\n <a-spin :spinning=\"loading\">\n <a-table\n :columns=\"column\"\n :dataSource=\"datasource\"\n rowKey=\"id\"\n :pagination=\"false\"\n :scroll=\"{ y: height, x: width }\"\n @change=\"handleTableChange\"\n ></a-table>\n </a-spin>\n </div>\n <template #footer>\n <a-button\n key=\"back\"\n @click=\"handleCancel\"\n >\n 关闭\n </a-button>\n <a-button\n key=\"ok\"\n type=\"primary\"\n @click=\"handleCancel\"\n >\n 确定\n </a-button>\n </template>\n </a-modal>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onUnmounted, ref, onMounted, computed } from 'vue';\nimport { debounce } from 'lodash';\nimport ConditionGroup from './syncConditionGroup.vue';\nimport { getApiData } from 'liyu-pc-base/api/api-model';\nimport dayjs from 'dayjs';\n\nexport default defineComponent({\n name: 'ExportRawData',\n components: { ConditionGroup },\n props: {\n title: {\n type: String,\n required: false,\n default: () => '',\n },\n record: {\n type: Object,\n required: false,\n default: () => ({}),\n },\n },\n setup(props, { emit }) {\n const height = ref(window.innerHeight - 550);\n const onresize: any = debounce(() => {\n height.value = window.innerHeight - 550;\n }, 200);\n const loading = ref(false);\n\n const datasource = ref<any[]>([]);\n const open = ref(true);\n const titleMap = ref({});\n\n const column = computed(() => {\n const res = [];\n if (datasource.value?.length) {\n for (const key of Object.keys(datasource.value[0])) {\n const title = titleMap.value[key] || key;\n res.push({\n title: title,\n dataIndex: key,\n key: key,\n });\n }\n }\n return res;\n });\n\n const get_column_config = async () => {\n const res: any = await getApiData(\n {\n export_task_id: (props as any).record?.id,\n },\n `${props.record.model_app}/query_sync_model_field_list`,\n );\n if (res?.data?.length) {\n for (const item of res.data) {\n titleMap.value[item.field_name] = item.name;\n }\n }\n };\n const current = ref<number>(1);\n const pageSize = ref<number>(10);\n const total = ref<number>(0);\n const width = computed(() => {\n let w = column.value.length * 200;\n return w < 1000 ? 1000 : w;\n });\n const pageOptions = ref<string[]>([\n '10',\n '20',\n '50',\n '100',\n '500',\n '1000',\n '2000',\n '5000',\n '10000',\n ]);\n\n // 条件构建器根\n const conditionsRoot = ref<any>({ type: 'and', conditions: [] });\n\n // 时间范围([start, end] 字符串,格式 YYYY-MM-DD HH:mm:ss;用于后端 start_time/end_time)\n const timeRange = ref<any>(null);\n\n // 排序状态 - 支持多字段排序\n const sortFields = ref<Array<{ field: string; order: string }>>([]);\n\n const handleCancel = () => {\n emit('cancel');\n };\n\n const get_datasource = async () => {\n loading.value = true;\n try {\n const params: any = {\n export_task_id: (props as any).record?.id,\n current: current.value,\n pageSize: pageSize.value,\n conditions: conditionsRoot.value,\n sort_fields: sortFields.value.length > 0 ? sortFields.value : undefined,\n };\n // 时间范围:前端传则带上(供后端作为 start_time/end_time 渲染 SQL),不传则回退默认区间\n if (\n timeRange.value &&\n timeRange.value.length === 2 &&\n timeRange.value[0] &&\n timeRange.value[1]\n ) {\n params.time_range = timeRange.value;\n }\n const res: any = await getApiData(params, `${props.record.model_app}/query_raw_data`);\n datasource.value = res?.data || [];\n current.value = res?.current ?? current.value;\n pageSize.value = res?.pageSize ?? pageSize.value;\n total.value = res?.total ?? 0;\n } finally {\n loading.value = false;\n }\n };\n\n const handlePageChange = (page: number, size?: number) => {\n current.value = page;\n if (size && size !== pageSize.value) pageSize.value = size;\n get_datasource();\n };\n\n const handleTableChange = (pagination: any, filters: any, sorter: any, { action }: any) => {\n if (action === 'sort') {\n if (sorter?.field) {\n const field = sorter.field;\n const order = sorter.order === 'ascend' ? 'asc' : 'desc';\n sortFields.value = [{ field: field, order: order }];\n } else {\n // 清除所有排序\n sortFields.value = [];\n }\n\n // 重置到第一页并重新查询\n current.value = 1;\n get_datasource();\n }\n };\n\n const resetConditions = () => {\n conditionsRoot.value = { type: 'and', conditions: [] };\n timeRange.value = null;\n };\n const applySearch = () => {\n current.value = 1;\n get_datasource();\n };\n\n onMounted(() => {\n window.addEventListener('resize', onresize);\n onresize();\n get_column_config();\n let start_time = '';\n if (props.record?.data_start_date) {\n start_time = props.record?.data_start_date + ' 00:00:00';\n } else {\n start_time = dayjs().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss');\n }\n timeRange.value = [start_time, dayjs().format('YYYY-MM-DD HH:mm:ss')];\n });\n onUnmounted(() => {\n window.removeEventListener('resize', onresize);\n });\n return {\n height,\n handleCancel,\n open,\n column,\n width,\n datasource,\n current,\n pageSize,\n total,\n handlePageChange,\n pageOptions,\n // 条件\n conditionsRoot,\n resetConditions,\n applySearch,\n loading,\n handleTableChange,\n // 时间范围\n timeRange,\n };\n },\n});\n</script>\n<style lang=\"less\" scoped>\n.qb-group {\n border-left: 2px solid #f0f0f0;\n padding-left: 8px;\n}\n.qb-group-head {\n display: flex;\n gap: 8px;\n margin-bottom: 8px;\n}\n.qb-group-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.qb-rule {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.qb-subgroup {\n padding: 6px 0 6px 8px;\n border-left: 2px dashed #f0f0f0;\n}\n.conditions-scroll {\n max-height: 200px;\n overflow-y: auto;\n padding-right: 8px;\n}\n.time-range-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n}\n.field-label {\n font-weight: 500;\n color: rgba(0, 0, 0, 0.85);\n}\n</style>\n"],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "liyu-pc-base",
3
3
  "type": "module",
4
4
  "license": "MIT",
5
- "version": "1.0.554",
5
+ "version": "1.0.560",
6
6
  "scripts": {
7
7
  "build": "vite build",
8
8
  "build:watch": "vite build --watch --mode development",