文件
mashangyoujiu/Public/js/choose-store-goods.js

371 行
17 KiB
JavaScript
可执行文件

Vue.component('template-choose-store-goods', {
template: `<div class="choose-store-goods-box" v-cloak>
<div class="chooseGoods">
<!-- 待选商品信息 -->
<div class="chooseGoodsTables">
<el-form :inline="true">
<el-form-item label="商品信息">
<el-input v-model="searchForm.keyword" size="small"
@keydown.enter.exact.native.prevent="searchGoods"
clearable placeholder="请输入商品名称">
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="searchGoods" size="small" plain>搜索</el-button>
</el-form-item>
</el-form>
<!-- 商品信息表格 -->
<template>
<el-table :data="goodsList" border size="mini">
<el-table-column align="center" label="序号" type="index" width="50"></el-table-column>
<el-table-column align="center" prop="goods_name" show-overflow-tooltip
label="商品名称" min-width="120px"></el-table-column>
<el-table-column align="center" label="图片" width="60px">
<template slot-scope="scope">
<el-image class="goods-img" :src="scope.row.goods_img?scope.row.goods_img:''">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
</template>
</el-table-column>
<el-table-column align="center" prop="goods_number" width="100" label="货号"></el-table-column>
<el-table-column align="center" prop="goods_num" width="80px" label="库存"></el-table-column>
<el-table-column align="center" prop="retail_price" width="90px" label="零售价"></el-table-column>
<el-table-column align="center" prop="online_price" width="90px" label="商城价"></el-table-column>
<el-table-column align="center" label="操作" width="80px">
<template slot-scope="scope">
<el-button type="text"
size="mini"
:disabled="chooseGoodsList.length>=max_choose_num?true:false"
@click="chooseGoods(scope.row)"
v-if="checkGoods(scope.row.id)">选择
</el-button>
<el-button v-else type="text" style="color: #666;" size="mini">已选</el-button>
</template>
</el-table-column>
<div slot="empty" v-if="!loading">暂无数据</div>
<div slot="empty" v-else><span class="el-icon-loading"></span></div>
</el-table>
<!-- 分页 -->
<el-pagination @size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchForm.page"
:page-sizes="[10]"
:page-size="searchForm.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="currentLen">
</el-pagination>
</template>
</div>
<!-- 已选商品 -->
<div class="chooseGoodsTables">
<el-form :inline="true" class="demo-form-inline" size="small">
<el-form-item label="已选商品">
<el-input v-model="select_keyword"
clearable
@input="goodsNull"
@keydown.enter.exact.native.prevent="searchChooseGoods"
placeholder="请输入商品名称"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="searchChooseGoods" plain>搜索</el-button>
<el-button v-if="chooseGoodsList.length" @click="toClearChoose">清空已选</el-button>
</el-form-item>
</el-form>
<div class="selected-goods">
<el-table :data="showChooseGoodsList" border size="mini" height="calc(100vh - 286px)">
<el-table-column type="index" label="序号" align="center" width="50"></el-table-column>
<el-table-column align="center" prop="goods_name" show-overflow-tooltip
label="商品名称" min-width="120px"></el-table-column>
<el-table-column align="center" label="图片" width="60px">
<template slot-scope="scope">
<el-image class="goods-img" :src="scope.row.goods_img?scope.row.goods_img:''">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
</template>
</el-table-column>
<el-table-column align="center" prop="goods_number" width="100" label="货号"></el-table-column>
<el-table-column align="center" prop="goods_num" width="80px" label="库存"></el-table-column>
<el-table-column align="center" prop="retail_price" width="90px" label="零售价"></el-table-column>
<el-table-column align="center" prop="online_price" width="90px" label="商城价"></el-table-column>
<template v-for="item in input_field">
<el-table-column align="center" width="100px"
:prop="item.key" :label="item.title">
<template slot-scope="scope">
<el-input type="text" size="mini" v-model="scope.row[item.key]"></el-input>
</template>
</el-table-column>
</template>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button type="text" size="mini" @click="deleteSelected(scope.$index)">
删除
</el-button>
</template>
</el-table-column>
<div slot="empty" v-if="!loading">未选择商品</div>
</el-table>
</div>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary"
round
@click="sureChooseGoods"
:disabled="chooseGoodsList.length==0?true:false"
size="small">确定选择({{chooseGoodsList.length}}/{{max_choose_num}})
</el-button>
</div>
</div>`,
props: {
'max_choose_num': {
type: Number,
default: 1,
},//最大可选商品数量
'show': {
type: Boolean,
default: false,
},//为了重新渲染数据
'store_id': {
type: Number,
default: 0,
},//门店ID,可不传
'online_state': {
type: String,
default: '',
},//商城出售状态 0非商城出售 1商城出售
'status': {
type: String,
default: '',
},//商品上下架状态 0上架 1下架
'input_field': {
type: Array,
default: () => {
return []
},
},//其他显示字段
'distribution': {
type: Boolean,
default: false,
}
},
data: function () {
return {
searchForm: {
keyword: '',
page: 1,
limit: 10,
},//待选商品列表搜索选项
currentLen: 0,//待选商品总数量
loading: false,
goodsList: [],//待选商品列表
chooseGoodsList: [],//已选商品列表
showChooseGoodsList: [],//展示的已选商品列表
select_keyword: '',
chooseGoodsObj: {},//已选商品id对象
}
},
methods: {
//即将清空已选
toClearChoose() {
this.$confirm("确认清空已选商品列表?", "关闭提示", {
confirmButtonText: '清空',
cancelButtonText: '取消',
type: 'info'
}).then(() => {
this.chooseGoodsList = [];
this.showChooseGoodsList = [];
this.chooseGoodsObj = {};
var goodsList = JSON.parse(JSON.stringify(this.goodsList));
this.goodsList = [];
this.goodsList = goodsList;
}).catch(() => {
})
},
//确认选择商品
sureChooseGoods() {
let chooseGoodsList = JSON.parse(JSON.stringify(this.chooseGoodsList));
let reg = /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d{0,2})$/;
if (this.input_field.length) {
for (let i = 0; i < chooseGoodsList.length; i++) {
for (let j = 0; j < this.input_field.length; j++) {
let a = chooseGoodsList[i][this.input_field[j].key];
switch (this.input_field[j].type) {
case 'rate':
if (((this.input_field[j].required || a != ''
&& a != undefined)
&& !reg.test(a))
|| (a && a * 1 < 0.01 || a * 1 > 99)) {
return this.$message.error(`${this.input_field[j].title}设置有误`);
}
break;
}
}
}
}
this.chooseGoodsList = [];
this.showChooseGoodsList = [];
this.chooseGoodsObj = {};
this.select_keyword = '';
this.currentLen = 0;
this.$nextTick(function () {
this.$emit('select-goods', chooseGoodsList);
}.bind(this))
},
//清空已选搜索关键词
goodsNull(e) {
if (!e) {
this.showChooseGoodsList = this.chooseGoodsList
}
},
//判断商品是否可选
checkGoods(goods_id) {
return !this.chooseGoodsObj[goods_id];
},
//点击了选择商品
chooseGoods(item) {
item = JSON.parse(JSON.stringify(item));
this.chooseGoodsObj[item.id] = true;
this.chooseGoodsList.unshift(item);
if (this.select_keyword) {
if (this.fuzzySearch(item.goods_name, this.select_keyword)) {
this.showChooseGoodsList.unshift(item);
}
} else {
this.showChooseGoodsList.unshift(item);
}
var goodsList = JSON.parse(JSON.stringify(this.goodsList));
this.goodsList = [];
this.goodsList = goodsList;
},
//删除已选商品
deleteSelected(index) {
let goods_id = this.showChooseGoodsList[index].id;
delete this.chooseGoodsObj[goods_id];
this.showChooseGoodsList.splice(index, 1);
for (var i in this.chooseGoodsList) {
if (this.chooseGoodsList[i].id == goods_id) {
this.chooseGoodsList.splice(i, 1);
break;
}
}
delete goods_id;
var goodsList = JSON.parse(JSON.stringify(this.goodsList));
this.goodsList = [];
this.goodsList = goodsList;
},
//已选列表搜索
searchChooseGoods() {
this.showChooseGoodsList = [];
if (this.select_keyword == '') {
this.showChooseGoodsList = this.chooseGoodsList;
} else {
for (let i = 0; i < this.chooseGoodsList.length; i++) {
if (this.fuzzySearch(this.chooseGoodsList[i].goods_name, this.select_keyword)) {
this.showChooseGoodsList.push(this.chooseGoodsList[i]);
}
}
}
},
//模糊搜索商品名称
fuzzySearch(name, keyword) {
if (keyword === '' || keyword === undefined) {
return true;
}
let len = 0;
let arr = String(keyword).split('');
for (let i in arr) {
console.log(arr[i]);
if (name.indexOf(arr[i]) != -1) {
len++;
}
}
if (len == arr.length) {
return true;
} else {
return false;
}
},
//准备搜索
searchGoods() {
this.searchForm.page = 1;
this.getCount();
this.getData();
},
//切换每页数量
handleSizeChange(val) {
this.searchForm.limit = val;
this.searchForm.page = 1;
this.getData();
},
//切换页数
handleCurrentChange(val) {
this.searchForm.page = val;
this.getData();
},
//获取商品列表
getData() {
this.goodsList = [];
this.loading = true;
$.ajax({
url: "/index.php/Retail/Component/getStoreGoodsList",
type: 'post',
data: {
store_id: this.store_id,
online_state: this.online_state,
status: this.status,
distribution: this.distribution ? 1 : 0,
...this.searchForm,
},
success: (res) => {
this.loading = false;
if (res.status == 1) {
this.goodsList = res.data;
}
},
error: (data) => {
console.log(data);
this.loading = false;
}
})
},
//获取商品总数量
getCount() {
$.ajax({
url: "/index.php/Retail/Component/getStoreGoodsCount",
type: 'post',
data: {
store_id: this.store_id,
online_state: this.online_state,
status: this.status,
...this.searchForm,
},
success: (res) => {
if (res.status == 1) {
this.currentLen = res.count;
}
},
error: (data) => {
console.log(data);
}
})
},
},
watch: {
show(n, o) {
//监听show的变化,重新渲染列表
if (n) {
this.getCount();
this.getData();
}
}
},
created () {
// console.log('created');
this.getCount();
this.getData();
},
});