Commit 09cc5240 by chenxin

fix: 库存记录 抽出

parent 90e7e103
<template>
<el-dialog title="活动统计" :visible.sync="dialogVisible" width="800px" @close="close">
<div class="mb20">
<el-select class="mr10 w140" clearable v-model="listParams.appCode" placeholder="全部应用" @change="refresh">
<el-option label="福利调整(手动)" :value="1"></el-option>
<el-option label="福利调整(同步)" :value="2"></el-option>
<el-option label="积分商城" :value="3"></el-option>
</el-select>
<el-input class="mr10 w300" v-model="listParams.activityName" clearable placeholder="请输入活动名称搜索" @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
</div>
<el-table tooltip-effect="dark" :data="tableList" style="width:100%">
<el-table-column prop="couponCode" label="活动应用名称" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="活动名称" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="可用库存" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="历史履约库存" min-width="120"> </el-table-column>
</el-table>
<div class="clearfix">
<dm-pagination class="fr mb0" v-if="tableList.length" background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">关闭</el-button>
</span>
</el-dialog>
</template>
<script>
import { page } from '@/mixins/table.js';
export default {
mixins: [ page ],
props: {
dialogVisible: {
default: false,
type: Boolean
},
welfareId: {
type: String,
required: true
}
},
data() {
return {
loading: false,
listParams: {
appCode: '',
activityName: '',
currentPage: 1,
pageSize: 20
},
total: 0,
tableList: [],
};
},
methods: {
close() {
this.$emit('update:dialogVisible', false);
},
getTableList() {
return;
}
},
watch: {
dialogVisible(val) {
val && this.getTableList();
}
}
};
</script>
\ No newline at end of file
<template>
<div class="p20" v-loading="loading">
<div class="pb20 clearfix flex-center">
<welfare-item :welfare-id="$route.query.id"></welfare-item>
</div>
<div style="height:20px;width:calc(100% + 40px);position:relative;left:-20px;" class="bg-color mb20"></div>
<div>
<p class="fz16 mb15">操作记录<span class="fz12 ml10 gray03">主要对手动调整库存,应用占用库存,应用释放库存的场景下对福利“可占库存”引起变更进行记录</span></p>
<div class="table-search-head">
<el-select class="mr10 w140" clearable v-model="listParams.status" placeholder="全部操作类型" @change="refresh">
<el-option v-for="item in stockAdjustStatus" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-select class="mr10 w140" clearable v-model="listParams.status" placeholder="全部应用" @change="refresh">
<el-option label="福利调整(手动)" :value="1"></el-option>
<el-option label="福利调整(同步)" :value="2"></el-option>
<el-option label="积分商城" :value="3"></el-option>
</el-select>
<el-input class="mr10 w300" v-model="listParams.activityName" clearable placeholder="请输入活动名称搜索" @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-date-picker class="w300 mr10" v-model="dateTime" type="daterange" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期" @change="refresh"></el-date-picker>
</div>
</div>
<el-table tooltip-effect="dark" :data="tableList" style="width:100%">
<el-table-column prop="giveTime" label="操作时间" min-width="120">
<span slot-scope="scope" v-html="listTime(scope.row.createTime)"></span>
</el-table-column>
<el-table-column label="调整类型" min-width="120" fixed="left">
<span slot-scope="scope">{{ scope.row.type | fType }}</span>
</el-table-column>
<el-table-column prop="couponCode" label="调整数量" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="可占库存" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="操作人" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="调整应用" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="活动名称" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="备注" min-width="140" show-overflow-tooltip> </el-table-column>
</el-table>
<div class="clearfix">
<dm-pagination class="fr mb0" v-if="tableList.length" background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</div>
</div>
</template>
<script>
import { page, formate } from '@/mixins/table.js';
import { listTime } from '@/utils/index.js';
import fetch from '@/api/gic-card.js';
import { cardType } from '@/config/mapping/gic-card';
import { stockAdjustStatus } from '@/config/mapping/common';
import welfareItem from './welfare-item';
const { giveLogList } = fetch;
export default {
name: 'SendList',
components: {
welfareItem,
},
mixins: [ page, formate ],
props: {
welfareId: {
type: String,
required: true
}
},
data() {
return {
loading: false,
dateTime: [ , ],
listParams: {
appCode: '',
activityName: '',
receiveBeginTime: '',
receiveEndTime: '',
currentPage: 1,
pageSize: 20
},
stockAdjustStatus: Object.keys(stockAdjustStatus).map(v => { return { label: stockAdjustStatus[v], value: v }; }),
total: 0,
tableList: [],
};
},
created() {
this.$emit('updateBread', [ { breadName: '福利中心' }, { breadName: 'GIC卡券' }, { breadName: '卡券日志' }, { breadName: '转赠记录' } ]);
},
mounted() {
this.getTableList();
},
methods: {
listTime,
// formatSendStatus(row) {
// const st = sendType[row.status];
// if(st) {
// return `<span class="state-point ${st.cl}">${st.label || '--'}</span>`;
// } else {
// return '<span class="state-point state-point-default">未知状态</span>';
// }
// },
formatCardType(row) {
return cardType[row.cardType].label;
},
getTableList() {
return;
if(this.loading) {
return;
}
this.loading = true;
this.formatterTimeFunc('giveBeginTime', 'giveEndTime', 'yyyy-MM-dd', 'dateTime');
let params = { ...this.listParams, memberCardId: this.currentAreaId };
// TODO: search
giveLogList(params).then(res => {
this.loading = false;
const data = res.result;
this.tableList = data.result || [];
this.total = data.totalCount;
// 删除至最后一页没数据的情况,页码-1
if (this.tableList.length === 0 && this.listParams.currentPage !== 1) {
this.listParams.currentPage -= 1;
this.getTableList();
}
}).finally(() => {
this.loading = false;
});
},
},
filter: {
fType(v) {
return stockAdjustStatus[v] || '未知操作';
}
}
};
</script>
<template>
<div class="welfare-item">
<div class="head">
<el-tag type="success" class="mr10">使用中</el-tag>
<label>更新时间:</label>2020-12-21 12:12:12<label class="ml30">福利ID:</label>567856785678567867867
</div>
<div class="content">
<div>
<p>100元卡券(线下)</p>
<p class="gray03 fz12">100元卡券(线下)</p>
<p class="gray03 fz12">创建时间:2020-12-12 12:12:12</p>
</div>
<div>
<p>成本:¥12.00</p>
<p>可占库存:1000</p>
</div>
<div style="position:relative;">
<p>已占用:200</p>
<p>总库存:1200</p>
<p>已履约:140</p>
<el-tag style="position:absolute;right:20px;top:20px;">实际库存</el-tag>
</div>
<div style="flex-shrink: 0;width:100px;">
<el-button type="primary" class="fr mr20" @click="dialogVisible = true">活动记录</el-button>
</div>
</div>
<el-table :data="skuList" style="width: calc(100% - 40px)" max-height="200" class="ml20 mr20 mb10">
<el-table-column prop="num" label="SKU信息" min-width="150"></el-table-column>
<el-table-column prop="num" label="SKU编码" min-width="150"></el-table-column>
<el-table-column prop="num" label="总库存" min-width="150"></el-table-column>
<el-table-column prop="num" label="已占用" min-width="150"></el-table-column>
<el-table-column prop="num" label="可占库存" min-width="150"></el-table-column>
<el-table-column prop="num" label="已履约" min-width="150"></el-table-column>
</el-table>
<act-dialog :dialog-visible.sync="dialogVisible" :welfare-id="$route.query.id"></act-dialog>
</div>
</template>
<script>
import actDialog from './dialog';
export default {
name: 'WelfareItem',
components: {
actDialog
},
props: {
welfareId: {
type: String,
required: true
}
},
data() {
return {
info: {},
dialogVisible: false,
skuList: Array(5).fill({ num: 50 })
};
},
methods: {
getWelfareInfo() {
console.log('info');
}
},
watch: {
welfareId: {
handler() {
this.getWelfareInfo();
},
immediate: true,
},
}
};
</script>
<style lang="scss" scope>
.welfare-item {
width: 100%;
border: 1px solid $gray-tab;
background: white;
.head {
font-size: 13px;
background: $gray-thead;
color: $gray01;
height: 40px;
line-height: 40px;
padding: 0 20px 0;
border-bottom: 1px solid $gray-tab;
label {
color: $gray02;
}
&-type {
margin-right: 20px;
min-width: 100px;
}
}
.content {
height: 115px;
overflow: hidden;
padding: 0;
display: flex;
> div {
margin-left: 20px;
padding-top: 20px;
flex: 1;
line-height: 28px;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="main-content">
<div class="main-content-head">
<welfare-item :welfare-id="welfareId" />
</div>
<div class="main-content-bodys" v-loading="loading">
<div class="pb20 pt5 clearfix flex-center search">
<label class="mr8 cursor">操作时间</label>
<el-date-picker class="mr10" v-model="dateTime" type="datetimerange" :default-time="['00:00:00', '23:59:59']" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期" @change="refresh" />
<label class="ml15 mr8">库存</label>
<el-input-number class="hide-right w100" @change="refresh" v-model="listParams.modifyStockMin" controls-position="right" :precision="0" :min="1" :max="10000" placeholder="请输入" />
<label class="ml5 mr5">-</label>
<el-input-number class="hide-right w100 mr15" @change="refresh" v-model="listParams.modifyStockMax" controls-position="right" :precision="0" :min="1" :max="100000" placeholder="请输入" />
<el-select class="w220 mrAuto" collapse-tags clearable v-model="listParams.activityIdList" placeholder="所有营销活动" multiple @change="refresh">
<el-option v-for="(v, i) in activityList" :key="i" :label="v.activityName" :value="v.activityId"></el-option>
</el-select>
<!-- <el-button type="primary" icon="iconfont-market4 icon-icon_yunxiazai">下载</el-button> -->
</div>
<el-table tooltip-effect="dark" :data="tableList" style="width:100%" @sort-change="handleSort">
<template>
<el-table-column v-for="(v, i) in tableHeader" :fixed="v.fixed" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter" :sortable="v.sortable">
<template slot-scope="scope">
<span v-if="v.formatter" v-html="v.formatter(scope.row)"></span>
<span v-else-if="v.famount">{{ scope.row[v.prop] | amountFormat(null, 0, null) }}</span>
<span v-else>{{ scope.row[v.prop] }}</span>
</template>
</el-table-column>
</template>
</el-table>
<div class="clearfix">
<dm-pagination class="fr mb0" v-if="tableList.length" hide-on-single-page background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</div>
</div>
</div>
</template>
<script>
import { page, formate } from '@/mixins/table.js';
// import welfareItem from './welfare-item';
import { listTime } from '@/utils/index.js';
// import api from '@/api/welfare';
// const { stockLogList, activityListByWfId } = api;
export default {
name: 'StockLogList',
// components: {
// welfareItem
// },
mixins: [ page, formate ],
data() {
return {
loading: false,
welfareId: this.$route.query.id,
dateTime: [ , ],
listParams: {
search: '',
welfareId: this.$route.query.id,
modifyLogId: '',
modifyTimeBegin: '',
modifyTimeEnd: '',
modifyStockMin: undefined,
modifyStockMax: undefined,
currentPage: 1,
pageSize: 20,
},
activityList: [],
total: 0,
tableList: [],
tableHeader: [
{ label: '库存调整记录ID', prop: 'modifyLogId', align: 'left', minWidth: '140', fixed: 'left' },
{
label: '操作时间',
minWidth: '120',
align: 'left',
prop: 'modifyTime',
sortable: true,
formatter: function(row) {
return listTime(row.modifyTime);
}
},
{
label: '调整库存',
minWidth: '120',
align: 'left',
sortable: true,
formatter: function(row) {
return 1;
}
},
{
label: '调整类型',
minWidth: '120',
align: 'left',
formatter: function(row) {
return 0;
}
},
{ label: '总库存', prop: 'afterTotalStock', align: 'left', minWidth: '120' }
]
};
},
mounted() {
this.getTableList();
this.activityListByWfId();
},
methods: {
handleSort() {
console.log('sort');
},
// 获取福利列表
getTableList() {
// if(this.loading) {
// return;
// }
// this.loading = true;
// this.formatterTimeFunc('modifyTimeBegin', 'modifyTimeEnd', 'yyyy-MM-dd-HH-mm-ss');
// const params = { ...this.listParams };
// stockLogList(params).then(res => {
// this.loading = false;
// const data = res.result;
// this.tableList = data.result || [];
// this.total = data.totalCount;
// // 删除至最后一页没数据的情况,页码-1
// if (this.tableList.length === 0 && this.listParams.currentPage !== 1) {
// this.listParams.currentPage -= 1;
// this.getTableList();
// }
// }).finally(() => {
// this.loading = false;
// });
},
// 获取营销活动列表
activityListByWfId() {
// activityListByWfId({ welfareId: this.welfareId }).then(res => {
// this.activityList = res.result || [];
// });
}
},
};
</script>
<template>
<div class="welfare-item">
<div class="head">
<span class="head-type">
<el-tag type="success" v-if="item.welfareType == 'wx_card'">{{ cardType[welfareType] || '--' }}</el-tag>
<el-tag v-else-if="item.welfareType == 'gic_card'">{{ cardType[welfareType] || '--' }}</el-tag>
<el-tag type="warning" v-else-if="item.welfareType == 'gift'">{{ cardType[welfareType] || '--' }}</el-tag>
<el-tag type="success" v-else>{{ cardType[welfareType] || '--' }}</el-tag>
</span>
<label>更新时间:</label>{{ formatDateTimeByType(item.updateTime) }}<label class="ml30">福利ID:</label>{{ item.welfareId }}
</div>
<div class="content clearfix wf-content">
<div class="it1">
<div class="cover-image" v-if="item.welfareType">
<dm-el-image-view class="img" :src="require(`@/assets/images/wf-${welfareType}.png`)" fit="fill" >
<div slot="error" class="image-slot">
<img class="img" :src="require('../../../assets/images/z-loading-failure.png')" draggable="false" />
</div>
</dm-el-image-view>
</div>
<dl>
<dd><span class="ellipsis" style="max-width:400px;display:inline-block;">{{ item.welfareName }}</span><label class="fr fz13">成本</label></dd>
<dt><label>停用时间:</label>{{ formatDateTimeByType(item.expiredDate) || '--' }}<span class="fr fz14">{{ item.singleCost | amountFormat }}</span></dt>
<dt><label>创建时间:</label>{{ formatDateTimeByType(item.createTime) }}</dt>
</dl>
</div>
<div class="it2">
<template v-if="item.attributeList && item.attributeList.length">
<ul>
<li v-for="(attr, idx) in item.attributeList" :key="idx"><label>{{ attr.attributeName }}</label>{{ attr.attributeValue || '--' }}</li>
</ul>
<div class="icon" v-if="item.attributeList.length > 4">
<el-tooltip open-delay="200" placement="bottom" :offset="5">
<ul slot="content">
<li v-for="(attr, idx) in item.attributeList" :key="idx"><label>{{ attr.attributeName }}</label>{{ attr.attributeValue || '--' }}</li>
</ul>
<i class="el-icon-more"></i>
</el-tooltip>
</div>
</template>
</div>
<div class="it3">
<!-- width:100% 文字溢出 -->
<el-popover open-delay="200" style="width:100%;" v-if="dealContent(item.welfareDescContent, true) > 4" width="200" trigger="hover">
<div v-html="item.welfareDescContent"></div>
<ul slot="reference" v-html="dealContent(item.welfareDescContent)"></ul>
</el-popover>
<ul v-else v-html="dealContent(item.welfareDescContent)"></ul>
</div>
<div class="it4">
<el-row :gutter="10">
<el-col :span="24" class="oh mb8">
<label>总库存:</label>{{ item.totalStock | amountFormat(null, 0, null) }}
<span class="el-tag" :class="`t${item.stockType}`">{{ stockType[item.stockType] }}</span>
</el-col>
<el-col :span="12" class="br mb8"><label>已占用:</label>{{ item.occupyStock | amountFormat(null, 0, null) }}</el-col>
<el-col :span="12" class="mb8"><label>可占用:</label>{{ item.remainedStock | amountFormat(null, 0, null) }}</el-col>
<el-col :span="12" class="br"><label>已发放:</label>{{ item.consumedStock | amountFormat(null, 0, null) }}</el-col>
<el-col :span="12"><label>未发放:</label>{{ (item.totalStock - item.consumedStock) | amountFormat(null, 0, null) }}</el-col>
</el-row>
</div>
<!-- 操作按钮插槽 -->
<slot name="option" />
</div>
</div>
</template>
<script>
import { formatDateTimeByType } from '@/utils/index';
import { cardType, stockType } from '@/config/mapping/welfare';
export default {
name: 'WelfareItem',
props: {
item: {
type: Object,
default: () => {}
}
},
data() {
return {
cardType,
stockType
};
},
methods: {
formatDateTimeByType,
dealContent(val, flag = false) {
// flag:false 返回处理后的数据
// flag:true 返回处理后数据的长度
if(!flag) {
let str = val ? val.split('<br/>').filter(v => v).map(v => {
return `<li>${v}</li>`;
}).join('') : '';
return str;
} else {
return val ? val.split('<br/>').filter(v => v).length : 0;
}
}
},
computed: {
welfareType() {
return this.item.welfareType ? this.item.welfareType.replace(/_/g, '-') : '';
}
}
};
</script>
<style lang="scss" scoped>
.welfare-item {
border: 1px solid $gray-tab;
background: white;
.head {
font-size: 13px;
background: $gray-thead;
color: $gray01;
height: 40px;
line-height: 40px;
padding: 0 20px 0;
border-bottom: 1px solid $gray-tab;
label {
color: $gray02;
}
&-type {
margin-right: 20px;
min-width: 100px;
}
}
.content {
height: 115px;
overflow: hidden;
padding: 0;
> div {
float: left;
height: 100%;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
// padding-top: 12px;
border-right: 1px solid $gray-tab;
&:last-child {
border-right: none;
}
}
label {
color: $gray02;
}
.it1 {
position: relative;
padding-left: 15px;
dl {
flex-shrink: 0;
// padding-left: 110px;
-webkit-box-flex: 1;
flex: 1;
padding-left: 10px;
padding-right: 10px;
color: $gray01;
dd {
line-height: 1;
margin-bottom: 15px;
font-size: 14px;
}
dt {
margin-bottom: 8px;
line-height: 18px;
font-size: 13px;
&:last-child {
margin-bottom: 0;
}
}
}
.cover-image {
// position: absolute;
// left: 20px;
// top: 12px;
flex-shrink: 0;
width: 80px;
height: 80px;
overflow: hidden;
border-radius: 2px;
span {
position: absolute;
background-color: $blue;
left: 0;
top: 0;
z-index: 100;
color: white;
padding: 0 4px;
line-height:20px;
font-size: 12px;
border-radius:2px 0px 6px 0px;
};
}
}
.it2 {
position: relative;
.icon {
position: absolute;
right: 0;
top: 0;
height: 100%;
width: 25px;
display: flex;
color: $blue;
align-items: center;
justify-content: center;
i {
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
cursor: pointer;
display: inline-block;
line-height: 14px;
font-size: 12px;
border: 1px solid rgb(196, 198, 207);
width: 16px;
height: 16px;
border-radius: 50%;
text-align: center;
color: $gray03;
&:hover {
color: $blue;
border-color: $blue;
}
}
}
ul {
margin-left: 10px;
margin-right: 25px;
overflow: hidden;
max-height: 80%;
li {
font-size: 13px;
color: $gray01;
line-height: 18px;
margin-bottom: 6px;
text-overflow: ellipsis;
overflow: hidden;
max-width: 100%;
white-space: nowrap;
word-wrap: normal;
&:last-child {
margin-bottom: 0;
}
}
}
}
.it3 {
padding: 12px 10px;
line-height:22px;
color: $gray01;
font-size: 13px;
/deep/ ul {
// margin-left: 10px;
// margin-right: 25px;
overflow: hidden;
max-height: 80%;
width: 100%;
li {
font-size: 13px;
color: $gray01;
line-height: 18px;
margin-bottom: 6px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
&:last-child {
margin-bottom: 0;
}
}
}
}
.it4 {
padding-left: 10px;
padding-right: 10px;
.el-tag {
&.t1 {
color: #FA8C16;
background: #FFF7E6;
border-color: #FFD591;
}
color: $blue;
background: $blue-selected;
position: absolute;
right: 0;
top: -2px;
height: 22px;
line-height: 22px;
}
label {
font-size: 13px;
}
.br {
position: relative;
&::after {
position: absolute;
width: 1px;
background: $gray-tab;
content: '';
height: 100%;
right: 10px;
top: 0;
}
}
/deep/ {
.el-row {
.el-col.oh {
overflow: visible;
}
.el-col {
position: relative;
line-height: 18px;
margin-bottom: 8px;
text-overflow: ellipsis;
overflow: hidden;
max-width: 100%;
white-space: nowrap;
word-wrap: normal;
}
}
}
}
.it5 {
padding-left: 10px;
/deep/ li {
display: block;
margin-left: 0px;
font-size: 13px;
margin-bottom: 6px;
&:last-child {
margin-bottom: 0;
}
}
}
}
.img {
width: 80px;
height: 80px;
}
}
</style>
\ No newline at end of file
......@@ -35,4 +35,12 @@ export const wfTypes = [
{ title: '虚拟礼品', desc: '文案描述文案描述文案描述', target: '', code: 'w-virtual-gifts' },
{ title: 'GIC 卡券', desc: '文案描述文案描述文案描述', target: '/gic-card/list', code: 'w-gic-card' },
{ title: 'GIC 卡券包', desc: '文案描述文案描述文案描述', target: '/card-package/list', code: 'w-card-package' },
];
\ No newline at end of file
];
export const stockAdjustStatus = {
1: '增加',
2: '减少',
3: '占用',
4: '释放',
};
\ No newline at end of file
......@@ -112,7 +112,8 @@
<li v-if="scope.row._status == 2">
<dm-perm-button @click="handler(10, scope.row)" type="text">禁用</dm-perm-button>
</li>
<li v-if="[1,2].includes(scope.row._status)">
<!-- v-if="[1,2].includes(scope.row._status)" -->
<li>
<dm-perm-button @click="handler(9, scope.row)" type="text">库存记录</dm-perm-button>
</li>
<li v-if="[2, 3, 4].includes(scope.row._status)" :class="{ disabled: $itemPerm($itemCode.gicCardGroupBtn) || scope.row.deleteFlag }">
......
<template>
<stock-list welfare-id=""></stock-list>
<stock-list :welfare-id="$route.query.id"></stock-list>
</template>
<script>
import stockList from '@/components/welfare/list.vue';
import stockList from '@/components/stock-list/index.vue';
export default {
name: 'StockList',
components: {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment