diff --git a/src/api/hard/hard-after-sale.ts b/src/api/hard/hard-after-sale.ts index cf54e5b4..0da78f39 100644 --- a/src/api/hard/hard-after-sale.ts +++ b/src/api/hard/hard-after-sale.ts @@ -170,9 +170,9 @@ export function disagree(obj?: Object) { } /** - * 将人工审核且已完成的钱包退款退回审核中,服务端会同步扣回退款金额并恢复库存占用。 + * 将人工审核且已完成的钱包退款退回审核中,服务端会同步扣回退款金额;默认重新占用库存占用。 * - * @param query 售后单 ID 查询参数 + * @param query 售后单 ID 及 deductStock(是否扣减库存,默认 true)查询参数 * @returns 后端统一业务响应 */ export function returnToReview(query?: Object) { diff --git a/src/api/hard/hard-car-record.ts b/src/api/hard/hard-car-record.ts new file mode 100644 index 00000000..5dcb7617 --- /dev/null +++ b/src/api/hard/hard-car-record.ts @@ -0,0 +1,41 @@ +import request from "/@/utils/request" +import type { AsyncTaskProgress } from "/@/api/asyncTask" + +/** 购物车商品记录异步导出提交接口的统一响应。 */ +export interface HardCarRecordExportTaskResponse { + /** 后端创建的初始异步任务进度。 */ + data: AsyncTaskProgress + /** 后端返回的任务提交提示。 */ + msg?: string +} + +/** + * 以购物车商品明细为维度分页查询记录,一行对应一条商品快照及其所属订单摘要。 + * + * @param query 商品、订单、用户、部门、时间及身份筛选条件 + */ +export function pageJoin(query: any) { + return request({ + url: "/hard/hard-car-record/page-join", + method: "post", + params: { + current: query.current, + size: query.size, + }, + data: query, + }) +} + +/** + * 按购物车商品记录页面当前筛选条件提交异步分批导出任务。 + * + * @param query 商品记录筛选条件;carIds 非空时仅导出当前勾选的商品明细行 + * @returns 包含任务初始进度的统一响应 + */ +export function submitExport(query: Record) { + return request({ + url: "/hard/hard-car-record/export-task", + method: "post", + data: query, + }) +} diff --git a/src/components/Upload/Excel.vue b/src/components/Upload/Excel.vue index 4086f862..7e0b19d3 100644 --- a/src/components/Upload/Excel.vue +++ b/src/components/Upload/Excel.vue @@ -71,6 +71,9 @@ const prop = defineProps({ }, }) +/** 错误明细弹窗最多渲染的行数,防止超大错误列表拖垮表格;与后端返回上限保持一致。 */ +const MAX_ERROR_ROWS = 1000 + /** Element Plus 上传组件实例,用于提交和清理文件。 */ const uploadRef = ref() /** 当前已选择的 Excel 文件列表,作为上传列表展示和提交前校验的统一数据源。 */ @@ -133,7 +136,14 @@ const handleFileSuccess = (response: any) => { if (response.code === 1) { useMessage().error(response.msg ? response.msg : "导入失败,以下数据不合法") state.errorVisible = true - state.errorData = Array.isArray(response.data) ? response.data : response.data?.errors || [] + const fullErrors: any[] = Array.isArray(response.data) ? response.data : response.data?.errors || [] + // 兜底截断:即使后端未限制,也只渲染前 MAX_ERROR_ROWS 行,避免大文件全错时卡死弹窗 + if (fullErrors.length > MAX_ERROR_ROWS) { + state.errorData = fullErrors.slice(0, MAX_ERROR_ROWS) + useMessage().warning(`错误共 ${fullErrors.length} 条,仅展示前 ${MAX_ERROR_ROWS} 条`) + } else { + state.errorData = fullErrors + } uploadRef.value.clearFiles() return } diff --git a/src/views/admin/system/user/index.vue b/src/views/admin/system/user/index.vue index 08b7411c..014e0926 100644 --- a/src/views/admin/system/user/index.vue +++ b/src/views/admin/system/user/index.vue @@ -18,11 +18,7 @@ - + + + diff --git a/src/views/hard/hard-car-record/index.vue b/src/views/hard/hard-car-record/index.vue new file mode 100644 index 00000000..274fe356 --- /dev/null +++ b/src/views/hard/hard-car-record/index.vue @@ -0,0 +1,461 @@ + + + + + diff --git a/src/views/wallet/wallet-recharge-apply/unbind-import-excel.vue b/src/views/wallet/wallet-recharge-apply/unbind-import-excel.vue index c3ee2864..2835b643 100644 --- a/src/views/wallet/wallet-recharge-apply/unbind-import-excel.vue +++ b/src/views/wallet/wallet-recharge-apply/unbind-import-excel.vue @@ -1,7 +1,7 @@