@skyfox2000/webui 1.3.4 → 1.3.6

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.
Files changed (55) hide show
  1. package/.vscode/settings.json +1 -1
  2. package/lib/assets/modules/{file-upload-BBlFaIXB.js → file-upload-DhPgqGdk.js} +50 -50
  3. package/lib/assets/modules/index-02J2AYth.js +377 -0
  4. package/lib/assets/modules/{index-m5rogIyM.js → index-C31q4LHC.js} +2 -2
  5. package/lib/assets/modules/{index-BG1SqSVl.js → index-CCpTizF9.js} +1 -1
  6. package/lib/assets/modules/{menuTabs-tPIz4a89.js → menuTabs-DyhSKN9r.js} +2 -2
  7. package/lib/assets/modules/{toolIcon-DwWoD9TN.js → toolIcon-CqM4gBIc.js} +1 -1
  8. package/lib/assets/modules/{uploadList-D_Z-Y2tw.js → uploadList-DAVjJkqz.js} +511 -476
  9. package/lib/assets/modules/{uploadList-Da7mQUNK.js → uploadList-ZajZKqaS.js} +4 -4
  10. package/lib/components/common/alert/index.vue.d.ts +13 -0
  11. package/lib/components/common/icon/helper.vue.d.ts +1 -0
  12. package/lib/components/common/index.d.ts +2 -0
  13. package/lib/components/content/form/formItem.vue.d.ts +1 -0
  14. package/lib/components/content/table/index.vue.d.ts +95 -4
  15. package/lib/components/form/input/index.vue.d.ts +4 -1
  16. package/lib/components/form/select/index.vue.d.ts +2 -0
  17. package/lib/components/form/treeSelect/index.vue.d.ts +11 -2
  18. package/lib/components/index.d.ts +1 -1
  19. package/lib/es/AceEditor/index.js +3 -3
  20. package/lib/es/BasicLayout/index.js +3 -3
  21. package/lib/es/Error403/index.js +1 -1
  22. package/lib/es/Error404/index.js +1 -1
  23. package/lib/es/ExcelForm/index.js +317 -274
  24. package/lib/es/UploadForm/index.js +4 -4
  25. package/lib/index.d.ts +1 -1
  26. package/lib/typings/form.d.ts +2 -2
  27. package/lib/typings/option.d.ts +2 -2
  28. package/lib/utils/excel-preview.d.ts +24 -0
  29. package/lib/utils/form-excel.d.ts +17 -4
  30. package/lib/utils/options.d.ts +2 -2
  31. package/lib/webui.css +1 -1
  32. package/lib/webui.es.js +759 -747
  33. package/package.json +1 -1
  34. package/src/components/common/alert/index.vue +76 -0
  35. package/src/components/common/icon/helper.vue +7 -1
  36. package/src/components/common/index.ts +4 -1
  37. package/src/components/common/loading/index.vue +1 -1
  38. package/src/components/content/dialog/excelForm.vue +343 -313
  39. package/src/components/content/form/formItem.vue +6 -2
  40. package/src/components/content/table/index.vue +9 -6
  41. package/src/components/form/autoComplete/index.vue +9 -3
  42. package/src/components/form/cascader/index.vue +8 -6
  43. package/src/components/form/input/index.vue +16 -3
  44. package/src/components/form/select/index.vue +5 -11
  45. package/src/components/form/treeSelect/index.vue +22 -17
  46. package/src/components/index.ts +1 -0
  47. package/src/index.ts +1 -0
  48. package/src/typings/form.d.ts +2 -2
  49. package/src/typings/option.d.ts +2 -2
  50. package/src/utils/excel-preview.ts +188 -0
  51. package/src/utils/file-upload.ts +0 -2
  52. package/src/utils/form-excel.ts +132 -126
  53. package/src/utils/options.ts +80 -22
  54. package/src/utils/table.ts +15 -2
  55. package/lib/assets/modules/index-4kDAt8nS.js +0 -333
@@ -1,52 +1,127 @@
1
- import { defineComponent as Ce, ref as o, computed as G, watch as I, onMounted as Ue, createBlock as Q, openBlock as f, unref as i, withCtx as T, renderSlot as _e, createElementBlock as y, createCommentVNode as L, createElementVNode as x, createVNode as F, createTextVNode as q, toDisplayString as b, normalizeClass as Te, Fragment as re, renderList as te } from "vue";
2
- import { _ as W } from "../../assets/modules/index-BG1SqSVl.js";
3
- import { Modal as Fe, Upload as se, Alert as oe, Space as Ee } from "ant-design-vue";
4
- import { httpGet as Se, ResStatus as ie } from "@skyfox2000/fapi";
5
- import { C as ke, a1 as De, a7 as Ve } from "../../assets/modules/uploadList-D_Z-Y2tw.js";
6
- import { A as Le, p as Re, U as Be } from "../../assets/modules/file-upload-BBlFaIXB.js";
1
+ import { defineComponent as we, ref as v, computed as U, watch as W, onMounted as be, createBlock as H, openBlock as f, unref as n, withCtx as T, renderSlot as J, createElementBlock as x, createCommentVNode as K, createElementVNode as g, createVNode as C, createTextVNode as X, toDisplayString as S, normalizeClass as Ce, Fragment as ie, renderList as ne } from "vue";
2
+ import { _ as Y } from "../../assets/modules/index-CCpTizF9.js";
3
+ import { Modal as Fe, Upload as ce, Space as _e } from "ant-design-vue";
4
+ import { httpGet as Ue, ResStatus as fe } from "@skyfox2000/fapi";
5
+ import { E as Te, a1 as Se, a7 as Ee } from "../../assets/modules/uploadList-DAVjJkqz.js";
6
+ import { A as Re, p as De, U as ue } from "../../assets/modules/file-upload-DhPgqGdk.js";
7
7
  import "@skyfox2000/microbase";
