liyu-pc-base 1.0.554 → 1.0.562

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,10 +1,10 @@
1
1
  import { t as e } from "./_plugin-vue_export-helper-B3ysoDQm.js";
2
2
  import { t } from "./lodash-CC0qDxjV.js";
3
3
  import { getApiData as n } from "./api/api-model.js";
4
- import { Fragment as r, computed as i, createBlock as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u, onMounted as d, onUnmounted as f, openBlock as p, ref as m, renderList as h, resolveComponent as g, withCtx as _ } from "vue";
5
- import v from "dayjs";
4
+ import { Fragment as r, computed as i, createBlock as a, createCommentVNode as o, createElementBlock as s, createElementVNode as c, createTextVNode as l, createVNode as u, defineComponent as d, onMounted as f, onUnmounted as p, openBlock as m, ref as h, renderList as g, resolveComponent as _, toDisplayString as v, withCtx as y } from "vue";
5
+ import b from "dayjs";
6
6
  //#region src/components/lysync/syncConditionGroup.vue?vue&type=script&lang.ts
7
- var y = t(), b = u({
7
+ var x = t(), S = d({
8
8
  name: "ConditionGroup",
9
9
  props: {
10
10
  group: {
@@ -86,17 +86,17 @@ var y = t(), b = u({
86
86
  }
87
87
  };
88
88
  }
89
- }), x = { class: "qb-group" }, S = { class: "qb-group-head" }, C = { class: "qb-group-body" }, w = {
89
+ }), C = { class: "qb-group" }, w = { class: "qb-group-head" }, T = { class: "qb-group-body" }, E = {
90
90
  key: 0,
91
91
  class: "qb-subgroup"
92
- }, T = {
92
+ }, D = {
93
93
  key: 1,
94
94
  class: "qb-rule"
95
95
  };
96
- function E(e, t, n, i, u, d) {
97
- let f = g("a-select"), m = g("a-button"), v = g("ConditionGroup"), y = g("a-input"), b = g("a-space"), E = g("a-select-option");
98
- return p(), o("div", x, [s("div", S, [
99
- l(f, {
96
+ function O(e, t, n, i, o, d) {
97
+ let f = _("a-select"), p = _("a-button"), h = _("ConditionGroup"), v = _("a-input"), b = _("a-space"), x = _("a-select-option");
98
+ return m(), s("div", C, [c("div", w, [
99
+ u(f, {
100
100
  style: { width: "110px" },
101
101
  value: e.group.type || "and",
102
102
  options: [{
@@ -108,34 +108,34 @@ function E(e, t, n, i, u, d) {
108
108
  }],
109
109
  "onUpdate:value": t[0] ||= (t) => e.group.type = t
110
110
  }, null, 8, ["value"]),
111
- l(m, {
111
+ u(p, {
112
112
  size: "small",
113
113
  onClick: e.addRule
114
114
  }, {
115
- default: _(() => t[1] ||= [c(" 添加条件 ")]),
115
+ default: y(() => t[1] ||= [l(" 添加条件 ")]),
116
116
  _: 1
117
117
  }, 8, ["onClick"]),
118
- l(m, {
118
+ u(p, {
119
119
  size: "small",
120
120
  style: { "margin-left": "8px" },
121
121
  onClick: e.addGroup
122
122
  }, {
123
- default: _(() => t[2] ||= [c(" 添加分组 ")]),
123
+ default: y(() => t[2] ||= [l(" 添加分组 ")]),
124
124
  _: 1
125
125
  }, 8, ["onClick"])
126
- ]), s("div", C, [(p(!0), o(r, null, h(e.group.conditions, (n, i) => (p(), o(r, { key: i }, [n && typeof n == "object" && "type" in n ? (p(), o("div", w, [l(v, {
126
+ ]), c("div", T, [(m(!0), s(r, null, g(e.group.conditions, (n, i) => (m(), s(r, { key: i }, [n && typeof n == "object" && "type" in n ? (m(), s("div", E, [u(h, {
127
127
  group: n,
128
128
  columns: e.columns
129
- }, null, 8, ["group", "columns"]), l(m, {
129
+ }, null, 8, ["group", "columns"]), u(p, {
130
130
  danger: "",
131
131
  size: "small",
132
132
  style: { margin: "4px 0" },
133
133
  onClick: (t) => e.removeAt(i)
134
134
  }, {
135
- default: _(() => t[3] ||= [c(" 删除分组 ")]),
135
+ default: y(() => t[3] ||= [l(" 删除分组 ")]),
136
136
  _: 2
137
- }, 1032, ["onClick"])])) : (p(), o("div", T, [
138
- l(f, {
137
+ }, 1032, ["onClick"])])) : (m(), s("div", D, [
138
+ u(f, {
139
139
  value: n.field,
140
140
  style: { "min-width": "200px" },
141
141
  placeholder: "选择字段",
@@ -146,7 +146,7 @@ function E(e, t, n, i, u, d) {
146
146
  "options",
147
147
  "onUpdate:value"
148
148
  ]),
149
- l(f, {
149
+ u(f, {
150
150
  value: n.op,
151
151
  style: { width: "200px" },
152
152
  options: e.operators,
@@ -156,29 +156,29 @@ function E(e, t, n, i, u, d) {
156
156
  "options",
157
157
  "onUpdate:value"
158
158
  ]),
159
- n.op === "in" ? (p(), a(f, {
159
+ n.op === "in" ? (m(), a(f, {
160
160
  key: 0,
161
161
  mode: "tags",
162
162
  style: { "min-width": "220px" },
163
163
  value: Array.isArray(n.value) ? n.value : [],
164
164
  placeholder: "输入多个值后回车",
165
165
  "onUpdate:value": (e) => n.value = e
166
- }, null, 8, ["value", "onUpdate:value"])) : n.op === "between" ? (p(), a(b, {
166
+ }, null, 8, ["value", "onUpdate:value"])) : n.op === "between" ? (m(), a(b, {
167
167
  key: 1,
168
168
  size: 4
169
169
  }, {
170
- default: _(() => [
171
- l(y, {
170
+ default: y(() => [
171
+ u(v, {
172
172
  style: { width: "120px" },
173
173
  value: Array.isArray(n.value) ? n.value?.[0] : void 0,
174
174
  placeholder: "起始值",
175
175
  "onUpdate:value": (t) => e.updateBetween(n, 0, t)
176
176
  }, null, 8, ["value", "onUpdate:value"]),
177
- t[4] ||= s("span", { style: {
177
+ t[4] ||= c("span", { style: {
178
178
  padding: "0 4px",
179
179
  color: "#999"
180
180
  } }, "~", -1),
181
- l(y, {
181
+ u(v, {
182
182
  style: { width: "120px" },
183
183
  value: Array.isArray(n.value) ? n.value?.[1] : void 0,
184
184
  placeholder: "结束值",
@@ -186,50 +186,50 @@ function E(e, t, n, i, u, d) {
186
186
  }, null, 8, ["value", "onUpdate:value"])
187
187
  ]),
188
188
  _: 2
189
- }, 1024)) : n.op === "is" ? (p(), a(f, {
189
+ }, 1024)) : n.op === "is" ? (m(), a(f, {
190
190
  key: 2,
191
191
  style: { "min-width": "160px" },
192
192
  value: n.value,
193
193
  placeholder: "选择 NULL/TRUE/FALSE",
194
194
  "onUpdate:value": (e) => n.value = e
195
195
  }, {
196
- default: _(() => [
197
- l(E, { value: null }, {
198
- default: _(() => t[5] ||= [c("NULL")]),
196
+ default: y(() => [
197
+ u(x, { value: null }, {
198
+ default: y(() => t[5] ||= [l("NULL")]),
199
199
  _: 1
200
200
  }),
201
- l(E, { value: !0 }, {
202
- default: _(() => t[6] ||= [c("TRUE")]),
201
+ u(x, { value: !0 }, {
202
+ default: y(() => t[6] ||= [l("TRUE")]),
203
203
  _: 1
204
204
  }),
205
- l(E, { value: !1 }, {
206
- default: _(() => t[7] ||= [c("FALSE")]),
205
+ u(x, { value: !1 }, {
206
+ default: y(() => t[7] ||= [l("FALSE")]),
207
207
  _: 1
208
208
  })
209
209
  ]),
210
210
  _: 2
211
- }, 1032, ["value", "onUpdate:value"])) : (p(), a(y, {
211
+ }, 1032, ["value", "onUpdate:value"])) : (m(), a(v, {
212
212
  key: 3,
213
213
  style: { "min-width": "220px" },
214
214
  value: n.value,
215
215
  placeholder: "输入值",
216
216
  "onUpdate:value": (e) => n.value = e
217
217
  }, null, 8, ["value", "onUpdate:value"])),
218
- l(m, {
218
+ u(p, {
219
219
  danger: "",
220
220
  size: "small",
221
221
  onClick: (t) => e.removeAt(i)
222
222
  }, {
223
- default: _(() => t[8] ||= [c(" 删除 ")]),
223
+ default: y(() => t[8] ||= [l(" 删除 ")]),
224
224
  _: 2
225
225
  }, 1032, ["onClick"])
226
226
  ]))], 64))), 128))])]);
227
227
  }
228
228
  //#endregion
229
229
  //#region src/components/lysync/syncExportRawData.vue?vue&type=script&lang.ts
230
- var D = u({
230
+ var k = d({
231
231
  name: "ExportRawData",
232
- components: { ConditionGroup: /* @__PURE__ */ e(b, [["render", E], ["__scopeId", "data-v-1c5e0123"]]) },
232
+ components: { ConditionGroup: /* @__PURE__ */ e(S, [["render", O], ["__scopeId", "data-v-1c5e0123"]]) },
233
233
  props: {
234
234
  title: {
235
235
  type: String,
@@ -243,26 +243,29 @@ var D = u({
243
243
  }
244
244
  },
245
245
  setup(e, { emit: t }) {
246
- let r = m(window.innerHeight - 550), a = (0, y.debounce)(() => {
246
+ let r = h(window.innerHeight - 550), a = (0, x.debounce)(() => {
247
247
  r.value = window.innerHeight - 550;
248
- }, 200), o = m(!1), s = m([]), c = m(!0), l = m({}), u = i(() => {
248
+ }, 200), o = h(!1), s = h([]), c = h(!0), l = h({}), u = i(() => {
249
249
  let e = [];
250
- if (s.value?.length) for (let t of Object.keys(s.value[0])) {
251
- let n = l.value[t] || t;
252
- e.push({
253
- title: n,
254
- dataIndex: t,
255
- key: t
256
- });
250
+ if (s.value?.length) {
251
+ for (let t of Object.keys(s.value[0])) if (t != "_id") {
252
+ let n = l.value[t] || t;
253
+ e.push({
254
+ title: n,
255
+ dataIndex: t,
256
+ key: t,
257
+ isMatch: !!l.value[t]
258
+ });
259
+ }
257
260
  }
258
261
  return e;
259
- }), p = async () => {
262
+ }), d = async () => {
260
263
  let t = await n({ export_task_id: e.record?.id }, `${e.record.model_app}/query_sync_model_field_list`);
261
- if (t?.data?.length) for (let e of t.data) l.value[e.field_name] = e.name;
262
- }, h = m(1), g = m(10), _ = m(0), b = i(() => {
264
+ if (t?.data?.length) for (let e of t.data) l.value[e.field_name] = e.name, l.value[e.name] = e.name;
265
+ }, m = h(1), g = h(10), _ = h(0), v = i(() => {
263
266
  let e = u.value.length * 200;
264
267
  return e < 1e3 ? 1e3 : e;
265
- }), x = m([
268
+ }), y = h([
266
269
  "10",
267
270
  "20",
268
271
  "50",
@@ -272,48 +275,49 @@ var D = u({
272
275
  "2000",
273
276
  "5000",
274
277
  "10000"
275
- ]), S = m({
278
+ ]), S = h({
276
279
  type: "and",
277
280
  conditions: []
278
- }), C = m(null), w = m([]), T = () => {
281
+ }), C = h(null), w = h([]), T = () => {
279
282
  t("cancel");
280
283
  }, E = async () => {
281
284
  o.value = !0;
282
285
  try {
283
286
  let t = {
284
287
  export_task_id: e.record?.id,
285
- current: h.value,
288
+ current: m.value,
286
289
  pageSize: g.value,
287
290
  conditions: S.value,
288
291
  sort_fields: w.value.length > 0 ? w.value : void 0
289
292
  };
290
293
  C.value && C.value.length === 2 && C.value[0] && C.value[1] && (t.time_range = C.value);
291
- let r = await n(t, `${e.record.model_app}/query_raw_data`);
292
- s.value = r?.data || [], h.value = r?.current ?? h.value, g.value = r?.pageSize ?? g.value, _.value = r?.total ?? 0;
294
+ let r = await n(t, `${e.record.model_app}/query_raw_data`), i = r?.data || [], a = 0;
295
+ for (let e of i) e._id = a, a++;
296
+ s.value = i, m.value = r?.current ?? m.value, g.value = r?.pageSize ?? g.value, _.value = r?.total ?? 0;
293
297
  } finally {
294
298
  o.value = !1;
295
299
  }
296
300
  };
297
- return d(() => {
298
- window.addEventListener("resize", a), a(), p();
301
+ return f(() => {
302
+ window.addEventListener("resize", a), a(), d();
299
303
  let t = "";
300
- t = e.record?.data_start_date ? e.record?.data_start_date + " 00:00:00" : v().subtract(1, "day").format("YYYY-MM-DD HH:mm:ss"), C.value = [t, v().format("YYYY-MM-DD HH:mm:ss")];
301
- }), f(() => {
304
+ t = e.record?.data_start_date ? e.record?.data_start_date + " 00:00:00" : b().subtract(1, "day").format("YYYY-MM-DD HH:mm:ss"), C.value = [t, b().format("YYYY-MM-DD HH:mm:ss")];
305
+ }), p(() => {
302
306
  window.removeEventListener("resize", a);
303
307
  }), {
304
308
  height: r,
305
309
  handleCancel: T,
306
310
  open: c,
307
311
  column: u,
308
- width: b,
312
+ width: v,
309
313
  datasource: s,
310
- current: h,
314
+ current: m,
311
315
  pageSize: g,
312
316
  total: _,
313
317
  handlePageChange: (e, t) => {
314
- h.value = e, t && t !== g.value && (g.value = t), E();
318
+ m.value = e, t && t !== g.value && (g.value = t), E();
315
319
  },
316
- pageOptions: x,
320
+ pageOptions: y,
317
321
  conditionsRoot: S,
318
322
  resetConditions: () => {
319
323
  S.value = {
@@ -322,27 +326,27 @@ var D = u({
322
326
  }, C.value = null;
323
327
  },
324
328
  applySearch: () => {
325
- h.value = 1, E();
329
+ m.value = 1, E();
326
330
  },
327
331
  loading: o,
328
332
  handleTableChange: (e, t, n, { action: r }) => {
329
333
  r === "sort" && (n?.field ? w.value = [{
330
334
  field: n.field,
331
335
  order: n.order === "ascend" ? "asc" : "desc"
332
- }] : w.value = [], h.value = 1, E());
336
+ }] : w.value = [], m.value = 1, E());
333
337
  },
334
338
  timeRange: C
335
339
  };
336
340
  }
337
- }), O = { style: {
341
+ }), A = { style: {
338
342
  display: "flex",
339
343
  "justify-content": "space-between",
340
344
  "align-items": "center"
341
- } }, k = { class: "conditions-scroll" }, A = { class: "time-range-row" };
342
- function j(e, t, n, r, i, o) {
343
- let u = g("a-button"), d = g("ConditionGroup"), f = g("a-range-picker"), m = g("a-space"), h = g("a-card"), v = g("a-table"), y = g("a-spin"), b = g("a-modal");
344
- return p(), a(b, {
345
- title: "原始数据",
345
+ } }, j = { class: "conditions-scroll" }, M = { class: "time-range-row" }, N = { key: 1 };
346
+ function P(e, t, n, r, i, d) {
347
+ let f = _("a-button"), p = _("ConditionGroup"), h = _("a-range-picker"), g = _("a-space"), b = _("a-card"), x = _("a-tag"), S = _("s-table"), C = _("a-spin"), w = _("a-modal");
348
+ return m(), a(w, {
349
+ title: "原始数据 (仅返回50条数据)",
346
350
  width: "1300px",
347
351
  open: e.open,
348
352
  "onUpdate:open": t[1] ||= (t) => e.open = t,
@@ -350,52 +354,52 @@ function j(e, t, n, r, i, o) {
350
354
  centered: "",
351
355
  onCancel: e.handleCancel
352
356
  }, {
353
- footer: _(() => [l(u, {
357
+ footer: y(() => [u(f, {
354
358
  key: "back",
355
359
  onClick: e.handleCancel
356
360
  }, {
357
- default: _(() => t[6] ||= [c(" 关闭 ")]),
361
+ default: y(() => t[6] ||= [l(" 关闭 ")]),
358
362
  _: 1
359
- }, 8, ["onClick"]), l(u, {
363
+ }, 8, ["onClick"]), u(f, {
360
364
  key: "ok",
361
365
  type: "primary",
362
366
  onClick: e.handleCancel
363
367
  }, {
364
- default: _(() => t[7] ||= [c(" 确定 ")]),
368
+ default: y(() => t[7] ||= [l(" 确定 ")]),
365
369
  _: 1
366
370
  }, 8, ["onClick"])]),
367
- default: _(() => [s("div", null, [l(h, {
371
+ default: y(() => [c("div", null, [u(b, {
368
372
  size: "small",
369
373
  bordered: !1,
370
374
  style: { "margin-bottom": "12px" }
371
375
  }, {
372
- default: _(() => [l(m, {
376
+ default: y(() => [u(g, {
373
377
  direction: "vertical",
374
378
  size: 8,
375
379
  style: { width: "100%" }
376
380
  }, {
377
- default: _(() => [
378
- s("div", O, [t[4] ||= s("div", { style: { "font-weight": "600" } }, "查询条件", -1), s("div", null, [l(u, {
381
+ default: y(() => [
382
+ c("div", A, [t[4] ||= c("div", { style: { "font-weight": "600" } }, "查询条件", -1), c("div", null, [u(f, {
379
383
  size: "small",
380
384
  onClick: e.resetConditions
381
385
  }, {
382
- default: _(() => t[2] ||= [c(" 重置 ")]),
386
+ default: y(() => t[2] ||= [l(" 重置 ")]),
383
387
  _: 1
384
- }, 8, ["onClick"]), l(u, {
388
+ }, 8, ["onClick"]), u(f, {
385
389
  type: "primary",
386
390
  size: "small",
387
391
  style: { "margin-left": "8px" },
388
392
  onClick: e.applySearch
389
393
  }, {
390
- default: _(() => t[3] ||= [c(" 查询 ")]),
394
+ default: y(() => t[3] ||= [l(" 查询 ")]),
391
395
  _: 1
392
396
  }, 8, ["onClick"])])]),
393
- s("div", k, [l(d, {
397
+ c("div", j, [u(p, {
394
398
  group: e.conditionsRoot,
395
399
  columns: e.column,
396
400
  "is-root": !0
397
401
  }, null, 8, ["group", "columns"])]),
398
- s("div", A, [t[5] ||= s("span", { class: "field-label" }, "时间范围:", -1), l(f, {
402
+ c("div", M, [t[5] ||= c("span", { class: "field-label" }, "时间范围:", -1), u(h, {
399
403
  value: e.timeRange,
400
404
  "onUpdate:value": t[0] ||= (t) => e.timeRange = t,
401
405
  "show-time": { format: "HH:mm:ss" },
@@ -408,37 +412,38 @@ function j(e, t, n, r, i, o) {
408
412
  _: 1
409
413
  })]),
410
414
  _: 1
411
- }), l(y, { spinning: e.loading }, {
412
- default: _(() => [l(v, {
415
+ }), u(C, { spinning: e.loading }, {
416
+ default: y(() => [e.datasource?.length ? (m(), a(S, {
417
+ key: 0,
413
418
  columns: e.column,
414
419
  dataSource: e.datasource,
415
- rowKey: "id",
416
- pagination: {
417
- current: e.current,
418
- pageSize: e.pageSize,
419
- total: e.total,
420
- onChange: e.handlePageChange,
421
- showSizeChanger: !0,
422
- showQuickJumper: !0,
423
- pageSizeOptions: e.pageOptions
424
- },
420
+ rowKey: "_id",
421
+ pagination: !1,
425
422
  scroll: {
426
423
  y: e.height,
427
424
  x: e.width
428
425
  },
429
426
  onChange: e.handleTableChange
430
- }, null, 8, [
427
+ }, {
428
+ headerCell: y(({ title: e, column: t }) => [t.isMatch ? (m(), a(x, {
429
+ key: 0,
430
+ color: "blue"
431
+ }, {
432
+ default: y(() => [l(v(e), 1)]),
433
+ _: 2
434
+ }, 1024)) : o("", !0), t.isMatch ? o("", !0) : (m(), s("span", N, v(e), 1))]),
435
+ _: 1
436
+ }, 8, [
431
437
  "columns",
432
438
  "dataSource",
433
- "pagination",
434
439
  "scroll",
435
440
  "onChange"
436
- ])]),
441
+ ])) : o("", !0)]),
437
442
  _: 1
438
443
  }, 8, ["spinning"])])]),
439
444
  _: 1
440
445
  }, 8, ["open", "onCancel"]);
441
446
  }
442
- var M = /*#__PURE__*/ e(D, [["render", j], ["__scopeId", "data-v-d2125ac3"]]);
447
+ var F = /*#__PURE__*/ e(k, [["render", P], ["__scopeId", "data-v-1f8cf6f5"]]);
443
448
  //#endregion
444
- export { M as default };
449
+ export { F as default };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncExportRawData-B8xySuut.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 <s-table\n v-if=\"datasource?.length\"\n :columns=\"column\"\n :dataSource=\"datasource\"\n rowKey=\"_id\"\n :pagination=\"false\"\n :scroll=\"{ y: height, x: width }\"\n @change=\"handleTableChange\"\n >\n <template #headerCell=\"{ title, column }\">\n <a-tag\n color=\"blue\"\n v-if=\"column.isMatch\"\n >\n {{ title }}\n </a-tag>\n <span v-if=\"!column.isMatch\">\n {{ title }}\n </span>\n </template>\n </s-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 if (key != '_id') {\n const title = titleMap.value[key] || key;\n res.push({\n title: title,\n dataIndex: key,\n key: key,\n isMatch: !!titleMap.value[key],\n });\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 titleMap.value[item.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\n const tmpData = res?.data || [];\n let index = 0;\n for (const item of tmpData) {\n item._id = index;\n index++;\n }\n datasource.value = tmpData;\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 <s-table\n v-if=\"datasource?.length\"\n :columns=\"column\"\n :dataSource=\"datasource\"\n rowKey=\"_id\"\n :pagination=\"false\"\n :scroll=\"{ y: height, x: width }\"\n @change=\"handleTableChange\"\n >\n <template #headerCell=\"{ title, column }\">\n <a-tag\n color=\"blue\"\n v-if=\"column.isMatch\"\n >\n {{ title }}\n </a-tag>\n <span v-if=\"!column.isMatch\">\n {{ title }}\n </span>\n </template>\n </s-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 if (key != '_id') {\n const title = titleMap.value[key] || key;\n res.push({\n title: title,\n dataIndex: key,\n key: key,\n isMatch: !!titleMap.value[key],\n });\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 titleMap.value[item.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\n const tmpData = res?.data || [];\n let index = 0;\n for (const item of tmpData) {\n item._id = index;\n index++;\n }\n datasource.value = tmpData;\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.562",
6
6
  "scripts": {
7
7
  "build": "vite build",
8
8
  "build:watch": "vite build --watch --mode development",