From e82a191e374321d8a30ffadef7078daf0112b4e0 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Tue, 19 Aug 2025 12:44:37 +0800 Subject: [PATCH 01/15] =?UTF-8?q?1.other.ts=E5=A2=9E=E5=8A=A0application/o?= =?UTF-8?q?ctet-stream=E7=99=BD=E5=90=8D=E5=8D=95=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=8F=A3=E5=91=B3=E6=A8=A1=E5=9D=97=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/supermarketerp/smErpTasteStock.ts | 41 +++++++ src/utils/other.ts | 3 +- .../supermarketerp/smErpTasteStock/form.vue | 111 +++++++++++++++++ .../supermarketerp/smErpTasteStock/index.vue | 115 ++++++++++++++++++ 4 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 src/api/supermarketerp/smErpTasteStock.ts create mode 100644 src/views/supermarketerp/smErpTasteStock/form.vue create mode 100644 src/views/supermarketerp/smErpTasteStock/index.vue diff --git a/src/api/supermarketerp/smErpTasteStock.ts b/src/api/supermarketerp/smErpTasteStock.ts new file mode 100644 index 0000000..bc697f4 --- /dev/null +++ b/src/api/supermarketerp/smErpTasteStock.ts @@ -0,0 +1,41 @@ +import request from "/@/utils/request" + +export function fetchList(query?: Object) { + return request({ + url: '/supermarket/smErpTasteStock/page', + method: 'get', + params: query + }) +} + +export function addObj(obj?: Object) { + return request({ + url: '/supermarket/smErpTasteStock', + method: 'post', + data: obj + }) +} + +export function getObj(id?: string) { + return request({ + url: '/supermarket/smErpTasteStock/' + id, + method: 'get' + }) +} + +export function delObjs(ids?: Object) { + return request({ + url: '/supermarket/smErpTasteStock', + method: 'delete', + data: ids + }) +} + +export function putObj(obj?: Object) { + return request({ + url: '/supermarket/smErpTasteStock', + method: 'put', + data: obj + }) +} + diff --git a/src/utils/other.ts b/src/utils/other.ts index ca381da..6d95f83 100644 --- a/src/utils/other.ts +++ b/src/utils/other.ts @@ -352,8 +352,9 @@ export function handleBlobFile(response: any, fileName: string) { "text/plain", "image/jpeg", "image/png", + // "application/zip" // 添加 ZIP 文件类型支持 + "application/octet-stream" ] - if (!allowedTypes.includes(blob.type) && blob.type !== "") { useMessage().error("不支持的文件类型") return diff --git a/src/views/supermarketerp/smErpTasteStock/form.vue b/src/views/supermarketerp/smErpTasteStock/form.vue new file mode 100644 index 0000000..1e39acf --- /dev/null +++ b/src/views/supermarketerp/smErpTasteStock/form.vue @@ -0,0 +1,111 @@ + + + diff --git a/src/views/supermarketerp/smErpTasteStock/index.vue b/src/views/supermarketerp/smErpTasteStock/index.vue new file mode 100644 index 0000000..a09fd06 --- /dev/null +++ b/src/views/supermarketerp/smErpTasteStock/index.vue @@ -0,0 +1,115 @@ + + + From 2a82e97cfea36dc83bd4d8b603b57c9887d42f8f Mon Sep 17 00:00:00 2001 From: weiwei Date: Tue, 19 Aug 2025 16:46:03 +0800 Subject: [PATCH 02/15] =?UTF-8?q?feat:=E5=BA=93=E5=AD=98=E5=95=86=E5=93=81?= =?UTF-8?q?=E5=8F=A3=E5=91=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supermarketSpu/components/taste-stock.vue | 89 +++++++++++++++++++ .../supermarketerp/supermarketSpu/form.vue | 18 +++- 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 src/views/supermarketerp/supermarketSpu/components/taste-stock.vue diff --git a/src/views/supermarketerp/supermarketSpu/components/taste-stock.vue b/src/views/supermarketerp/supermarketSpu/components/taste-stock.vue new file mode 100644 index 0000000..8b5a7ba --- /dev/null +++ b/src/views/supermarketerp/supermarketSpu/components/taste-stock.vue @@ -0,0 +1,89 @@ + + + diff --git a/src/views/supermarketerp/supermarketSpu/form.vue b/src/views/supermarketerp/supermarketSpu/form.vue index 2dd4b55..2725cc9 100644 --- a/src/views/supermarketerp/supermarketSpu/form.vue +++ b/src/views/supermarketerp/supermarketSpu/form.vue @@ -18,6 +18,9 @@ + + + @@ -35,6 +38,7 @@ import BaseInfo from "./components/base-info.vue" import PackageUnit, { type rowVU } from "./components/package-unit.vue" import ProductInventory from "./components/product-inventory.vue" import AuxiliaryCode, { type rowVC } from "./components/auxiliary-code.vue" +import TasteStock from "./components/taste-stock.vue" import { getObj, addObj, putObj } from "/@/api/supermarketerp/supermarketSpu" import { TabPaneName } from "element-plus" import { useMessage } from "/@/hooks/message" @@ -47,7 +51,7 @@ const visible = ref(false) const loading = ref(false) const formRef = ref() const packageUnitRef = ref() -const tabPaneName = ["基础信息", "包装单位", "库存", "辅助条码"] +const tabPaneName = ["基础信息", "包装单位", "库存", "辅助条码", "口味"] const tabPaneActiveName = ref(tabPaneName[0]) const tabPaneActiveIndex = ref(0) @@ -71,6 +75,7 @@ const form = reactive({ grossMargin: 0, smErpUnitEntityList: [], smErpAuxiliaryCodeEntityList: [], + smErpTasteStockEntityList: [], barCode: "", spec: "", @@ -254,6 +259,15 @@ const settleAuxiliaryCode = () => { }) } +// 整理辅助条码列表 +const settleSmErpTasteStockEntityList = () => { + const smErpTasteStockEntityList = [...form.smErpTasteStockEntityList] + return smErpTasteStockEntityList.map((item: rowVC) => { + if (item.id.startsWith("tmp_")) item.id = "" + return item + }) +} + // 提交 const onSubmit = async () => { const valid = await formRef.value.validate().catch(() => {}) @@ -264,6 +278,7 @@ const onSubmit = async () => { const smErpAuxiliaryCodeEntityList = settleAuxiliaryCode() const smErpUnitEntityList = settlePackageUnitList() + const smErpTasteStockEntityList = settleSmErpTasteStockEntityList() try { loading.value = true const _pa = { @@ -271,6 +286,7 @@ const onSubmit = async () => { ...formatedStorePrice.value, smErpAuxiliaryCodeEntityList, smErpUnitEntityList, + smErpTasteStockEntityList, } // console.log("提交的数据", _pa) From f39279bf8a6d756e8a280cc2a08aaf7387bffb87 Mon Sep 17 00:00:00 2001 From: weiwei Date: Wed, 20 Aug 2025 11:11:34 +0800 Subject: [PATCH 03/15] =?UTF-8?q?feat:=E5=BA=93=E5=AD=98=E5=95=86=E5=93=81?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E5=8F=A3=E5=91=B3=E7=9A=84=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/package-unit.vue | 28 ++++- .../supermarketSpu/components/taste-form.vue | 104 ++++++++++++++++++ .../supermarketerp/supermarketSpu/form.vue | 24 ++-- 3 files changed, 146 insertions(+), 10 deletions(-) create mode 100644 src/views/supermarketerp/supermarketSpu/components/taste-form.vue diff --git a/src/views/supermarketerp/supermarketSpu/components/package-unit.vue b/src/views/supermarketerp/supermarketSpu/components/package-unit.vue index 3335357..29479f6 100644 --- a/src/views/supermarketerp/supermarketSpu/components/package-unit.vue +++ b/src/views/supermarketerp/supermarketSpu/components/package-unit.vue @@ -10,8 +10,9 @@

- + + 新增口味 - - + + diff --git a/src/views/supermarketerp/supermarketSpu/form.vue b/src/views/supermarketerp/supermarketSpu/form.vue index 2725cc9..2e0d703 100644 --- a/src/views/supermarketerp/supermarketSpu/form.vue +++ b/src/views/supermarketerp/supermarketSpu/form.vue @@ -6,7 +6,7 @@ - + - - - @@ -38,8 +35,8 @@ import BaseInfo from "./components/base-info.vue" import PackageUnit, { type rowVU } from "./components/package-unit.vue" import ProductInventory from "./components/product-inventory.vue" import AuxiliaryCode, { type rowVC } from "./components/auxiliary-code.vue" -import TasteStock from "./components/taste-stock.vue" import { getObj, addObj, putObj } from "/@/api/supermarketerp/supermarketSpu" +import { fetchList } from "/@/api/supermarketerp/smErpTasteStock" import { TabPaneName } from "element-plus" import { useMessage } from "/@/hooks/message" import { displayPrice, storePrice } from "/@/utils/formatMoney" @@ -51,7 +48,7 @@ const visible = ref(false) const loading = ref(false) const formRef = ref() const packageUnitRef = ref() -const tabPaneName = ["基础信息", "包装单位", "库存", "辅助条码", "口味"] +const tabPaneName = ["基础信息", "包装单位", "库存", "辅助条码"] const tabPaneActiveName = ref(tabPaneName[0]) const tabPaneActiveIndex = ref(0) @@ -185,6 +182,8 @@ const openDialog = async (id: string) => { // 设置基础包装单位的单选行 packageUnitRef.value.setRadioRow(form.smErpUnitEntityList.findIndex((item: any) => item.isBase)) + + await getAllTasteList(id) } } @@ -219,11 +218,22 @@ const getsupermarketSpuData = async (id: string) => { } } +// 获取全部口味 +const getAllTasteList = async (spuId: string) => { + const { code, data, msg } = await fetchList({ spuId, current: 1, size: 1000 }) + if (code !== 0) { + form.smErpTasteStockEntityList = [] + return useMessage().error(msg) + } + form.smErpTasteStockEntityList = data.records ?? [] +} + // 重置表单数据 const resetForm = () => { formRef.value?.resetFields() form.smErpUnitEntityList = [] form.smErpAuxiliaryCodeEntityList = [] + form.smErpTasteStockEntityList = [] } // 整理包装单位列表 @@ -259,7 +269,7 @@ const settleAuxiliaryCode = () => { }) } -// 整理辅助条码列表 +// 整理口味 const settleSmErpTasteStockEntityList = () => { const smErpTasteStockEntityList = [...form.smErpTasteStockEntityList] return smErpTasteStockEntityList.map((item: rowVC) => { From ff3a47dcabca55474da66af7d91d25fad04895ff Mon Sep 17 00:00:00 2001 From: weiwei Date: Wed, 20 Aug 2025 15:36:08 +0800 Subject: [PATCH 04/15] =?UTF-8?q?feat:=E5=8F=A3=E5=91=B3=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/package-unit.vue | 2 + .../supermarketSpu/components/taste-form.vue | 55 ++++++++++-- .../supermarketSpu/components/taste-stock.vue | 89 ------------------- .../supermarketerp/supermarketSpu/form.vue | 1 + 4 files changed, 50 insertions(+), 97 deletions(-) delete mode 100644 src/views/supermarketerp/supermarketSpu/components/taste-stock.vue diff --git a/src/views/supermarketerp/supermarketSpu/components/package-unit.vue b/src/views/supermarketerp/supermarketSpu/components/package-unit.vue index 29479f6..eed0c61 100644 --- a/src/views/supermarketerp/supermarketSpu/components/package-unit.vue +++ b/src/views/supermarketerp/supermarketSpu/components/package-unit.vue @@ -144,6 +144,7 @@ export interface rowVU { isBase?: boolean | null flag?: string taste?: string + tasteId: string } export interface TasteItem { id: string @@ -218,6 +219,7 @@ const pushEvent = (row?: rowVU | undefined) => { promotionPrice: 0, costPrice: 0, taste: "", + tasteId: "", } Object.assign(newRow, row) } diff --git a/src/views/supermarketerp/supermarketSpu/components/taste-form.vue b/src/views/supermarketerp/supermarketSpu/components/taste-form.vue index 26e66dd..7d8add1 100644 --- a/src/views/supermarketerp/supermarketSpu/components/taste-form.vue +++ b/src/views/supermarketerp/supermarketSpu/components/taste-form.vue @@ -13,7 +13,7 @@ :column-config="{ resizable: true }" :row-config="{ isHover: true }" :resizable-config="{ dragMode: 'fixed' }" - :data="tasteList || []" + :data="tableTasteList" :edit-config="{ trigger: 'click', mode: 'cell', @@ -30,8 +30,8 @@ > - @@ -64,15 +65,36 @@ type Row = { } const tasteList = defineModel("modelValue", { default: [] }) - +const tableTasteList = ref([]) const tableRef = ref() const visible = ref(false) const validRules = { - tasteName: [{ required: true, message: "口味单位不能为空", trigger: "blur" }], + tasteName: [ + { required: true, message: "口味单位不能为空", trigger: "blur" }, + { + validator({ cellValue, row, rowIndex }: any) { + if ( + cellValue && + tableTasteList.value + .filter((item: Row, index: number) => rowIndex != index && item.tasteName == row.tasteName) + .some((v: Row) => v.tasteName == row.tasteName) + ) + return new Error("该口味已存在") + }, + }, + ], stock: [{ required: true, message: "库存不能为空", trigger: "blur" }], } +// 自定义编辑模板的input校验 +const slotInputChange = (slotParams: any) => { + const $table = tableRef.value + if ($table) { + $table.updateStatus(slotParams) + } +} + // 底部新增行 const pushEvent = () => { const newRow: Row = { @@ -80,7 +102,7 @@ const pushEvent = () => { tasteName: "", stock: 0, } - tasteList.value.push(newRow) + tableTasteList.value.push(newRow) nextTick(() => { const $table = tableRef.value if ($table) { @@ -91,11 +113,28 @@ const pushEvent = () => { // 删除行 const removeRow = (rowIndex: number) => { - tasteList.value.splice(rowIndex, 1) + tableTasteList.value.splice(rowIndex, 1) } -const openDialog = (id: string) => { +const openDialog = () => { visible.value = true + tableTasteList.value = tasteList.value ? [...tasteList.value] : [] +} + +// 提交 +const onConfirm = async () => { + const $table = tableRef.value + if ($table) { + const errMap = await $table.validate(true) + if (errMap) { + console.log("全量校验失败!", errMap) + return + } else { + console.log("全量校验成功!") + visible.value = false + tasteList.value = [...tableTasteList.value] + } + } } defineExpose({ diff --git a/src/views/supermarketerp/supermarketSpu/components/taste-stock.vue b/src/views/supermarketerp/supermarketSpu/components/taste-stock.vue deleted file mode 100644 index 8b5a7ba..0000000 --- a/src/views/supermarketerp/supermarketSpu/components/taste-stock.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - diff --git a/src/views/supermarketerp/supermarketSpu/form.vue b/src/views/supermarketerp/supermarketSpu/form.vue index 2e0d703..03abb2d 100644 --- a/src/views/supermarketerp/supermarketSpu/form.vue +++ b/src/views/supermarketerp/supermarketSpu/form.vue @@ -248,6 +248,7 @@ const settlePackageUnitList = () => { item.isBase = false } if (item.id.startsWith("tmp_")) item.id = "" + if (item.tasteId.startsWith("tmp_")) item.tasteId = "" // 转换金额单位 item.costPrice = storePrice(item.costPrice) item.promotionPrice = storePrice(item.promotionPrice) From 6517d33d1c775c8b644b881c01a1943fcc8e9b01 Mon Sep 17 00:00:00 2001 From: weiwei Date: Wed, 20 Aug 2025 18:14:35 +0800 Subject: [PATCH 05/15] =?UTF-8?q?feat:=E5=8F=A3=E5=91=B3=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=92=8C=E6=A0=A1=E9=AA=8C=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/package-unit.vue | 43 ++++++++++++------- .../supermarketSpu/components/taste-form.vue | 4 +- .../supermarketerp/supermarketSpu/form.vue | 8 +++- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/views/supermarketerp/supermarketSpu/components/package-unit.vue b/src/views/supermarketerp/supermarketSpu/components/package-unit.vue index eed0c61..fffa8eb 100644 --- a/src/views/supermarketerp/supermarketSpu/components/package-unit.vue +++ b/src/views/supermarketerp/supermarketSpu/components/package-unit.vue @@ -65,8 +65,8 @@ -