yh-report 2.4.50 → 2.4.51

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.
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as o, ref as a, onActivated as i, onDeactivated as r, onMounted as m, openBlock as s, createElementBlock as c, createVNode as d } from "vue";
2
2
  import { useRoute as u } from "vue-router";
3
- import { u as l } from "./index-348a17e6.mjs";
3
+ import { u as l } from "./index-3ea9b472.mjs";
4
4
  import "element-plus";
5
5
  import "@/libs/api.request.js";
6
6
  import "lodash-es";
@@ -25,4 +25,4 @@ const p = { class: "statement-detail-container" }, y = /* @__PURE__ */ o({
25
25
  export {
26
26
  y as default
27
27
  };
28
- //# sourceMappingURL=StatementDetail-21b55acb.mjs.map
28
+ //# sourceMappingURL=StatementDetail-9ed9e955.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatementDetail-21b55acb.mjs","sources":["../StatementDetail.vue"],"sourcesContent":["<template>\n <section class=\"statement-detail-container\">\n <report-run :id=\"id\"></report-run>\n </section>\n</template>\n<script setup lang=\"ts\">\nimport {ref, onMounted, onActivated, onDeactivated} from 'vue';\nimport {useRoute} from 'vue-router';\nimport reportRun from './component/reportRun.vue';\nconst route = useRoute();\nconst id = ref();\n\nonActivated(() => {\n document.querySelector('.main-container')?.classList.add('statement-design-main');\n});\n\nonDeactivated(() => {\n document.querySelector('.main-container')?.classList.remove('statement-design-main');\n});\n\nonMounted(() => {\n id.value = route.params.id;\n});\n</script>\n"],"names":["route","useRoute","id","ref","onActivated","_a","onDeactivated","onMounted"],"mappings":";;;;;;;;;;AASA,UAAMA,IAAQC,KACRC,IAAKC;AAEX,WAAAC,EAAY,MAAM;;AAChB,OAAAC,IAAA,SAAS,cAAc,iBAAiB,MAAxC,QAAAA,EAA2C,UAAU,IAAI;AAAA,IAAuB,CACjF,GAEDC,EAAc,MAAM;;AAClB,OAAAD,IAAA,SAAS,cAAc,iBAAiB,MAAxC,QAAAA,EAA2C,UAAU,OAAO;AAAA,IAAuB,CACpF,GAEDE,EAAU,MAAM;AACX,MAAAL,EAAA,QAAQF,EAAM,OAAO;AAAA,IAAA,CACzB;;;;;"}
1
+ {"version":3,"file":"StatementDetail-9ed9e955.mjs","sources":["../StatementDetail.vue"],"sourcesContent":["<template>\n <section class=\"statement-detail-container\">\n <report-run :id=\"id\"></report-run>\n </section>\n</template>\n<script setup lang=\"ts\">\nimport {ref, onMounted, onActivated, onDeactivated} from 'vue';\nimport {useRoute} from 'vue-router';\nimport reportRun from './component/reportRun.vue';\nconst route = useRoute();\nconst id = ref();\n\nonActivated(() => {\n document.querySelector('.main-container')?.classList.add('statement-design-main');\n});\n\nonDeactivated(() => {\n document.querySelector('.main-container')?.classList.remove('statement-design-main');\n});\n\nonMounted(() => {\n id.value = route.params.id;\n});\n</script>\n"],"names":["route","useRoute","id","ref","onActivated","_a","onDeactivated","onMounted"],"mappings":";;;;;;;;;;AASA,UAAMA,IAAQC,KACRC,IAAKC;AAEX,WAAAC,EAAY,MAAM;;AAChB,OAAAC,IAAA,SAAS,cAAc,iBAAiB,MAAxC,QAAAA,EAA2C,UAAU,IAAI;AAAA,IAAuB,CACjF,GAEDC,EAAc,MAAM;;AAClB,OAAAD,IAAA,SAAS,cAAc,iBAAiB,MAAxC,QAAAA,EAA2C,UAAU,OAAO;AAAA,IAAuB,CACpF,GAEDE,EAAU,MAAM;AACX,MAAAL,EAAA,QAAQF,EAAM,OAAO;AAAA,IAAA,CACzB;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as G, reactive as B, ref as N, onMounted as Q, watch as L, openBlock as W, createElementBlock as X, createElementVNode as y, createTextVNode as c, toDisplayString as u, unref as e, createVNode as n, withCtx as i, withKeys as Z } from "vue";
2
2
  import { useRouter as ee } from "vue-router";
3
- import { r as a, g as te, s as D, d as oe, a as le } from "./index-348a17e6.mjs";
3
+ import { r as a, g as te, s as D, d as oe, a as le } from "./index-3ea9b472.mjs";
4
4
  import { ElButton as m, ElFormItem as _, ElInput as x, ElTable as ne, ElTableColumn as h, ElPagination as ae, ElDialog as ie, ElForm as re, ElMessage as b, ElLoading as se, ElMessageBox as U } from "element-plus";
5
5
  import { l as de, u as ce } from "./editorLock-61ebf836.mjs";
6
6
  import "@/libs/api.request.js";
@@ -447,4 +447,4 @@ const pe = { class: "statement-list-container" }, me = { class: "actions" }, fe
447
447
  export {
448
448
  De as default
449
449
  };
450
- //# sourceMappingURL=StatementList-63aa9977.mjs.map
450
+ //# sourceMappingURL=StatementList-34396aeb.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatementList-63aa9977.mjs","sources":["../libs/util.ts","../StatementList.vue"],"sourcesContent":["/**\n * 复制文本\n * @param {string} str 要复制的文本\n * @returns {Promise<void>}\n */\nexport function copyString(str) {\n if (navigator.clipboard && window.isSecureContext) {\n navigator.clipboard.writeText(str);\n return Promise.resolve();\n } else {\n let textArea = document.createElement('textarea');\n textArea.value = str;\n textArea.style.position = 'absolute';\n textArea.style.opacity = '0';\n textArea.style.left = '-200%';\n textArea.style.top = '-200%';\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n let flag = document.execCommand('copy');\n textArea.remove();\n if (flag) {\n return Promise.resolve();\n } else {\n return Promise.reject(new Error('copy error'));\n }\n }\n}\n\nexport function isColorLight(color) {\n let rgb;\n if (color.startsWith('#')) {\n color = color.slice(1).toUpperCase();\n\n if (color.length === 3) {\n color = color\n .split('')\n .map((char) => char + char)\n .join('');\n }\n rgb = color.match(/.{2}/g).map((hex) => parseInt(hex, 16));\n } else if (color.startsWith('rgb(')) {\n const rgbMatch = color.match(/\\d+/g);\n rgb = rgbMatch.map((num) => parseInt(num, 10));\n } else {\n console.error('Invalid color format');\n return false;\n }\n const luminance = (0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]) / 255;\n return luminance > 0.5;\n}\n\nexport function getEnumOptions<T extends Record<string, any>>(enumObj: T, filters: string[] = []) {\n return Object.keys(enumObj)\n .filter((key) => !filters.includes(enumObj[key as keyof T]))\n .map((key) => ({\n value: enumObj[key as keyof T],\n label: key,\n }));\n}\n","<template>\n <section class=\"statement-list-container\">\n <div class=\"actions\">\n <div class=\"el-button is-text import-excel-button\">\n <input\n class=\"import-excel-input\"\n type=\"file\"\n @change=\"importReport($event)\" />\n {{ rct('导入') }}\n </div>\n <el-button\n text\n @click=\"exportReport\">\n {{ rct('导出') }}\n </el-button>\n <el-button\n type=\"primary\"\n @click=\"toAddForm\">\n {{ rct('新增') }}\n </el-button>\n <div class=\"form-context\">\n <el-form-item :label=\"rct('报表名称')\">\n <el-input\n v-model=\"listForm.key\"\n @keyup.enter=\"onSearch\"\n :placeholder=\"rct('键入关键字搜索报表')\"></el-input>\n </el-form-item>\n </div>\n <el-button\n type=\"primary\"\n @click=\"onSearch()\">\n {{ rct('搜索') }}\n </el-button>\n <el-button @click=\"onReset()\">{{ rct('重置') }}</el-button>\n </div>\n <el-table\n :data=\"data\"\n row-key=\"id\"\n @selection-change=\"selectionChangeHandle\">\n <el-table-column\n type=\"selection\"\n width=\"50\"></el-table-column>\n <el-table-column\n label=\"#\"\n type=\"index\"\n width=\"66\"\n left></el-table-column>\n <el-table-column\n :label=\"rct('报表代码')\"\n min-width=\"100\"\n prop=\"code\"></el-table-column>\n <el-table-column\n :label=\"rct('报表名称')\"\n min-width=\"100\"\n prop=\"name\"></el-table-column>\n <el-table-column\n :label=\"rct('描述')\"\n min-width=\"200\"\n prop=\"description\"></el-table-column>\n <el-table-column\n :label=\"rct('操作')\"\n width=\"490\"\n fixed=\"right\">\n <template #default=\"scope\">\n <el-button\n link\n :title=\"rct('本系统前台菜单地址')\"\n @click=\"copyLink(scope.row, 'inner')\">\n {{ rct('菜单') }}\n </el-button>\n <el-button\n link\n :title=\"rct('后台测试')\"\n @click=\"copyLink(scope.row, 'admin')\">\n {{ rct('后台') }}\n </el-button>\n <el-button\n link\n :title=\"rct('其他系统嵌入地址')\"\n @click=\"copyLink(scope.row, 'outside')\">\n {{ rct('外嵌') }}\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toDesign(scope.row)\">\n <i class=\"yhreport-icon report-sheji\"></i>\n {{ rct('设计') }}\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toView(scope.row)\">\n <i class=\"yhreport-icon report-preview\"></i>\n {{ rct('查看') }}\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toEditor(scope.row)\">\n <i class=\"yhreport-icon report-bianji\"></i>\n {{ rct('编辑') }}\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toCopy(scope.row)\">\n <i class=\"yhreport-icon report-fuzhi\"></i>\n {{ rct('复制') }}\n </el-button>\n <el-button\n type=\"danger\"\n link\n @click=\"toDelete(scope.row)\">\n <i class=\"yhreport-icon report-shanchusekuai\"></i>\n {{ rct('删除') }}\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n <el-pagination\n background\n style=\"padding-top: 10px; justify-content: flex-end\"\n :page-sizes=\"[10, 20, 50, 100]\"\n v-model:page-size=\"listForm.pageSize\"\n :total=\"listForm.total\"\n v-model:current-page=\"listForm.pageNumber\"\n layout=\"sizes,prev,pager,next,total\"></el-pagination>\n <!-- 新增报表对话框 -->\n <el-dialog\n v-model=\"dialogFormVisible\"\n @close=\"cancelForm\"\n :title=\"form.id ? rct('编辑报表') : rct('新建报表')\">\n <el-form\n :model=\"form\"\n label-width=\"120\">\n <el-form-item\n :label=\"rct('报表代码')\"\n required>\n <el-input\n v-model=\"form.code\"\n autocomplete=\"off\" />\n </el-form-item>\n <el-form-item\n :label=\"rct('报表名称')\"\n required>\n <el-input\n v-model=\"form.name\"\n autocomplete=\"off\" />\n </el-form-item>\n <el-form-item\n :label=\"rct('描述')\"\n required>\n <el-input\n v-model=\"form.description\"\n type=\"textarea\"\n autocomplete=\"off\" />\n </el-form-item>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"cancelForm\">{{ rct('取消') }}</el-button>\n <el-button\n type=\"primary\"\n @click=\"saveForm()\">\n {{ rct('保存') }}\n </el-button>\n </span>\n </template>\n </el-dialog>\n </section>\n</template>\n<script setup lang=\"ts\">\nimport {ref, reactive, computed, watch, onMounted} from 'vue';\nimport {useRouter} from 'vue-router';\nimport {Statement} from './types';\nimport {getList, save, del} from './api/form';\nimport {ElMessageBox, ElMessage, ElButton, ElForm, ElFormItem, ElInput, ElTable, ElTableColumn, ElPagination, ElDialog, ElLoading} from 'element-plus';\nimport {copyString} from './libs/util';\nimport dayjs from 'dayjs';\nimport {lockEditor, unlockEditor} from 'yh-report/libs/editorLock';\nimport {rct} from 'yh-report';\n\nconst router = useRouter();\n\n// @ts-ignore\nconst listForm = reactive({\n key: '',\n pageSize: 10,\n pageNumber: 1,\n total: 0,\n});\nconst data = ref<Statement[]>([]);\n\n//获取报表列表\nasync function getStatementList(flag = false) {\n if (flag) {\n listForm.pageNumber = 1;\n listForm.total = 0;\n }\n const res = await getList({\n key: listForm.key,\n pageSize: listForm.pageSize,\n pageNumber: listForm.pageNumber,\n });\n data.value = res.data.list;\n listForm.total = res.data.total;\n}\n\nfunction copyLink(row, type) {\n let href = '';\n let hrefName = '链接';\n switch (type) {\n case 'admin':\n href = `/admin/statement/detail/${row.id}`;\n hrefName = '后台链接';\n break;\n case 'inner':\n href = `innerStatementdetail/${row.id}`;\n hrefName = '菜单链接';\n break;\n default:\n href = `${window.location.origin}${window.location.pathname}#/statementdetail/${row.id}`;\n hrefName = '外部链接';\n }\n copyString(href)\n .then(() => {\n ElMessage.success(hrefName + '复制成功');\n })\n .catch(() => {\n ElMessage.error(hrefName + '复制遇到问题');\n });\n}\n\nconst tableSelections = ref([]);\nconst selectionChangeHandle = (selections) => {\n tableSelections.value = selections;\n};\n\nconst importReport = async (e) => {\n const file = e.target.files[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = async (event) => {\n e.target.value = '';\n try {\n if (event.target) {\n const jsonData = JSON.parse(event.target.result as string);\n if (Array.isArray(jsonData) && jsonData.every((item) => typeof item === 'object' && 'code' in item && 'config' in item && 'description' in item && 'name' in item)) {\n const loading = ElLoading.service({\n fullscreen: true,\n text: `正在导入报表,共 ${jsonData.length} 个,请稍候...`,\n });\n for (let i = 0; i < jsonData.length; i++) {\n loading.setText(`正在保存第 ${i + 1} 个,共 ${jsonData.length} 个,请稍候...`);\n const item = jsonData[i];\n await save(item);\n }\n loading.close();\n getStatementList(true);\n } else {\n ElMessage.error('格式错误,请确保导入的文件未被修改过!');\n }\n }\n } catch (error) {\n ElMessage.error('文件解析失败,请检查文件是否为有效的 JSON 格式!');\n }\n };\n reader.readAsText(file);\n};\n\nconst exportReport = () => {\n if (tableSelections.value.length > 0) {\n const jsonData = JSON.stringify(\n tableSelections.value.map(({code, config, description, name}) => {\n return {\n code,\n config,\n description,\n name,\n };\n }),\n null,\n 2\n );\n const blob = new Blob([jsonData], {type: 'application/json'});\n\n const url = URL.createObjectURL(blob);\n\n const formattedDate = dayjs().format('YYYYMMDDHHmm');\n const fileName = `报表导出-${formattedDate}.json`;\n\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n URL.revokeObjectURL(url);\n } else {\n ElMessage.warning('请选择要操作的报表!');\n }\n};\n\nconst toDesign = async (row) => {\n let res = await lockEditor(row.id);\n if (res === 'OK') {\n router.push(`/admin/statement/design/${row.id}`);\n } else {\n const toUnlock = await ElMessageBox.alert('报表正在被其他用户锁定,是否强制解锁?', '提示', {\n confirmButtonText: '解锁',\n cancelButtonText: '取消',\n });\n if (toUnlock === 'confirm') {\n let flag = await unlockEditor(row.id);\n if (flag) {\n toDesign(row);\n } else {\n ElMessage.error('解锁失败,请稍后再试!');\n }\n }\n }\n};\n\nconst toView = (row) => {\n router.push(`/admin/statement/detail/${row.id}`);\n};\n\nonMounted(() => {\n getStatementList(true);\n});\n\n//新增报表\nconst dialogFormVisible = ref(false);\n\nconst form = reactive({\n id: undefined,\n name: '',\n code: '',\n description: '',\n});\n\nconst toAddForm = () => {\n dialogFormVisible.value = true;\n};\n\nconst toEditor = (row) => {\n dialogFormVisible.value = true;\n form.id = row.id;\n form.name = row.name;\n form.code = row.code;\n form.description = row.description;\n};\n\nconst toCopy = (row) => {\n ElMessageBox.confirm('当前操作会复制选定的报表,确认继续吗?', '提醒', {\n confirmButtonText: '复制',\n cancelButtonText: '取消',\n type: 'warning',\n }).then(() => {\n let form = {\n name: `${row.name}-copy`,\n code: `${row.code}-copy`,\n description: `${row.description}-copy`,\n chartConfig: row.chartConfig,\n config: row.config,\n listData: row.listData,\n };\n save(form)\n .then(() => {\n ElMessage.success('复制成功');\n getStatementList(true);\n })\n .catch(() => {\n ElMessage.error('复制失败');\n });\n });\n};\n\nconst toDelete = (row) => {\n ElMessageBox.confirm('当前操作会删除选定的报表,确认继续吗?', '警告', {\n confirmButtonText: '删除',\n cancelButtonText: '取消',\n type: 'warning',\n }).then(async () => {\n let res = await del(row.id);\n if (res.data) {\n getStatementList(true);\n }\n });\n};\n\nconst cancelForm = () => {\n dialogFormVisible.value = false;\n form.id = undefined;\n form.name = '';\n form.code = '';\n form.description = '';\n};\nconst saveForm = async () => {\n await save(form);\n getStatementList(true);\n cancelForm();\n};\n\n//搜索报表\nconst onSearch = (e?) => {\n if (e) {\n e.preventDefault();\n e.stopPropagation();\n }\n getStatementList(false);\n};\n\n//重置\nconst onReset = () => {\n listForm.key = '';\n getStatementList(true);\n};\n\n//分页功能\nwatch(\n () => listForm.pageNumber,\n () => {\n getStatementList();\n }\n);\nwatch(\n () => listForm.pageSize,\n () => {\n getStatementList();\n }\n);\n</script>\n\n<style lang=\"scss\">\n.statement-list-container {\n width: 100%;\n height: 100%;\n padding: 10px 0 0;\n box-sizing: border-box;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n .actions {\n display: flex;\n align-items: center;\n\n .form-context {\n flex: 1;\n margin: 0 10px;\n display: flex;\n }\n\n .el-form-item {\n margin-bottom: 0;\n margin-right: 10px;\n }\n }\n\n .el-table {\n flex: 1;\n }\n\n .el-dialog {\n .el-button--text {\n margin-right: 15px;\n }\n\n .el-form-item {\n width: 100%;\n }\n\n .el-select {\n width: 100%;\n }\n\n .el-input {\n width: 100%;\n }\n\n .dialog-footer button:first-child {\n margin-right: 10px;\n }\n }\n .import-excel-button {\n position: relative;\n .import-excel-input {\n position: absolute;\n left: 0;\n top: 0;\n opacity: 0;\n width: 100%;\n height: 100%;\n z-index: 10;\n }\n }\n}\n</style>\n"],"names":["copyString","str","textArea","flag","router","useRouter","listForm","reactive","data","ref","getStatementList","res","getList","copyLink","row","type","href","hrefName","ElMessage","tableSelections","selectionChangeHandle","selections","importReport","e","file","reader","event","jsonData","item","loading","ElLoading","i","save","exportReport","code","config","description","name","blob","url","fileName","dayjs","a","toDesign","lockEditor","ElMessageBox","unlockEditor","toView","onMounted","dialogFormVisible","form","toAddForm","toEditor","toCopy","toDelete","del","cancelForm","saveForm","onSearch","onReset","watch"],"mappings":"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"}
1
+ {"version":3,"file":"StatementList-34396aeb.mjs","sources":["../libs/util.ts","../StatementList.vue"],"sourcesContent":["/**\n * 复制文本\n * @param {string} str 要复制的文本\n * @returns {Promise<void>}\n */\nexport function copyString(str) {\n if (navigator.clipboard && window.isSecureContext) {\n navigator.clipboard.writeText(str);\n return Promise.resolve();\n } else {\n let textArea = document.createElement('textarea');\n textArea.value = str;\n textArea.style.position = 'absolute';\n textArea.style.opacity = '0';\n textArea.style.left = '-200%';\n textArea.style.top = '-200%';\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n let flag = document.execCommand('copy');\n textArea.remove();\n if (flag) {\n return Promise.resolve();\n } else {\n return Promise.reject(new Error('copy error'));\n }\n }\n}\n\nexport function isColorLight(color) {\n let rgb;\n if (color.startsWith('#')) {\n color = color.slice(1).toUpperCase();\n\n if (color.length === 3) {\n color = color\n .split('')\n .map((char) => char + char)\n .join('');\n }\n rgb = color.match(/.{2}/g).map((hex) => parseInt(hex, 16));\n } else if (color.startsWith('rgb(')) {\n const rgbMatch = color.match(/\\d+/g);\n rgb = rgbMatch.map((num) => parseInt(num, 10));\n } else {\n console.error('Invalid color format');\n return false;\n }\n const luminance = (0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]) / 255;\n return luminance > 0.5;\n}\n\nexport function getEnumOptions<T extends Record<string, any>>(enumObj: T, filters: string[] = []) {\n return Object.keys(enumObj)\n .filter((key) => !filters.includes(enumObj[key as keyof T]))\n .map((key) => ({\n value: enumObj[key as keyof T],\n label: key,\n }));\n}\n","<template>\n <section class=\"statement-list-container\">\n <div class=\"actions\">\n <div class=\"el-button is-text import-excel-button\">\n <input\n class=\"import-excel-input\"\n type=\"file\"\n @change=\"importReport($event)\" />\n {{ rct('导入') }}\n </div>\n <el-button\n text\n @click=\"exportReport\">\n {{ rct('导出') }}\n </el-button>\n <el-button\n type=\"primary\"\n @click=\"toAddForm\">\n {{ rct('新增') }}\n </el-button>\n <div class=\"form-context\">\n <el-form-item :label=\"rct('报表名称')\">\n <el-input\n v-model=\"listForm.key\"\n @keyup.enter=\"onSearch\"\n :placeholder=\"rct('键入关键字搜索报表')\"></el-input>\n </el-form-item>\n </div>\n <el-button\n type=\"primary\"\n @click=\"onSearch()\">\n {{ rct('搜索') }}\n </el-button>\n <el-button @click=\"onReset()\">{{ rct('重置') }}</el-button>\n </div>\n <el-table\n :data=\"data\"\n row-key=\"id\"\n @selection-change=\"selectionChangeHandle\">\n <el-table-column\n type=\"selection\"\n width=\"50\"></el-table-column>\n <el-table-column\n label=\"#\"\n type=\"index\"\n width=\"66\"\n left></el-table-column>\n <el-table-column\n :label=\"rct('报表代码')\"\n min-width=\"100\"\n prop=\"code\"></el-table-column>\n <el-table-column\n :label=\"rct('报表名称')\"\n min-width=\"100\"\n prop=\"name\"></el-table-column>\n <el-table-column\n :label=\"rct('描述')\"\n min-width=\"200\"\n prop=\"description\"></el-table-column>\n <el-table-column\n :label=\"rct('操作')\"\n width=\"490\"\n fixed=\"right\">\n <template #default=\"scope\">\n <el-button\n link\n :title=\"rct('本系统前台菜单地址')\"\n @click=\"copyLink(scope.row, 'inner')\">\n {{ rct('菜单') }}\n </el-button>\n <el-button\n link\n :title=\"rct('后台测试')\"\n @click=\"copyLink(scope.row, 'admin')\">\n {{ rct('后台') }}\n </el-button>\n <el-button\n link\n :title=\"rct('其他系统嵌入地址')\"\n @click=\"copyLink(scope.row, 'outside')\">\n {{ rct('外嵌') }}\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toDesign(scope.row)\">\n <i class=\"yhreport-icon report-sheji\"></i>\n {{ rct('设计') }}\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toView(scope.row)\">\n <i class=\"yhreport-icon report-preview\"></i>\n {{ rct('查看') }}\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toEditor(scope.row)\">\n <i class=\"yhreport-icon report-bianji\"></i>\n {{ rct('编辑') }}\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toCopy(scope.row)\">\n <i class=\"yhreport-icon report-fuzhi\"></i>\n {{ rct('复制') }}\n </el-button>\n <el-button\n type=\"danger\"\n link\n @click=\"toDelete(scope.row)\">\n <i class=\"yhreport-icon report-shanchusekuai\"></i>\n {{ rct('删除') }}\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n <el-pagination\n background\n style=\"padding-top: 10px; justify-content: flex-end\"\n :page-sizes=\"[10, 20, 50, 100]\"\n v-model:page-size=\"listForm.pageSize\"\n :total=\"listForm.total\"\n v-model:current-page=\"listForm.pageNumber\"\n layout=\"sizes,prev,pager,next,total\"></el-pagination>\n <!-- 新增报表对话框 -->\n <el-dialog\n v-model=\"dialogFormVisible\"\n @close=\"cancelForm\"\n :title=\"form.id ? rct('编辑报表') : rct('新建报表')\">\n <el-form\n :model=\"form\"\n label-width=\"120\">\n <el-form-item\n :label=\"rct('报表代码')\"\n required>\n <el-input\n v-model=\"form.code\"\n autocomplete=\"off\" />\n </el-form-item>\n <el-form-item\n :label=\"rct('报表名称')\"\n required>\n <el-input\n v-model=\"form.name\"\n autocomplete=\"off\" />\n </el-form-item>\n <el-form-item\n :label=\"rct('描述')\"\n required>\n <el-input\n v-model=\"form.description\"\n type=\"textarea\"\n autocomplete=\"off\" />\n </el-form-item>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"cancelForm\">{{ rct('取消') }}</el-button>\n <el-button\n type=\"primary\"\n @click=\"saveForm()\">\n {{ rct('保存') }}\n </el-button>\n </span>\n </template>\n </el-dialog>\n </section>\n</template>\n<script setup lang=\"ts\">\nimport {ref, reactive, computed, watch, onMounted} from 'vue';\nimport {useRouter} from 'vue-router';\nimport {Statement} from './types';\nimport {getList, save, del} from './api/form';\nimport {ElMessageBox, ElMessage, ElButton, ElForm, ElFormItem, ElInput, ElTable, ElTableColumn, ElPagination, ElDialog, ElLoading} from 'element-plus';\nimport {copyString} from './libs/util';\nimport dayjs from 'dayjs';\nimport {lockEditor, unlockEditor} from 'yh-report/libs/editorLock';\nimport {rct} from 'yh-report';\n\nconst router = useRouter();\n\n// @ts-ignore\nconst listForm = reactive({\n key: '',\n pageSize: 10,\n pageNumber: 1,\n total: 0,\n});\nconst data = ref<Statement[]>([]);\n\n//获取报表列表\nasync function getStatementList(flag = false) {\n if (flag) {\n listForm.pageNumber = 1;\n listForm.total = 0;\n }\n const res = await getList({\n key: listForm.key,\n pageSize: listForm.pageSize,\n pageNumber: listForm.pageNumber,\n });\n data.value = res.data.list;\n listForm.total = res.data.total;\n}\n\nfunction copyLink(row, type) {\n let href = '';\n let hrefName = '链接';\n switch (type) {\n case 'admin':\n href = `/admin/statement/detail/${row.id}`;\n hrefName = '后台链接';\n break;\n case 'inner':\n href = `innerStatementdetail/${row.id}`;\n hrefName = '菜单链接';\n break;\n default:\n href = `${window.location.origin}${window.location.pathname}#/statementdetail/${row.id}`;\n hrefName = '外部链接';\n }\n copyString(href)\n .then(() => {\n ElMessage.success(hrefName + '复制成功');\n })\n .catch(() => {\n ElMessage.error(hrefName + '复制遇到问题');\n });\n}\n\nconst tableSelections = ref([]);\nconst selectionChangeHandle = (selections) => {\n tableSelections.value = selections;\n};\n\nconst importReport = async (e) => {\n const file = e.target.files[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = async (event) => {\n e.target.value = '';\n try {\n if (event.target) {\n const jsonData = JSON.parse(event.target.result as string);\n if (Array.isArray(jsonData) && jsonData.every((item) => typeof item === 'object' && 'code' in item && 'config' in item && 'description' in item && 'name' in item)) {\n const loading = ElLoading.service({\n fullscreen: true,\n text: `正在导入报表,共 ${jsonData.length} 个,请稍候...`,\n });\n for (let i = 0; i < jsonData.length; i++) {\n loading.setText(`正在保存第 ${i + 1} 个,共 ${jsonData.length} 个,请稍候...`);\n const item = jsonData[i];\n await save(item);\n }\n loading.close();\n getStatementList(true);\n } else {\n ElMessage.error('格式错误,请确保导入的文件未被修改过!');\n }\n }\n } catch (error) {\n ElMessage.error('文件解析失败,请检查文件是否为有效的 JSON 格式!');\n }\n };\n reader.readAsText(file);\n};\n\nconst exportReport = () => {\n if (tableSelections.value.length > 0) {\n const jsonData = JSON.stringify(\n tableSelections.value.map(({code, config, description, name}) => {\n return {\n code,\n config,\n description,\n name,\n };\n }),\n null,\n 2\n );\n const blob = new Blob([jsonData], {type: 'application/json'});\n\n const url = URL.createObjectURL(blob);\n\n const formattedDate = dayjs().format('YYYYMMDDHHmm');\n const fileName = `报表导出-${formattedDate}.json`;\n\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n URL.revokeObjectURL(url);\n } else {\n ElMessage.warning('请选择要操作的报表!');\n }\n};\n\nconst toDesign = async (row) => {\n let res = await lockEditor(row.id);\n if (res === 'OK') {\n router.push(`/admin/statement/design/${row.id}`);\n } else {\n const toUnlock = await ElMessageBox.alert('报表正在被其他用户锁定,是否强制解锁?', '提示', {\n confirmButtonText: '解锁',\n cancelButtonText: '取消',\n });\n if (toUnlock === 'confirm') {\n let flag = await unlockEditor(row.id);\n if (flag) {\n toDesign(row);\n } else {\n ElMessage.error('解锁失败,请稍后再试!');\n }\n }\n }\n};\n\nconst toView = (row) => {\n router.push(`/admin/statement/detail/${row.id}`);\n};\n\nonMounted(() => {\n getStatementList(true);\n});\n\n//新增报表\nconst dialogFormVisible = ref(false);\n\nconst form = reactive({\n id: undefined,\n name: '',\n code: '',\n description: '',\n});\n\nconst toAddForm = () => {\n dialogFormVisible.value = true;\n};\n\nconst toEditor = (row) => {\n dialogFormVisible.value = true;\n form.id = row.id;\n form.name = row.name;\n form.code = row.code;\n form.description = row.description;\n};\n\nconst toCopy = (row) => {\n ElMessageBox.confirm('当前操作会复制选定的报表,确认继续吗?', '提醒', {\n confirmButtonText: '复制',\n cancelButtonText: '取消',\n type: 'warning',\n }).then(() => {\n let form = {\n name: `${row.name}-copy`,\n code: `${row.code}-copy`,\n description: `${row.description}-copy`,\n chartConfig: row.chartConfig,\n config: row.config,\n listData: row.listData,\n };\n save(form)\n .then(() => {\n ElMessage.success('复制成功');\n getStatementList(true);\n })\n .catch(() => {\n ElMessage.error('复制失败');\n });\n });\n};\n\nconst toDelete = (row) => {\n ElMessageBox.confirm('当前操作会删除选定的报表,确认继续吗?', '警告', {\n confirmButtonText: '删除',\n cancelButtonText: '取消',\n type: 'warning',\n }).then(async () => {\n let res = await del(row.id);\n if (res.data) {\n getStatementList(true);\n }\n });\n};\n\nconst cancelForm = () => {\n dialogFormVisible.value = false;\n form.id = undefined;\n form.name = '';\n form.code = '';\n form.description = '';\n};\nconst saveForm = async () => {\n await save(form);\n getStatementList(true);\n cancelForm();\n};\n\n//搜索报表\nconst onSearch = (e?) => {\n if (e) {\n e.preventDefault();\n e.stopPropagation();\n }\n getStatementList(false);\n};\n\n//重置\nconst onReset = () => {\n listForm.key = '';\n getStatementList(true);\n};\n\n//分页功能\nwatch(\n () => listForm.pageNumber,\n () => {\n getStatementList();\n }\n);\nwatch(\n () => listForm.pageSize,\n () => {\n getStatementList();\n }\n);\n</script>\n\n<style lang=\"scss\">\n.statement-list-container {\n width: 100%;\n height: 100%;\n padding: 10px 0 0;\n box-sizing: border-box;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n .actions {\n display: flex;\n align-items: center;\n\n .form-context {\n flex: 1;\n margin: 0 10px;\n display: flex;\n }\n\n .el-form-item {\n margin-bottom: 0;\n margin-right: 10px;\n }\n }\n\n .el-table {\n flex: 1;\n }\n\n .el-dialog {\n .el-button--text {\n margin-right: 15px;\n }\n\n .el-form-item {\n width: 100%;\n }\n\n .el-select {\n width: 100%;\n }\n\n .el-input {\n width: 100%;\n }\n\n .dialog-footer button:first-child {\n margin-right: 10px;\n }\n }\n .import-excel-button {\n position: relative;\n .import-excel-input {\n position: absolute;\n left: 0;\n top: 0;\n opacity: 0;\n width: 100%;\n height: 100%;\n z-index: 10;\n }\n }\n}\n</style>\n"],"names":["copyString","str","textArea","flag","router","useRouter","listForm","reactive","data","ref","getStatementList","res","getList","copyLink","row","type","href","hrefName","ElMessage","tableSelections","selectionChangeHandle","selections","importReport","e","file","reader","event","jsonData","item","loading","ElLoading","i","save","exportReport","code","config","description","name","blob","url","fileName","dayjs","a","toDesign","lockEditor","ElMessageBox","unlockEditor","toView","onMounted","dialogFormVisible","form","toAddForm","toEditor","toCopy","toDelete","del","cancelForm","saveForm","onSearch","onReset","watch"],"mappings":";;;;;;;;AAKO,SAASA,GAAWC,GAAK;AAC1B,MAAA,UAAU,aAAa,OAAO;AACtB,qBAAA,UAAU,UAAUA,CAAG,GAC1B,QAAQ;AACV;AACD,QAAAC,IAAW,SAAS,cAAc,UAAU;AAChD,IAAAA,EAAS,QAAQD,GACjBC,EAAS,MAAM,WAAW,YAC1BA,EAAS,MAAM,UAAU,KACzBA,EAAS,MAAM,OAAO,SACtBA,EAAS,MAAM,MAAM,SACZ,SAAA,KAAK,YAAYA,CAAQ,GAClCA,EAAS,MAAM,GACfA,EAAS,OAAO;AACZ,QAAAC,IAAO,SAAS,YAAY,MAAM;AAEtC,WADAD,EAAS,OAAO,GACZC,IACK,QAAQ,YAER,QAAQ,OAAO,IAAI,MAAM,YAAY,CAAC;AAAA,EAEjD;AACF;;;;AC4JA,UAAMC,IAASC,MAGTC,IAAWC,EAAS;AAAA,MACxB,KAAK;AAAA,MACL,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,IAAA,CACR,GACKC,IAAOC,EAAiB,CAAA,CAAE;AAGjB,mBAAAC,EAAiBP,IAAO,IAAO;AAC5C,MAAIA,MACFG,EAAS,aAAa,GACtBA,EAAS,QAAQ;AAEb,YAAAK,IAAM,MAAMC,GAAQ;AAAA,QACxB,KAAKN,EAAS;AAAA,QACd,UAAUA,EAAS;AAAA,QACnB,YAAYA,EAAS;AAAA,MAAA,CACtB;AACI,MAAAE,EAAA,QAAQG,EAAI,KAAK,MACbL,EAAA,QAAQK,EAAI,KAAK;AAAA,IAC5B;AAES,aAAAE,EAASC,GAAKC,GAAM;AAC3B,UAAIC,IAAO,IACPC,IAAW;AACf,cAAQF,GAAM;AAAA,QACZ,KAAK;AACI,UAAAC,IAAA,2BAA2BF,EAAI,EAAE,IAC7BG,IAAA;AACX;AAAA,QACF,KAAK;AACI,UAAAD,IAAA,wBAAwBF,EAAI,EAAE,IAC1BG,IAAA;AACX;AAAA,QACF;AACS,UAAAD,IAAA,GAAG,OAAO,SAAS,MAAM,GAAG,OAAO,SAAS,QAAQ,qBAAqBF,EAAI,EAAE,IAC3EG,IAAA;AAAA,MACf;AACW,MAAAjB,GAAAgB,CAAI,EACZ,KAAK,MAAM;AACA,QAAAE,EAAA,QAAQD,IAAW,MAAM;AAAA,MAAA,CACpC,EACA,MAAM,MAAM;AACD,QAAAC,EAAA,MAAMD,IAAW,QAAQ;AAAA,MAAA,CACpC;AAAA,IACL;AAEM,UAAAE,IAAkBV,EAAI,CAAA,CAAE,GACxBW,IAAwB,CAACC,MAAe;AAC5C,MAAAF,EAAgB,QAAQE;AAAA,IAAA,GAGpBC,IAAe,OAAOC,MAAM;AAChC,YAAMC,IAAOD,EAAE,OAAO,MAAM,CAAC;AAC7B,UAAI,CAACC;AAAM;AAEL,YAAAC,IAAS,IAAI;AACZ,MAAAA,EAAA,SAAS,OAAOC,MAAU;AAC/B,QAAAH,EAAE,OAAO,QAAQ;AACb,YAAA;AACF,cAAIG,EAAM,QAAQ;AAChB,kBAAMC,IAAW,KAAK,MAAMD,EAAM,OAAO,MAAgB;AACzD,gBAAI,MAAM,QAAQC,CAAQ,KAAKA,EAAS,MAAM,CAACC,MAAS,OAAOA,KAAS,YAAY,UAAUA,KAAQ,YAAYA,KAAQ,iBAAiBA,KAAQ,UAAUA,CAAI,GAAG;AAC5J,oBAAAC,IAAUC,GAAU,QAAQ;AAAA,gBAChC,YAAY;AAAA,gBACZ,MAAM,YAAYH,EAAS,MAAM;AAAA,cAAA,CAClC;AACD,uBAASI,IAAI,GAAGA,IAAIJ,EAAS,QAAQI,KAAK;AACxC,gBAAAF,EAAQ,QAAQ,SAASE,IAAI,CAAC,QAAQJ,EAAS,MAAM,WAAW;AAC1D,sBAAAC,IAAOD,EAASI,CAAC;AACvB,sBAAMC,EAAKJ,CAAI;AAAA,cACjB;AACA,cAAAC,EAAQ,MAAM,GACdnB,EAAiB,EAAI;AAAA,YAAA;AAErB,cAAAQ,EAAU,MAAM,qBAAqB;AAAA,UAEzC;AAAA,gBACc;AACd,UAAAA,EAAU,MAAM,6BAA6B;AAAA,QAC/C;AAAA,MAAA,GAEFO,EAAO,WAAWD,CAAI;AAAA,IAAA,GAGlBS,IAAe,MAAM;AACrB,UAAAd,EAAgB,MAAM,SAAS,GAAG;AACpC,cAAMQ,IAAW,KAAK;AAAA,UACpBR,EAAgB,MAAM,IAAI,CAAC,EAAC,MAAAe,GAAM,QAAAC,GAAQ,aAAAC,GAAa,MAAAC,SAC9C;AAAA,YACL,MAAAH;AAAA,YACA,QAAAC;AAAA,YACA,aAAAC;AAAA,YACA,MAAAC;AAAA,UAAA,EAEH;AAAA,UACD;AAAA,UACA;AAAA,QAAA,GAEIC,IAAO,IAAI,KAAK,CAACX,CAAQ,GAAG,EAAC,MAAM,mBAAA,CAAmB,GAEtDY,IAAM,IAAI,gBAAgBD,CAAI,GAG9BE,IAAW,QADKC,GAAA,EAAQ,OAAO,cAAc,CACb,SAEhCC,IAAI,SAAS,cAAc,GAAG;AACpC,QAAAA,EAAE,OAAOH,GACTG,EAAE,WAAWF,GACJ,SAAA,KAAK,YAAYE,CAAC,GAC3BA,EAAE,MAAM,GACC,SAAA,KAAK,YAAYA,CAAC,GAE3B,IAAI,gBAAgBH,CAAG;AAAA,MAAA;AAEvB,QAAArB,EAAU,QAAQ,YAAY;AAAA,IAChC,GAGIyB,IAAW,OAAO7B,MAAQ;AAE9B,MADU,MAAM8B,GAAW9B,EAAI,EAAE,MACrB,OACVV,EAAO,KAAK,2BAA2BU,EAAI,EAAE,EAAE,IAE9B,MAAM+B,EAAa,MAAM,uBAAuB,MAAM;AAAA,QACrE,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,MAAA,CACnB,MACgB,cACJ,MAAMC,GAAahC,EAAI,EAAE,IAElC6B,EAAS7B,CAAG,IAEZI,EAAU,MAAM,aAAa;AAAA,IAGnC,GAGI6B,IAAS,CAACjC,MAAQ;AACtB,MAAAV,EAAO,KAAK,2BAA2BU,EAAI,EAAE,EAAE;AAAA,IAAA;AAGjD,IAAAkC,EAAU,MAAM;AACd,MAAAtC,EAAiB,EAAI;AAAA,IAAA,CACtB;AAGK,UAAAuC,IAAoBxC,EAAI,EAAK,GAE7ByC,IAAO3C,EAAS;AAAA,MACpB,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IAAA,CACd,GAEK4C,IAAY,MAAM;AACtB,MAAAF,EAAkB,QAAQ;AAAA,IAAA,GAGtBG,IAAW,CAACtC,MAAQ;AACxB,MAAAmC,EAAkB,QAAQ,IAC1BC,EAAK,KAAKpC,EAAI,IACdoC,EAAK,OAAOpC,EAAI,MAChBoC,EAAK,OAAOpC,EAAI,MAChBoC,EAAK,cAAcpC,EAAI;AAAA,IAAA,GAGnBuC,IAAS,CAACvC,MAAQ;AACT,MAAA+B,EAAA,QAAQ,uBAAuB,MAAM;AAAA,QAChD,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,MAAM;AAAA,MAAA,CACP,EAAE,KAAK,MAAM;AACZ,YAAIK,IAAO;AAAA,UACT,MAAM,GAAGpC,EAAI,IAAI;AAAA,UACjB,MAAM,GAAGA,EAAI,IAAI;AAAA,UACjB,aAAa,GAAGA,EAAI,WAAW;AAAA,UAC/B,aAAaA,EAAI;AAAA,UACjB,QAAQA,EAAI;AAAA,UACZ,UAAUA,EAAI;AAAA,QAAA;AAEXoC,QAAAA,EAAAA,CAAI,EACN,KAAK,MAAM;AACV,UAAAhC,EAAU,QAAQ,MAAM,GACxBR,EAAiB,EAAI;AAAA,QAAA,CACtB,EACA,MAAM,MAAM;AACX,UAAAQ,EAAU,MAAM,MAAM;AAAA,QAAA,CACvB;AAAA,MAAA,CACJ;AAAA,IAAA,GAGGoC,IAAW,CAACxC,MAAQ;AACX,MAAA+B,EAAA,QAAQ,uBAAuB,MAAM;AAAA,QAChD,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,MAAM;AAAA,MAAA,CACP,EAAE,KAAK,YAAY;AAElB,SADU,MAAMU,GAAIzC,EAAI,EAAE,GAClB,QACNJ,EAAiB,EAAI;AAAA,MACvB,CACD;AAAA,IAAA,GAGG8C,IAAa,MAAM;AACvB,MAAAP,EAAkB,QAAQ,IAC1BC,EAAK,KAAK,QACVA,EAAK,OAAO,IACZA,EAAK,OAAO,IACZA,EAAK,cAAc;AAAA,IAAA,GAEfO,IAAW,YAAY;AAC3B,YAAMzB,EAAKkB,CAAI,GACfxC,EAAiB,EAAI,GACV8C;IAAA,GAIPE,IAAW,CAACnC,MAAO;AACvB,MAAIA,MACFA,EAAE,eAAe,GACjBA,EAAE,gBAAgB,IAEpBb,EAAiB,EAAK;AAAA,IAAA,GAIlBiD,IAAU,MAAM;AACpB,MAAArD,EAAS,MAAM,IACfI,EAAiB,EAAI;AAAA,IAAA;AAIvB,WAAAkD;AAAA,MACE,MAAMtD,EAAS;AAAA,MACf,MAAM;AACa,QAAAI;MACnB;AAAA,IAAA,GAEFkD;AAAA,MACE,MAAMtD,EAAS;AAAA,MACf,MAAM;AACa,QAAAI;MACnB;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2523,7 +2523,7 @@ jsep.addBinaryOp("<", 0, (Y, K) => Y < K);
2523
2523
  jsep.addBinaryOp(">=", 0, (Y, K) => Y >= K);
2524
2524
  jsep.addBinaryOp("<=", 0, (Y, K) => Y <= K);
2525
2525
  let innerConfig = {}, needComputedCell = /* @__PURE__ */ new Map();
2526
- const StringFunRex = /\$\{([a-zA-Z0-9_$\-\.\/:\u4e00-\u9fa5]+)\}/g, FormulaRex = /\$\{=(.+?)\}/g;
2526
+ const StringFunRex = /\$\{([^\}]+)\}/g, FormulaRex = /\$\{=(.+?)\}/g;
2527
2527
  function evaluateTextFormulas(Y, K) {
2528
2528
  return Y.replace(FormulaRex, (e, C) => {
2529
2529
  try {
@@ -7320,7 +7320,7 @@ function transformArrayToObject(Y, K) {
7320
7320
  function formatText(Y, K) {
7321
7321
  const e = K.start ?? -1, C = K.end ?? -1;
7322
7322
  let k = String(Y);
7323
- return e !== -1 && C !== -1 ? k = k.substring(e, C) : e !== -1 ? k = k.substring(e) : C !== -1 && (k = k.substring(0, C)), k;
7323
+ return e !== -1 && C !== -1 ? k = k.substring(e, C) : e !== -1 ? k = k.substring(e) : C !== -1 && (k = k.substring(0, C)), k.replace(".", "-");
7324
7324
  }
7325
7325
  function formatNumber(Y, K) {
7326
7326
  let e = Number(Y);
@@ -33260,7 +33260,7 @@ const silenceExport = async (Y) => {
33260
33260
  title: "报表列表",
33261
33261
  icon: "iconfont icon-s-grid"
33262
33262
  },
33263
- component: () => import("./StatementList-63aa9977.mjs")
33263
+ component: () => import("./StatementList-34396aeb.mjs")
33264
33264
  }), e.addRoute("Index", {
33265
33265
  path: "statement/design/:id",
33266
33266
  name: "报表设计",
@@ -33269,7 +33269,7 @@ const silenceExport = async (Y) => {
33269
33269
  title: "报表设计",
33270
33270
  icon: "iconfont icon-s-grid"
33271
33271
  },
33272
- component: () => import("./StatementDesign-1a462b39.mjs")
33272
+ component: () => import("./StatementDesign-baf66cc9.mjs")
33273
33273
  }), e.addRoute("Index", {
33274
33274
  path: "statement/detail/:id",
33275
33275
  name: "后台报表查看",
@@ -33278,7 +33278,7 @@ const silenceExport = async (Y) => {
33278
33278
  title: "后台报表查看",
33279
33279
  icon: "iconfont icon-s-grid"
33280
33280
  },
33281
- component: () => import("./StatementDetail-21b55acb.mjs")
33281
+ component: () => import("./StatementDetail-9ed9e955.mjs")
33282
33282
  })), e.addRoute({
33283
33283
  path: "/statementdetail/:id",
33284
33284
  name: "报表查看",
@@ -33289,7 +33289,7 @@ const silenceExport = async (Y) => {
33289
33289
  isWhite: !0
33290
33290
  },
33291
33291
  props: !0,
33292
- component: () => import("./StatementDetail-21b55acb.mjs")
33292
+ component: () => import("./StatementDetail-9ed9e955.mjs")
33293
33293
  });
33294
33294
  }
33295
33295
  };
@@ -33320,7 +33320,7 @@ function dynamicReportView(Y) {
33320
33320
  })
33321
33321
  );
33322
33322
  }
33323
- console.info("%cyh-report %cVer 2.4.50", "color:#409EFF;font-size: 22px;font-weight:bolder;text-shadow: 2px 2px 4px #84c1ff;", "color:#fff;font-size: 12px;background-color:#409EFF;padding:2px 4px;border-radius:3px;");
33323
+ console.info("%cyh-report %cVer 2.4.51", "color:#409EFF;font-size: 22px;font-weight:bolder;text-shadow: 2px 2px 4px #84c1ff;", "color:#fff;font-size: 12px;background-color:#409EFF;padding:2px 4px;border-radius:3px;");
33324
33324
  export {
33325
33325
  CellType as C,
33326
33326
  DataSourceColumnDataType as D,
@@ -33355,4 +33355,4 @@ export {
33355
33355
  index as y,
33356
33356
  dynamicReportView as z
33357
33357
  };
33358
- //# sourceMappingURL=index-348a17e6.mjs.map
33358
+ //# sourceMappingURL=index-3ea9b472.mjs.map