8
- import n from "vue-m-message";
9
- import { _ as Ne, c as Pe, p as ze, v as Ae, a as Me } from "../../assets/modules/index-4kDAt8nS.js";
8
+ import c from "vue-m-message";
9
+ import { c as ke, _ as Z, h as Le, p as Ne, i as Ke } from "../../assets/modules/index-02J2AYth.js";
10
10
  import "dayjs";
11
11
  import "vue-draggable-next";
12
- import $e from "@vue-office/excel";
13
- const je = {
12
+ import "async-validator";
13
+ import Ve from "@vue-office/excel";
14
+ const Be = (t) => t.includes(",") || t.includes(`
15
+ `), Me = (t, s) => t === "text/csv" || (s == null ? void 0 : s.toLowerCase().includes(".csv")) || !1, ze = (t, s) => t === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || t === "application/vnd.ms-excel" || (s == null ? void 0 : s.toLowerCase().match(/\.(xlsx|xls)$/)) !== null, ee = async (t, s = "preview.csv") => {
16
+ const e = await ke(t, s);
17
+ if (e.success)
18
+ return {
19
+ success: !0,
20
+ blobUrl: e.blobUrl,
21
+ fileName: e.fileName
22
+ };
23
+ throw new Error(e.error || "CSV格式处理失败");
24
+ }, ae = (t, s, e = "预览文件.xlsx") => ({
25
+ success: !0,
26
+ blobUrl: `data:${s || "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"};base64,${t}`,
27
+ fileName: e
28
+ }), ve = async (t, s = !1) => {
29
+ if (s) {
30
+ if (typeof t == "string")
31
+ return Be(t) ? await ee(t) : ae(t);
32
+ if (t instanceof ArrayBuffer || t instanceof Uint8Array) {
33
+ const e = new Blob([t], {
34
+ type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
35
+ });
36
+ return {
37
+ success: !0,
38
+ blobUrl: URL.createObjectURL(e),
39
+ fileName: "预览文件.xlsx"
40
+ };
41
+ } else
42
+ throw new Error("不支持的原始文件格式");
43
+ }
44
+ if (t.Content && t.Type)
45
+ return Me(t.Type, t.FileName) ? await ee(t.Content, t.FileName || "preview.csv") : ze(t.Type, t.FileName) ? ae(t.Content, t.Type, t.FileName || "预览文件.xlsx") : ae(t.Content);
46
+ if (t.url)
47
+ return {
48
+ success: !0,
49
+ blobUrl: t.url,
50
+ fileName: t.fileName || "预览文件.xlsx"
51
+ };
52
+ if (typeof t == "string")
53
+ return await ee(t);
54
+ throw new Error("不支持的文件格式");
55
+ }, Pe = async (t, s) => {
56
+ if (!t || !s)
57
+ throw new Error("预览URL或Excel控制器未配置");
58
+ try {
59
+ let e = null;
60
+ if (t.method === "GET") {
61
+ const a = {
62
+ ...t,
63
+ method: "GET",
64
+ api: t.api || s.page.api,
65
+ authorize: t.authorize ?? s.page.authorize
66
+ };
67
+ e = await Ue(a);
68
+ } else {
69
+ const a = t.params;
70
+ e = await Te(s, {
71
+ url: t,
72
+ urlKey: "preview",
73
+ params: a,
74
+ hideErrorToast: !0
75
+ });
76
+ }
77
+ if (t.raw)
78
+ return await ve(e, !0);
79
+ if ((e == null ? void 0 : e.status) === fe.SUCCESS && e.data) {
80
+ const a = e.data;
81
+ return await ve(a, !1);
82
+ } else
83
+ throw new Error((e == null ? void 0 : e.msg) || "文件加载失败");
84
+ } catch (e) {
85
+ throw console.error("预览文件加载错误:", e), c.error("文件加载失败:" + ((e == null ? void 0 : e.message) || "未知错误")), e;
86
+ }
87
+ }, $e = {
14
88
  key: 0,
15
89
  class: "mb-4 flex items-center"
16
- }, Oe = {
90
+ }, Ae = {
17
91
  key: 0,
18
92
  class: "ml-3 text-gray-600"
19
- }, Ke = { class: "flex gap-4" }, Ge = {
93
+ }, je = { class: "flex gap-4 relative" }, Oe = {
20
94
  key: 1,
21
95
  class: "w-[22%] flex-grow overflow-hidden flex flex-col"
22
- }, Ie = { class: "bg-gray-50 p-2 rounded border flex-grow flex flex-col" }, Qe = {
96
+ }, Ge = { class: "bg-gray-50 p-2 rounded border flex-grow flex flex-col" }, Ie = {
23
97
  key: 0,
24
98
  class: "text-gray-500"
25
99
  }, qe = {
26
100
  key: 1,
27
101
  class: "flex flex-col"
28
- }, We = { class: "overflow-y-auto" }, He = { class: "text-[13px] text-gray-600" }, Je = { class: "pl-5 mt-1 mb-0" }, Xe = {
102
+ }, Qe = { class: "overflow-y-auto" }, We = { class: "text-[13px] text-gray-600" }, He = { class: "pl-5 mt-1 mb-0" }, Je = {
29
103
  key: 0,
30
104
  class: "mt-3"
31
- }, Ye = { class: "text-[12px] text-gray-600 p-1" }, Ze = { class: "text-[13px] text-gray-600" }, el = { class: "pl-5 mt-1 mb-0" }, ll = { class: "text-[12px] text-gray-600" }, xl = /* @__PURE__ */ Ce({
105
+ }, Xe = { class: "text-[12px] text-gray-600 p-1" }, Ye = { class: "text-[13px] text-gray-600" }, Ze = { class: "pl-5 mt-1 mb-0" }, ea = { class: "text-[12px] text-gray-600" }, ma = /* @__PURE__ */ we({
32
106
  __name: "excelForm",
33
107
  props: {
34
108
  title: {},
35
109
  gridCtrl: {},
36
110
  excelCtrl: {},
111
+ enableUpload: { type: Boolean, default: !0 },
37
112
  uploadParams: {},
38
113
  excelFieldMap: {},
39
114
  fileField: {},
40
- excelBatchField: {},
115
+ excelRecordsKey: {},
116
+ excelRowsKey: {},
41
117
  saveText: {},
42
118
  cancelText: {},
43
119
  previewUrl: {},
44
120
  fileType: {}
45
121
  },
46
- setup(ne) {
47
- var Z, ee, le;
48
- const r = ne, t = r.excelCtrl, h = o(!1), d = o(""), ce = o([]), c = o(""), C = o(!0), z = G(() => !!r.previewUrl), ue = G(() => {
49
- switch (r.fileType || "both") {
122
+ setup(t, { expose: s }) {
123
+ const e = t, a = e.excelCtrl, m = v(!1), w = v(""), le = v([]), y = v(""), P = U(() => !!e.previewUrl), te = U(() => e.enableUpload), de = U(() => {
124
+ switch (e.fileType || "both") {
50
125
  case "excel":
51
126
  return ".xlsx,.xls";
52
127
  case "csv":
@@ -55,8 +130,8 @@ const je = {
55
130
  default:
56
131
  return ".xlsx,.xls,.csv";
57
132
  }
58
- }), ve = G(() => {
59
- switch (r.fileType || "both") {
133
+ }), pe = U(() => {
134
+ switch (e.fileType || "both") {
60
135
  case "excel":
61
136
  return "请选择Excel文件";
62
137
  case "csv":
@@ -65,290 +140,245 @@ const je = {
65
140
  default:
66
141
  return "请选择Excel或CSV文件";
67
142
  }
68
- }), E = o("待验证数据规则"), S = o("warning"), k = o("待验证重复数据"), D = o("warning");
69
- I(
70
- () => t.visible.value,
143
+ }), V = v("待验证数据规则"), E = v("warning"), $ = v("待验证重复数据"), B = v("warning");
144
+ W(
145
+ () => a.visible.value,
71
146
  () => {
72
- h.value = t.visible.value, h.value && (d.value = "", c.value = "", C.value = !0, E.value = "待验证数据规则", S.value = "warning", k.value = "待验证重复数据", D.value = "warning", R.value = !1, B.value = !1, r.previewUrl && j());
147
+ m.value = a.visible.value, m.value && (j(), e.previewUrl && I());
73
148
  }
74
- ), I(
75
- () => h.value,
149
+ ), W(
150
+ () => m.value,
76
151
  () => {
77
- t.visible.value = h.value;
152
+ a.visible.value = m.value, m.value || j();
78
153
  }
79
- ), I(
80
- () => r.previewUrl,
154
+ ), W(
155
+ () => e.previewUrl,
81
156
  () => {
82
- h.value && r.previewUrl && j();
157
+ m.value && e.previewUrl && I();
83
158
  },
84
159
  { deep: !0 }
85
160
  );
86
- const A = o(r.uploadParams), g = o((Z = A.value) == null ? void 0 : Z.uploadUrl), U = o((ee = A.value) == null ? void 0 : ee.duplicateRules), V = o((le = A.value) == null ? void 0 : le.duplicateUrl), j = async () => {
87
- if (!(!r.previewUrl || !t))
161
+ const F = v(e.uploadParams), R = U(() => {
162
+ var l;
163
+ return (l = F.value) == null ? void 0 : l.uploadUrl;
164
+ }), M = U(() => {
165
+ var l;
166
+ return (l = F.value) == null ? void 0 : l.duplicateRules;
167
+ }), D = U(() => {
168
+ var l;
169
+ return (l = F.value) == null ? void 0 : l.duplicateUrl;
170
+ }), I = async () => {
171
+ if (!(!e.previewUrl || !a)) {
172
+ a.isFormLoading.value = !0;
88
173
  try {
89
- let e = null;
90
- if (t.isFormLoading.value = !0, r.previewUrl.method === "GET") {
91
- const l = {
92
- ...r.previewUrl,
93
- method: "GET",
94
- api: r.previewUrl.api || t.page.api,
95
- authorize: r.previewUrl.authorize ?? t.page.authorize
96
- };
97
- e = await Se(l);
98
- } else {
99
- const l = r.previewUrl.params;
100
- e = await ke(t, {
101
- url: r.previewUrl,
102
- urlKey: "preview",
103
- params: l,
104
- hideErrorToast: !0
105
- });
106
- }
107
- if (r.previewUrl.raw)
108
- await H(e);
109
- else if ((e == null ? void 0 : e.status) === ie.SUCCESS && e.data) {
110
- const l = e.data;
111
- await H(l);
112
- } else
113
- throw new Error((e == null ? void 0 : e.msg) || "文件加载失败");
114
- } catch (e) {
115
- console.error("预览文件加载错误:", e), n.error("文件加载失败:" + ((e == null ? void 0 : e.message) || "未知错误"));
174
+ const l = await Pe(e.previewUrl, a);
175
+ l.success && (w.value = l.blobUrl, y.value = l.fileName);
176
+ } catch (l) {
177
+ console.error("预览文件加载错误:", l), c.error("文件加载失败:" + ((l == null ? void 0 : l.message) || "未知错误"));
116
178
  } finally {
117
- t.isFormLoading.value = !1;
179
+ setTimeout(() => {
180
+ a.isFormLoading.value = !1;
181
+ }, 1e3);
118
182
  }
119
- }, O = async (e, l = "preview.csv") => {
120
- const a = await Pe(e, l);
121
- if (a.success)
122
- d.value = a.blobUrl, c.value = a.fileName;
123
- else
124
- throw new Error(a.error || "CSV格式处理失败");
125
- }, K = (e, l, a = "预览文件.xlsx") => {
126
- const s = l || "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
127
- d.value = `data:${s};base64,${e}`, c.value = a;
128
- }, pe = (e) => e.includes(",") || e.includes(`
129
- `), fe = (e, l) => e === "text/csv" || (l == null ? void 0 : l.toLowerCase().includes(".csv")), de = (e, l) => e === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || e === "application/vnd.ms-excel" || (l == null ? void 0 : l.toLowerCase().match(/\.(xlsx|xls)$/)), H = async (e) => {
130
- var l;
131
- if ((l = r.previewUrl) != null && l.raw) {
132
- if (typeof e == "string")
133
- pe(e) ? await O(e) : K(e);
134
- else if (e instanceof ArrayBuffer || e instanceof Uint8Array) {
135
- const a = new Blob([e], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
136
- d.value = URL.createObjectURL(a), c.value = "预览文件.xlsx";
137
- } else
138
- throw new Error("不支持的原始文件格式");
139
- return;
140
183
  }
141
- if (e.Content && e.Type)
142
- fe(e.Type, e.FileName) ? await O(e.Content, e.FileName || "preview.csv") : de(e.Type, e.FileName) ? K(e.Content, e.Type, e.FileName || "预览文件.xlsx") : K(e.Content);
143
- else if (e.url)
144
- d.value = e.url, c.value = e.fileName || "预览文件.xlsx";
145
- else if (typeof e == "string")
146
- await O(e);
147
- else
148
- throw new Error("不支持的文件格式");
149
184
  }, me = async () => {
150
- var l;
151
- const e = g.value;
152
- if (!e) {
153
- n.error("未配置文件上传地址!");
185
+ var i;
186
+ F.value = e.uploadParams;
187
+ const l = R.value;
188
+ if (!l) {
189
+ c.error("未配置文件上传地址!");
154
190
  return;
155
191
  }
156
- if (R.value) {
157
- n.error("表格数据存在验证错误,请修正后再上传!");
192
+ if (_.value) {
193
+ c.error("表格数据存在验证错误,请修正后再上传!");
158
194
  return;
159
195
  }
160
- t.isFormSaving.value = !0;
196
+ a.isFormSaving.value = !0;
161
197
  try {
162
- if (!N.value || !c.value) {
163
- n.warning("请先选择文件!"), t.isFormSaving.value = !1;
198
+ if (!L.value || !y.value) {
199
+ c.warning("请先选择文件!"), a.isFormSaving.value = !1;
164
200
  return;
165
201
  }
166
- const a = new Le(e, 1), s = J.value || "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", m = new File([N.value], c.value, {
167
- type: s
168
- }), u = Re.join(((l = A.value) == null ? void 0 : l.basePath) ?? "", c.value), v = {
202
+ const r = new Re(l, 1), u = q.value || "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", o = new File([L.value], y.value, {
203
+ type: u
204
+ }), d = De.join(((i = F.value) == null ? void 0 : i.basePath) ?? "", y.value), p = {
169
205
  uid: "1",
170
- name: c.value,
171
- originFileObj: m,
172
- status: Be.Uploading,
206
+ name: y.value,
207
+ originFileObj: o,
208
+ status: ue.Uploading,
173
209
  percent: 0,
174
210
  params: {
175
- FileKey: u
211
+ FileKey: d
176
212
  }
177
- }, w = new AbortController();
178
- try {
179
- await a.uploadFile(v, w.signal, (p) => {
180
- v.percent = p;
181
- }), n.success("文件上传成功,开始业务处理!"), xe(v);
182
- } catch (p) {
183
- throw console.error("文件上传错误:", p), n.error((p == null ? void 0 : p.message) || "文件上传失败,请稍后再试!"), p;
184
- }
185
- } catch (a) {
186
- console.error("上传处理错误:", a), n.error("上传处理失败:" + ((a == null ? void 0 : a.message) || "未知错误"));
213
+ }, b = new AbortController();
214
+ (await r.uploadFile(p, b.signal, (h) => {
215
+ p.percent = h;
216
+ })).status === ue.Success && (c.success("文件上传成功,开始业务处理!"), ye(p));
217
+ } catch (r) {
218
+ console.error("上传处理错误:", r), c.error("上传处理失败:" + ((r == null ? void 0 : r.message) || "未知错误"));
187
219
  } finally {
188
- t.isFormSaving.value = !1;
220
+ a.isFormSaving.value = !1;
189
221
  }
190
- }, xe = async (e) => {
191
- if (t.formData.value) {
192
- if (r.excelBatchField) {
193
- const s = await ze(N.value);
194
- if (!s) return null;
195
- const { excelData: m } = s, u = m.map((v) => {
196
- var p;
197
- const w = {};
198
- for (const _ in v) {
199
- const $ = (p = r.excelFieldMap) == null ? void 0 : p[_];
200
- $ && (w[$] = v[_]);
222
+ }, ye = async (l) => {
223
+ if (a.formData.value) {
224
+ if (e.excelRecordsKey || e.excelRowsKey) {
225
+ const o = await Ne(L.value);
226
+ if (!o) return null;
227
+ const { excelData: d, excelRows: p } = o, b = d.map((N) => {
228
+ var Q;
229
+ const h = {};
230
+ for (const O in N) {
231
+ const G = (Q = e.excelFieldMap) == null ? void 0 : Q[O];
232
+ G && (h[G] = N[O]);
201
233
  }
202
- return w;
234
+ return h;
203
235
  });
204
- t.formData.value[r.excelBatchField] = u;
236
+ e.excelRecordsKey && (a.formData.value[e.excelRecordsKey] = b), e.excelRowsKey && (a.formData.value[e.excelRowsKey] = p);
205
237
  }
206
- const l = r.fileField ?? "FileInfo";
207
- t.formData.value[l] = e, t.beforeSave && t.beforeSave();
208
- const a = {
238
+ const i = e.fileField ?? "FileInfo";
239
+ a.formData.value[i] = l;
240
+ const r = {};
241
+ a.primaryKey && a.formData.value[a.primaryKey] !== void 0 && (r[a.primaryKey] = a.formData.value[a.primaryKey]);
242
+ const u = {
209
243
  Data: {
210
- ...t.formData.value
244
+ ...a.formData.value
211
245
  },
212
- Query: {
213
- [r.excelCtrl.primaryKey]: t.formData.value[r.excelCtrl.primaryKey]
214
- }
246
+ Query: r
215
247
  };
216
- t.isFormSaving.value = !0;
248
+ if (a.beforeSave && a.beforeSave(u) === !1)
249
+ return;
250
+ a.isFormSaving.value = !0;
217
251
  try {
218
- const s = await Ve(r.excelCtrl, {
219
- params: a,
252
+ const o = await Ee(e.excelCtrl, {
253
+ params: u,
220
254
  urlKey: "save",
221
- url: r.excelCtrl.saveUrl
255
+ url: e.excelCtrl.saveUrl
222
256
  });
223
- (s == null ? void 0 : s.status) === ie.SUCCESS ? (n.success("数据保存成功!"), t.afterSave && t.afterSave(), t.visible.value = !1) : n.error("保存失败:" + ((s == null ? void 0 : s.msg) || "未知错误"));
224
- } catch (s) {
225
- console.error("保存错误:", s), n.error("数据保存失败,请稍后再试!");
257
+ (o == null ? void 0 : o.status) === fe.SUCCESS ? (c.success("数据保存成功!"), a.afterSave && a.afterSave(), a.visible.value = !1) : c.error("保存失败:" + ((o == null ? void 0 : o.msg) || "未知错误"));
258
+ } catch (o) {
259
+ console.error("保存错误:", o), c.error("数据保存失败,请稍后再试!");
226
260
  } finally {
227
- t.isFormSaving.value = !1;
261
+ a.isFormSaving.value = !1;
228
262
  }
229
263
  }
230
- }, R = o(!1), B = o(!1), N = o(null), J = o(""), X = async (e) => {
231
- const l = r.gridCtrl;
232
- if (!l) return !1;
233
- const { hasError: a, errBlob: s } = await Ae(e, t.formRules.value);
234
- if (a) {
235
- if (s) {
236
- R.value = !0, C.value = !1, E.value = "数据验证失败", S.value = "error";
237
- const m = URL.createObjectURL(s);
238
- d.value = m;
239
- }
240
- return !1;
241
- } else
242
- E.value = "数据验证成功", S.value = "success";
243
- if (U.value && U.value.length > 0 && V.value)
264
+ }, _ = v(!1), k = v(!1), L = v(null), q = v(""), re = async (l) => {
265
+ const i = e.gridCtrl;
266
+ if (i) {
267
+ F.value = e.uploadParams;
244
268
  try {
245
- V.value.api || (V.value.api = l.page.api), V.value.authorize === void 0 && (V.value.authorize = l.page.authorize);
246
- const { hasError: m, errBlob: u } = await Me(e, U.value, V.value);
247
- if (m) {
269
+ D.value && (D.value.api || (D.value.api = i.page.api), D.value.authorize === void 0 && (D.value.authorize = i.page.authorize));
270
+ const {
271
+ hasError: r,
272
+ errBlob: u,
273
+ validationMsg: o,
274
+ duplicateMsg: d
275
+ } = await Ke(l, a.formRules.value, M.value, D.value);
276
+ if (V.value = o, $.value = d, r) {
248
277
  if (u) {
249
- B.value = !0, k.value = "检测到重复数据", D.value = "error";
250
- const v = URL.createObjectURL(u);
251
- d.value = v;
278
+ _.value = !0, k.value = !0, E.value = "error", B.value = "error";
279
+ const p = URL.createObjectURL(u);
280
+ w.value = p;
252
281
  }
253
- return !1;
254
282
  } else
255
- B.value = !1, k.value = "数据验证通过", D.value = "success";
283
+ _.value = !1, k.value = !1, E.value = "success", B.value = "success";
256
284
  } catch {
257
- return k.value = "重复检测异常", D.value = "error", !1;
285
+ V.value = "验证异常", $.value = "验证异常", E.value = "error", B.value = "error";
258
286
  }
259
- return !0;
260
- }, ye = async (e) => {
261
- if (!r.gridCtrl) {
262
- n.error("未配置表格控制器!");
287
+ }
288
+ }, xe = async (l) => {
289
+ if (!e.gridCtrl) {
290
+ c.error("未配置表格控制器!");
263
291
  return;
264
292
  }
265
- const a = e.type === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || e.type === "application/vnd.ms-excel", s = e.type === "text/csv" || e.name.toLowerCase().endsWith(".csv"), m = r.fileType || "both";
266
- let u = !1, v = "";
267
- switch (m) {
293
+ F.value = e.uploadParams;
294
+ const r = l.type === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || l.type === "application/vnd.ms-excel", u = l.type === "text/csv" || l.name.toLowerCase().endsWith(".csv"), o = e.fileType || "both";
295
+ let d = !1, p = "";
296
+ switch (o) {
268
297
  case "excel":
269
- u = a, v = "只能上传Excel文件!";
298
+ d = r, p = "只能上传Excel文件!";
270
299
  break;
271
300
  case "csv":
272
- u = s, v = "只能上传CSV文件!";
301
+ d = u, p = "只能上传CSV文件!";
273
302
  break;
274
303
  case "both":
275
304
  default:
276
- u = a || s, v = "只能上传Excel文件或CSV文件!";
305
+ d = r || u, p = "只能上传Excel文件或CSV文件!";
277
306
  break;
278
307
  }
279
- if (!u)
280
- return n.error(v), se.LIST_IGNORE;
308
+ if (!d)
309
+ return c.error(p), ce.LIST_IGNORE;
281
310
  try {
282
- if (c.value = e.name, J.value = s ? "text/csv" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", R.value = !1, B.value = !1, C.value = !0, E.value = "待验证数据规则", S.value = "warning", k.value = "待验证重复数据", D.value = "warning", s) {
283
- const _ = await e.arrayBuffer(), we = new TextDecoder("utf-8").decode(_), { csvToExcelView: ge } = await import("../../assets/modules/index-4kDAt8nS.js").then((be) => be.h), P = await ge(we, e.name);
284
- if (!P.success)
285
- throw new Error(P.error || "CSV文件处理失败");
286
- const ae = await (await fetch(P.blobUrl)).arrayBuffer();
287
- return N.value = ae, await X(ae) && (d.value = P.blobUrl, c.value = P.fileName, C.value = !1), !1;
311
+ if (j(), y.value = l.name, q.value = u ? "text/csv" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", u) {
312
+ const h = await l.arrayBuffer(), O = new TextDecoder("utf-8").decode(h), { csvToExcelView: G } = await import("../../assets/modules/index-02J2AYth.js").then((he) => he.j), z = await G(O, l.name);
313
+ if (!z.success)
314
+ throw new Error(z.error || "CSV文件处理失败");
315
+ const oe = await (await fetch(z.blobUrl)).arrayBuffer();
316
+ return L.value = oe, await re(oe), !_.value && !k.value && (w.value = z.blobUrl), y.value = z.fileName, a.isFormLoading.value = !1, !1;
288
317
  }
289
- const w = await e.arrayBuffer();
290
- N.value = w;
291
- const p = new FileReader();
292
- p.readAsDataURL(e), p.onload = async (_) => {
293
- if (_.target) {
294
- if (!await X(w))
295
- return;
296
- d.value = _.target.result, C.value = !1;
297
- } else
298
- n.error("加载文件失败,请检查文件格式!");
318
+ const b = await l.arrayBuffer();
319
+ L.value = b;
320
+ const N = new FileReader();
321
+ N.readAsDataURL(l), N.onload = async (h) => {
322
+ h.target ? (await re(b), !_.value && !k.value && (w.value = h.target.result), a.isFormLoading.value = !1) : c.error("加载文件失败,请检查文件格式!");
299
323
  };
300
- } catch (w) {
301
- console.error("文件处理错误:", w), n.error("文件处理失败,请检查文件格式!"), C.value = !1, E.value = "文件处理错误", S.value = "error";
324
+ } catch (b) {
325
+ console.error("文件处理错误:", b), c.error("文件处理失败,请检查文件格式!"), a.isFormLoading.value = !1, V.value = "文件处理错误", E.value = "error";
302
326
  }
303
327
  return !1;
304
- }, M = De(t.formRules.value);
305
- Ue(() => {
306
- var l;
307
- const e = (l = r.gridCtrl) == null ? void 0 : l.page;
308
- if (e && !z.value) {
309
- if (g.value = g.value ?? e.urls.upload, !g.value) {
310
- n.error("未配置文件上传地址!");
328
+ }, A = Se(a.formRules.value);
329
+ be(() => {
330
+ var i;
331
+ const l = (i = e.gridCtrl) == null ? void 0 : i.page;
332
+ if (l && !P.value) {
333
+ if (!R.value) {
334
+ c.error("未配置文件上传地址!");
311
335
  return;
312
336
  }
313
- g.value.api || (g.value.api = e.api), g.value.authorize === void 0 && (g.value.authorize = e.authorize);
314
- for (const a in t.formData.value)
315
- r.gridCtrl.rowData.value && (t.formData.value[a] = r.gridCtrl.rowData.value[a]);
337
+ R.value.api || (R.value.api = l.api), R.value.authorize === void 0 && (R.value.authorize = l.authorize);
338
+ for (const r in a.formData.value)
339
+ e.gridCtrl.rowData.value && (a.formData.value[r] = e.gridCtrl.rowData.value[r]);
316
340
  }
317
- h.value = t.visible.value, h.value && r.previewUrl && j();
341
+ m.value = a.visible.value, m.value && e.previewUrl && I();
318
342
  });
319
- const Y = () => {
320
- t.visible.value = !1;
321
- }, he = () => {
322
- console.error("渲染失败");
343
+ const j = () => {
344
+ if (w.value = "", y.value = "", le.value = [], L.value = null, q.value = "", a.isFormLoading.value = !1, V.value = "待验证数据规则", E.value = "warning", $.value = "待验证重复数据", B.value = "warning", _.value = !1, k.value = !1, a.formData.value) {
345
+ const l = e.fileField ?? "FileInfo", i = e.excelRecordsKey, r = e.excelRowsKey;
346
+ delete a.formData.value[l], i && delete a.formData.value[i], r && delete a.formData.value[r];
347
+ }
348
+ }, se = () => {
349
+ a.visible.value = !1;
350
+ }, ge = () => {
323
351
  };
324
- return (e, l) => (f(), Q(i(Fe), {
325
- title: e.title ?? "文件上传",
326
- open: h.value,
327
- "onUpdate:open": l[0] || (l[0] = (a) => h.value = a),
328
- wrapClassName: ["modal", "mx-auto", e.$attrs.width ? "w-[" + e.$attrs.width + "]" : ""].join(" "),
352
+ return s({
353
+ clearAll: j
354
+ }), (l, i) => (f(), H(n(Fe), {
355
+ title: l.title ?? "文件上传",
356
+ open: m.value,
357
+ "onUpdate:open": i[0] || (i[0] = (r) => m.value = r),
358
+ wrapClassName: ["modal", "mx-auto", l.$attrs.width ? "w-[" + l.$attrs.width + "]" : ""].join(" "),
329
359
  width: 940,
330
- onClose: Y
360
+ onClose: se
331
361
  }, {
332
362
  footer: T(() => [
333
- F(i(Ee), null, {
363
+ C(n(_e), null, {
334
364
  default: T(() => {
335
- var a;
365
+ var r;
336
366
  return [
337
- F(i(W), { onClick: Y }, {
367
+ C(n(Y), { onClick: se }, {
338
368
  default: T(() => [
339
- q(b(e.cancelText ?? (z.value ? "关闭" : "取消")), 1)
369
+ X(S(l.cancelText ?? (P.value ? "关闭" : "取消")), 1)
340
370
  ]),
341
371
  _: 1
342
372
  }),
343
- z.value ? L("", !0) : (f(), Q(i(W), {
373
+ P.value ? K("", !0) : (f(), H(n(Y), {
344
374
  key: 0,
345
375
  onClick: me,
346
376
  type: "primary",
347
- loading: ((a = i(t)) == null ? void 0 : a.isFormSaving.value) ?? !1,
348
- disabled: !d.value || R.value || B.value || C.value
377
+ loading: ((r = n(a)) == null ? void 0 : r.isFormSaving.value) ?? !1,
378
+ disabled: !w.value || _.value || k.value || n(a).isFormLoading.value
349
379
  }, {
350
380
  default: T(() => [
351
- q(b(e.saveText ?? "上传文件"), 1)
381
+ X(S(l.saveText ?? "上传文件"), 1)
352
382
  ]),
353
383
  _: 1
354
384
  }, 8, ["loading", "disabled"]))
@@ -358,37 +388,50 @@ const je = {
358
388
  })
359
389
  ]),
360
390
  default: T(() => [
361
- _e(e.$slots, "default"),
362
- z.value ? L("", !0) : (f(), y("div", je, [
363
- F(i(se), {
364
- "file-list": ce.value,
365
- "before-upload": ye,
366
- accept: ue.value,
367
- showUploadList: !0
391
+ J(l.$slots, "default"),
392
+ P.value ? K("", !0) : (f(), x("div", $e, [
393
+ J(l.$slots, "file-before"),
394
+ C(n(ce), {
395
+ "file-list": le.value,
396
+ "before-upload": xe,
397
+ accept: de.value,
398
+ showUploadList: !0,
399
+ disabled: !te.value
368
400
  }, {
369
401
  default: T(() => [
370
- F(i(W), { type: "primary" }, {
402
+ C(n(Y), {
403
+ type: "primary",
404
+ disabled: !te.value
405
+ }, {
371
406
  default: T(() => [
372
- q(b(ve.value), 1)
407
+ X(S(pe.value), 1)
373
408
  ]),
374
409
  _: 1
375
- })
410
+ }, 8, ["disabled"])
376
411
  ]),
377
412
  _: 1
378
- }, 8, ["file-list", "accept"]),
379
- d.value && c.value ? (f(), y("div", Oe, [
380
- x("span", null, b(c.value), 1)
381
- ])) : L("", !0)
413
+ }, 8, ["file-list", "accept", "disabled"]),
414
+ w.value && y.value ? (f(), x("div", Ae, [
415
+ C(n(Z), {
416
+ message: y.value,
417
+ type: "info",
418
+ "show-icon": !1
419
+ }, null, 8, ["message"])
420
+ ])) : K("", !0),
421
+ J(l.$slots, "file-after")
382
422
  ])),
383
- x("div", Ke, [
384
- i(t).isFormLoading ? (f(), Q(i(Ne), { key: 0 })) : L("", !0),
385
- x("div", {
386
- class: Te(["flex-shrink-0 relative border border-gray-200 rounded-md overflow-hidden", [i(M).length === 0 ? "w-[100%]" : "w-[80%]"]]),
423
+ g("div", je, [
424
+ n(a).isFormLoading.value ? (f(), H(n(Le), {
425
+ key: 0,
426
+ size: "large"
427
+ })) : K("", !0),
428
+ g("div", {
429
+ class: Ce(["flex-shrink-0 relative border border-gray-200 rounded-md overflow-hidden", [n(A).length === 0 ? "w-[100%]" : "w-[80%]"]]),
387
430
  style: { height: "430px" }
388
431
  }, [
389
- F(i($e), {
390
- src: d.value,
391
- onError: he,
432
+ C(n(Ve), {
433
+ src: w.value,
434
+ onError: ge,
392
435
  style: { width: "100%", height: "100%" },
393
436
  options: {
394
437
  styles: !0,
@@ -400,46 +443,46 @@ const je = {
400
443
  }
401
444
  }, null, 8, ["src"])
402
445
  ], 2),
403
- i(M).length > 0 ? (f(), y("div", Ge, [
404
- x("div", Ie, [
405
- i(M).length === 0 ? (f(), y("div", Qe, "没有设置验证规则")) : (f(), y("div", qe, [
406
- F(i(oe), {
407
- message: E.value,
408
- type: S.value,
446
+ n(A).length > 0 ? (f(), x("div", Oe, [
447
+ g("div", Ge, [
448
+ n(A).length === 0 ? (f(), x("div", Ie, "没有设置验证规则")) : (f(), x("div", qe, [
449
+ C(n(Z), {
450
+ message: V.value,
451
+ type: E.value,
409
452
  "show-icon": "",
410
453
  class: "mb-2"
411
454
  }, null, 8, ["message", "type"]),
412
- x("div", We, [
413
- (f(!0), y(re, null, te(i(M), (a, s) => (f(), y("div", {
414
- key: s,
455
+ g("div", Qe, [
456
+ (f(!0), x(ie, null, ne(n(A), (r, u) => (f(), x("div", {
457
+ key: u,
415
458
  class: "border-b pb-0"
416
459
  }, [
417
- x("div", He, b(a.field), 1),
418
- x("ul", Je, [
419
- (f(!0), y(re, null, te(a.rules, (m, u) => (f(), y("li", {
420
- key: u,
460
+ g("div", We, S(r.field), 1),
461
+ g("ul", He, [
462
+ (f(!0), x(ie, null, ne(r.rules, (o, d) => (f(), x("li", {
463
+ key: d,
421
464
  class: "text-[12px] text-gray-600"
422
- }, b(m), 1))), 128))
465
+ }, S(o), 1))), 128))
423
466
  ])
424
467
  ]))), 128))
425
468
  ]),
426
- U.value && U.value.length > 0 ? (f(), y("div", Xe, [
427
- F(i(oe), {
428
- message: k.value,
429
- type: D.value,
469
+ M.value && M.value.length > 0 ? (f(), x("div", Je, [
470
+ C(n(Z), {
471
+ message: $.value,
472
+ type: B.value,
430
473
  "show-icon": "",
431
474
  class: "mt-2 mb-2"
432
475
  }, null, 8, ["message", "type"]),
433
- x("div", Ye, [
434
- x("div", Ze, " 以下" + b(U.value.length > 1 ? "组合" : "字段") + "必须唯一 ", 1),
435
- x("ul", el, [
436
- x("li", ll, b(U.value.join(", ")), 1)
476
+ g("div", Xe, [
477
+ g("div", Ye, " 以下" + S(M.value.length > 1 ? "组合" : "字段") + "必须唯一 ", 1),
478
+ g("ul", Ze, [
479
+ g("li", ea, S(M.value.join(", ")), 1)
437
480
  ])
438
481
  ])
439
- ])) : L("", !0)
482
+ ])) : K("", !0)
440
483
  ]))
441
484
  ])
442
- ])) : L("", !0)
485
+ ])) : K("", !0)
443
486
  ])
444
487
  ]),
445
488
  _: 3
@@ -447,5 +490,5 @@ const je = {
447
490
  }
448
491
  });
449
492
  export {
450
- xl as default
493
+ ma as default
451
494
  };