支持店铺通过excel批量更新商品库存功能

This commit is contained in:
pikachu1995@126.com 2024-06-27 17:09:58 +08:00
parent 92559ca9e7
commit 6e9d725f6d

View File

@ -19,6 +19,26 @@
style="width: 200px"
/>
</Form-item>
<Form-item label="商品编号" prop="goodsId">
<Input
type="text"
v-model="searchForm.goodsId"
placeholder="请输入商品编号"
clearable
style="width: 200px"
/>
</Form-item>
<Form-item label="状态" prop="status">
<Select
v-model="searchForm.marketEnable"
placeholder="请选择"
clearable
style="width: 200px"
>
<Option value="DOWN">下架</Option>
<Option value="UPPER">上架</Option>
</Select>
</Form-item>
<Form-item label="商品分类" prop="category">
<Cascader
v-model="category"
@ -27,12 +47,62 @@
:data="categoryList"
></Cascader>
</Form-item>
<Form-item label="货号" prop="id">
<Input
type="text"
v-model="searchForm.skuSn"
placeholder="请输入货号"
clearable
style="width: 200px"
/>
</Form-item>
<Button @click="handleSearch" type="primary" class="search-btn">搜索</Button>
<Button @click="handleReset" class="search-btn">重置</Button>
</Form>
</Row>
<Tabs @on-click="switchTabs" value="updateStock" v-model="stockType">
<TabPane label="商品库存管理" name="stockManage">
<Row class="operation padding-row">
<Button @click="exportStock" type="primary" class="export">批量导出</Button>
<Button @click="openImportStock" class="export">批量导入</Button>
</Row>
<Table
class="mt_10"
border
:loading="loading"
:columns="stockManageColumns"
:data="stockAllData"
ref="table"
>
<template slot="goodsSlot" slot-scope="{ row }">
<div style="margin-top: 5px; height: 90px; display: flex">
<div style="">
<img :src="row.thumbnail" style="height: 80px; margin-top: 3px; width: 70px"/>
</div>
<div style="margin-left: 13px;margin-top: 5px;">
<div class="div-zoom" style="color: black;">
{{ row.goodsName }}
</div>
<div class="div-zoom" style="margin-top: 5px;">
ID: {{ row.goodsId }}
</div>
</div>
</div>
</template>
<template slot="skuSlot" slot-scope="{ row }">
<div style="margin-top: 5px; height: 90px; display: flex">
<div style="margin-left: 13px;margin-top: 5px;">
<div class="div-zoom" style="color: black;">
{{ row.simpleSpecs }}
</div>
<div class="div-zoom" style="margin-top: 5px;">
ID: {{ row.id }}
</div>
</div>
</div>
</template>
</Table>
</TabPane>
<TabPane label="预警商品" name="warnList">
<Table
class="mt_10"
@ -54,7 +124,8 @@
ref="table"
>
<template slot="alertQuantitySlot" slot-scope="{ row }">
<Input type="number" v-model="row.alertQuantity" clearable placeholder="请输入预警库存" @on-blur="updateWarnStock(row)" @on-change="checkVal(row)" />
<Input type="number" v-model="row.alertQuantity" clearable placeholder="请输入预警库存"
@on-blur="updateWarnStock(row)" @on-change="checkVal(row)"/>
</template>
</Table>
</TabPane>
@ -66,7 +137,7 @@
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
:page-size-opts="[20, 50]"
size="small"
show-total
show-elevator
@ -92,31 +163,51 @@
<Button type="primary" @click="updateStock">更新</Button>
</div>
</Modal>
</div>
</template>
<script>
import {
getGoodsSkuListDataSeller,
<Modal title="导入商品信息" v-model="importModal" :mask-closable="false">
<div style="text-align: center">
<Upload :before-upload="handleUpload" name="files"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
multiple type="drag" :action="action" :headers="accessToken">
<div style="padding: 50px 0">
<Icon type="ios-cloud-upload" size="102" style="color: #3399ff"></Icon>
<h2>选择或拖拽文件上传</h2>
</div>
<Spin fix v-if="spinShow"></Spin>
</Upload>
</div>
<div slot="footer">
<Button type="text" @click="importModal = false">确定</Button>
</div>
</Modal>
</div>
</template>
<script>
import {
getGoodsCategoryAll,
getGoodsListDataByStockSeller,
getGoodsSkuListDataSeller,
importStockExcel,
queryExportStock,
updateGoodsAlertStocks,
updateGoodsSkuStocks,
getGoodsCategoryAll
} from "@/api/goods";
import * as API_Shop from "@/api/shops";
export default {
updateGoodsSkuStocks
} from "@/api/goods";
export default {
name: "goods",
data() {
return {
importModal: false,
id: "", //id
loading: true, //
updateStockModalVisible: false, //
stockAllUpdate: undefined, //
stockType: 'warnList',
stockType: 'stockManage',
searchForm: {
//
pageNumber: 1, //
pageSize: 10, //
pageSize: 20, //
sort: "create_time", //
order: "desc", //
},
@ -125,6 +216,55 @@
formValidate: {},
//
stockList: [],
stockManageColumns: [
{
title: "商品信息",
key: "goodsName",
midwidth: 400,
slot: "goodsSlot",
}, {
title: "SKU信息",
key: "simpleSpecs",
midwidth: 400,
tooltip: true,
slot: "skuSlot",
}, {
title: "上架状态",
key: "marketEnable",
width: 130,
sortable: false,
render: (h, params) => {
if (params.row.marketEnable == "DOWN") {
return h("Tag", {props: {color: "red"}}, "下架");
} else if (params.row.marketEnable == "UPPER") {
return h("Tag", {props: {color: "green"}}, "上架");
}
},
}, {
title: "审核状态",
key: "authFlag",
width: 120,
render: (h, params) => {
if (params.row.authFlag == "PASS") {
return h("Tag", {props: {color: "green"}}, "通过");
} else if (params.row.authFlag == "TOBEAUDITED") {
return h("Tag", {props: {color: "volcano"}}, "待审核");
} else if (params.row.authFlag == "REFUSE") {
return h("Tag", {props: {color: "red"}}, "审核拒绝");
}
},
}, {
title: "库存",
key: "quantity",
midwidth: 280,
render: (h, params) => {
if (params.row.quantity) {
return h("div", params.row.quantity);
} else {
return h("div", 0);
}
},
},],
//
columns: [
{
@ -226,11 +366,11 @@
width: 130,
render: (h, params) => {
if (params.row.authFlag == "TOBEAUDITED") {
return h("Tag", { props: { color: "blue" } }, "待审核");
return h("Tag", {props: {color: "blue"}}, "待审核");
} else if (params.row.authFlag == "PASS") {
return h("Tag", { props: { color: "green" } }, "通过");
return h("Tag", {props: {color: "green"}}, "通过");
} else if (params.row.authFlag == "REFUSE") {
return h("Tag", { props: { color: "red" } }, "审核拒绝");
return h("Tag", {props: {color: "red"}}, "审核拒绝");
}
},
},
@ -256,6 +396,7 @@
],
warnData: [], //
skuAllData: [], //SKU
stockAllData: [],//SKU
total: 0, //sku
categoryList: [], //
category: '', //
@ -268,16 +409,16 @@
this.getDataList();
this.deepGroup();
},
openUpdataStockModal(row){
openUpdataStockModal(row) {
this.stockList = []
this.selectedSku = JSON.parse(JSON.stringify(row));
this.stockList.push(this.selectedSku);
this.updateStockModalVisible = true;
},
//
updateStock () {
updateStock() {
let updateStockList = this.stockList.map((i) => {
let j = { skuId: i.id, quantity: i.quantity };
let j = {skuId: i.id, quantity: i.quantity};
return j;
});
updateGoodsSkuStocks(updateStockList).then((res) => {
@ -289,18 +430,18 @@
});
},
//
updateWarnStock(row){
if(this.checkFlag){
let submit = { skuId: row.id, alertQuantity: row.alertQuantity }
updateWarnStock(row) {
if (this.checkFlag) {
let submit = {skuId: row.id, alertQuantity: row.alertQuantity}
updateGoodsAlertStocks(submit).then(res => {
if(res.success){
if (res.success) {
this.$Message.success('更新成功')
}
})
}
},
//
checkVal(row){
checkVal(row) {
if (
!/^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/.test(row.alertQuantity) ||
parseInt(row.alertQuantity) < 0 ||
@ -315,7 +456,7 @@
this.checkFlag = true;
},
//
switchTabs(){
switchTabs() {
this.handleReset();
this.getDataList();
},
@ -350,30 +491,39 @@
getDataList() {
this.loading = true;
//
if(this.stockType == 'warnList'){
if (this.stockType == 'warnList') {
//
getGoodsListDataByStockSeller(this.searchForm).then(res => {
if(res.success){
if (res.success) {
this.warnData = res.result.records
this.total = res.result.total
this.loading = false;
}
})
}else if(this.stockType == 'warnSetting'){
} else if (this.stockType == 'warnSetting') {
//sku
getGoodsSkuListDataSeller(this.searchForm).then(res => {
if(res.success){
if (res.success) {
this.skuAllData = res.result.records
this.total = res.result.total
this.loading = false;
}
})
} else if (this.stockType == 'stockManage') {
//sku
getGoodsSkuListDataSeller(this.searchForm).then(res => {
if (res.success) {
this.stockAllData = res.result.records
this.total = res.result.total
this.loading = false;
}
})
}
},
//
deepGroup() {
getGoodsCategoryAll().then(res =>{
if(res.success){
getGoodsCategoryAll().then(res => {
if (res.success) {
res.result.forEach((item) => {
let childWay = []; //
//
@ -408,13 +558,70 @@
}
})
},
//
async exportStock() {
let randomNumber = '';
for (let i = 0; i < 10; i++) {
randomNumber += Math.floor(Math.random() * 10);
}
;
queryExportStock(this.searchForm)
.then((res) => {
const blob = new Blob([res], {
type: "application/vnd.ms-excel;charset=utf-8",
});
//<a> Firefox Chrome download
//IE10blobdownload
if ("download" in document.createElement("a")) {
//adownload
const link = document.createElement("a"); //a
link.download = randomNumber + ".xlsx"; //a
link.style.display = "none";
link.href = URL.createObjectURL(blob);
document.body.appendChild(link);
link.click(); //
URL.revokeObjectURL(link.href); //url
document.body.removeChild(link); //
} else {
navigator.msSaveBlob(blob, fileName);
}
})
.catch((err) => {
console.log(err);
});
},
openImportStock() {
this.importModal = true;
},
//
handleUpload(file) {
this.file = file;
this.upload();
return false;
},
/**
* 上传文件
*/
upload() {
let fd = new FormData();
fd.append("files", this.file);
this.spinShow = true;
importStockExcel(fd).then(res => {
if (res.success) {
this.spinShow = false;
this.$Message.success("导入成功");
this.importModal = false;
this.getDataList();
}
})
},
},
mounted() {
this.init();
},
};
</script>
<style lang="scss" scoped>
@import "@/styles/table-common.scss";
</style>
};
</script>
<style lang="scss" scoped>
@import "@/styles/table-common.scss";
</style>