@skyfox2000/webui 1.3.5 → 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.
- package/.vscode/settings.json +1 -1
- package/lib/assets/modules/{file-upload-C0twqMV5.js → file-upload-DhPgqGdk.js} +50 -50
- package/lib/assets/modules/index-02J2AYth.js +377 -0
- package/lib/assets/modules/{index-D1XAa1Uo.js → index-C31q4LHC.js} +2 -2
- package/lib/assets/modules/{index-C4CryM-R.js → index-CCpTizF9.js} +1 -1
- package/lib/assets/modules/{menuTabs-BrYQa4UO.js → menuTabs-DyhSKN9r.js} +2 -2
- package/lib/assets/modules/{toolIcon-B-g9pyE4.js → toolIcon-CqM4gBIc.js} +1 -1
- package/lib/assets/modules/{uploadList-0f2FA_5s.js → uploadList-DAVjJkqz.js} +127 -127
- package/lib/assets/modules/{uploadList-DCWRIxPJ.js → uploadList-ZajZKqaS.js} +4 -4
- package/lib/components/common/alert/index.vue.d.ts +13 -0
- package/lib/components/common/icon/helper.vue.d.ts +1 -0
- package/lib/components/common/index.d.ts +2 -0
- package/lib/components/content/form/formItem.vue.d.ts +1 -0
- package/lib/components/form/input/index.vue.d.ts +4 -1
- package/lib/components/form/select/index.vue.d.ts +2 -0
- package/lib/components/form/treeSelect/index.vue.d.ts +11 -2
- package/lib/components/index.d.ts +1 -1
- package/lib/es/AceEditor/index.js +3 -3
- package/lib/es/BasicLayout/index.js +3 -3
- package/lib/es/Error403/index.js +1 -1
- package/lib/es/Error404/index.js +1 -1
- package/lib/es/ExcelForm/index.js +311 -275
- package/lib/es/UploadForm/index.js +4 -4
- package/lib/index.d.ts +1 -1
- package/lib/typings/form.d.ts +2 -2
- package/lib/utils/excel-preview.d.ts +24 -0
- package/lib/utils/form-excel.d.ts +17 -4
- package/lib/webui.css +1 -1
- package/lib/webui.es.js +677 -662
- package/package.json +1 -1
- package/src/components/common/alert/index.vue +76 -0
- package/src/components/common/icon/helper.vue +7 -1
- package/src/components/common/index.ts +4 -1
- package/src/components/content/dialog/excelForm.vue +337 -308
- package/src/components/content/form/formItem.vue +6 -2
- package/src/components/form/input/index.vue +16 -3
- package/src/components/form/select/index.vue +5 -11
- package/src/components/form/treeSelect/index.vue +22 -17
- package/src/components/index.ts +1 -0
- package/src/index.ts +1 -0
- package/src/typings/form.d.ts +2 -2
- package/src/utils/excel-preview.ts +188 -0
- package/src/utils/file-upload.ts +0 -2
- package/src/utils/form-excel.ts +132 -126
- package/lib/assets/modules/index-CKJIxasX.js +0 -333
|
@@ -1,52 +1,127 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { _ as
|
|
3
|
-
import { Modal as Fe, Upload as
|
|
4
|
-
import { httpGet as
|
|
5
|
-
import { E as
|
|
6
|
-
import { A as
|
|
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
|
|
9
|
-
import {
|
|
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
|
|
13
|
-
|
|
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
|
-
},
|
|
90
|
+
}, Ae = {
|
|
17
91
|
key: 0,
|
|
18
92
|
class: "ml-3 text-gray-600"
|
|
19
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
|
|
115
|
+
excelRecordsKey: {},
|
|
116
|
+
excelRowsKey: {},
|
|
41
117
|
saveText: {},
|
|
42
118
|
cancelText: {},
|
|
43
119
|
previewUrl: {},
|
|
44
120
|
fileType: {}
|
|
45
121
|
},
|
|
46
|
-
setup(
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
}),
|
|
59
|
-
switch (
|
|
133
|
+
}), pe = U(() => {
|
|
134
|
+
switch (e.fileType || "both") {
|
|
60
135
|
case "excel":
|
|
61
136
|
return "请选择Excel文件";
|
|
62
137
|
case "csv":
|
|
@@ -65,294 +140,245 @@ const je = {
|
|
|
65
140
|
default:
|
|
66
141
|
return "请选择Excel或CSV文件";
|
|
67
142
|
}
|
|
68
|
-
}),
|
|
69
|
-
|
|
70
|
-
() =>
|
|
143
|
+
}), V = v("待验证数据规则"), E = v("warning"), $ = v("待验证重复数据"), B = v("warning");
|
|
144
|
+
W(
|
|
145
|
+
() => a.visible.value,
|
|
71
146
|
() => {
|
|
72
|
-
|
|
147
|
+
m.value = a.visible.value, m.value && (j(), e.previewUrl && I());
|
|
73
148
|
}
|
|
74
|
-
),
|
|
75
|
-
() =>
|
|
149
|
+
), W(
|
|
150
|
+
() => m.value,
|
|
76
151
|
() => {
|
|
77
|
-
|
|
152
|
+
a.visible.value = m.value, m.value || j();
|
|
78
153
|
}
|
|
79
|
-
),
|
|
80
|
-
() =>
|
|
154
|
+
), W(
|
|
155
|
+
() => e.previewUrl,
|
|
81
156
|
() => {
|
|
82
|
-
|
|
157
|
+
m.value && e.previewUrl && I();
|
|
83
158
|
},
|
|
84
159
|
{ deep: !0 }
|
|
85
160
|
);
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
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;
|
|
89
173
|
try {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
method: "GET",
|
|
95
|
-
api: r.previewUrl.api || t.page.api,
|
|
96
|
-
authorize: r.previewUrl.authorize ?? t.page.authorize
|
|
97
|
-
};
|
|
98
|
-
e = await Se(l);
|
|
99
|
-
} else {
|
|
100
|
-
const l = r.previewUrl.params;
|
|
101
|
-
e = await ke(t, {
|
|
102
|
-
url: r.previewUrl,
|
|
103
|
-
urlKey: "preview",
|
|
104
|
-
params: l,
|
|
105
|
-
hideErrorToast: !0
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
if (r.previewUrl.raw)
|
|
109
|
-
await H(e);
|
|
110
|
-
else if ((e == null ? void 0 : e.status) === ie.SUCCESS && e.data) {
|
|
111
|
-
const l = e.data;
|
|
112
|
-
await H(l);
|
|
113
|
-
} else
|
|
114
|
-
throw new Error((e == null ? void 0 : e.msg) || "文件加载失败");
|
|
115
|
-
} catch (e) {
|
|
116
|
-
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) || "未知错误"));
|
|
117
178
|
} finally {
|
|
118
179
|
setTimeout(() => {
|
|
119
|
-
|
|
180
|
+
a.isFormLoading.value = !1;
|
|
120
181
|
}, 1e3);
|
|
121
182
|
}
|
|
122
183
|
}
|
|
123
|
-
}, O = async (e, l = "preview.csv") => {
|
|
124
|
-
const a = await ze(e, l);
|
|
125
|
-
if (a.success)
|
|
126
|
-
d.value = a.blobUrl, c.value = a.fileName;
|
|
127
|
-
else
|
|
128
|
-
throw new Error(a.error || "CSV格式处理失败");
|
|
129
|
-
}, K = (e, l, a = "预览文件.xlsx") => {
|
|
130
|
-
const s = l || "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
|
131
|
-
d.value = `data:${s};base64,${e}`, c.value = a;
|
|
132
|
-
}, pe = (e) => e.includes(",") || e.includes(`
|
|
133
|
-
`), 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) => {
|
|
134
|
-
var l;
|
|
135
|
-
if ((l = r.previewUrl) != null && l.raw) {
|
|
136
|
-
if (typeof e == "string")
|
|
137
|
-
pe(e) ? await O(e) : K(e);
|
|
138
|
-
else if (e instanceof ArrayBuffer || e instanceof Uint8Array) {
|
|
139
|
-
const a = new Blob([e], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
|
|
140
|
-
d.value = URL.createObjectURL(a), c.value = "预览文件.xlsx";
|
|
141
|
-
} else
|
|
142
|
-
throw new Error("不支持的原始文件格式");
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
if (e.Content && e.Type)
|
|
146
|
-
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);
|
|
147
|
-
else if (e.url)
|
|
148
|
-
d.value = e.url, c.value = e.fileName || "预览文件.xlsx";
|
|
149
|
-
else if (typeof e == "string")
|
|
150
|
-
await O(e);
|
|
151
|
-
else
|
|
152
|
-
throw new Error("不支持的文件格式");
|
|
153
184
|
}, me = async () => {
|
|
154
|
-
var
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
185
|
+
var i;
|
|
186
|
+
F.value = e.uploadParams;
|
|
187
|
+
const l = R.value;
|
|
188
|
+
if (!l) {
|
|
189
|
+
c.error("未配置文件上传地址!");
|
|
158
190
|
return;
|
|
159
191
|
}
|
|
160
|
-
if (
|
|
161
|
-
|
|
192
|
+
if (_.value) {
|
|
193
|
+
c.error("表格数据存在验证错误,请修正后再上传!");
|
|
162
194
|
return;
|
|
163
195
|
}
|
|
164
|
-
|
|
196
|
+
a.isFormSaving.value = !0;
|
|
165
197
|
try {
|
|
166
|
-
if (!
|
|
167
|
-
|
|
198
|
+
if (!L.value || !y.value) {
|
|
199
|
+
c.warning("请先选择文件!"), a.isFormSaving.value = !1;
|
|
168
200
|
return;
|
|
169
201
|
}
|
|
170
|
-
const
|
|
171
|
-
type:
|
|
172
|
-
}),
|
|
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 = {
|
|
173
205
|
uid: "1",
|
|
174
|
-
name:
|
|
175
|
-
originFileObj:
|
|
176
|
-
status:
|
|
206
|
+
name: y.value,
|
|
207
|
+
originFileObj: o,
|
|
208
|
+
status: ue.Uploading,
|
|
177
209
|
percent: 0,
|
|
178
210
|
params: {
|
|
179
|
-
FileKey:
|
|
211
|
+
FileKey: d
|
|
180
212
|
}
|
|
181
|
-
},
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
throw console.error("文件上传错误:", p), n.error((p == null ? void 0 : p.message) || "文件上传失败,请稍后再试!"), p;
|
|
188
|
-
}
|
|
189
|
-
} catch (a) {
|
|
190
|
-
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) || "未知错误"));
|
|
191
219
|
} finally {
|
|
192
|
-
|
|
220
|
+
a.isFormSaving.value = !1;
|
|
193
221
|
}
|
|
194
|
-
},
|
|
195
|
-
if (
|
|
196
|
-
if (
|
|
197
|
-
const
|
|
198
|
-
if (!
|
|
199
|
-
const { excelData:
|
|
200
|
-
var
|
|
201
|
-
const
|
|
202
|
-
for (const
|
|
203
|
-
const
|
|
204
|
-
|
|
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]);
|
|
205
233
|
}
|
|
206
|
-
return
|
|
234
|
+
return h;
|
|
207
235
|
});
|
|
208
|
-
|
|
236
|
+
e.excelRecordsKey && (a.formData.value[e.excelRecordsKey] = b), e.excelRowsKey && (a.formData.value[e.excelRowsKey] = p);
|
|
209
237
|
}
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
const
|
|
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 = {
|
|
213
243
|
Data: {
|
|
214
|
-
...
|
|
244
|
+
...a.formData.value
|
|
215
245
|
},
|
|
216
|
-
Query:
|
|
217
|
-
[r.excelCtrl.primaryKey]: t.formData.value[r.excelCtrl.primaryKey]
|
|
218
|
-
}
|
|
246
|
+
Query: r
|
|
219
247
|
};
|
|
220
|
-
|
|
248
|
+
if (a.beforeSave && a.beforeSave(u) === !1)
|
|
249
|
+
return;
|
|
250
|
+
a.isFormSaving.value = !0;
|
|
221
251
|
try {
|
|
222
|
-
const
|
|
223
|
-
params:
|
|
252
|
+
const o = await Ee(e.excelCtrl, {
|
|
253
|
+
params: u,
|
|
224
254
|
urlKey: "save",
|
|
225
|
-
url:
|
|
255
|
+
url: e.excelCtrl.saveUrl
|
|
226
256
|
});
|
|
227
|
-
(
|
|
228
|
-
} catch (
|
|
229
|
-
console.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("数据保存失败,请稍后再试!");
|
|
230
260
|
} finally {
|
|
231
|
-
|
|
261
|
+
a.isFormSaving.value = !1;
|
|
232
262
|
}
|
|
233
263
|
}
|
|
234
|
-
},
|
|
235
|
-
const
|
|
236
|
-
if (
|
|
237
|
-
|
|
238
|
-
if (a) {
|
|
239
|
-
if (s) {
|
|
240
|
-
R.value = !0, C.value = !1, E.value = "数据验证失败", S.value = "error";
|
|
241
|
-
const m = URL.createObjectURL(s);
|
|
242
|
-
d.value = m;
|
|
243
|
-
}
|
|
244
|
-
return !1;
|
|
245
|
-
} else
|
|
246
|
-
E.value = "数据验证成功", S.value = "success";
|
|
247
|
-
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;
|
|
248
268
|
try {
|
|
249
|
-
|
|
250
|
-
const {
|
|
251
|
-
|
|
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) {
|
|
252
277
|
if (u) {
|
|
253
|
-
|
|
254
|
-
const
|
|
255
|
-
|
|
278
|
+
_.value = !0, k.value = !0, E.value = "error", B.value = "error";
|
|
279
|
+
const p = URL.createObjectURL(u);
|
|
280
|
+
w.value = p;
|
|
256
281
|
}
|
|
257
|
-
return !1;
|
|
258
282
|
} else
|
|
259
|
-
|
|
283
|
+
_.value = !1, k.value = !1, E.value = "success", B.value = "success";
|
|
260
284
|
} catch {
|
|
261
|
-
|
|
285
|
+
V.value = "验证异常", $.value = "验证异常", E.value = "error", B.value = "error";
|
|
262
286
|
}
|
|
263
|
-
|
|
264
|
-
},
|
|
265
|
-
if (!
|
|
266
|
-
|
|
287
|
+
}
|
|
288
|
+
}, xe = async (l) => {
|
|
289
|
+
if (!e.gridCtrl) {
|
|
290
|
+
c.error("未配置表格控制器!");
|
|
267
291
|
return;
|
|
268
292
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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) {
|
|
272
297
|
case "excel":
|
|
273
|
-
|
|
298
|
+
d = r, p = "只能上传Excel文件!";
|
|
274
299
|
break;
|
|
275
300
|
case "csv":
|
|
276
|
-
|
|
301
|
+
d = u, p = "只能上传CSV文件!";
|
|
277
302
|
break;
|
|
278
303
|
case "both":
|
|
279
304
|
default:
|
|
280
|
-
|
|
305
|
+
d = r || u, p = "只能上传Excel文件或CSV文件!";
|
|
281
306
|
break;
|
|
282
307
|
}
|
|
283
|
-
if (!
|
|
284
|
-
return
|
|
308
|
+
if (!d)
|
|
309
|
+
return c.error(p), ce.LIST_IGNORE;
|
|
285
310
|
try {
|
|
286
|
-
if (
|
|
287
|
-
const
|
|
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);
|
|
288
313
|
if (!z.success)
|
|
289
314
|
throw new Error(z.error || "CSV文件处理失败");
|
|
290
|
-
const
|
|
291
|
-
return
|
|
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;
|
|
292
317
|
}
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (!await X(w))
|
|
299
|
-
return;
|
|
300
|
-
d.value = _.target.result, C.value = !1;
|
|
301
|
-
} else
|
|
302
|
-
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("加载文件失败,请检查文件格式!");
|
|
303
323
|
};
|
|
304
|
-
} catch (
|
|
305
|
-
console.error("文件处理错误:",
|
|
324
|
+
} catch (b) {
|
|
325
|
+
console.error("文件处理错误:", b), c.error("文件处理失败,请检查文件格式!"), a.isFormLoading.value = !1, V.value = "文件处理错误", E.value = "error";
|
|
306
326
|
}
|
|
307
327
|
return !1;
|
|
308
|
-
},
|
|
309
|
-
|
|
310
|
-
var
|
|
311
|
-
const
|
|
312
|
-
if (
|
|
313
|
-
if (
|
|
314
|
-
|
|
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("未配置文件上传地址!");
|
|
315
335
|
return;
|
|
316
336
|
}
|
|
317
|
-
|
|
318
|
-
for (const
|
|
319
|
-
|
|
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]);
|
|
320
340
|
}
|
|
321
|
-
|
|
341
|
+
m.value = a.visible.value, m.value && e.previewUrl && I();
|
|
322
342
|
});
|
|
323
|
-
const
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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 = () => {
|
|
327
351
|
};
|
|
328
|
-
return (
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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(" "),
|
|
333
359
|
width: 940,
|
|
334
|
-
onClose:
|
|
360
|
+
onClose: se
|
|
335
361
|
}, {
|
|
336
362
|
footer: T(() => [
|
|
337
|
-
|
|
363
|
+
C(n(_e), null, {
|
|
338
364
|
default: T(() => {
|
|
339
|
-
var
|
|
365
|
+
var r;
|
|
340
366
|
return [
|
|
341
|
-
|
|
367
|
+
C(n(Y), { onClick: se }, {
|
|
342
368
|
default: T(() => [
|
|
343
|
-
|
|
369
|
+
X(S(l.cancelText ?? (P.value ? "关闭" : "取消")), 1)
|
|
344
370
|
]),
|
|
345
371
|
_: 1
|
|
346
372
|
}),
|
|
347
|
-
P.value ?
|
|
373
|
+
P.value ? K("", !0) : (f(), H(n(Y), {
|
|
348
374
|
key: 0,
|
|
349
375
|
onClick: me,
|
|
350
376
|
type: "primary",
|
|
351
|
-
loading: ((
|
|
352
|
-
disabled: !
|
|
377
|
+
loading: ((r = n(a)) == null ? void 0 : r.isFormSaving.value) ?? !1,
|
|
378
|
+
disabled: !w.value || _.value || k.value || n(a).isFormLoading.value
|
|
353
379
|
}, {
|
|
354
380
|
default: T(() => [
|
|
355
|
-
|
|
381
|
+
X(S(l.saveText ?? "上传文件"), 1)
|
|
356
382
|
]),
|
|
357
383
|
_: 1
|
|
358
384
|
}, 8, ["loading", "disabled"]))
|
|
@@ -362,40 +388,50 @@ const je = {
|
|
|
362
388
|
})
|
|
363
389
|
]),
|
|
364
390
|
default: T(() => [
|
|
365
|
-
|
|
366
|
-
P.value ?
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
"
|
|
370
|
-
|
|
371
|
-
|
|
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
|
|
372
400
|
}, {
|
|
373
401
|
default: T(() => [
|
|
374
|
-
|
|
402
|
+
C(n(Y), {
|
|
403
|
+
type: "primary",
|
|
404
|
+
disabled: !te.value
|
|
405
|
+
}, {
|
|
375
406
|
default: T(() => [
|
|
376
|
-
|
|
407
|
+
X(S(pe.value), 1)
|
|
377
408
|
]),
|
|
378
409
|
_: 1
|
|
379
|
-
})
|
|
410
|
+
}, 8, ["disabled"])
|
|
380
411
|
]),
|
|
381
412
|
_: 1
|
|
382
|
-
}, 8, ["file-list", "accept"]),
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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")
|
|
386
422
|
])),
|
|
387
|
-
|
|
388
|
-
|
|
423
|
+
g("div", je, [
|
|
424
|
+
n(a).isFormLoading.value ? (f(), H(n(Le), {
|
|
389
425
|
key: 0,
|
|
390
426
|
size: "large"
|
|
391
|
-
})) :
|
|
392
|
-
|
|
393
|
-
class:
|
|
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%]"]]),
|
|
394
430
|
style: { height: "430px" }
|
|
395
431
|
}, [
|
|
396
|
-
|
|
397
|
-
src:
|
|
398
|
-
onError:
|
|
432
|
+
C(n(Ve), {
|
|
433
|
+
src: w.value,
|
|
434
|
+
onError: ge,
|
|
399
435
|
style: { width: "100%", height: "100%" },
|
|
400
436
|
options: {
|
|
401
437
|
styles: !0,
|
|
@@ -407,46 +443,46 @@ const je = {
|
|
|
407
443
|
}
|
|
408
444
|
}, null, 8, ["src"])
|
|
409
445
|
], 2),
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
message:
|
|
415
|
-
type:
|
|
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,
|
|
416
452
|
"show-icon": "",
|
|
417
453
|
class: "mb-2"
|
|
418
454
|
}, null, 8, ["message", "type"]),
|
|
419
|
-
|
|
420
|
-
(f(!0),
|
|
421
|
-
key:
|
|
455
|
+
g("div", Qe, [
|
|
456
|
+
(f(!0), x(ie, null, ne(n(A), (r, u) => (f(), x("div", {
|
|
457
|
+
key: u,
|
|
422
458
|
class: "border-b pb-0"
|
|
423
459
|
}, [
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
(f(!0),
|
|
427
|
-
key:
|
|
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,
|
|
428
464
|
class: "text-[12px] text-gray-600"
|
|
429
|
-
},
|
|
465
|
+
}, S(o), 1))), 128))
|
|
430
466
|
])
|
|
431
467
|
]))), 128))
|
|
432
468
|
]),
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
message:
|
|
436
|
-
type:
|
|
469
|
+
M.value && M.value.length > 0 ? (f(), x("div", Je, [
|
|
470
|
+
C(n(Z), {
|
|
471
|
+
message: $.value,
|
|
472
|
+
type: B.value,
|
|
437
473
|
"show-icon": "",
|
|
438
474
|
class: "mt-2 mb-2"
|
|
439
475
|
}, null, 8, ["message", "type"]),
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
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)
|
|
444
480
|
])
|
|
445
481
|
])
|
|
446
|
-
])) :
|
|
482
|
+
])) : K("", !0)
|
|
447
483
|
]))
|
|
448
484
|
])
|
|
449
|
-
])) :
|
|
485
|
+
])) : K("", !0)
|
|
450
486
|
])
|
|
451
487
|
]),
|
|
452
488
|
_: 3
|
|
@@ -454,5 +490,5 @@ const je = {
|
|
|
454
490
|
}
|
|
455
491
|
});
|
|
456
492
|
export {
|
|
457
|
-
|
|
493
|
+
ma as default
|
|
458
494
|
};
|