菜品导入增加不覆盖选项

This commit is contained in:
zjf committed 2026-08-18 09:19:54 +08:00
1 parent b964535313
commit 15c6a4ae85
2 files changed
+23 -12

No files matched your search

+1 -1
View File
@@ -55,7 +55,7 @@ export function putObj(obj?: Object) {
})
}
/** Excel 导入菜品:cover=true 覆盖,false 仅新增 */
/** Excel 导入菜品:importMode=cover|skip|force;兼容 cover=true/false */
export function importSpu(data: FormData, params: Object) {
return request({
url: "/canteen/canteenSpu/import",
+22 -11
View File
@@ -130,9 +130,9 @@
<!-- 编辑、新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
<el-dialog v-model="importVisible" title="导入菜品" width="520px" :close-on-click-modal="false" destroy-on-close>
<el-dialog v-model="importVisible" title="导入菜品" width="560px" :close-on-click-modal="false" destroy-on-close>
<el-alert type="info" :closable="false" show-icon class="mb-4"
title="覆盖导入:有则更新、无则新增。同一菜品若既有「单品行」又在套餐里,以单品行单价为准。导出含菜品ID请勿删。分类不存在会自动新建。" />
title="覆盖:同名更新;新增:同名跳过;不覆盖:同名套餐/单品也新增(分类仍按名称复用)。同一菜品若既有单品行又在套餐里,覆盖时以单品行单价为准。" />
<el-form label-width="110px">
<el-form-item label="商户" required>
<select-mch v-model="importMerchantId" :apiParams="{ types: '1' }" style="width: 100%" />
@@ -142,9 +142,10 @@
<span class="ml-2 text-gray-400 text-xs">Excel 分类名匹配不到时使用</span>
</el-form-item>
<el-form-item label="导入方式" required>
<el-radio-group v-model="importCover">
<el-radio :label="true">覆盖导入(同名更新价格/库存等)</el-radio>
<el-radio :label="false">新增导入(同名跳过)</el-radio>
<el-radio-group v-model="importMode" class="import-mode-radios">
<el-radio label="cover">覆盖导入(同名更新价格/库存等)</el-radio>
<el-radio label="skip">新增导入(同名跳过)</el-radio>
<el-radio label="force">不覆盖导入(同名也新增,分类除外)</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="Excel 文件" required>
@@ -252,14 +253,15 @@ const importVisible = ref(false)
const importLoading = ref(false)
const importMerchantId = ref<string | number>()
const importCategoryId = ref<string | number>()
const importCover = ref(true)
/** cover=覆盖 | skip=同名跳过 | force=同名也新增 */
const importMode = ref<"cover" | "skip" | "force">("cover")
const importFile = ref<File | null>(null)
const importUploadRef = ref<UploadInstance>()
const openImport = () => {
importMerchantId.value = state.queryForm?.merchantId || undefined
importCategoryId.value = undefined
importCover.value = true
importMode.value = "cover"
importFile.value = null
importVisible.value = true
}
@@ -277,23 +279,23 @@ const submitImport = async () => {
useMessage().warning("请选择 Excel 文件")
return
}
const cover = importCover.value === true
const mode = importMode.value || "skip"
const fd = new FormData()
fd.append("file", importFile.value)
fd.append("merchantId", String(importMerchantId.value))
if (importCategoryId.value != null && importCategoryId.value !== "") {
fd.append("categoryId", String(importCategoryId.value))
}
fd.append("cover", cover ? "true" : "false")
fd.append("importMode", mode)
importLoading.value = true
try {
const res: any = await importSpu(fd, {
merchantId: importMerchantId.value,
categoryId: importCategoryId.value || undefined,
cover: cover ? "true" : "false",
importMode: mode,
})
const tip = res.msg || "导入成功"
if (!cover && String(tip).includes("跳过")) {
if (mode === "skip" && String(tip).includes("跳过")) {
useMessage().warning(tip)
} else {
useMessage().success(tip)
@@ -332,3 +334,12 @@ const handleDelete = async (ids: string[]) => {
}
}
</script>
<style scoped>
.import-mode-radios {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 8px;
}
</style>