库存预警

master
chc 2024-01-16 17:26:09 +08:00
parent 6221b59b21
commit d20da31f2c
5 changed files with 427 additions and 11 deletions

View File

@ -38,6 +38,7 @@
type="primary"
@click="
goodsData = [];
goodsParams.pageNumber = 1;
getQueryGoodsList();
"
icon="ios-search"

View File

@ -0,0 +1,419 @@
<template>
<div class="search">
<Card>
<Row @keydown.enter.native="handleSearch">
<Form
ref="searchForm"
:model="searchForm"
inline
:label-width="70"
class="search-form"
>
<Form-item label="商品名称" prop="goodsName">
<Input
type="text"
v-model="searchForm.goodsName"
placeholder="请输入商品名称"
clearable
style="width: 200px"
/>
</Form-item>
<Form-item label="商品分类" prop="category">
<Cascader
v-model="category"
placeholder="请选择商品分类"
style="width: 200px"
:data="categoryList"
></Cascader>
</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="warnList">
<Table
class="mt_10"
border
:loading="loading"
:columns="columns"
:data="warnData"
ref="table"
>
</Table>
</TabPane>
<TabPane label="设置预警" name="warnSetting">
<Table
class="mt_10"
border
:loading="loading"
:columns="settingColumns"
:data="skuAllData"
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)" />
</template>
</Table>
</TabPane>
</Tabs>
<Row type="flex" justify="end" class="mt_10">
<Page
:current="searchForm.pageNumber"
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
</Row>
</Card>
<Modal
title="更新库存"
v-model="updateStockModalVisible"
:mask-closable="false"
:width="610"
>
<Table
class="mt_10"
:columns="updateStockColumns"
:data="stockList"
border
></Table>
<div slot="footer">
<Button type="text" @click="updateStockModalVisible = false">取消</Button>
<Button type="primary" @click="updateStock"></Button>
</div>
</Modal>
</div>
</template>
<script>
import {
getGoodsSkuListDataSeller,
getGoodsListDataByStockSeller,
updateGoodsAlertStocks,
updateGoodsSkuStocks,
getGoodsCategoryAll
} from "@/api/goods";
import * as API_Shop from "@/api/shops";
export default {
name: "goods",
data() {
return {
id: "", //id
loading: true, //
updateStockModalVisible: false, //
stockAllUpdate: undefined, //
stockType: 'warnList',
searchForm: {
//
pageNumber: 1, //
pageSize: 10, //
sort: "create_time", //
order: "desc", //
},
checkFlag: false, //
//
formValidate: {},
//
stockList: [],
//
columns: [
{
title: "商品名称",
key: "goodsName",
midwidth: 400,
tooltip: true,
},
{
title: "库存",
key: "quantity",
midwidth: 280,
render: (h, params) => {
if (params.row.quantity) {
return h("div", params.row.quantity);
} else {
return h("div", 0);
}
},
},
{
title: "预警值",
key: "alertQuantity",
midwidth: 280,
render: (h, params) => {
if (params.row.alertQuantity) {
return h("div", params.row.alertQuantity);
} else {
return h("div", 0);
}
},
},
{
title: "操作",
key: "action",
align: "center",
fixed: "right",
width: 200,
render: (h, params) => {
return h("div", [
h(
"Button",
{
props: {
type: "default",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.openUpdataStockModal(params.row);
},
},
},
"库存"
),
]);
},
},
],
settingColumns: [
{
title: "商品名称",
key: "goodsName",
},
{
title: "库存",
key: "quantity",
width: 400,
render: (h, params) => {
if (params.row.quantity) {
return h("div", params.row.quantity);
} else {
return h("div", 0);
}
},
},
{
title: "预警值",
key: "alertQuantity",
width: 400,
slot: 'alertQuantitySlot',
},
],
updateStockColumns: [
{
title: "sku规格",
key: "sn",
minWidth: 120,
render: (h, params) => {
return h("div", {}, params.row.simpleSpecs);
},
},
{
title: "审核状态",
key: "authFlag",
width: 130,
render: (h, params) => {
if (params.row.authFlag == "TOBEAUDITED") {
return h("Tag", { props: { color: "blue" } }, "待审核");
} else if (params.row.authFlag == "PASS") {
return h("Tag", { props: { color: "green" } }, "通过");
} else if (params.row.authFlag == "REFUSE") {
return h("Tag", { props: { color: "red" } }, "审核拒绝");
}
},
},
{
title: "操作",
key: "action",
align: "center",
width: 200,
render: (h, params) => {
let vm = this;
return h("InputNumber", {
props: {
value: params.row.quantity,
},
on: {
"on-change": (event) => {
vm.stockList[params.index].quantity = event;
},
},
});
},
},
],
warnData: [], //
skuAllData: [], //SKU
total: 0, //sku
categoryList: [], //
category: '', //
selectedSku: {},
};
},
methods: {
init() {
//
this.getDataList();
this.deepGroup();
},
openUpdataStockModal(row){
this.stockList = []
this.selectedSku = JSON.parse(JSON.stringify(row));
this.stockList.push(this.selectedSku);
this.updateStockModalVisible = true;
},
//
updateStock () {
let updateStockList = this.stockList.map((i) => {
let j = { skuId: i.id, quantity: i.quantity };
return j;
});
updateGoodsSkuStocks(updateStockList).then((res) => {
if (res.success) {
this.updateStockModalVisible = false;
this.$Message.success("更新库存成功");
this.getDataList();
}
});
},
//
updateWarnStock(row){
if(this.checkFlag){
let submit = { skuId: row.id, alertQuantity: row.alertQuantity }
updateGoodsAlertStocks(submit).then(res => {
if(res.success){
this.$Message.success('更新成功')
}
})
}
},
//
checkVal(row){
if (
!/^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/.test(row.alertQuantity) ||
parseInt(row.alertQuantity) < 0 ||
parseInt(row.alertQuantity) > 99999999
) {
//
this.$Message.error("请输入0~99999999之间的数字值")
this.checkFlag = false;
return;
}
this.checkFlag = true;
},
//
switchTabs(){
this.handleReset();
this.getDataList();
},
//
changePageSize(v) {
this.searchForm.pageSize = v;
this.getDataList();
},
//
changePage(v) {
this.searchForm.pageNumber = v;
this.getDataList();
this.clearSelectAll();
},
//
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.searchForm.categoryPath = this.category.join(",")
this.getDataList();
},
//
handleReset() {
this.searchForm = {};
this.category = [];
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
//
this.getDataList();
},
//
getDataList() {
this.loading = true;
//
if(this.stockType == 'warnList'){
//
getGoodsListDataByStockSeller(this.searchForm).then(res => {
if(res.success){
this.warnData = res.result.records
this.total = res.result.total
this.loading = false;
}
})
}else if(this.stockType == 'warnSetting'){
//sku
getGoodsSkuListDataSeller(this.searchForm).then(res => {
if(res.success){
this.skuAllData = res.result.records
this.total = res.result.total
this.loading = false;
}
})
}
},
//
deepGroup() {
getGoodsCategoryAll().then(res =>{
if(res.success){
res.result.forEach((item) => {
let childWay = []; //
//
if (item.children) {
item.children.forEach((child) => {
// //
if (child.children) {
child.children.forEach((grandson, index, arr) => {
arr[index] = {
value: grandson.id,
label: grandson.name,
children: "",
};
});
}
let children = {
value: child.id,
label: child.name,
children: child.children,
};
childWay.push(children);
});
}
//
let way = {
value: item.id,
label: item.name,
children: childWay,
};
this.categoryList.push(way);
});
}
})
},
},
mounted() {
this.init();
},
};
</script>
<style lang="scss" scoped>
@import "@/styles/table-common.scss";
</style>

