yh-report 2.3.21 → 2.3.23

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 l } from "vue-router";
3
- import { n as u } from "./index-ea29746f.mjs";
3
+ import { n as u } from "./index-0496fae5.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-4162df02.mjs.map
28
+ //# sourceMappingURL=StatementDetail-e0406425.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatementDetail-4162df02.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-e0406425.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,25 +1,25 @@
1
1
  import { defineComponent as H, reactive as z, ref as E, onMounted as J, watch as j, openBlock as I, createElementBlock as G, createElementVNode as f, createTextVNode as c, createVNode as n, unref as l, withCtx as a, withKeys as Q } from "vue";
2
2
  import { useRouter as W } from "vue-router";
3
- import { g as X, s as D, d as Z, a as ee } from "./index-ea29746f.mjs";
4
- import { ElButton as p, ElFormItem as w, ElInput as _, ElTable as te, ElTableColumn as v, ElPagination as oe, ElDialog as ne, ElForm as le, ElMessage as k, ElLoading as ae, ElMessageBox as L } from "element-plus";
3
+ import { g as X, s as D, d as Z, a as ee } from "./index-0496fae5.mjs";
4
+ import { ElButton as u, ElFormItem as w, ElInput as C, ElTable as te, ElTableColumn as k, ElPagination as oe, ElDialog as ne, ElForm as le, ElMessage as v, ElLoading as ae, ElMessageBox as L } from "element-plus";
5
5
  import { l as ie, u as re } from "./editorLock-afc375cb.mjs";
6
6
  import "@/libs/api.request.js";
7
7
  import "lodash-es";
8
8
  import "echarts";
