|
|
@@ -3,7 +3,7 @@
|
|
3
|
3
|
<el-card class="import-card">
|
|
4
|
4
|
<template #header>
|
|
5
|
5
|
<div class="card-header">
|
|
6
|
|
- <span class="title">采、销执行表及库存业务Excel导入</span>
|
|
|
6
|
+ <span class="title">采、销执行表及各类业务Excel导入</span>
|
|
7
|
7
|
</div>
|
|
8
|
8
|
</template>
|
|
9
|
9
|
|
|
|
@@ -27,35 +27,145 @@
|
|
27
|
27
|
</div>
|
|
28
|
28
|
<template #tip>
|
|
29
|
29
|
<div class="el-upload__tip">
|
|
30
|
|
- 只能上传 .xlsx 或 .xls 格式的Excel文件
|
|
|
30
|
+ 只能上传 .xlsx 或 .xls 格式的Excel文件,大小不超过50MB
|
|
31
|
31
|
</div>
|
|
32
|
32
|
</template>
|
|
33
|
33
|
</el-upload>
|
|
34
|
34
|
</div>
|
|
35
|
35
|
|
|
36
|
|
- <!-- 导入按钮 -->
|
|
37
|
|
- <div class="action-buttons">
|
|
|
36
|
+ <!-- 导入按钮区域 -->
|
|
|
37
|
+ <!-- 第一排:批量导入按钮 -->
|
|
|
38
|
+ <div class="action-buttons batch-buttons">
|
|
38
|
39
|
<el-button
|
|
39
|
40
|
type="primary"
|
|
40
|
|
- :loading="loading"
|
|
|
41
|
+ :loading="psExeLoading"
|
|
41
|
42
|
:disabled="!fileList.length"
|
|
42
|
|
- @click="handleImport"
|
|
|
43
|
+ @click="handlePsExeImport"
|
|
43
|
44
|
>
|
|
44
|
|
- {{ loading ? '采销导入中...' : '开始导入采销执行表' }}
|
|
|
45
|
+ {{ psExeLoading ? '采销导入中...' : '导入采销执行表' }}
|
|
45
|
46
|
</el-button>
|
|
46
|
47
|
<el-button
|
|
47
|
48
|
type="primary"
|
|
48
|
|
- :loading="stockLoading"
|
|
|
49
|
+ :loading="allLoading"
|
|
49
|
50
|
:disabled="!fileList.length"
|
|
50
|
|
- @click="handleStockImport"
|
|
|
51
|
+ @click="handleImportAll"
|
|
51
|
52
|
style="margin-left: 10px"
|
|
52
|
53
|
>
|
|
53
|
|
- {{ stockLoading ? '库存导入中...' : '导入库存业务' }}
|
|
|
54
|
+ {{ allLoading ? '所有业务导入中...' : '导入所有业务库' }}
|
|
54
|
55
|
</el-button>
|
|
55
|
|
- <el-button @click="handleReset">重置</el-button>
|
|
56
|
56
|
</div>
|
|
57
|
57
|
|
|
58
|
|
- <!-- 错误信息显示 -->
|
|
|
58
|
+ <!-- 第二排:单独模块导入按钮(分组排版) -->
|
|
|
59
|
+ <div class="action-buttons single-buttons">
|
|
|
60
|
+ <div class="single-buttons-group">
|
|
|
61
|
+ <span class="group-title">基础业务:</span>
|
|
|
62
|
+ <el-button
|
|
|
63
|
+ type="primary"
|
|
|
64
|
+ :loading="stockLoading"
|
|
|
65
|
+ :disabled="!fileList.length"
|
|
|
66
|
+ @click="handleStockImport"
|
|
|
67
|
+ size="small"
|
|
|
68
|
+ >
|
|
|
69
|
+ {{ stockLoading ? '导入中...' : '库存业务' }}
|
|
|
70
|
+ </el-button>
|
|
|
71
|
+ <el-button
|
|
|
72
|
+ type="primary"
|
|
|
73
|
+ :loading="payLoading"
|
|
|
74
|
+ :disabled="!fileList.length"
|
|
|
75
|
+ @click="handlePayImport"
|
|
|
76
|
+ size="small"
|
|
|
77
|
+ style="margin-left: 5px"
|
|
|
78
|
+ >
|
|
|
79
|
+ {{ payLoading ? '导入中...' : '付款业务' }}
|
|
|
80
|
+ </el-button>
|
|
|
81
|
+ <el-button
|
|
|
82
|
+ type="primary"
|
|
|
83
|
+ :loading="feePayLoading"
|
|
|
84
|
+ :disabled="!fileList.length"
|
|
|
85
|
+ @click="handleFeePayImport"
|
|
|
86
|
+ size="small"
|
|
|
87
|
+ style="margin-left: 5px"
|
|
|
88
|
+ >
|
|
|
89
|
+ {{ feePayLoading ? '导入中...' : '费用付款' }}
|
|
|
90
|
+ </el-button>
|
|
|
91
|
+ </div>
|
|
|
92
|
+
|
|
|
93
|
+ <div class="single-buttons-group" style="margin-top: 10px">
|
|
|
94
|
+ <span class="group-title">发票结算:</span>
|
|
|
95
|
+ <el-button
|
|
|
96
|
+ type="primary"
|
|
|
97
|
+ :loading="feeInvoiceLoading"
|
|
|
98
|
+ :disabled="!fileList.length"
|
|
|
99
|
+ @click="handleFeeInvoiceImport"
|
|
|
100
|
+ size="small"
|
|
|
101
|
+ >
|
|
|
102
|
+ {{ feeInvoiceLoading ? '导入中...' : '费用发票结算' }}
|
|
|
103
|
+ </el-button>
|
|
|
104
|
+ <el-button
|
|
|
105
|
+ type="primary"
|
|
|
106
|
+ :loading="jinxiangInvoiceLoading"
|
|
|
107
|
+ :disabled="!fileList.length"
|
|
|
108
|
+ @click="handleJinxiangInvoiceImport"
|
|
|
109
|
+ size="small"
|
|
|
110
|
+ style="margin-left: 5px"
|
|
|
111
|
+ >
|
|
|
112
|
+ {{ jinxiangInvoiceLoading ? '导入中...' : '进项发票结算' }}
|
|
|
113
|
+ </el-button>
|
|
|
114
|
+ </div>
|
|
|
115
|
+
|
|
|
116
|
+ <div class="single-buttons-group" style="margin-top: 10px">
|
|
|
117
|
+ <span class="group-title">其他结算:</span>
|
|
|
118
|
+ <el-button
|
|
|
119
|
+ type="primary"
|
|
|
120
|
+ :loading="daodandengjiLoading"
|
|
|
121
|
+ :disabled="!fileList.length"
|
|
|
122
|
+ @click="handleDaodandengjiImport"
|
|
|
123
|
+ size="small"
|
|
|
124
|
+ >
|
|
|
125
|
+ {{ daodandengjiLoading ? '导入中...' : '到货登记结算' }}
|
|
|
126
|
+ </el-button>
|
|
|
127
|
+ <el-button
|
|
|
128
|
+ type="primary"
|
|
|
129
|
+ :loading="shoukuanrenlingLoading"
|
|
|
130
|
+ :disabled="!fileList.length"
|
|
|
131
|
+ @click="handleShoukuanrenlingImport"
|
|
|
132
|
+ size="small"
|
|
|
133
|
+ style="margin-left: 5px"
|
|
|
134
|
+ >
|
|
|
135
|
+ {{ shoukuanrenlingLoading ? '导入中...' : '收款认领结算' }}
|
|
|
136
|
+ </el-button>
|
|
|
137
|
+ <el-button
|
|
|
138
|
+ type="primary"
|
|
|
139
|
+ :loading="xiaoshoujiesuanLoading"
|
|
|
140
|
+ :disabled="!fileList.length"
|
|
|
141
|
+ @click="handleXiaoshoujiesuanImport"
|
|
|
142
|
+ size="small"
|
|
|
143
|
+ style="margin-left: 5px"
|
|
|
144
|
+ >
|
|
|
145
|
+ {{ xiaoshoujiesuanLoading ? '导入中...' : '销售结算开票' }}
|
|
|
146
|
+ </el-button>
|
|
|
147
|
+ <el-button
|
|
|
148
|
+ type="primary"
|
|
|
149
|
+ :loading="dailijiesuanLoading"
|
|
|
150
|
+ :disabled="!fileList.length"
|
|
|
151
|
+ @click="handleDailijiesuanImport"
|
|
|
152
|
+ size="small"
|
|
|
153
|
+ style="margin-left: 5px"
|
|
|
154
|
+ >
|
|
|
155
|
+ {{ dailijiesuanLoading ? '导入中...' : '代理结算' }}
|
|
|
156
|
+ </el-button>
|
|
|
157
|
+ </div>
|
|
|
158
|
+
|
|
|
159
|
+ <el-button
|
|
|
160
|
+ @click="handleReset"
|
|
|
161
|
+ size="small"
|
|
|
162
|
+ style="margin-top: 10px; margin-left: 0"
|
|
|
163
|
+ >
|
|
|
164
|
+ 重置
|
|
|
165
|
+ </el-button>
|
|
|
166
|
+ </div>
|
|
|
167
|
+
|
|
|
168
|
+ <!-- 错误/成功信息显示 -->
|
|
59
|
169
|
<div v-if="errorMessage" class="error-message-area">
|
|
60
|
170
|
<el-alert
|
|
61
|
171
|
title="导入错误"
|
|
|
@@ -65,8 +175,6 @@
|
|
65
|
175
|
:closable="false"
|
|
66
|
176
|
/>
|
|
67
|
177
|
</div>
|
|
68
|
|
-
|
|
69
|
|
- <!-- 成功信息显示 -->
|
|
70
|
178
|
<div v-if="successMessage" class="success-message-area">
|
|
71
|
179
|
<el-alert
|
|
72
|
180
|
title="导入成功"
|
|
|
@@ -86,9 +194,11 @@
|
|
86
|
194
|
>
|
|
87
|
195
|
<template #default>
|
|
88
|
196
|
<div class="tips-content">
|
|
89
|
|
- <p>1. 请确保Excel文件包含所有需要的Sheet页,每个Sheet页对应一张表</p>
|
|
90
|
|
- <p>2. 系统会自动处理合并字段,按照逗号分隔存储</p>
|
|
91
|
|
- <p>3. 导入过程中如有错误,会在上方错误信息区域显示</p>
|
|
|
197
|
+ <p>1. 「导入所有业务库」会批量执行库存、付款、各类结算等所有业务导入;</p>
|
|
|
198
|
+ <p>2. 「单独模块导入」可针对性导入某类业务,适合单业务调试;</p>
|
|
|
199
|
+ <p>3. 请确保Excel文件包含对应业务的Sheet页,每个Sheet页对应一张表;</p>
|
|
|
200
|
+ <p>4. 系统会自动处理合并字段,按照逗号分隔存储;</p>
|
|
|
201
|
+ <p>5. 导入过程中如有错误,会在上方错误信息区域显示。</p>
|
|
92
|
202
|
</div>
|
|
93
|
203
|
</template>
|
|
94
|
204
|
</el-alert>
|
|
|
@@ -101,150 +211,186 @@
|
|
101
|
211
|
import { ref } from 'vue'
|
|
102
|
212
|
import { ElMessage } from 'element-plus'
|
|
103
|
213
|
import { UploadFilled } from '@element-plus/icons-vue'
|
|
104
|
|
-import { importPsExeExcel, importStockExcel } from '../api/contractApi' // 新增导入库存的API
|
|
105
|
|
-
|
|
106
|
|
-// 响应式数据
|
|
|
214
|
+// 导入所有API方法
|
|
|
215
|
+import {
|
|
|
216
|
+ importPsExeExcel,
|
|
|
217
|
+ importAllExcel,
|
|
|
218
|
+ importStockExcel,
|
|
|
219
|
+ importPayExcel,
|
|
|
220
|
+ importFeePayExcel,
|
|
|
221
|
+ importFeeInvoiceExcel,
|
|
|
222
|
+ importJinxiangInvoiceExcel,
|
|
|
223
|
+ importDaodandengjiExcel,
|
|
|
224
|
+ importShoukuanrenlingExcel,
|
|
|
225
|
+ importXiaoshoujiesuanExcel,
|
|
|
226
|
+ importDailijiesuanExcel
|
|
|
227
|
+} from '../api/contractApi'
|
|
|
228
|
+
|
|
|
229
|
+// 响应式数据:文件+各业务加载状态
|
|
107
|
230
|
const uploadRef = ref()
|
|
108
|
231
|
const fileList = ref([])
|
|
109
|
|
-const loading = ref(false)
|
|
110
|
|
-const stockLoading = ref(false) // 库存导入的加载状态
|
|
111
|
232
|
const errorMessage = ref('')
|
|
112
|
233
|
const successMessage = ref('')
|
|
113
|
234
|
|
|
114
|
|
-// 处理文件选择
|
|
|
235
|
+// 加载状态:批量导入
|
|
|
236
|
+const psExeLoading = ref(false)
|
|
|
237
|
+const allLoading = ref(false)
|
|
|
238
|
+
|
|
|
239
|
+// 加载状态:单独模块
|
|
|
240
|
+const stockLoading = ref(false)
|
|
|
241
|
+const payLoading = ref(false)
|
|
|
242
|
+const feePayLoading = ref(false)
|
|
|
243
|
+const feeInvoiceLoading = ref(false)
|
|
|
244
|
+const jinxiangInvoiceLoading = ref(false)
|
|
|
245
|
+const daodandengjiLoading = ref(false)
|
|
|
246
|
+const shoukuanrenlingLoading = ref(false)
|
|
|
247
|
+const xiaoshoujiesuanLoading = ref(false)
|
|
|
248
|
+const dailijiesuanLoading = ref(false)
|
|
|
249
|
+
|
|
|
250
|
+// 处理文件选择(复用原有逻辑)
|
|
115
|
251
|
const handleFileChange = (file) => {
|
|
116
|
252
|
const isExcel = file.name.endsWith('.xlsx') || file.name.endsWith('.xls')
|
|
117
|
|
-
|
|
118
|
253
|
if (!isExcel) {
|
|
119
|
254
|
ElMessage.error('只能上传Excel文件!')
|
|
120
|
255
|
uploadRef.value.handleRemove(file)
|
|
121
|
256
|
return false
|
|
122
|
257
|
}
|
|
123
|
|
-
|
|
124
|
258
|
const isLt50M = file.size / 1024 / 1024 < 50
|
|
125
|
259
|
if (!isLt50M) {
|
|
126
|
260
|
ElMessage.error('Excel文件大小不能超过50MB!')
|
|
127
|
261
|
uploadRef.value.handleRemove(file)
|
|
128
|
262
|
return false
|
|
129
|
263
|
}
|
|
130
|
|
-
|
|
131
|
264
|
fileList.value = [file]
|
|
132
|
265
|
errorMessage.value = ''
|
|
133
|
266
|
successMessage.value = ''
|
|
134
|
267
|
}
|
|
135
|
268
|
|
|
136
|
|
-// 处理文件移除
|
|
|
269
|
+// 处理文件移除(复用原有逻辑)
|
|
137
|
270
|
const handleFileRemove = () => {
|
|
138
|
271
|
fileList.value = []
|
|
139
|
272
|
errorMessage.value = ''
|
|
140
|
273
|
successMessage.value = ''
|
|
141
|
274
|
}
|
|
142
|
275
|
|
|
143
|
|
-// 执行采销导入
|
|
144
|
|
-const handleImport = async () => {
|
|
|
276
|
+// 重置(重置所有加载状态)
|
|
|
277
|
+const handleReset = () => {
|
|
|
278
|
+ fileList.value = []
|
|
|
279
|
+ errorMessage.value = ''
|
|
|
280
|
+ successMessage.value = ''
|
|
|
281
|
+ uploadRef.value?.clearFiles()
|
|
|
282
|
+ // 重置批量加载状态
|
|
|
283
|
+ psExeLoading.value = false
|
|
|
284
|
+ allLoading.value = false
|
|
|
285
|
+ // 重置单独模块加载状态
|
|
|
286
|
+ stockLoading.value = false
|
|
|
287
|
+ payLoading.value = false
|
|
|
288
|
+ feePayLoading.value = false
|
|
|
289
|
+ feeInvoiceLoading.value = false
|
|
|
290
|
+ jinxiangInvoiceLoading.value = false
|
|
|
291
|
+ daodandengjiLoading.value = false
|
|
|
292
|
+ shoukuanrenlingLoading.value = false
|
|
|
293
|
+ xiaoshoujiesuanLoading.value = false
|
|
|
294
|
+ dailijiesuanLoading.value = false
|
|
|
295
|
+}
|
|
|
296
|
+
|
|
|
297
|
+// 通用导入方法(抽离重复逻辑)
|
|
|
298
|
+const commonImport = async (apiMethod, loadingRef, businessName) => {
|
|
145
|
299
|
if (!fileList.value.length) {
|
|
146
|
300
|
ElMessage.warning('请先选择Excel文件')
|
|
147
|
301
|
return
|
|
148
|
302
|
}
|
|
149
|
|
-
|
|
150
|
303
|
const file = fileList.value[0].raw
|
|
151
|
|
- loading.value = true
|
|
|
304
|
+ loadingRef.value = true
|
|
152
|
305
|
errorMessage.value = ''
|
|
153
|
306
|
successMessage.value = ''
|
|
154
|
|
-
|
|
155
|
307
|
try {
|
|
156
|
|
- console.log('开始上传采销文件:', file.name)
|
|
157
|
|
-
|
|
158
|
|
- // 调用后端API
|
|
159
|
|
- const response = await importPsExeExcel(file)
|
|
160
|
|
-
|
|
161
|
|
- console.log('API响应成功:', response.status)
|
|
162
|
|
- console.log('响应数据:', response.data)
|
|
163
|
|
-
|
|
164
|
|
- // 处理响应数据
|
|
|
308
|
+ console.log(`开始上传${businessName}文件:`, file.name)
|
|
|
309
|
+ const response = await apiMethod(file)
|
|
165
|
310
|
if (response.status === 200) {
|
|
166
|
311
|
const resultData = response.data
|
|
167
|
|
-
|
|
168
|
312
|
if (resultData.code === 200 || resultData.success === true) {
|
|
169
|
|
- successMessage.value = resultData.message || '采销执行表导入成功'
|
|
170
|
|
- ElMessage.success('采销执行表导入成功')
|
|
|
313
|
+ successMessage.value = resultData.message || `${businessName}导入成功`
|
|
|
314
|
+ ElMessage.success(`${businessName}导入成功`)
|
|
171
|
315
|
} else {
|
|
172
|
|
- errorMessage.value = resultData.message || '采销执行表导入失败'
|
|
173
|
|
- ElMessage.error('采销执行表导入失败')
|
|
|
316
|
+ errorMessage.value = resultData.message || `${businessName}导入失败`
|
|
|
317
|
+ ElMessage.error(`${businessName}导入失败`)
|
|
174
|
318
|
}
|
|
175
|
319
|
}
|
|
176
|
|
-
|
|
177
|
320
|
} catch (error) {
|
|
178
|
|
- console.error('详细错误信息:', error)
|
|
|
321
|
+ console.error(`${businessName}导入错误:`, error)
|
|
179
|
322
|
errorMessage.value = error.message || '网络请求失败'
|
|
180
|
|
- ElMessage.error('采销执行表导入失败')
|
|
|
323
|
+ ElMessage.error(`${businessName}导入失败`)
|
|
181
|
324
|
} finally {
|
|
182
|
|
- loading.value = false
|
|
|
325
|
+ loadingRef.value = false
|
|
183
|
326
|
}
|
|
184
|
327
|
}
|
|
185
|
328
|
|
|
186
|
|
-// 新增:执行库存业务导入
|
|
187
|
|
-const handleStockImport = async () => {
|
|
188
|
|
- if (!fileList.value.length) {
|
|
189
|
|
- ElMessage.warning('请先选择Excel文件')
|
|
190
|
|
- return
|
|
191
|
|
- }
|
|
|
329
|
+// 1. 采销执行表导入(单独)
|
|
|
330
|
+const handlePsExeImport = () => {
|
|
|
331
|
+ commonImport(importPsExeExcel, psExeLoading, '采销执行表')
|
|
|
332
|
+}
|
|
192
|
333
|
|
|
193
|
|
- const file = fileList.value[0].raw
|
|
194
|
|
- stockLoading.value = true
|
|
195
|
|
- errorMessage.value = ''
|
|
196
|
|
- successMessage.value = ''
|
|
|
334
|
+// 2. 导入所有业务(批量)
|
|
|
335
|
+const handleImportAll = () => {
|
|
|
336
|
+ commonImport(importAllExcel, allLoading, '所有业务')
|
|
|
337
|
+}
|
|
197
|
338
|
|
|
198
|
|
- try {
|
|
199
|
|
- console.log('开始上传库存文件:', file.name)
|
|
|
339
|
+// 3. 库存业务导入(单独)
|
|
|
340
|
+const handleStockImport = () => {
|
|
|
341
|
+ commonImport(importStockExcel, stockLoading, '库存业务')
|
|
|
342
|
+}
|
|
200
|
343
|
|
|
201
|
|
- // 调用库存导入API
|
|
202
|
|
- const response = await importStockExcel(file)
|
|
|
344
|
+// 4. 付款业务导入(单独)
|
|
|
345
|
+const handlePayImport = () => {
|
|
|
346
|
+ commonImport(importPayExcel, payLoading, '货款付款')
|
|
|
347
|
+}
|
|
203
|
348
|
|
|
204
|
|
- console.log('库存API响应成功:', response.status)
|
|
205
|
|
- console.log('响应数据:', response.data)
|
|
|
349
|
+// 5. 费用付款业务导入(单独)
|
|
|
350
|
+const handleFeePayImport = () => {
|
|
|
351
|
+ commonImport(importFeePayExcel, feePayLoading, '费用付款')
|
|
|
352
|
+}
|
|
206
|
353
|
|
|
207
|
|
- // 处理响应数据
|
|
208
|
|
- if (response.status === 200) {
|
|
209
|
|
- const resultData = response.data
|
|
|
354
|
+// 6. 费用发票结算导入(单独)
|
|
|
355
|
+const handleFeeInvoiceImport = () => {
|
|
|
356
|
+ commonImport(importFeeInvoiceExcel, feeInvoiceLoading, '费用发票结算业务')
|
|
|
357
|
+}
|
|
210
|
358
|
|
|
211
|
|
- if (resultData.code === 200 || resultData.success === true) {
|
|
212
|
|
- successMessage.value = resultData.data || '库存业务导入成功'
|
|
213
|
|
- ElMessage.success('库存业务导入成功')
|
|
214
|
|
- } else {
|
|
215
|
|
- errorMessage.value = resultData.data || '库存业务导入失败'
|
|
216
|
|
- ElMessage.error('库存业务导入失败')
|
|
217
|
|
- }
|
|
218
|
|
- }
|
|
|
359
|
+// 7. 进项发票结算导入(单独)
|
|
|
360
|
+const handleJinxiangInvoiceImport = () => {
|
|
|
361
|
+ commonImport(importJinxiangInvoiceExcel, jinxiangInvoiceLoading, '进项发票结算业务')
|
|
|
362
|
+}
|
|
219
|
363
|
|
|
220
|
|
- } catch (error) {
|
|
221
|
|
- console.error('库存导入错误信息:', error)
|
|
222
|
|
- errorMessage.value = error.message || '网络请求失败'
|
|
223
|
|
- ElMessage.error('库存业务导入失败')
|
|
224
|
|
- } finally {
|
|
225
|
|
- stockLoading.value = false
|
|
226
|
|
- }
|
|
|
364
|
+// 8. 到货登记结算导入(单独)
|
|
|
365
|
+const handleDaodandengjiImport = () => {
|
|
|
366
|
+ commonImport(importDaodandengjiExcel, daodandengjiLoading, '到货登记结算业务')
|
|
227
|
367
|
}
|
|
228
|
368
|
|
|
229
|
|
-// 重置
|
|
230
|
|
-const handleReset = () => {
|
|
231
|
|
- fileList.value = []
|
|
232
|
|
- errorMessage.value = ''
|
|
233
|
|
- successMessage.value = ''
|
|
234
|
|
- uploadRef.value?.clearFiles()
|
|
|
369
|
+// 9. 收款认领结算导入(单独)
|
|
|
370
|
+const handleShoukuanrenlingImport = () => {
|
|
|
371
|
+ commonImport(importShoukuanrenlingExcel, shoukuanrenlingLoading, '收款认领结算业务')
|
|
|
372
|
+}
|
|
|
373
|
+
|
|
|
374
|
+// 10. 销售结算开票导入(单独)
|
|
|
375
|
+const handleXiaoshoujiesuanImport = () => {
|
|
|
376
|
+ commonImport(importXiaoshoujiesuanExcel, xiaoshoujiesuanLoading, '销售结算开票业务')
|
|
|
377
|
+}
|
|
|
378
|
+
|
|
|
379
|
+// 11. 代理结算业务导入(单独)
|
|
|
380
|
+const handleDailijiesuanImport = () => {
|
|
|
381
|
+ commonImport(importDailijiesuanExcel, dailijiesuanLoading, '代理结算业务')
|
|
235
|
382
|
}
|
|
236
|
383
|
</script>
|
|
237
|
384
|
|
|
238
|
385
|
<style scoped>
|
|
239
|
|
-/* 样式保持不变 */
|
|
240
|
386
|
.excel-import-simple {
|
|
241
|
387
|
padding: 20px;
|
|
242
|
|
- max-width: 900px;
|
|
|
388
|
+ max-width: 1200px;
|
|
243
|
389
|
margin: 0 auto;
|
|
244
|
390
|
}
|
|
245
|
391
|
|
|
246
|
392
|
.import-card {
|
|
247
|
|
- min-height: 500px;
|
|
|
393
|
+ min-height: 600px;
|
|
248
|
394
|
}
|
|
249
|
395
|
|
|
250
|
396
|
.card-header {
|
|
|
@@ -262,16 +408,34 @@ const handleReset = () => {
|
|
262
|
408
|
margin: 20px 0;
|
|
263
|
409
|
}
|
|
264
|
410
|
|
|
265
|
|
-.action-buttons {
|
|
|
411
|
+/* 批量按钮样式 */
|
|
|
412
|
+.action-buttons.batch-buttons {
|
|
266
|
413
|
text-align: center;
|
|
267
|
414
|
margin: 20px 0;
|
|
268
|
415
|
}
|
|
269
|
416
|
|
|
270
|
|
-.error-message-area {
|
|
271
|
|
- margin-top: 20px;
|
|
|
417
|
+/* 单独模块按钮样式 */
|
|
|
418
|
+.action-buttons.single-buttons {
|
|
|
419
|
+ text-align: left;
|
|
|
420
|
+ margin: 0 20px 20px;
|
|
|
421
|
+ border-top: 1px dashed #e6e6e6;
|
|
|
422
|
+ padding-top: 20px;
|
|
|
423
|
+}
|
|
|
424
|
+
|
|
|
425
|
+.single-buttons-group {
|
|
|
426
|
+ display: flex;
|
|
|
427
|
+ align-items: center;
|
|
|
428
|
+}
|
|
|
429
|
+
|
|
|
430
|
+.group-title {
|
|
|
431
|
+ font-size: 14px;
|
|
|
432
|
+ color: #666;
|
|
|
433
|
+ width: 80px;
|
|
|
434
|
+ text-align: right;
|
|
|
435
|
+ margin-right: 10px;
|
|
272
|
436
|
}
|
|
273
|
437
|
|
|
274
|
|
-.success-message-area {
|
|
|
438
|
+.error-message-area, .success-message-area {
|
|
275
|
439
|
margin-top: 20px;
|
|
276
|
440
|
}
|
|
277
|
441
|
|