View File

@ -1459,10 +1459,6 @@ export default {
title: "库存",
slot: "quantity",
},
{
title: "库存预警",
slot: "alertQuantity",
},
{
title: "货号",
slot: "sn",

View File

@ -111,12 +111,12 @@
投诉
</div>
</div>
<div class="detail-item" @click="navigateTo('goods')">
<div>
<span>{{ homeData.waitUpper || 0 }}</span>
<div>待上架</div>
<div class="detail-item" >
<div @click="navigateTo('alert-goods-quantity')">
<span>{{ homeData.alertQuantityNum || 0 }}</span>
<div>库存预警</div>
</div>
<div>
<div @click="navigateTo('goods')">
<span>{{ homeData.waitAuth || 0 }}</span>
<div>审核中</div>
</div>

View File

@ -4,14 +4,14 @@
<div class="query-wrapper">
<div class="query-item">
<div>搜索范围</div>
<Input placeholder="商品名称" @on-clear="goodsData=[]; goodsParams.goodsName=''; getQueryGoodsList()" @on-enter="()=>{goodsData=[]; getQueryGoodsList();}" clearable style="width: 150px"
<Input placeholder="商品名称" @on-clear="goodsData=[]; goodsParams.goodsName=''; goodsParams.pageNumber = 1; getQueryGoodsList()" @on-enter="()=>{goodsData=[]; goodsParams.pageNumber = 1; getQueryGoodsList();}" clearable style="width: 150px"
v-model="goodsParams.goodsName" />
</div>
<div class="query-item">
<Cascader v-model="category" placeholder="请选择商品分类" style="width: 150px" :data="cateList"></Cascader>
</div>
<div class="query-item">
<Button type="primary" @click="goodsData=[]; getQueryGoodsList();" icon="ios-search">搜索</Button>
<Button type="primary" @click="goodsData=[]; goodsParams.pageNumber = 1; getQueryGoodsList();" icon="ios-search">搜索</Button>
</div>
</div>
<div >