diff --git a/src/api/assets/asset/index.ts b/src/api/assets/asset/index.ts index f0ef671..8932121 100644 --- a/src/api/assets/asset/index.ts +++ b/src/api/assets/asset/index.ts @@ -84,3 +84,73 @@ export function uploadAssetImage(file: File) { }, }); } + +// SKU 列表查询参数 +export interface SkuQueryParams { + assetId: string; + status?: number; + keyword?: string; + minPrice?: number; + maxPrice?: number; + page?: number; + pageSize?: number; +} + +// SKU 创建参数 +export interface CreateSkuParams { + assetId: string; + assetName: string; + skuName: string; + imageUrl?: string; + specValues?: Record; + price: number; + unlimitedStock: boolean; + stock: number; + sort?: number; + status?: number; +} + +// 获取 SKU 列表 +export function listAssetSkus(params: SkuQueryParams) { + return newService({ + url: '/assets/asset/sku/listAssetSkus', + method: 'get', + params, + }); +} + +// 创建 SKU +export function createAssetSku(data: CreateSkuParams) { + return newService({ + url: '/assets/asset/sku/createAssetSku', + method: 'post', + data, + }); +} + +// 获取 SKU 详情 +export function getAssetSku(id: string) { + return newService({ + url: '/assets/asset/sku/getAssetSku', + method: 'get', + params: { id }, + }); +} + +// 修改 SKU +export function updateAssetSku(data: CreateSkuParams & { id: string }) { + return newService({ + url: '/assets/asset/sku/updateAssetSku', + method: 'put', + data, + }); +} + +// 删除 SKU +export function deleteAssetSku(id: string) { + return newService({ + url: '/assets/asset/sku/deleteAssetSku', + method: 'delete', + params: { id }, + }); +} diff --git a/src/views/assets/asset/component/editAsset.vue b/src/views/assets/asset/component/editAsset.vue index edf7cc4..1a8487f 100644 --- a/src/views/assets/asset/component/editAsset.vue +++ b/src/views/assets/asset/component/editAsset.vue @@ -665,7 +665,7 @@ const rules: FormRules = { type: [{ required: true, message: '请选择资产类型', trigger: 'change' }], categoryId: [{ required: true, message: '请选择资产分类', trigger: 'change' }], offlineTime: [{ validator: validateOfflineTime, trigger: 'change' }], - mainImage: [{ required: false, message: '请上传主图', trigger: 'change' }], + mainImage: [{ required: true, message: '请上传主图', trigger: 'change' }], 'serviceAssetConfig.serviceAssetArrivalConfig.booking.minAdvance': [{ required: true, message: '请输入最小提前时间', trigger: 'blur' }], 'serviceAssetConfig.serviceAssetArrivalConfig.booking.minDuration': [{ required: true, message: '请输入最小时长', trigger: 'blur' }], 'serviceAssetConfig.serviceAssetArrivalConfig.booking.cancelWindow': [{ required: true, message: '请输入取消提前时间', trigger: 'blur' }], @@ -1091,23 +1091,25 @@ const buildRequestBody = async (): Promise => { // 主图 (已在上传时直接赋值给 ruleForm.mainImage) if (ruleForm.mainImage) { - body.fileURL = ruleForm.mainImage; + body.imageURL = ruleForm.mainImage; } // 图片列表 const imageUrls: string[] = []; for (const file of imageFileList.value) { - if (file.response) { - // 新上传的图片使用原始 URL - imageUrls.push(file.response as string); - } else if (file.url && !file.url.startsWith('blob:')) { - // 已有图片保留原 URL - imageUrls.push(file.url); + let url = (file.response as string) || ''; + if (!url && file.url && !file.url.startsWith('blob:')) { + url = file.url; + } + if (url) { + // 移除前缀,确保提交相对路径 + if (fileAddressPrefix.value && url.startsWith(fileAddressPrefix.value)) { + url = url.substring(fileAddressPrefix.value.length); + } + imageUrls.push(url); } } - if (imageUrls.length > 0) { - body.images = imageUrls; - } + body.images = imageUrls; // 根据类型添加配置 if (ruleForm.type === 'physical') { diff --git a/src/views/assets/asset/component/skuDialog.vue b/src/views/assets/asset/component/skuDialog.vue new file mode 100644 index 0000000..5cfb140 --- /dev/null +++ b/src/views/assets/asset/component/skuDialog.vue @@ -0,0 +1,558 @@ + + + + + diff --git a/src/views/assets/asset/index.vue b/src/views/assets/asset/index.vue index 22e2aaa..55e1bf9 100644 --- a/src/views/assets/asset/index.vue +++ b/src/views/assets/asset/index.vue @@ -84,6 +84,7 @@ + @@ -98,6 +99,7 @@ import { ref, reactive, onMounted } from 'vue'; import { ElMessageBox, ElMessage } from 'element-plus'; import { listAssets, updateAssetStatus, deleteAsset } from '/@/api/assets/asset'; import EditAsset from './component/editAsset.vue'; +import SkuDialog from './component/skuDialog.vue'; interface AssetRow { id: string; @@ -115,6 +117,7 @@ interface AssetRow { } const editAssetRef = ref(); +const skuDialogRef = ref(); const tableData = reactive({ data: [] as AssetRow[], @@ -217,10 +220,9 @@ const onEdit = (row: AssetRow) => { editAssetRef.value.openDialog(row, true); }; -// 添加SKU(待定) +// 管理SKU const onAddSku = (row: AssetRow) => { - ElMessage.info('添加SKU功能待开发'); - console.log('添加SKU:', row); + skuDialogRef.value.openDialog(row); }; // 分页大小改变