Files
2026-08-23 14:26:37 +08:00

85 lines
2.5 KiB
TypeScript

import createAxios from '@/utils/request';
import { downloadBlob } from '@/api/common/download.ts';
import type IProduct from '@/domain/iProduct.ts';
import type { IBatchPriceUpdate, IPriceMatrix } from '@/domain/iProduct.ts';
export interface PriceMatrixParams {
category_id?: number;
keyword?: string;
page?: number;
pageSize?: number;
}
/** 导入校验错误行(Excel 行号,1 起) */
export interface IImportError {
row: number;
message: string;
}
/** 商品下拉选项(仅上架) */
export async function getProductOptions(keyword?: string) {
return createAxios<IProduct[]>({
url: '/product/goods/options',
method: 'get',
params: keyword ? { keyword } : {},
});
}
/** 商品列表导出(列格式与导入模板一致,导出文件修改后可直接重新导入) */
export async function exportProducts(params: { category_id?: number } = {}) {
return downloadBlob('/product/goods/export', params, '商品列表.xlsx');
}
/** 下载商品导入模板(列头 + 示例行) */
export async function downloadProductTemplate() {
return downloadBlob('/product/goods/export', { template: 1 }, '商品导入模板.xlsx');
}
/**
* Excel 批量导入商品(整表校验,有错全部不导入)
* 失败时 promise reject,错误行明细在 err.data.data.errors
*/
export async function importProducts(file: File) {
const formData = new FormData();
formData.append('file', file);
return createAxios<{ created: number }>({
url: '/product/goods/import',
method: 'post',
data: formData,
headers: { 'Content-Type': 'multipart/form-data' },
timeout: 60000,
});
}
/** 批量删除商品(软删除) */
export async function batchDeleteProducts(ids: number[]) {
return createAxios({
url: '/product/goods/batch',
method: 'delete',
data: { ids },
});
}
/**
* A2 价格矩阵:行=商品,列=启用等级,值=按等级上浮比例换算的售价(成本价未设置 null);
* 仅成本价可编辑
*/
export async function getPriceMatrix(params?: PriceMatrixParams) {
return createAxios<IPriceMatrix>({
url: '/product/goods/priceMatrix',
method: 'get',
params,
});
}
/**
* A2 批量调价:批量调整成本价(等级售价随上浮比例联动;提交后给受影响门店生成价格变更通知)
*/
export async function batchPrice(updates: IBatchPriceUpdate[]) {
return createAxios({
url: '/product/goods/batchPrice',
method: 'put',
data: { updates },
});
}