9
- function se(x) {
9
+ function se(_) {
10
10
  if (navigator.clipboard && window.isSecureContext)
11
- return navigator.clipboard.writeText(x), Promise.resolve();
11
+ return navigator.clipboard.writeText(_), Promise.resolve();
12
12
  {
13
- let u = document.createElement("textarea");
14
- u.value = x, u.style.position = "absolute", u.style.opacity = "0", u.style.left = "-200%", u.style.top = "-200%", document.body.appendChild(u), u.focus(), u.select();
13
+ let m = document.createElement("textarea");
14
+ m.value = _, m.style.position = "absolute", m.style.opacity = "0", m.style.left = "-200%", m.style.top = "-200%", document.body.appendChild(m), m.focus(), m.select();
15
15
  let i = document.execCommand("copy");
16
- return u.remove(), i ? Promise.resolve() : Promise.reject(new Error("copy error"));
16
+ return m.remove(), i ? Promise.resolve() : Promise.reject(new Error("copy error"));
17
17
  }
18
18
  }
19
- const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue = { class: "el-button is-text import-excel-button" }, pe = { class: "form-context" }, me = /* @__PURE__ */ f("i", { class: "iconfont icon-antdesign" }, null, -1), fe = /* @__PURE__ */ f("i", { class: "iconfont icon-view" }, null, -1), ge = /* @__PURE__ */ f("i", { class: "iconfont icon-edit-outline" }, null, -1), ye = /* @__PURE__ */ f("i", { class: "iconfont icon-delete" }, null, -1), ve = { class: "dialog-footer" }, Ee = /* @__PURE__ */ H({
19
+ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue = { class: "el-button is-text import-excel-button" }, me = { class: "form-context" }, pe = /* @__PURE__ */ f("i", { class: "iconfont icon-antdesign" }, null, -1), fe = /* @__PURE__ */ f("i", { class: "iconfont icon-view" }, null, -1), ge = /* @__PURE__ */ f("i", { class: "iconfont icon-edit-outline" }, null, -1), ye = /* @__PURE__ */ f("i", { class: "iconfont icon-delete" }, null, -1), ke = { class: "dialog-footer" }, Ve = /* @__PURE__ */ H({
20
20
  __name: "StatementList",
21
- setup(x) {
22
- const u = W(), i = z({
21
+ setup(_) {
22
+ const m = W(), i = z({
23
23
  key: "",
24
24
  pageSize: 10,
25
25
  pageNumber: 1,
@@ -34,16 +34,25 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
34
34
  });
35
35
  S.value = t.data.list, i.total = t.data.total;
36
36
  }
37
- function $(o, t) {
37
+ function x(o, t) {
38
38
  let e = "", s = "链接";
39
- t === "inner" ? (e = `innerStatementdetail/${o.id}`, s = "内部链接") : (e = `${window.location.origin}${window.location.pathname}#/statementdetail/${o.id}`, s = "外部链接"), se(e).then(() => {
40
- k.success(s + "复制成功");
39
+ switch (t) {
40
+ case "admin":
41
+ e = `/admin/statement/detail/${o.id}`, s = "后台链接";
42
+ break;
43
+ case "inner":
44
+ e = `innerStatementdetail/${o.id}`, s = "菜单链接";
45
+ case "outside":
46
+ e = `${window.location.origin}${window.location.pathname}#/statementdetail/${o.id}`, s = "外部链接";
47
+ }
48
+ se(e).then(() => {
49
+ v.success(s + "复制成功");
41
50
  }).catch(() => {
42
- k.error(s + "复制遇到问题");
51
+ v.error(s + "复制遇到问题");
43
52
  });
44
53
  }
45
- const C = E([]), T = (o) => {
46
- C.value = o;
54
+ const h = E([]), T = (o) => {
55
+ h.value = o;
47
56
  }, B = async (o) => {
48
57
  const t = o.target.files[0];
49
58
  if (!t)
@@ -53,29 +62,29 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
53
62
  o.target.value = "";
54
63
  try {
55
64
  if (s.target) {
56
- const m = JSON.parse(s.target.result);
57
- if (Array.isArray(m) && m.every((d) => typeof d == "object" && "code" in d && "config" in d && "description" in d && "name" in d)) {
65
+ const p = JSON.parse(s.target.result);
66
+ if (Array.isArray(p) && p.every((d) => typeof d == "object" && "code" in d && "config" in d && "description" in d && "name" in d)) {
58
67
  const d = ae.service({
59
68
  fullscreen: !0,
60
- text: `正在导入报表,共 ${m.length} 个,请稍候...`
69
+ text: `正在导入报表,共 ${p.length} 个,请稍候...`
61
70
  });
62
- for (let y = 0; y < m.length; y++) {
63
- d.setText(`正在保存第 ${y + 1} 个,共 ${m.length} 个,请稍候...`);
64
- const V = m[y];
71
+ for (let y = 0; y < p.length; y++) {
72
+ d.setText(`正在保存第 ${y + 1} 个,共 ${p.length} 个,请稍候...`);
73
+ const V = p[y];
65
74
  await D(V);
66
75
  }
67
76
  d.close(), g(!0);
68
77
  } else
69
- k.error("格式错误,请确保导入的文件未被修改过!");
78
+ v.error("格式错误,请确保导入的文件未被修改过!");
70
79
  }
71
80
  } catch {
72
- k.error("文件解析失败,请检查文件是否为有效的 JSON 格式!");
81
+ v.error("文件解析失败,请检查文件是否为有效的 JSON 格式!");
73
82
  }
74
83
  }, e.readAsText(t);
75
84
  }, R = () => {
76
- if (C.value.length > 0) {
85
+ if (h.value.length > 0) {
77
86
  const o = JSON.stringify(
78
- C.value.map(({ code: y, config: V, description: Y, name: q }) => ({
87
+ h.value.map(({ code: y, config: V, description: Y, name: q }) => ({
79
88
  code: y,
80
89
  config: V,
81
90
  description: Y,
@@ -83,17 +92,17 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
83
92
  })),
84
93
  null,
85
94
  2
86
- ), t = new Blob([o], { type: "application/json" }), e = URL.createObjectURL(t), m = `报表导出-${Z().format("YYYYMMDDHHmm")}.json`, d = document.createElement("a");
87
- d.href = e, d.download = m, document.body.appendChild(d), d.click(), document.body.removeChild(d), URL.revokeObjectURL(e);
95
+ ), t = new Blob([o], { type: "application/json" }), e = URL.createObjectURL(t), p = `报表导出-${Z().format("YYYYMMDDHHmm")}.json`, d = document.createElement("a");
96
+ d.href = e, d.download = p, document.body.appendChild(d), d.click(), document.body.removeChild(d), URL.revokeObjectURL(e);
88
97
  } else
89
- k.warning("请选择要操作的报表!");
98
+ v.warning("请选择要操作的报表!");
90
99
  }, N = async (o) => {
91
- await ie(o.id) === "OK" ? u.push(`/admin/statement/design/${o.id}`) : await L.alert("报表正在被其他用户锁定,是否强制解锁?", "提示", {
100
+ await ie(o.id) === "OK" ? m.push(`/admin/statement/design/${o.id}`) : await L.alert("报表正在被其他用户锁定,是否强制解锁?", "提示", {
92
101
  confirmButtonText: "解锁",
93
102
  cancelButtonText: "取消"
94
- }) === "confirm" && (await re(o.id) ? N(o) : k.error("解锁失败,请稍后再试!"));
103
+ }) === "confirm" && (await re(o.id) ? N(o) : v.error("解锁失败,请稍后再试!"));
95
104
  }, F = (o) => {
96
- u.push(`/admin/statement/detail/${o.id}`);
105
+ m.push(`/admin/statement/detail/${o.id}`);
97
106
  };
98
107
  J(() => {
99
108
  g(!0);
@@ -115,10 +124,10 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
115
124
  }).then(async () => {
116
125
  (await ee(o.id)).data && g(!0);
117
126
  });
118
- }, h = () => {
127
+ }, $ = () => {
119
128
  b.value = !1, r.id = void 0, r.name = "", r.code = "", r.description = "";
120
129
  }, M = async () => {
121
- await D(r), g(!0), h();
130
+ await D(r), g(!0), $();
122
131
  }, U = (o) => {
123
132
  o && (o.preventDefault(), o.stopPropagation()), g(!1);
124
133
  }, K = () => {
@@ -144,7 +153,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
144
153
  }, null, 32),
145
154
  c(" 导入 ")
146
155
  ]),
147
- n(l(p), {
156
+ n(l(u), {
148
157
  text: "",
149
158
  onClick: R
150
159
  }, {
@@ -153,7 +162,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
153
162
  ]),
154
163
  _: 1
155
164
  }),
156
- n(l(p), {
165
+ n(l(u), {
157
166
  type: "primary",
158
167
  onClick: O
159
168
  }, {
@@ -162,10 +171,10 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
162
171
  ]),
163
172
  _: 1
164
173
  }),
165
- f("div", pe, [
174
+ f("div", me, [
166
175
  n(l(w), { label: "报表名称" }, {
167
176
  default: a(() => [
168
- n(l(_), {
177
+ n(l(C), {
169
178
  modelValue: i.key,
170
179
  "onUpdate:modelValue": t[1] || (t[1] = (e) => i.key = e),
171
180
  onKeyup: Q(U, ["enter"]),
@@ -175,7 +184,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
175
184
  _: 1
176
185
  })
177
186
  ]),
178
- n(l(p), {
187
+ n(l(u), {
179
188
  type: "primary",
180
189
  onClick: t[2] || (t[2] = (e) => U())
181
190
  }, {
@@ -184,7 +193,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
184
193
  ]),
185
194
  _: 1
186
195
  }),
187
- n(l(p), {
196
+ n(l(u), {
188
197
  onClick: t[3] || (t[3] = (e) => K())
189
198
  }, {
190
199
  default: a(() => [
@@ -199,69 +208,79 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
199
208
  onSelectionChange: T
200
209
  }, {
201
210
  default: a(() => [
202
- n(l(v), {
211
+ n(l(k), {
203
212
  type: "selection",
204
213
  width: "50"
205
214
  }),
206
- n(l(v), {
215
+ n(l(k), {
207
216
  label: "#",
208
217
  type: "index",
209
218
  width: "66",
210
219
  left: ""
211
220
  }),
212
- n(l(v), {
221
+ n(l(k), {
213
222
  label: "报表代码",
214
223
  "min-width": "100",
215
224
  prop: "code"
216
225
  }),
217
- n(l(v), {
226
+ n(l(k), {
218
227
  label: "报表名称",
219
228
  "min-width": "100",
220
229
  prop: "name"
221
230
  }),
222
- n(l(v), {
231
+ n(l(k), {
223
232
  label: "描述",
224
233
  "min-width": "200",
225
234
  prop: "description"
226
235
  }),
227
- n(l(v), {
236
+ n(l(k), {
228
237
  label: "操作",
229
- width: "500",
238
+ width: "440",
230
239
  fixed: "right"
231
240
  }, {
232
241
  default: a((e) => [
233
- n(l(p), {
242
+ n(l(u), {
243
+ link: "",
244
+ title: "本系统前台菜单地址",
245
+ onClick: (s) => x(e.row, "inner")
246
+ }, {
247
+ default: a(() => [
248
+ c(" 菜单 ")
249
+ ]),
250
+ _: 2
251
+ }, 1032, ["onClick"]),
252
+ n(l(u), {
234
253
  link: "",
235
- title: "本系统前台页面嵌入地址",
236
- onClick: (s) => $(e.row, "inner")
254
+ title: "后台测试",
255
+ onClick: (s) => x(e.row, "admin")
237
256
  }, {
238
257
  default: a(() => [
239
- c(" 内部链接 ")
258
+ c(" 后台 ")
240
259
  ]),
241
260
  _: 2
242
261
  }, 1032, ["onClick"]),
243
- n(l(p), {
262
+ n(l(u), {
244
263
  link: "",
245
264
  title: "其他系统嵌入地址",
246
- onClick: (s) => $(e.row, "outside")
265
+ onClick: (s) => x(e.row, "outside")
247
266
  }, {
248
267
  default: a(() => [
249
- c(" 外部链接 ")
268
+ c(" 外嵌 ")
250
269
  ]),
251
270
  _: 2
252
271
  }, 1032, ["onClick"]),
253
- n(l(p), {
272
+ n(l(u), {
254
273
  type: "primary",
255
274
  link: "",
256
275
  onClick: (s) => N(e.row)
257
276
  }, {
258
277
  default: a(() => [
259
- me,
278
+ pe,
260
279
  c(" 设计 ")
261
280
  ]),
262
281
  _: 2
263
282
  }, 1032, ["onClick"]),
264
- n(l(p), {
283
+ n(l(u), {
265
284
  type: "primary",
266
285
  link: "",
267
286
  onClick: (s) => F(e.row)
@@ -272,7 +291,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
272
291
  ]),
273
292
  _: 2
274
293
  }, 1032, ["onClick"]),
275
- n(l(p), {
294
+ n(l(u), {
276
295
  type: "primary",
277
296
  link: "",
278
297
  onClick: (s) => P(e.row)
@@ -283,7 +302,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
283
302
  ]),
284
303
  _: 2
285
304
  }, 1032, ["onClick"]),
286
- n(l(p), {
305
+ n(l(u), {
287
306
  type: "danger",
288
307
  link: "",
289
308
  onClick: (s) => A(e.row)
@@ -314,18 +333,18 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
314
333
  n(l(ne), {
315
334
  modelValue: b.value,
316
335
  "onUpdate:modelValue": t[10] || (t[10] = (e) => b.value = e),
317
- onClose: h,
336
+ onClose: $,
318
337
  title: r.id ? "编辑报表" : "新建报表"
319
338
  }, {
320
339
  footer: a(() => [
321
- f("span", ve, [
322
- n(l(p), { onClick: h }, {
340
+ f("span", ke, [
341
+ n(l(u), { onClick: $ }, {
323
342
  default: a(() => [
324
343
  c("取消")
325
344
  ]),
326
345
  _: 1
327
346
  }),
328
- n(l(p), {
347
+ n(l(u), {
329
348
  type: "primary",
330
349
  onClick: t[9] || (t[9] = (e) => M())
331
350
  }, {
@@ -347,7 +366,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
347
366
  required: ""
348
367
  }, {
349
368
  default: a(() => [
350
- n(l(_), {
369
+ n(l(C), {
351
370
  modelValue: r.code,
352
371
  "onUpdate:modelValue": t[6] || (t[6] = (e) => r.code = e),
353
372
  autocomplete: "off"
@@ -360,7 +379,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
360
379
  required: ""
361
380
  }, {
362
381
  default: a(() => [
363
- n(l(_), {
382
+ n(l(C), {
364
383
  modelValue: r.name,
365
384
  "onUpdate:modelValue": t[7] || (t[7] = (e) => r.name = e),
366
385
  autocomplete: "off"
@@ -373,7 +392,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
373
392
  required: ""
374
393
  }, {
375
394
  default: a(() => [
376
- n(l(_), {
395
+ n(l(C), {
377
396
  modelValue: r.description,
378
397
  "onUpdate:modelValue": t[8] || (t[8] = (e) => r.description = e),
379
398
  type: "textarea",
@@ -392,6 +411,6 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
392
411
  }
393
412
  });
394
413
  export {
395
- Ee as default
414
+ Ve as default
396
415
  };
397
- //# sourceMappingURL=StatementList-90930ff4.mjs.map
416
+ //# sourceMappingURL=StatementList-d5eabf08.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatementList-d5eabf08.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 导入\n </div>\n <el-button\n text\n @click=\"exportReport\">\n 导出\n </el-button>\n <el-button\n type=\"primary\"\n @click=\"toAddForm\">\n 新增\n </el-button>\n <div class=\"form-context\">\n <el-form-item label=\"报表名称\">\n <el-input\n v-model=\"listForm.key\"\n @keyup.enter=\"onSearch\"\n placeholder=\"键入关键字搜索报表\"></el-input>\n </el-form-item>\n </div>\n <el-button\n type=\"primary\"\n @click=\"onSearch()\">\n 搜索\n </el-button>\n <el-button @click=\"onReset()\">重置</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=\"报表代码\"\n min-width=\"100\"\n prop=\"code\"></el-table-column>\n <el-table-column\n label=\"报表名称\"\n min-width=\"100\"\n prop=\"name\"></el-table-column>\n <el-table-column\n label=\"描述\"\n min-width=\"200\"\n prop=\"description\"></el-table-column>\n <el-table-column\n label=\"操作\"\n width=\"440\"\n fixed=\"right\">\n <template #default=\"scope\">\n <el-button\n link\n title=\"本系统前台菜单地址\"\n @click=\"copyLink(scope.row, 'inner')\">\n 菜单\n </el-button>\n <el-button\n link\n title=\"后台测试\"\n @click=\"copyLink(scope.row, 'admin')\">\n 后台\n </el-button>\n <el-button\n link\n title=\"其他系统嵌入地址\"\n @click=\"copyLink(scope.row, 'outside')\">\n 外嵌\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toDesign(scope.row)\">\n <i class=\"iconfont icon-antdesign\"></i>\n 设计\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toView(scope.row)\">\n <i class=\"iconfont icon-view\"></i>\n 查看\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toEditor(scope.row)\">\n <i class=\"iconfont icon-edit-outline\"></i>\n 编辑\n </el-button>\n <el-button\n type=\"danger\"\n link\n @click=\"toDelete(scope.row)\">\n <i class=\"iconfont icon-delete\"></i>\n 删除\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 ? '编辑报表' : '新建报表'\">\n <el-form\n :model=\"form\"\n label-width=\"120\">\n <el-form-item\n label=\"报表代码\"\n required>\n <el-input\n v-model=\"form.code\"\n autocomplete=\"off\" />\n </el-form-item>\n <el-form-item\n label=\"报表名称\"\n required>\n <el-input\n v-model=\"form.name\"\n autocomplete=\"off\" />\n </el-form-item>\n <el-form-item\n label=\"描述\"\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\">取消</el-button>\n <el-button\n type=\"primary\"\n @click=\"saveForm()\">\n 保存\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';\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 case 'outside':\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 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","toDelete","del","cancelForm","saveForm","onSearch","onReset","watch"],"mappings":"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"}