添加:总平台添加商品
This commit is contained in:
parent
79c7068c44
commit
ca198a4c11
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
import request from './request'
|
import request from './request'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -37,3 +36,47 @@ export function expressStatuseApi(id, is_show) {
|
||||||
export function syncExpressApi() {
|
export function syncExpressApi() {
|
||||||
return request.get('store/express/sync')
|
return request.get('store/express/sync')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 运费模板 -- 城市
|
||||||
|
*/
|
||||||
|
export function cityList() {
|
||||||
|
return request.get('system/city/lst')
|
||||||
|
}
|
||||||
|
export function cityListV2(pid) {
|
||||||
|
return request.get('v2/system/city/lst/' + pid)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @description 运费模板 -- 列表
|
||||||
|
*/
|
||||||
|
export function templateListApi(data) {
|
||||||
|
return request.get('store/shipping/lst', data)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @description 运费模板 -- 新增
|
||||||
|
*/
|
||||||
|
export function templateCreateApi(data) {
|
||||||
|
return request.post('store/shipping/create', data)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @description 运费模板 -- 编辑
|
||||||
|
*/
|
||||||
|
export function templateUpdateApi(id, data) {
|
||||||
|
return request.post(`store/shipping/update/${id}`, data)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @description 运费模板 -- 详情
|
||||||
|
*/
|
||||||
|
export function templateDetailApi(id) {
|
||||||
|
return request.get(`/store/shipping/detail/${id}`)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @description 运费模板 -- 删除
|
||||||
|
*/
|
||||||
|
export function templateDeleteApi(id) {
|
||||||
|
return request.delete(`store/shipping/delete/${id}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,12 @@ export function storeCategoryStatusApi(id, status) {
|
||||||
export function storeCategoryRecommendApi(id, status) {
|
export function storeCategoryRecommendApi(id, status) {
|
||||||
return request.post(`store/category/is_hot/${id}`, { status })
|
return request.post(`store/category/is_hot/${id}`, { status })
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @description 商品列表 -- 商户分类
|
||||||
|
*/
|
||||||
|
export function categorySelectApi() {
|
||||||
|
return request.get(`store/category/select`)
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @description 品牌分类 -- 列表
|
* @description 品牌分类 -- 列表
|
||||||
*/
|
*/
|
||||||
|
|
@ -72,6 +78,12 @@ export function brandCategoryDeleteApi(id) {
|
||||||
export function brandCategoryStatusApi(id, status) {
|
export function brandCategoryStatusApi(id, status) {
|
||||||
return request.post(`store/brand/category/status/${id}`, { status })
|
return request.post(`store/brand/category/status/${id}`, { status })
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @description 商品列表 -- 品牌分类
|
||||||
|
*/
|
||||||
|
export function categoryBrandListApi() {
|
||||||
|
return request.get(`store/category/brandlist`)
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @description 品牌 -- 列表
|
* @description 品牌 -- 列表
|
||||||
*/
|
*/
|
||||||
|
|
@ -420,6 +432,7 @@ export function guaranteeUpdateApi(id) {
|
||||||
export function guaranteeDeleteApi(id) {
|
export function guaranteeDeleteApi(id) {
|
||||||
return request.delete(`guarantee/delete/${id}`)
|
return request.delete(`guarantee/delete/${id}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 商品列表 -- 编辑排序
|
* @description 商品列表 -- 编辑排序
|
||||||
*/
|
*/
|
||||||
|
|
@ -519,3 +532,67 @@ export function merSpecsList(data) {
|
||||||
export function merProductLstApi(data) {
|
export function merProductLstApi(data) {
|
||||||
return request.get(`store/product/list`, data)
|
return request.get(`store/product/list`, data)
|
||||||
}
|
}
|
||||||
|
// 复制商品 -- 剩余次数
|
||||||
|
export function productCopyCountApi() {
|
||||||
|
return request.get(`store/productcopy/count`)
|
||||||
|
}
|
||||||
|
// 商品列表 -- 运费模板筛选
|
||||||
|
export function shippingListApi() {
|
||||||
|
return request.get(`store/shipping/list`)
|
||||||
|
}
|
||||||
|
// 商品添加 -- 属性规则
|
||||||
|
export function templateLsitApi() {
|
||||||
|
return request.get(`/store/attr/template/list`)
|
||||||
|
}
|
||||||
|
// 添加商品 -- 参数筛选
|
||||||
|
export function specsSelectedApi(data) {
|
||||||
|
return request.get(`store/params/temp/select`,data)
|
||||||
|
}
|
||||||
|
// 配置状态
|
||||||
|
export function productConfigApi() {
|
||||||
|
return request.get(`store/product/config`)
|
||||||
|
}
|
||||||
|
// 属性规则 -- 添加
|
||||||
|
export function attrCreatApi(data) {
|
||||||
|
return request.post('store/attr/template/create', data)
|
||||||
|
}
|
||||||
|
// 商品列表 -- 立即生成规格
|
||||||
|
export function generateAttrApi(id,data) {
|
||||||
|
return request.post(`store/product/get_attr_value/${id}`, data)
|
||||||
|
}
|
||||||
|
// 服务保障 -- 添加
|
||||||
|
export function guaranteeTemplateAddApi(data) {
|
||||||
|
return request.post(`guaranteeTemplate/create`, data)
|
||||||
|
}
|
||||||
|
// 服务保障 - 搜索
|
||||||
|
export function guaranteeTemplateSelectApi(data) {
|
||||||
|
return request.get(`guaranteeTemplate/select`, data)
|
||||||
|
}
|
||||||
|
// 服务保障 - 详情
|
||||||
|
export function guaranteeTemplateDetailApi(id) {
|
||||||
|
return request.get(`guaranteeTemplate/detail/${id}`)
|
||||||
|
}
|
||||||
|
// 添加商品 -- 获取服务保障模板列表
|
||||||
|
export function guaranteeTemplateListApi() {
|
||||||
|
return request.get(`guaranteeTemplate/list`)
|
||||||
|
}
|
||||||
|
// 添加商品 -- 参数筛选详情
|
||||||
|
export function productSpecsDetailApi(data) {
|
||||||
|
return request.get(`store/params/temp/show`, data)
|
||||||
|
}
|
||||||
|
// 商品列表 -- 添加
|
||||||
|
export function productCreateApi(data) {
|
||||||
|
return request.post(`store/product/create`, data)
|
||||||
|
}
|
||||||
|
// 商品列表 -- 编辑
|
||||||
|
export function productEditApi(id, data) {
|
||||||
|
return request.post(`store/product/edit/${id}`, data)
|
||||||
|
}
|
||||||
|
// 商品列表 -- 商品上下架
|
||||||
|
export function changeProductStatus(id, status) {
|
||||||
|
return request.post(`store/product/change_status/${id}`, { status })
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,278 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-form ref="formDynamic" size="small" :model="formDynamic" :rules="rules" class="attrFrom mb20" label-width="100px" @submit.native.prevent>
|
||||||
|
<el-row :gutter="24">
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="模板名称:" prop="template_name">
|
||||||
|
<el-input v-model="formDynamic.template_name" placeholder="请输入模板名称" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col v-for="(item, index) in formDynamic.template_value" :key="index" :span="24" class="noForm">
|
||||||
|
<el-form-item>
|
||||||
|
<div class="acea-row row-middle"><span class="mr5">{{ item.value }}</span><i class="el-icon-circle-close" @click="handleRemove(index)" /></div>
|
||||||
|
<div class="rulesBox">
|
||||||
|
<el-tag
|
||||||
|
v-for="(j, indexn) in item.detail"
|
||||||
|
:key="indexn"
|
||||||
|
closable
|
||||||
|
size="medium"
|
||||||
|
:disable-transitions="false"
|
||||||
|
class="mb5 mr10"
|
||||||
|
@close="handleClose(item.detail,indexn)"
|
||||||
|
>
|
||||||
|
{{ j }}
|
||||||
|
</el-tag>
|
||||||
|
<el-input
|
||||||
|
v-if="item.inputVisible"
|
||||||
|
ref="saveTagInput"
|
||||||
|
v-model="item.detail.attrsVal"
|
||||||
|
class="input-new-tag"
|
||||||
|
size="small"
|
||||||
|
maxlength="30"
|
||||||
|
@keyup.enter.native="createAttr(item.detail.attrsVal,index)"
|
||||||
|
@blur="createAttr(item.detail.attrsVal,index)"
|
||||||
|
/>
|
||||||
|
<el-button v-else class="button-new-tag" size="small" @click="showInput(item)">+ 添加</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col v-if="isBtn" :span="24" class="mt10" style="padding-left: 0;padding-right: 0;">
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="规格:">
|
||||||
|
<el-input v-model="attrsName" maxlength="30" placeholder="请输入规格" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="规格值:">
|
||||||
|
<el-input v-model="attrsVal" maxlength="30" placeholder="请输入规格值" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-button type="primary" class="mr10" @click="createAttrName">确定</el-button>
|
||||||
|
<el-button @click="offAttrName">取消</el-button>
|
||||||
|
</el-col>
|
||||||
|
</el-col>
|
||||||
|
<Spin v-if="spinShow" size="large" fix />
|
||||||
|
</el-row>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button v-if="!isBtn" type="primary" icon="md-add" class="mt10" @click="addBtn">添加新规格</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="dialogFormVisible = false">取 消</el-button>
|
||||||
|
<el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form>
|
||||||
|
<span class="footer acea-row">
|
||||||
|
<el-button @click="resetForm('formDynamic')">取消</el-button>
|
||||||
|
<el-button :loading="loading" type="primary" @click="handleSubmit('formDynamic')">确 定</el-button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import { attrCreatApi, attrEdittApi } from '@/api/product'
|
||||||
|
export default {
|
||||||
|
name: 'CreatAttr',
|
||||||
|
props: {
|
||||||
|
currentRow: {
|
||||||
|
type: Object,
|
||||||
|
default: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
dialogVisible: false,
|
||||||
|
inputVisible: false,
|
||||||
|
inputValue: '',
|
||||||
|
spinShow: false,
|
||||||
|
loading: false,
|
||||||
|
grid: {
|
||||||
|
xl: 3,
|
||||||
|
lg: 3,
|
||||||
|
md: 12,
|
||||||
|
sm: 24,
|
||||||
|
xs: 24
|
||||||
|
},
|
||||||
|
modal: false,
|
||||||
|
index: 1,
|
||||||
|
rules: {
|
||||||
|
template_name: [
|
||||||
|
{ required: true, message: '请输入模板名称', trigger: 'blur' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
formDynamic: {
|
||||||
|
template_name: '',
|
||||||
|
template_value: []
|
||||||
|
},
|
||||||
|
attrsName: '',
|
||||||
|
attrsVal: '',
|
||||||
|
formDynamicNameData: [],
|
||||||
|
isBtn: false,
|
||||||
|
formDynamicName: [],
|
||||||
|
results: [],
|
||||||
|
result: [],
|
||||||
|
ids: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
currentRow: {
|
||||||
|
handler: function(val, oldVal) {
|
||||||
|
this.formDynamic = val
|
||||||
|
},
|
||||||
|
immediate: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.formDynamic.template_value.map(item => {
|
||||||
|
this.$set(item, 'inputVisible', false)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
resetForm(formName) {
|
||||||
|
this.$msgbox.close()
|
||||||
|
this.clear()
|
||||||
|
this.$refs[formName].resetFields()
|
||||||
|
},
|
||||||
|
// 添加按钮
|
||||||
|
addBtn() {
|
||||||
|
this.isBtn = true
|
||||||
|
},
|
||||||
|
handleClose(item, index) {
|
||||||
|
item.splice(index, 1)
|
||||||
|
},
|
||||||
|
// 取消
|
||||||
|
offAttrName() {
|
||||||
|
this.isBtn = false
|
||||||
|
},
|
||||||
|
// 删除
|
||||||
|
handleRemove(index) {
|
||||||
|
this.formDynamic.template_value.splice(index, 1)
|
||||||
|
},
|
||||||
|
// 添加规则名称
|
||||||
|
createAttrName() {
|
||||||
|
if (this.attrsName && this.attrsVal) {
|
||||||
|
const data = {
|
||||||
|
value: this.attrsName,
|
||||||
|
detail: [
|
||||||
|
this.attrsVal
|
||||||
|
]
|
||||||
|
}
|
||||||
|
this.formDynamic.template_value.push(data)
|
||||||
|
var hash = {}
|
||||||
|
this.formDynamic.template_value = this.formDynamic.template_value.reduce(function(item, next) {
|
||||||
|
/* eslint-disable */
|
||||||
|
hash[next.value] ? '' : hash[next.value] = true && item.push(next);
|
||||||
|
return item
|
||||||
|
}, [])
|
||||||
|
this.attrsName = '';
|
||||||
|
this.attrsVal = '';
|
||||||
|
this.isBtn = false;
|
||||||
|
} else {
|
||||||
|
if(!this.attrsName){
|
||||||
|
this.$message.warning('请输入规格名称!');
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if(!this.attrsVal){
|
||||||
|
this.$message.warning('请输入规格值!');
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 添加属性
|
||||||
|
createAttr (num, idx) {
|
||||||
|
if (num) {
|
||||||
|
this.formDynamic.template_value[idx].detail.push(num);
|
||||||
|
var hash = {};
|
||||||
|
this.formDynamic.template_value[idx].detail = this.formDynamic.template_value[idx].detail.reduce(function (item, next) {
|
||||||
|
/* eslint-disable */
|
||||||
|
hash[next] ? '' : hash[next] = true && item.push(next);
|
||||||
|
return item
|
||||||
|
}, [])
|
||||||
|
this.formDynamic.template_value[idx].inputVisible = false
|
||||||
|
} else {
|
||||||
|
this.$message.warning('请添加属性');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showInput(item) {
|
||||||
|
this.$set(item, 'inputVisible', true)
|
||||||
|
},
|
||||||
|
// 提交
|
||||||
|
handleSubmit (name) {
|
||||||
|
this.$refs[name].validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
if (this.formDynamic.template_value.length === 0) {
|
||||||
|
return this.$message.warning('请至少添加一条属性规格!');
|
||||||
|
}
|
||||||
|
this.loading = true;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.currentRow.attr_template_id? attrEdittApi(this.currentRow.attr_template_id,this.formDynamic).then(res => {
|
||||||
|
this.$message.success(res.message);
|
||||||
|
this.loading = false;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.$msgbox.close()
|
||||||
|
}, 500);
|
||||||
|
setTimeout(() => {
|
||||||
|
this.clear();
|
||||||
|
this.$emit('getList');
|
||||||
|
}, 600);
|
||||||
|
}).catch(res => {
|
||||||
|
this.loading = false;
|
||||||
|
this.$message.error(res.message);
|
||||||
|
}):attrCreatApi(this.formDynamic).then(res => {
|
||||||
|
this.$message.success(res.message);
|
||||||
|
this.loading = false;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.$msgbox.close()
|
||||||
|
}, 500);
|
||||||
|
setTimeout(() => {
|
||||||
|
this.$emit('getList');
|
||||||
|
this.clear();
|
||||||
|
}, 600);
|
||||||
|
}).catch(res => {
|
||||||
|
this.loading = false;
|
||||||
|
this.$message.error(res.message);
|
||||||
|
})
|
||||||
|
}, 1200);
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
clear () {
|
||||||
|
this.$refs['formDynamic'].resetFields();
|
||||||
|
this.formDynamic.template_value = [];
|
||||||
|
this.formDynamic.template_name=''
|
||||||
|
this.isBtn = false;
|
||||||
|
this.attrsName = '';
|
||||||
|
this.attrsVal = '';
|
||||||
|
},
|
||||||
|
handleInputConfirm() {
|
||||||
|
const inputValue = this.inputValue
|
||||||
|
if (inputValue) {
|
||||||
|
this.dynamicTags.push(inputValue)
|
||||||
|
}
|
||||||
|
this.inputVisible = false
|
||||||
|
this.inputValue = ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.button-new-tag {
|
||||||
|
height: 28px;
|
||||||
|
line-height: 26px;
|
||||||
|
padding-top: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
.input-new-tag {
|
||||||
|
width: 90px;
|
||||||
|
margin-left: 10px;
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
.footer{
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,287 @@
|
||||||
|
<template>
|
||||||
|
<div class="divBox">
|
||||||
|
<div class="header clearfix">
|
||||||
|
<div class="container">
|
||||||
|
<el-form inline size="small">
|
||||||
|
<el-form-item label="优惠劵名称:">
|
||||||
|
<el-input v-model="tableFrom.coupon_name" placeholder="请输入优惠券名称" @keyup.enter.native="getList" class="selWidth" size="small">
|
||||||
|
<el-button slot="append" icon="el-icon-search" class="el-button-solt" size="small" @click="getList" />
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<el-table
|
||||||
|
ref="table"
|
||||||
|
v-loading="listLoading"
|
||||||
|
:data="tableData.data"
|
||||||
|
style="width: 100%"
|
||||||
|
size="mini"
|
||||||
|
max-height="400"
|
||||||
|
tooltip-effect="dark"
|
||||||
|
@selection-change="handleSelectionChange"
|
||||||
|
>
|
||||||
|
<el-table-column
|
||||||
|
v-if="handle==='wu'"
|
||||||
|
type="selection"
|
||||||
|
width="55"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
prop="coupon_id"
|
||||||
|
label="ID"
|
||||||
|
min-width="50"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
prop="title"
|
||||||
|
label="优惠券名称"
|
||||||
|
min-width="120"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
label="优惠劵类型"
|
||||||
|
min-width="80"
|
||||||
|
>
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<span>{{ row.type | couponTypeFilter }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
prop="coupon_price"
|
||||||
|
label="优惠券面值"
|
||||||
|
min-width="90"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
label="最低消费额"
|
||||||
|
min-width="90"
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ scope.row.use_min_price===0?'不限制':scope.row.use_min_price }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
label="有效期限"
|
||||||
|
min-width="250"
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ scope.row.coupon_type===1?scope.row.use_start_time+' 一 '+scope.row.use_end_time:scope.row.coupon_time }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
label="剩余数量"
|
||||||
|
min-width="90"
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ scope.row.is_limited===0 ? '不限量' : scope.row.remain_count }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column v-if="handle==='send'" label="操作" min-width="120" fixed="right" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button type="text" size="small" class="mr10" @click="send(scope.row.id)">发送</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<div class="block mb20">
|
||||||
|
<el-pagination
|
||||||
|
:page-sizes="[10, 20, 40]"
|
||||||
|
:page-size="tableFrom.limit"
|
||||||
|
:current-page="tableFrom.page"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
:total="tableData.total"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
@current-change="pageChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<el-button size="small" type="primary" class="fr" @click="ok">确定</el-button>
|
||||||
|
<el-button size="small" class="fr mr20" @click="close">取消</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import { couponSelectApi } from '@/api/marketing'
|
||||||
|
import { roterPre } from '@/settings'
|
||||||
|
export default {
|
||||||
|
name: 'CouponList',
|
||||||
|
props: {
|
||||||
|
handle: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
couponId: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
keyNum: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
couponData: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
roterPre: roterPre,
|
||||||
|
listLoading: true,
|
||||||
|
tableData: {
|
||||||
|
data: [],
|
||||||
|
total: 0
|
||||||
|
},
|
||||||
|
tableFrom: {
|
||||||
|
page: 1,
|
||||||
|
limit: 10,
|
||||||
|
coupon_name: '',
|
||||||
|
send_type: 3
|
||||||
|
},
|
||||||
|
multipleSelection: [],
|
||||||
|
attr: [],
|
||||||
|
multipleSelectionAll: [],
|
||||||
|
idKey: 'coupon_id',
|
||||||
|
nextPageFlag: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
keyNum: {
|
||||||
|
deep: true,
|
||||||
|
handler(val) {
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.tableFrom.page = 1
|
||||||
|
this.getList()
|
||||||
|
this.multipleSelectionAll = this.couponData
|
||||||
|
},
|
||||||
|
watch:{
|
||||||
|
couponData: {
|
||||||
|
deep: true,
|
||||||
|
handler(val) {
|
||||||
|
this.multipleSelectionAll = this.couponData
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
close() {
|
||||||
|
this.$msgbox.close()
|
||||||
|
this.multipleSelection = []
|
||||||
|
},
|
||||||
|
handleSelectionChange(val) {
|
||||||
|
this.multipleSelection = val
|
||||||
|
setTimeout(() => {
|
||||||
|
this.changePageCoreRecordData()
|
||||||
|
}, 50)
|
||||||
|
},
|
||||||
|
// 设置选中的方法
|
||||||
|
setSelectRow() {
|
||||||
|
if (!this.multipleSelectionAll || this.multipleSelectionAll.length <= 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 标识当前行的唯一键的名称
|
||||||
|
const idKey = this.idKey
|
||||||
|
const selectAllIds = []
|
||||||
|
this.multipleSelectionAll.forEach(row => {
|
||||||
|
selectAllIds.push(row[idKey])
|
||||||
|
})
|
||||||
|
this.$refs.table.clearSelection()
|
||||||
|
for (var i = 0; i < this.tableData.data.length; i++) {
|
||||||
|
if (selectAllIds.indexOf(this.tableData.data[i][idKey]) >= 0) {
|
||||||
|
// 设置选中,记住table组件需要使用ref="table"
|
||||||
|
this.$refs.table.toggleRowSelection(this.tableData.data[i], true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 记忆选择核心方法
|
||||||
|
changePageCoreRecordData() {
|
||||||
|
// 标识当前行的唯一键的名称
|
||||||
|
const idKey = this.idKey
|
||||||
|
const that = this
|
||||||
|
// 如果总记忆中还没有选择的数据,那么就直接取当前页选中的数据,不需要后面一系列计算
|
||||||
|
if (this.multipleSelectionAll.length <= 0) {
|
||||||
|
this.multipleSelectionAll = this.multipleSelection
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 总选择里面的key集合
|
||||||
|
const selectAllIds = []
|
||||||
|
this.multipleSelectionAll.forEach(row => {
|
||||||
|
selectAllIds.push(row[idKey])
|
||||||
|
})
|
||||||
|
const selectIds = []
|
||||||
|
// 获取当前页选中的id
|
||||||
|
this.multipleSelection.forEach(row => {
|
||||||
|
selectIds.push(row[idKey])
|
||||||
|
// 如果总选择里面不包含当前页选中的数据,那么就加入到总选择集合里
|
||||||
|
if (selectAllIds.indexOf(row[idKey]) < 0) {
|
||||||
|
that.multipleSelectionAll.push(row)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const noSelectIds = []
|
||||||
|
// 得到当前页没有选中的id
|
||||||
|
this.tableData.data.forEach(row => {
|
||||||
|
if (selectIds.indexOf(row[idKey]) < 0) {
|
||||||
|
noSelectIds.push(row[idKey])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
noSelectIds.forEach(id => {
|
||||||
|
if (selectAllIds.indexOf(id) >= 0) {
|
||||||
|
for (let i = 0; i < that.multipleSelectionAll.length; i++) {
|
||||||
|
if (that.multipleSelectionAll[i][idKey] == id) {
|
||||||
|
// 如果总选择中有未被选中的,那么就删除这条
|
||||||
|
that.multipleSelectionAll.splice(i, 1)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ok() {
|
||||||
|
if (this.multipleSelection.length > 0) {
|
||||||
|
this.$emit('getCouponId', this.multipleSelectionAll)
|
||||||
|
this.close()
|
||||||
|
} else {
|
||||||
|
this.$message.warning('请先选择优惠劵')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 列表
|
||||||
|
getList() {
|
||||||
|
this.listLoading = true
|
||||||
|
couponSelectApi(this.tableFrom).then(res => {
|
||||||
|
this.tableData.data = res.data.list
|
||||||
|
this.tableData.total = res.data.count
|
||||||
|
this.listLoading = false
|
||||||
|
this.$nextTick(function() {
|
||||||
|
this.setSelectRow()// 调用跨页选中方法
|
||||||
|
})
|
||||||
|
}).catch(res => {
|
||||||
|
this.listLoading = false
|
||||||
|
this.$message.error(res.message)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
pageChange(page) {
|
||||||
|
this.changePageCoreRecordData()
|
||||||
|
this.tableFrom.page = page
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
handleSizeChange(val) {
|
||||||
|
this.changePageCoreRecordData()
|
||||||
|
this.tableFrom.limit = val
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.selWidth{
|
||||||
|
width: 219px !important;
|
||||||
|
}
|
||||||
|
.seachTiele{
|
||||||
|
line-height: 35px;
|
||||||
|
}
|
||||||
|
.fr{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,470 @@
|
||||||
|
<template>
|
||||||
|
<div class="lazy-cascader" :style="{ width: width }">
|
||||||
|
<!-- 禁用状态 -->
|
||||||
|
<div
|
||||||
|
v-if="disabled"
|
||||||
|
class="el-input__inner lazy-cascader-input lazy-cascader-input-disabled"
|
||||||
|
>
|
||||||
|
<span v-show="placeholderVisible" class="lazy-cascader-placeholder">
|
||||||
|
{{ placeholder }}
|
||||||
|
</span>
|
||||||
|
<div v-if="props.multiple" class="lazy-cascader-tags">
|
||||||
|
<el-tag
|
||||||
|
v-for="(item, index) in labelArray"
|
||||||
|
:key="index"
|
||||||
|
class="lazy-cascader-tag"
|
||||||
|
type="info"
|
||||||
|
disable-transitions
|
||||||
|
closable
|
||||||
|
>
|
||||||
|
<span> {{ item.label.join(separator) }}</span>
|
||||||
|
</el-tag>
|
||||||
|
</div>
|
||||||
|
<div v-else class="lazy-cascader-label">
|
||||||
|
<el-tooltip
|
||||||
|
placement="top-start"
|
||||||
|
:content="labelObject.label.join(separator)"
|
||||||
|
>
|
||||||
|
<span>{{ labelObject.label.join(separator) }}</span>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 禁用状态 -->
|
||||||
|
<!-- 可选状态 -->
|
||||||
|
<el-popover v-else ref="popover" trigger="click" placement="bottom-start">
|
||||||
|
<!-- 搜索 -->
|
||||||
|
<div class="lazy-cascader-search">
|
||||||
|
<el-autocomplete
|
||||||
|
v-if="filterable"
|
||||||
|
v-model="keyword"
|
||||||
|
:style="{ width: searchWidth || '100%' }"
|
||||||
|
:popper-class="suggestionsPopperClass"
|
||||||
|
class="inline-input"
|
||||||
|
prefix-icon="el-icon-search"
|
||||||
|
label="name"
|
||||||
|
:fetch-suggestions="querySearch"
|
||||||
|
:trigger-on-focus="false"
|
||||||
|
placeholder="请输入"
|
||||||
|
@select="handleSelect"
|
||||||
|
@blur="isSearchEmpty = false"
|
||||||
|
>
|
||||||
|
<template slot-scope="{ item }">
|
||||||
|
<div class="name" :class="isChecked(item[props.value])">
|
||||||
|
{{ item[props.label].join(separator) }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-autocomplete>
|
||||||
|
<div v-show="isSearchEmpty" class="empty">{{ searchEmptyText }}</div>
|
||||||
|
</div>
|
||||||
|
<!-- 搜索 -->
|
||||||
|
<!-- 级联面板 -->
|
||||||
|
<div class="lazy-cascader-panel">
|
||||||
|
<el-cascader-panel
|
||||||
|
ref="panel"
|
||||||
|
v-model="current"
|
||||||
|
:options="options"
|
||||||
|
:props="currentProps"
|
||||||
|
@change="change"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<!-- 级联面板 -->
|
||||||
|
<!--内容区域-->
|
||||||
|
<div
|
||||||
|
slot="reference"
|
||||||
|
class="el-input__inner lazy-cascader-input"
|
||||||
|
:class="disabled ? 'lazy-cascader-input-disabled' : ''"
|
||||||
|
>
|
||||||
|
<span v-show="placeholderVisible" class="lazy-cascader-placeholder">
|
||||||
|
{{ placeholder }}
|
||||||
|
</span>
|
||||||
|
<div v-if="props.multiple" class="lazy-cascader-tags">
|
||||||
|
<el-tag
|
||||||
|
v-for="(item, index) in labelArray"
|
||||||
|
:key="index"
|
||||||
|
class="lazy-cascader-tag"
|
||||||
|
type="info"
|
||||||
|
size="small"
|
||||||
|
disable-transitions
|
||||||
|
closable
|
||||||
|
@close="handleClose(item)"
|
||||||
|
>
|
||||||
|
<span> {{ item.label.join(separator) }}</span>
|
||||||
|
</el-tag>
|
||||||
|
</div>
|
||||||
|
<div v-else class="lazy-cascader-label">
|
||||||
|
<el-tooltip
|
||||||
|
placement="top-start"
|
||||||
|
:content="labelObject.label.join(separator)"
|
||||||
|
>
|
||||||
|
<span>{{ labelObject.label.join(separator) }}</span>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
v-if="clearable && current.length > 0"
|
||||||
|
class="lazy-cascader-clear"
|
||||||
|
@click.stop="clearBtnClick"
|
||||||
|
>
|
||||||
|
<i class="el-icon-close" />
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!--内容区域-->
|
||||||
|
</el-popover>
|
||||||
|
<!-- 可选状态 -->
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Array,
|
||||||
|
default: () => {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
separator: {
|
||||||
|
type: String,
|
||||||
|
default: '/'
|
||||||
|
},
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
default: '请选择'
|
||||||
|
},
|
||||||
|
|
||||||
|
width: {
|
||||||
|
type: String,
|
||||||
|
default: '400px'
|
||||||
|
},
|
||||||
|
filterable: Boolean,
|
||||||
|
clearable: Boolean,
|
||||||
|
disabled: Boolean,
|
||||||
|
props: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
suggestionsPopperClass: {
|
||||||
|
type: String,
|
||||||
|
default: 'suggestions-popper-class'
|
||||||
|
},
|
||||||
|
searchWidth: {
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
searchEmptyText: {
|
||||||
|
type: String,
|
||||||
|
default: '暂无数据'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isSearchEmpty: false,
|
||||||
|
keyword: '',
|
||||||
|
options: [],
|
||||||
|
current: [],
|
||||||
|
labelObject: { label: [], value: [] },
|
||||||
|
labelArray: [],
|
||||||
|
currentProps: {
|
||||||
|
multiple: this.props.multiple,
|
||||||
|
checkStrictly: this.props.checkStrictly,
|
||||||
|
value: this.props.value,
|
||||||
|
label: this.props.label,
|
||||||
|
leaf: this.props.leaf,
|
||||||
|
lazy: true,
|
||||||
|
lazyLoad: this.lazyLoad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
placeholderVisible() {
|
||||||
|
if (this.current) {
|
||||||
|
return this.current.length == 0
|
||||||
|
} else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
current() {
|
||||||
|
this.getLabelArray()
|
||||||
|
},
|
||||||
|
value(v) {
|
||||||
|
this.current = v
|
||||||
|
},
|
||||||
|
keyword() {
|
||||||
|
this.isSearchEmpty = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.initOptions()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 搜索是否选中
|
||||||
|
isChecked(value) {
|
||||||
|
// 多选
|
||||||
|
if (this.props.multiple) {
|
||||||
|
const index = this.current.findIndex(item => {
|
||||||
|
return item.join() == value.join()
|
||||||
|
})
|
||||||
|
if (index > -1) {
|
||||||
|
return 'el-link el-link--primary'
|
||||||
|
} else {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (value.join() == this.current.join()) {
|
||||||
|
return 'el-link el-link--primary'
|
||||||
|
} else {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 搜索
|
||||||
|
querySearch(query, callback) {
|
||||||
|
this.props.lazySearch(query, list => {
|
||||||
|
callback(list)
|
||||||
|
if (!list || !list.length) this.isSearchEmpty = true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 选中搜索下拉搜索项
|
||||||
|
handleSelect(item) {
|
||||||
|
if (this.props.multiple) {
|
||||||
|
const index = this.current.findIndex(obj => {
|
||||||
|
return obj.join() == item[this.props.value].join()
|
||||||
|
})
|
||||||
|
if (index == -1) {
|
||||||
|
this.$refs.panel.clearCheckedNodes()
|
||||||
|
this.current.push(item[this.props.value])
|
||||||
|
this.$emit('change', this.current)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 选中下拉选变更值
|
||||||
|
if (
|
||||||
|
this.current == null ||
|
||||||
|
item[this.props.value].join() !== this.current.join()
|
||||||
|
) {
|
||||||
|
this.$refs.panel.activePath = []
|
||||||
|
this.current = item[this.props.value]
|
||||||
|
this.$emit('change', this.current)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.keyword = ''
|
||||||
|
},
|
||||||
|
// 初始化数据
|
||||||
|
async initOptions() {
|
||||||
|
this.props.lazyLoad(0, list => {
|
||||||
|
this.$set(this, 'options', list)
|
||||||
|
if (this.props.multiple) {
|
||||||
|
this.current = [...this.value]
|
||||||
|
} else {
|
||||||
|
this.current = this.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
async getLabelArray() {
|
||||||
|
if (this.props.multiple) {
|
||||||
|
const array = []
|
||||||
|
for (let i = 0; i < this.current.length; i++) {
|
||||||
|
const obj = await this.getObject(this.current[i])
|
||||||
|
array.push(obj)
|
||||||
|
}
|
||||||
|
this.labelArray = array
|
||||||
|
this.$emit('input', this.current)
|
||||||
|
if (!this.disabled) {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.popover.updatePopper()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.labelObject = await this.getObject(this.current || [])
|
||||||
|
this.$emit('input', this.current)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/** 格式化id=>object */
|
||||||
|
async getObject(id) {
|
||||||
|
try {
|
||||||
|
let options = this.options
|
||||||
|
const nameArray = []
|
||||||
|
for (let i = 0; i < id.length; i++) {
|
||||||
|
const index = options.findIndex(item => {
|
||||||
|
return item[this.props.value] == id[i]
|
||||||
|
})
|
||||||
|
if (index < 0) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
nameArray.push(options[index][this.props.label])
|
||||||
|
if (i < id.length - 1 && options[index].children == undefined) {
|
||||||
|
const list = new Promise(resolve => {
|
||||||
|
this.props.lazyLoad(id[i], list => {
|
||||||
|
resolve(list)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
this.$set(options[index], 'children', await list)
|
||||||
|
options = options[index].children
|
||||||
|
} else {
|
||||||
|
options = options[index].children
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { value: id, label: nameArray }
|
||||||
|
} catch (e) {
|
||||||
|
this.current = []
|
||||||
|
return { value: [], label: [] }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 懒加载数据
|
||||||
|
async lazyLoad(node, resolve) {
|
||||||
|
let current = this.current
|
||||||
|
if (this.props.multiple) {
|
||||||
|
current = [...this.current]
|
||||||
|
}
|
||||||
|
if (node.root) {
|
||||||
|
resolve()
|
||||||
|
} else if (node.data[this.props.leaf]) {
|
||||||
|
resolve()
|
||||||
|
} else if (node.data.children) {
|
||||||
|
if (this.props.multiple) {
|
||||||
|
this.current = current
|
||||||
|
}
|
||||||
|
resolve()
|
||||||
|
} else {
|
||||||
|
this.props.lazyLoad(node.value, list => {
|
||||||
|
node.data.children = list
|
||||||
|
if (this.props.multiple) {
|
||||||
|
this.current = current
|
||||||
|
}
|
||||||
|
resolve(list)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 删除多选值
|
||||||
|
/** 删除**/
|
||||||
|
handleClose(item) {
|
||||||
|
const index = this.current.findIndex(obj => {
|
||||||
|
return obj.join() == item.value.join()
|
||||||
|
})
|
||||||
|
if (index > -1) {
|
||||||
|
this.$refs.panel.clearCheckedNodes()
|
||||||
|
this.current.splice(index, 1)
|
||||||
|
this.$emit('change', this.current)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 点击清空按钮
|
||||||
|
clearBtnClick() {
|
||||||
|
this.$refs.panel.clearCheckedNodes()
|
||||||
|
this.current = []
|
||||||
|
this.$emit('change', this.current)
|
||||||
|
},
|
||||||
|
change() {
|
||||||
|
this.$emit('change', this.current)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.lazy-cascader {
|
||||||
|
display: inline-block;
|
||||||
|
width: 300px;
|
||||||
|
.lazy-cascader-input {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
background: #fff;
|
||||||
|
height: auto;
|
||||||
|
min-height: 36px;
|
||||||
|
padding: 5px;
|
||||||
|
line-height: 1;
|
||||||
|
cursor: pointer;
|
||||||
|
> .lazy-cascader-placeholder {
|
||||||
|
padding: 0 2px;
|
||||||
|
line-height: 28px;
|
||||||
|
color: #999;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
> .lazy-cascader-label {
|
||||||
|
padding: 0 2px;
|
||||||
|
line-height: 28px;
|
||||||
|
color: #606266;
|
||||||
|
font-size: 14px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
> .lazy-cascader-clear {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
display: inline-block;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.lazy-cascader-input-disabled {
|
||||||
|
background-color: #f5f7fa;
|
||||||
|
border-color: #e4e7ed;
|
||||||
|
color: #c0c4cc;
|
||||||
|
cursor: not-allowed;
|
||||||
|
> .lazy-cascader-label {
|
||||||
|
color: #c0c4cc;
|
||||||
|
}
|
||||||
|
> .lazy-cascader-placeholder {
|
||||||
|
color: #c0c4cc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.lazy-cascader-tag {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
max-width: 100%;
|
||||||
|
margin: 2px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
background: #f0f2f5;
|
||||||
|
> span {
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
> .el-icon-close {
|
||||||
|
-webkit-box-flex: 0;
|
||||||
|
-ms-flex: none;
|
||||||
|
flex: none;
|
||||||
|
background-color: #c0c4cc;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.lazy-cascader-panel {
|
||||||
|
margin-top: 10px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.suggestions-popper-class {
|
||||||
|
width: auto !important;
|
||||||
|
min-width: 200px;
|
||||||
|
}
|
||||||
|
.lazy-cascader-search {
|
||||||
|
.empty {
|
||||||
|
width: calc(100% - 24px);
|
||||||
|
box-sizing: border-box;
|
||||||
|
background-color: #fff;
|
||||||
|
color: #999;
|
||||||
|
text-align: center;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 999;
|
||||||
|
padding: 12px 0;
|
||||||
|
margin-top: 12px;
|
||||||
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||||
|
&:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -12px;
|
||||||
|
left: 36px;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 6px solid transparent;
|
||||||
|
border-right: 6px solid transparent;
|
||||||
|
border-top: 6px solid transparent;
|
||||||
|
border-bottom: 6px solid #fff;
|
||||||
|
filter: drop-shadow(0 -1px 2px rgba(0, 0, 0, 0.02));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,234 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-dialog :title="isEdit ? '编辑服务说明模板' : '添加服务说明模板'" :visible.sync="dialogVisible" width="1000px">
|
||||||
|
<el-form ref="formValidate" class="formValidate mt20" :model="formValidate" :rules="ruleInline" label-width="100px" label-position="right">
|
||||||
|
<el-form-item label="模板名称:" prop="template_name">
|
||||||
|
<el-input v-model="formValidate.template_name" placeholder="请输入模板名称" size="small" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="服务条款:" prop="template_value">
|
||||||
|
<div class="acea-row">
|
||||||
|
<el-tag
|
||||||
|
v-for="(tag, index) in termsService"
|
||||||
|
:key="index"
|
||||||
|
class="mr10"
|
||||||
|
closable
|
||||||
|
:disable-transitions="false"
|
||||||
|
@close="handleCloseItems(tag)"
|
||||||
|
>{{ tag.guarantee_name }}</el-tag>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-input v-model="guarantee_name" placeholder="请输入服务条款名称搜索" class="selWidth" size="small" @keyup.enter.native="getServiceTerms">
|
||||||
|
<el-button slot="append" icon="el-icon-search" size="small" class="el-button-solt" @click="getServiceTerms" />
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-checkbox-group v-model="formValidate.template_value" @change="handleCheckedTermsChange">
|
||||||
|
<el-checkbox v-for="item in termsList" v-show="item.isShow" :key="item.guarantee_id" :label="item.guarantee_id" class="guarantee_checkbox">
|
||||||
|
<span class="guarantee_name">{{ item.guarantee_name }}</span>
|
||||||
|
<span class="guarantee_info">{{ item.guarantee_info }}</span></el-checkbox>
|
||||||
|
</el-checkbox-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="排序:">
|
||||||
|
<el-input-number v-model="formValidate.sort" placeholder="请输入排序" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<span slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
<el-button v-if="!isEdit" type="primary" :loading="loading" @click="createGuarantee('formValidate')">确 定</el-button>
|
||||||
|
<el-button v-else type="primary" :loading="loading" @click="updateGuarantee('formValidate')">确 定</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import {
|
||||||
|
guaranteeTemplateAddApi,
|
||||||
|
guaranteeUpdateApi,
|
||||||
|
guaranteeTemplateDetailApi,
|
||||||
|
guaranteeTemplateSelectApi
|
||||||
|
} from '@/api/product'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'CreatGuarantee',
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isEdit: false,
|
||||||
|
dialogVisible: false,
|
||||||
|
loading: false,
|
||||||
|
guarantee_id: '',
|
||||||
|
guarantee_name: '',
|
||||||
|
termsService: [],
|
||||||
|
termsList: [],
|
||||||
|
formValidate: {
|
||||||
|
template_name: '',
|
||||||
|
template_value: [],
|
||||||
|
sort: ''
|
||||||
|
},
|
||||||
|
ruleInline: {
|
||||||
|
template_name: [
|
||||||
|
{ required: true, message: '请输入模板名称', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
template_value: [
|
||||||
|
{ required: true, message: '请选择服务条款', trigger: 'change' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.getServiceTerms()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/** 获取服务条款 */
|
||||||
|
getServiceTerms() {
|
||||||
|
guaranteeTemplateSelectApi({ keyword: this.guarantee_name }).then((res) => {
|
||||||
|
if (this.guarantee_name) {
|
||||||
|
this.getSearchItem(res.data)
|
||||||
|
} else {
|
||||||
|
this.termsList = res.data
|
||||||
|
this.termsList.forEach((item, index) => {
|
||||||
|
item.isShow = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(({ message }) => {
|
||||||
|
this.$message.error(message)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 把搜索结果显示出来 */
|
||||||
|
getSearchItem(arr) {
|
||||||
|
this.termsList.forEach((item, index) => {
|
||||||
|
if (arr.length > 0) {
|
||||||
|
arr.forEach((itemn, indexn) => {
|
||||||
|
if (itemn.guarantee_id == item.guarantee_id) {
|
||||||
|
item.isShow = true
|
||||||
|
} else {
|
||||||
|
item.isShow = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
item.isShow = false
|
||||||
|
}
|
||||||
|
this.$set(this.termsList, index, item)
|
||||||
|
console.log(this.termsList)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleCheckedTermsChange(value) {
|
||||||
|
this.getSelectedItems(value)
|
||||||
|
},
|
||||||
|
handleCloseItems(tag) {
|
||||||
|
this.termsService.splice(this.termsService.indexOf(tag), 1)
|
||||||
|
this.formValidate.template_value = []
|
||||||
|
this.termsService.map(item => {
|
||||||
|
this.formValidate.template_value.push(item.guarantee_id)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 取出选择的服务条款 */
|
||||||
|
getSelectedItems(arr) {
|
||||||
|
this.termsService = []
|
||||||
|
this.termsList.forEach((item, index) => {
|
||||||
|
arr.forEach((itemn, indexn) => {
|
||||||
|
if (itemn == item.guarantee_id) {
|
||||||
|
this.termsService.push(item)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 编辑
|
||||||
|
handleEdit(id) {
|
||||||
|
this.isEdit = true
|
||||||
|
this.dialogVisible = true
|
||||||
|
this.loading = false
|
||||||
|
this.guarantee_id = id
|
||||||
|
guaranteeTemplateDetailApi(id).then((res) => {
|
||||||
|
const data = res.data
|
||||||
|
this.formValidate = {
|
||||||
|
template_name: data.template_name,
|
||||||
|
template_value: data.template_value,
|
||||||
|
sort: data.sort
|
||||||
|
}
|
||||||
|
this.getSelectedItems(data.template_value)
|
||||||
|
this.$refs['formValidate'].clearValidate()
|
||||||
|
})
|
||||||
|
.catch(({ message }) => {
|
||||||
|
this.$message.error(message)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
add() {
|
||||||
|
this.isEdit = false
|
||||||
|
this.dialogVisible = true
|
||||||
|
this.loading = false
|
||||||
|
this.guarantee_name = ""
|
||||||
|
this.formValidate = {
|
||||||
|
template_name: '',
|
||||||
|
template_value: [],
|
||||||
|
sort: ''
|
||||||
|
}
|
||||||
|
this.getServiceTerms()
|
||||||
|
},
|
||||||
|
/** 添加 */
|
||||||
|
createGuarantee(name) {
|
||||||
|
this.$refs[name].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
this.loading = true
|
||||||
|
guaranteeTemplateAddApi(this.formValidate)
|
||||||
|
.then(({ message }) => {
|
||||||
|
this.$message.success(message)
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.loading = false
|
||||||
|
this.$emit('get-list', '')
|
||||||
|
})
|
||||||
|
.catch(({ message }) => {
|
||||||
|
this.loading = false
|
||||||
|
this.$message.error(message)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 编辑 */
|
||||||
|
updateGuarantee(name) {
|
||||||
|
this.$refs[name].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
this.loading = true
|
||||||
|
guaranteeUpdateApi(this.guarantee_id, this.formValidate)
|
||||||
|
.then(({ message }) => {
|
||||||
|
this.$message.success(message)
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.loading = false
|
||||||
|
this.$emit('get-list', '')
|
||||||
|
})
|
||||||
|
.catch(({ message }) => {
|
||||||
|
this.loading = false
|
||||||
|
this.$message.error(message)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
/deep/.selWidth{
|
||||||
|
width: 300px!important;
|
||||||
|
}
|
||||||
|
.guarantee_info{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
/deep/.el-checkbox__input{
|
||||||
|
vertical-align: top;
|
||||||
|
top: 3px;
|
||||||
|
}
|
||||||
|
/deep/.el-checkbox__label{
|
||||||
|
white-space: normal; word-break: break-all;
|
||||||
|
}
|
||||||
|
.guarantee_name{
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,488 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-form ref="ruleForm" v-loading="loading" :model="ruleForm" label-width="120px" size="mini" :rules="rules">
|
||||||
|
<el-form-item label="模板名称" prop="name">
|
||||||
|
<el-input v-model="ruleForm.name" class="withs" placeholder="请输入模板名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="运费说明" prop="info">
|
||||||
|
<el-input v-model="ruleForm.info" type="textarea" class="withs" placeholder="请输入运费说明" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="计费方式" prop="type">
|
||||||
|
<el-radio-group v-model="ruleForm.type" @change="changeRadio(ruleForm.type)">
|
||||||
|
<el-radio :label="0">按件数</el-radio>
|
||||||
|
<el-radio :label="1">按重量</el-radio>
|
||||||
|
<el-radio :label="2">按体积</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="配送区域及运费" prop="region">
|
||||||
|
<el-table v-loading="listLoading" :data="ruleForm.region" border fit highlight-current-row style="width: 100%" size="mini" class="tempBox">
|
||||||
|
<el-table-column align="center" label="可配送区域" min-width="260">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span v-if="scope.$index === 0">默认全国 <span style="font-weight: bold;">(开启指定区域不配送时无效)</span></span>
|
||||||
|
<LazyCascader
|
||||||
|
v-else
|
||||||
|
v-model="scope.row.city_ids"
|
||||||
|
style="width: 98%"
|
||||||
|
:props="props"
|
||||||
|
collapse-tags
|
||||||
|
clearable
|
||||||
|
:filterable="false"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column min-width="130px" align="center" :label="columns.title">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<el-input-number v-model="row.first" controls-position="right" :min="0" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column min-width="120px" align="center" label="运费(元)">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<el-input-number v-model="row.first_price" controls-position="right" :min="0" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column min-width="120px" align="center" :label="columns.title2">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<el-input-number v-model="row.continue" controls-position="right" :min="0.1" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column class-name="status-col" align="center" label="续费(元)" min-width="120">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<el-input-number v-model="row.continue_price" controls-position="right" :min="0" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="操作" min-width="80" fixed="right">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button
|
||||||
|
v-if="scope.$index > 0"
|
||||||
|
type="text"
|
||||||
|
size="small"
|
||||||
|
@click="confirmEdit(ruleForm.region,scope.$index)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" size="mini" icon="el-icon-edit" @click="addRegion(ruleForm.region)">
|
||||||
|
添加配送区域
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="指定包邮" prop="appoint">
|
||||||
|
<el-radio-group v-model="ruleForm.appoint">
|
||||||
|
<el-radio :label="1">开启</el-radio>
|
||||||
|
<el-radio :label="0">关闭</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="ruleForm.appoint === 1" prop="free">
|
||||||
|
<el-table v-loading="listLoading" :data="ruleForm.free" border fit highlight-current-row style="width: 100%" size="mini">
|
||||||
|
<el-table-column align="center" label="选择地区" min-width="220">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<LazyCascader
|
||||||
|
v-model="row.city_ids"
|
||||||
|
style="width: 95%"
|
||||||
|
:props="props"
|
||||||
|
collapse-tags
|
||||||
|
clearable
|
||||||
|
:filterable="false"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column min-width="180px" align="center" :label="columns.title3">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<el-input-number v-model="row.number" controls-position="right" :min="1" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column min-width="120px" align="center" label="最低购买金额(元)">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<el-input-number v-model="row.price" controls-position="right" :min="0.01" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="操作" min-width="120" fixed="right">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button
|
||||||
|
type="text"
|
||||||
|
size="small"
|
||||||
|
@click="confirmEdit(ruleForm.free,scope.$index)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="ruleForm.appoint === 1">
|
||||||
|
<el-button type="primary" size="mini" icon="el-icon-edit" @click="addFree(ruleForm.free)">
|
||||||
|
添加指定包邮区域
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="指定区域不配送" prop="undelivery">
|
||||||
|
<el-radio-group v-model="ruleForm.undelivery">
|
||||||
|
<el-radio :label="1">自定义</el-radio>
|
||||||
|
<el-radio :label="2">开启</el-radio>
|
||||||
|
<el-radio :label="0">关闭</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
<br>
|
||||||
|
(说明: 选择"开启"时, 仅支持上表添加的配送区域)
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item v-if="ruleForm.undelivery === 1" class="noBox" prop="city_id3">
|
||||||
|
<LazyCascader
|
||||||
|
v-model="ruleForm.city_id3"
|
||||||
|
placeholder="请选择不配送区域"
|
||||||
|
style="width: 46%"
|
||||||
|
:props="props"
|
||||||
|
collapse-tags
|
||||||
|
clearable
|
||||||
|
:filterable="false"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-form-item label="排序">
|
||||||
|
<el-input v-model="ruleForm.sort" class="withs" placeholder="请输入排序" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<span class="footer acea-row">
|
||||||
|
<el-button @click="resetForm('ruleForm')">取 消</el-button>
|
||||||
|
<el-button type="primary" @click="onsubmit('ruleForm')">确 定</el-button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import { cityListV2, templateCreateApi, templateDetailApi, templateUpdateApi } from '@/api/freight'
|
||||||
|
import LazyCascader from '../lazyCascader'
|
||||||
|
const defaultRole = {
|
||||||
|
name: '',
|
||||||
|
type: 0,
|
||||||
|
appoint: 0,
|
||||||
|
sort: 0,
|
||||||
|
info: '',
|
||||||
|
region: [{
|
||||||
|
first: 1,
|
||||||
|
first_price: 0,
|
||||||
|
continue: 1,
|
||||||
|
continue_price: 0,
|
||||||
|
city_id: [],
|
||||||
|
city_ids: []
|
||||||
|
}],
|
||||||
|
undelivery: 0,
|
||||||
|
free: [],
|
||||||
|
undelives: {},
|
||||||
|
city_id3: []
|
||||||
|
}
|
||||||
|
|
||||||
|
const cacheAddress = {}
|
||||||
|
|
||||||
|
const kg = '重量(kg)'
|
||||||
|
const m = '体积(m³)'
|
||||||
|
const statusMap = [
|
||||||
|
{
|
||||||
|
title: '首件',
|
||||||
|
title2: '续件',
|
||||||
|
title3: '最低购买件数'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: `首件${kg}`,
|
||||||
|
title2: `续件${kg}`,
|
||||||
|
title3: `最低购买${kg}`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: `首件${m}`,
|
||||||
|
title2: `续件${m}`,
|
||||||
|
title3: `最低购买${m}`
|
||||||
|
}
|
||||||
|
]
|
||||||
|
export default {
|
||||||
|
name: 'CreatTemplates',
|
||||||
|
components: {
|
||||||
|
LazyCascader
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
tempId: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
componentKey: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loading: false,
|
||||||
|
rules: {
|
||||||
|
name: [
|
||||||
|
{ required: true, message: '请输入模板名称', trigger: 'change' }
|
||||||
|
],
|
||||||
|
info: [
|
||||||
|
{ required: true, message: '请输入运费说明', trigger: 'blur' },
|
||||||
|
{ min: 3, max: 500, message: '长度在 3 到 500 个字符', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
free: [
|
||||||
|
{ type: 'array', required: true, message: '请至少添加一个地区', trigger: 'change' }
|
||||||
|
],
|
||||||
|
appoint: [
|
||||||
|
{ required: true, message: '请选择是否指定包邮', trigger: 'change' }
|
||||||
|
],
|
||||||
|
undelivery: [
|
||||||
|
{ required: true, message: '请选择是否指定区域不配送', trigger: 'change' }
|
||||||
|
],
|
||||||
|
type: [
|
||||||
|
{ required: true, message: '请选择计费方式', trigger: 'change' }
|
||||||
|
],
|
||||||
|
region: [
|
||||||
|
{ required: true, message: '请选择活动区域', trigger: 'change' }
|
||||||
|
]
|
||||||
|
// city_id3: [
|
||||||
|
// { type: 'array', required: true, message: '请至少选择一个地区', trigger: 'remove-tag' }
|
||||||
|
// ]
|
||||||
|
},
|
||||||
|
nodeKey: 'city_id',
|
||||||
|
props: {
|
||||||
|
children: 'children',
|
||||||
|
label: 'name',
|
||||||
|
value: 'id',
|
||||||
|
multiple: true,
|
||||||
|
lazy: true,
|
||||||
|
lazyLoad: this.lazyLoad,
|
||||||
|
checkStrictly: true
|
||||||
|
},
|
||||||
|
dialogVisible: false,
|
||||||
|
ruleForm: Object.assign({}, defaultRole),
|
||||||
|
listLoading: false,
|
||||||
|
cityList: [],
|
||||||
|
columns: {
|
||||||
|
title: '首件',
|
||||||
|
title2: '续件',
|
||||||
|
title3: '最低购买件数'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
componentKey: {
|
||||||
|
handler: function(val, oldVal) {
|
||||||
|
if (val) {
|
||||||
|
this.getInfo()
|
||||||
|
} else {
|
||||||
|
this.ruleForm = {
|
||||||
|
name: '',
|
||||||
|
type: 0,
|
||||||
|
appoint: 0,
|
||||||
|
sort: 0,
|
||||||
|
region: [{
|
||||||
|
first: 1,
|
||||||
|
first_price: 0,
|
||||||
|
continue: 1,
|
||||||
|
continue_price: 0,
|
||||||
|
city_id: [],
|
||||||
|
city_ids: []
|
||||||
|
}],
|
||||||
|
undelivery: 0,
|
||||||
|
free: [],
|
||||||
|
undelives: {},
|
||||||
|
city_id3: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// immediate: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
// this.getCityList()
|
||||||
|
if (this.tempId > 0) this.getInfo()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
resetForm(formName) {
|
||||||
|
this.$msgbox.close()
|
||||||
|
this.$refs[formName].resetFields()
|
||||||
|
},
|
||||||
|
onClose(formName) {
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.$refs[formName].resetFields()
|
||||||
|
},
|
||||||
|
confirmEdit(row, index) {
|
||||||
|
row.splice(index, 1)
|
||||||
|
},
|
||||||
|
changeRadio(num) {
|
||||||
|
this.columns = Object.assign({}, statusMap[num])
|
||||||
|
},
|
||||||
|
// 添加配送区域
|
||||||
|
addRegion(region) {
|
||||||
|
region.push(Object.assign({}, {
|
||||||
|
first: 1,
|
||||||
|
first_price: 1,
|
||||||
|
continue: 1,
|
||||||
|
continue_price: 0,
|
||||||
|
city_id: [],
|
||||||
|
city_ids: []
|
||||||
|
}))
|
||||||
|
},
|
||||||
|
addFree(Free) {
|
||||||
|
Free.push(Object.assign({}, {
|
||||||
|
city_id: [],
|
||||||
|
number: 1,
|
||||||
|
price: 0.01,
|
||||||
|
city_ids: []
|
||||||
|
}))
|
||||||
|
},
|
||||||
|
lazyLoad(node, resolve) {
|
||||||
|
if (cacheAddress[node]) {
|
||||||
|
cacheAddress[node]().then(res => {
|
||||||
|
resolve([...res.data])
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
const p = cityListV2(node)
|
||||||
|
cacheAddress[node] = () => p
|
||||||
|
p.then(res => {
|
||||||
|
res.data.forEach(item => {
|
||||||
|
item.leaf = item.snum === 0
|
||||||
|
})
|
||||||
|
cacheAddress[node] = () => new Promise((resolve1) => {
|
||||||
|
setTimeout(() => resolve1(res), 300)
|
||||||
|
})
|
||||||
|
resolve(res.data)
|
||||||
|
}).catch(res => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 详情
|
||||||
|
getInfo() {
|
||||||
|
this.loading = true
|
||||||
|
templateDetailApi(this.tempId).then(res => {
|
||||||
|
this.dialogVisible = true
|
||||||
|
const info = res.data
|
||||||
|
this.ruleForm = {
|
||||||
|
name: info.name,
|
||||||
|
type: info.type,
|
||||||
|
info: info.info,
|
||||||
|
appoint: info.appoint,
|
||||||
|
sort: info.sort,
|
||||||
|
region: info.region,
|
||||||
|
undelivery: info.undelivery,
|
||||||
|
free: info.free,
|
||||||
|
undelives: info.undelives,
|
||||||
|
city_id3: info.undelives.city_ids || []
|
||||||
|
}
|
||||||
|
this.ruleForm.region.map(item => {
|
||||||
|
this.$set(item, 'city_id', item.city_ids[0])
|
||||||
|
this.$set(item, 'city_ids', item.city_ids)
|
||||||
|
})
|
||||||
|
this.ruleForm.free.map(item => {
|
||||||
|
this.$set(item, 'city_id', item.city_ids[0])
|
||||||
|
this.$set(item, 'city_ids', item.city_ids)
|
||||||
|
})
|
||||||
|
this.changeRadio(info.type)
|
||||||
|
// this.$refs.changeType.click(info.type)
|
||||||
|
// this.$refs.refid.click();
|
||||||
|
this.loading = false
|
||||||
|
}).catch(res => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 列表
|
||||||
|
// getCityList() {
|
||||||
|
// cityListV2(0).then(res => {
|
||||||
|
// this.cityList = res.data
|
||||||
|
// }).catch(res => {
|
||||||
|
// this.$message.error(res.message)
|
||||||
|
// })
|
||||||
|
// },
|
||||||
|
change(idBox) {
|
||||||
|
idBox.map(item => {
|
||||||
|
const ids = []
|
||||||
|
if (item.city_ids.length === 0) return
|
||||||
|
item.city_ids.map(j => {
|
||||||
|
// j.splice(0, 1)
|
||||||
|
ids.push(j[j.length - 1])
|
||||||
|
})
|
||||||
|
item.city_id = ids
|
||||||
|
})
|
||||||
|
return idBox
|
||||||
|
},
|
||||||
|
changeOne(idBox) {
|
||||||
|
const city_ids = []
|
||||||
|
if (idBox.length === 0) return
|
||||||
|
idBox.map(item => {
|
||||||
|
// item.splice(0, 1)
|
||||||
|
city_ids.push(item[item.length - 1])
|
||||||
|
})
|
||||||
|
return city_ids
|
||||||
|
},
|
||||||
|
onsubmit(formName) {
|
||||||
|
// this.ruleForm.region = this.change(this.ruleForm.region)
|
||||||
|
// this.ruleForm.free = this.change(this.ruleForm.free)
|
||||||
|
// this.ruleForm.undelives.city_id = this.changeOne(this.ruleForm.city_id3)
|
||||||
|
const data = {
|
||||||
|
name: this.ruleForm.name,
|
||||||
|
type: this.ruleForm.type,
|
||||||
|
info: this.ruleForm.info,
|
||||||
|
appoint: this.ruleForm.appoint,
|
||||||
|
sort: this.ruleForm.sort,
|
||||||
|
region: this.change(this.ruleForm.region),
|
||||||
|
undelivery: this.ruleForm.undelivery,
|
||||||
|
free: this.change(this.ruleForm.free),
|
||||||
|
undelives: {
|
||||||
|
city_id: this.changeOne(this.ruleForm.city_id3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.$refs[formName].validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.tempId === 0 ? templateCreateApi(data).then(res => {
|
||||||
|
this.$message.success(res.message)
|
||||||
|
setTimeout(() => {
|
||||||
|
this.$msgbox.close()
|
||||||
|
}, 500)
|
||||||
|
setTimeout(() => {
|
||||||
|
this.$emit('getList')
|
||||||
|
this.$refs[formName].resetFields()
|
||||||
|
}, 600)
|
||||||
|
}).catch(res => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
}) : templateUpdateApi(this.tempId, data).then(res => {
|
||||||
|
this.$message.success(res.message)
|
||||||
|
setTimeout(() => {
|
||||||
|
this.$msgbox.close()
|
||||||
|
}, 500)
|
||||||
|
setTimeout(() => {
|
||||||
|
this.$emit('getList')
|
||||||
|
this.$refs[formName].resetFields()
|
||||||
|
}, 600)
|
||||||
|
}).catch(res => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.footer{
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
.withs{
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
.noBox{
|
||||||
|
/deep/.el-form-item__content{
|
||||||
|
margin-left: 0 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.tempBox{
|
||||||
|
/deep/.el-input-number--mini{
|
||||||
|
width: 100px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
|
||||||
|
export default function modalAttr(val, callback) {
|
||||||
|
const h = this.$createElement
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.$msgbox({
|
||||||
|
title: '属性规格',
|
||||||
|
customClass: 'upload-form',
|
||||||
|
closeOnClickModal: false,
|
||||||
|
showClose: false,
|
||||||
|
message: h('div', { class: 'common-form-upload' }, [
|
||||||
|
h('attrFrom', {
|
||||||
|
props: {
|
||||||
|
currentRow: val
|
||||||
|
},
|
||||||
|
on: {
|
||||||
|
getList() {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
]),
|
||||||
|
showCancelButton: false,
|
||||||
|
showConfirmButton: false
|
||||||
|
}).then(() => {
|
||||||
|
resolve()
|
||||||
|
}).catch(() => {
|
||||||
|
reject()
|
||||||
|
this.$message({
|
||||||
|
type: 'info',
|
||||||
|
message: '已取消'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
|
||||||
|
export default function modalCoupon(couponData, handle, couponId, keyNum, callback) {
|
||||||
|
const h = this.$createElement
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.$msgbox({
|
||||||
|
title: '优惠券列表',
|
||||||
|
customClass: 'upload-form-coupon',
|
||||||
|
closeOnClickModal: false,
|
||||||
|
showClose: false,
|
||||||
|
message: h('div', { class: 'common-form-upload' }, [
|
||||||
|
h('couponList', {
|
||||||
|
props: {
|
||||||
|
couponData: couponData,
|
||||||
|
handle: handle,
|
||||||
|
couponId: couponId,
|
||||||
|
keyNum: keyNum
|
||||||
|
},
|
||||||
|
on: {
|
||||||
|
getCouponId(id) {
|
||||||
|
callback(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
]),
|
||||||
|
showCancelButton: false,
|
||||||
|
showConfirmButton: false
|
||||||
|
}).then(() => {
|
||||||
|
resolve()
|
||||||
|
}).catch(() => {
|
||||||
|
reject()
|
||||||
|
this.$message({
|
||||||
|
type: 'info',
|
||||||
|
message: '已取消'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
|
||||||
|
export default function modalTemplates(id, callback, componentKey) {
|
||||||
|
const h = this.$createElement
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.$msgbox({
|
||||||
|
title: '运费模板',
|
||||||
|
customClass: 'upload-form-temp',
|
||||||
|
closeOnClickModal: false,
|
||||||
|
showClose: false,
|
||||||
|
message: h('div', { class: 'common-form-upload' }, [
|
||||||
|
h('templatesFrom', {
|
||||||
|
props: {
|
||||||
|
tempId: id,
|
||||||
|
componentKey: componentKey
|
||||||
|
},
|
||||||
|
on: {
|
||||||
|
getList() {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
]),
|
||||||
|
showCancelButton: false,
|
||||||
|
showConfirmButton: false
|
||||||
|
}).then(() => {
|
||||||
|
resolve()
|
||||||
|
}).catch(() => {
|
||||||
|
reject()
|
||||||
|
this.$message({
|
||||||
|
type: 'info',
|
||||||
|
message: '已取消'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
12
src/main.js
12
src/main.js
|
|
@ -25,6 +25,9 @@ import FormCreate from "@form-create/element-ui";
|
||||||
import uploadPicture from "./components/uploadPicture/uploadFrom";
|
import uploadPicture from "./components/uploadPicture/uploadFrom";
|
||||||
import VueUeditorWrap from "vue-ueditor-wrap";
|
import VueUeditorWrap from "vue-ueditor-wrap";
|
||||||
import newsCategory from "./components/newsCategory/newsCategoryFrom";
|
import newsCategory from "./components/newsCategory/newsCategoryFrom";
|
||||||
|
import couponList from './components/couponList'
|
||||||
|
import attrFrom from './components/attrFrom'
|
||||||
|
import templatesFrom from './components/templatesFrom'
|
||||||
import { getToken } from "./utils/auth";
|
import { getToken } from "./utils/auth";
|
||||||
|
|
||||||
import "./icons"; // icon
|
import "./icons"; // icon
|
||||||
|
|
@ -36,6 +39,9 @@ import { modalSure, deleteSure } from "@/libs/public";
|
||||||
import { modalSureDelete } from "@/libs/public";
|
import { modalSureDelete } from "@/libs/public";
|
||||||
import * as filters from "./filters";
|
import * as filters from "./filters";
|
||||||
import notice from "@/libs/notice";
|
import notice from "@/libs/notice";
|
||||||
|
import modalCoupon from '@/libs/modal-coupon'
|
||||||
|
import modalAttr from '@/libs/modal-attr'
|
||||||
|
import modalTemplates from '@/libs/modal-templates'
|
||||||
import guidancePop from "@/components/guidancePop";
|
import guidancePop from "@/components/guidancePop";
|
||||||
// swiper
|
// swiper
|
||||||
import VueAwesomeSwiper from "vue-awesome-swiper";
|
import VueAwesomeSwiper from "vue-awesome-swiper";
|
||||||
|
|
@ -45,6 +51,9 @@ Vue.use(uploadPicture);
|
||||||
Vue.use(FormCreate);
|
Vue.use(FormCreate);
|
||||||
Vue.use(newsCategory);
|
Vue.use(newsCategory);
|
||||||
Vue.component("vue-ueditor-wrap", VueUeditorWrap);
|
Vue.component("vue-ueditor-wrap", VueUeditorWrap);
|
||||||
|
Vue.component('couponList', couponList)
|
||||||
|
Vue.component('attrFrom', attrFrom)
|
||||||
|
Vue.component('templatesFrom', templatesFrom)
|
||||||
Vue.use(VueAwesomeSwiper);
|
Vue.use(VueAwesomeSwiper);
|
||||||
Vue.use(Viewer, {
|
Vue.use(Viewer, {
|
||||||
defaultOptions: {
|
defaultOptions: {
|
||||||
|
|
@ -72,6 +81,9 @@ Vue.prototype.$videoCloud = videoCloud;
|
||||||
Vue.prototype.$modalSure = modalSure;
|
Vue.prototype.$modalSure = modalSure;
|
||||||
Vue.prototype.$deleteSure = deleteSure;
|
Vue.prototype.$deleteSure = deleteSure;
|
||||||
Vue.prototype.$modalSureDelete = modalSureDelete;
|
Vue.prototype.$modalSureDelete = modalSureDelete;
|
||||||
|
Vue.prototype.$modalCoupon = modalCoupon
|
||||||
|
Vue.prototype.$modalAttr = modalAttr
|
||||||
|
Vue.prototype.$modalTemplates = modalTemplates
|
||||||
Vue.prototype.moment = Moment;
|
Vue.prototype.moment = Moment;
|
||||||
|
|
||||||
Vue.component('guidancePop',guidancePop);
|
Vue.component('guidancePop',guidancePop);
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,17 @@ const productRouter =
|
||||||
noCache: true
|
noCache: true
|
||||||
},
|
},
|
||||||
component: () => import('@/views/product/productGuarantee/index.vue')
|
component: () => import('@/views/product/productGuarantee/index.vue')
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
path: 'addProduct/:id?/:edit?',
|
||||||
|
component: () => import('@/views/product/addProduct/index'),
|
||||||
|
name: 'AddProduct',
|
||||||
|
meta: {
|
||||||
|
title: '商品添加',
|
||||||
|
noCache: true
|
||||||
|
},
|
||||||
|
hidden: true
|
||||||
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -438,7 +438,7 @@ table .el-image{
|
||||||
height: 46px!important;
|
height: 46px!important;
|
||||||
line-height: 46px!important;
|
line-height: 46px!important;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
padding-left: 0!important;
|
padding-left: 0!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.styleTwo .el-submenu__title{
|
.styleTwo .el-submenu__title{
|
||||||
|
|
@ -453,7 +453,7 @@ table .el-image{
|
||||||
background: #77777D!important;
|
background: #77777D!important;
|
||||||
.el-submenu__title{
|
.el-submenu__title{
|
||||||
background: #77777D!important;
|
background: #77777D!important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.styleTwo .router-link-active{
|
.styleTwo .router-link-active{
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
|
|
@ -464,3 +464,10 @@ table .el-image{
|
||||||
.el-slider__button-wrapper{
|
.el-slider__button-wrapper{
|
||||||
z-index: 100
|
z-index: 100
|
||||||
}
|
}
|
||||||
|
.upload-form-coupon{
|
||||||
|
min-width: 1100px!important;
|
||||||
|
max-height:700px!important;
|
||||||
|
}
|
||||||
|
.upload-form-temp{
|
||||||
|
min-width: 1000px!important;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,260 @@
|
||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
:visible.sync="carMyShow"
|
||||||
|
title="添加卡密"
|
||||||
|
width="600px"
|
||||||
|
>
|
||||||
|
<div class="carMywrapper">
|
||||||
|
<div class="type-radio">
|
||||||
|
<el-form label-width="80px">
|
||||||
|
<el-form-item label="卡密类型:">
|
||||||
|
<el-radio-group v-model="fixedCar.is_type" size="large">
|
||||||
|
<el-radio :label="0">固定卡密</el-radio>
|
||||||
|
<!-- <el-radio :label="1">一次性卡密</el-radio> -->
|
||||||
|
</el-radio-group>
|
||||||
|
<div v-if="fixedCar.is_type == 0">
|
||||||
|
<div class="stock-disk">
|
||||||
|
<el-input
|
||||||
|
v-model="fixedCar.key"
|
||||||
|
size="small"
|
||||||
|
type="textarea"
|
||||||
|
:rows="4"
|
||||||
|
placeholder="填写卡密信息"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="stock-input">
|
||||||
|
<!-- <el-input
|
||||||
|
type="number"
|
||||||
|
size="small"
|
||||||
|
v-model="fixedCar.stock"
|
||||||
|
:min="1"
|
||||||
|
placeholder="填写库存数量"
|
||||||
|
> -->
|
||||||
|
<el-input-number v-model="fixedCar.stock" :min="1" label="填写库存数量" /> 件
|
||||||
|
<!-- </el-input> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="scroll-virtual" v-if="fixedCar.is_type == 1">
|
||||||
|
<div
|
||||||
|
class="acea-row row-middle mb10"
|
||||||
|
v-for="(item, index) in virtualList"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<span class="mr10 virtual-title">卡号{{ index + 1 }}:</span>
|
||||||
|
<el-input
|
||||||
|
class="mr10 width15"
|
||||||
|
type="text"
|
||||||
|
size="small"
|
||||||
|
v-model.trim="item.key"
|
||||||
|
placeholder="请输入卡号(非必填)"
|
||||||
|
></el-input>
|
||||||
|
<span class="mr10 virtual-title">卡密{{ index + 1 }}:</span>
|
||||||
|
<el-input
|
||||||
|
class="mr10 width15"
|
||||||
|
type="text"
|
||||||
|
v-model.trim="item.pwd"
|
||||||
|
placeholder="请输入卡密"
|
||||||
|
size="small"
|
||||||
|
></el-input>
|
||||||
|
<span class="deteal-btn" @click="removeVirtual(index)"
|
||||||
|
>删除</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="fixedCar.is_type == 1" class="add-more">
|
||||||
|
<el-button type="primary" size="mini" @click="handleAdd">添加卡密</el-button>
|
||||||
|
<el-upload
|
||||||
|
ref="upload"
|
||||||
|
class="ml10"
|
||||||
|
style="display: inline-block;"
|
||||||
|
:action="cardUrl"
|
||||||
|
:before-upload="beforeUpload"
|
||||||
|
:headers="header"
|
||||||
|
:on-success="upFile"
|
||||||
|
:format="['xlsx']"
|
||||||
|
:on-format-error="handleFormatError"
|
||||||
|
>
|
||||||
|
<!-- <el-button type="success" size="mini">导入卡密</el-button> -->
|
||||||
|
</el-upload>
|
||||||
|
<!-- <el-button class="download" type="default" size="small" @click="getCarMyList">下载卡密模板</el-button> -->
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<el-button type="primary" class="btns" size="small" @click="cancel">取消</el-button>
|
||||||
|
<el-button type="primary" class="btns" size="small" @click="subBtn">确定</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import SettingMer from "@/libs/settingMer";
|
||||||
|
import { getToken } from "@/utils/auth";
|
||||||
|
import exportExcel from "@/utils/newToExcel.js";
|
||||||
|
import {
|
||||||
|
importCard,
|
||||||
|
exportProductCard
|
||||||
|
} from "@/api/product";
|
||||||
|
export default {
|
||||||
|
name: "addCarMy",
|
||||||
|
props:{
|
||||||
|
virtualList: {
|
||||||
|
type: Array,
|
||||||
|
default: function () {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data(){
|
||||||
|
return {
|
||||||
|
carMyShow: false,
|
||||||
|
fixedCar:{
|
||||||
|
is_type: 0,
|
||||||
|
key:'',
|
||||||
|
stock:0
|
||||||
|
},
|
||||||
|
cardUrl: SettingMer.https + "/file/upload/1",
|
||||||
|
header: {} //请求头部信息
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
// cardUrl() {
|
||||||
|
// return (
|
||||||
|
// SettingMer.https +
|
||||||
|
// `/upload/image/file`
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
// this.getToken();
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
// 下载卡密
|
||||||
|
async getCarMyList() {
|
||||||
|
let [th, filekey, data, fileName] = [[], [], [], ""];
|
||||||
|
let lebData = await this.getExcelData();
|
||||||
|
if (!fileName) fileName = lebData.filename;
|
||||||
|
if (!filekey.length) {
|
||||||
|
filekey = lebData.filekey;
|
||||||
|
}
|
||||||
|
if (!th.length) th = lebData.header;
|
||||||
|
data = lebData.export;
|
||||||
|
exportExcel(th, filekey, fileName, data);
|
||||||
|
},
|
||||||
|
getExcelData() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
exportProductCard().then((res) => {
|
||||||
|
return resolve(res.data);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
removeVirtual(index) {
|
||||||
|
this.virtualList.splice(index, 1);
|
||||||
|
},
|
||||||
|
upFile(res) {
|
||||||
|
importCard({ file: res.data.src }).then((res) => {
|
||||||
|
this.$emit('changeVirtual',JSON.parse(JSON.stringify(res.data)))
|
||||||
|
//this.$refs.upload.clearFiles();
|
||||||
|
}).catch(err=>{
|
||||||
|
return this.$Message.error(err.msg);
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleFormatError(file){
|
||||||
|
return this.$Message.error('必须上传xlsx格式文件');
|
||||||
|
},
|
||||||
|
// 上传头部token
|
||||||
|
getToken() {
|
||||||
|
this.header["Authori-zation"] = "Bearer " + getToken();
|
||||||
|
},
|
||||||
|
cancel(){
|
||||||
|
this.$emit('closeCarMy')
|
||||||
|
},
|
||||||
|
handleAdd() {
|
||||||
|
this.virtualList.push({
|
||||||
|
key: "",
|
||||||
|
pwd: "",
|
||||||
|
});
|
||||||
|
},
|
||||||
|
beforeUpload() {
|
||||||
|
let promise = new Promise((resolve) => {
|
||||||
|
this.$nextTick(function () {
|
||||||
|
resolve(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return promise;
|
||||||
|
},
|
||||||
|
subBtn(){
|
||||||
|
if(this.fixedCar.is_type==0){
|
||||||
|
if(this.fixedCar.key == ''){
|
||||||
|
return this.$message.error("请填写卡密信息");
|
||||||
|
}
|
||||||
|
if(!this.fixedCar.stock){
|
||||||
|
return this.$message.error("请填写库存数量");
|
||||||
|
}
|
||||||
|
this.$emit('fixdBtn',JSON.parse(JSON.stringify(this.fixedCar)))
|
||||||
|
}else{
|
||||||
|
let data = {
|
||||||
|
is_type:1,
|
||||||
|
list:this.virtualList
|
||||||
|
}
|
||||||
|
for (let i = 0; i < this.virtualList.length; i++) {
|
||||||
|
const element = this.virtualList[i];
|
||||||
|
if (!element.pwd) {
|
||||||
|
return this.$message.error("请输入所有卡密");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.$emit('fixdBtn',JSON.parse(JSON.stringify(data)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.width15{
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
/deep/.el-radio__label{
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.carMywrapper{
|
||||||
|
.download{
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
.stock-disk{
|
||||||
|
margin: 10px 0 15px 0;
|
||||||
|
}
|
||||||
|
.scroll-virtual {
|
||||||
|
max-height: 320px;
|
||||||
|
overflow-y: auto;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
.virtual-title {
|
||||||
|
width: 50px;
|
||||||
|
}
|
||||||
|
.deteal-btn {
|
||||||
|
color: #5179ea;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.add-more {
|
||||||
|
margin-top: 20px;
|
||||||
|
line-height: 32px;
|
||||||
|
|
||||||
|
}
|
||||||
|
.footer{
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
margin-top: 40px;
|
||||||
|
button{
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/deep/.el-input-group--append .el-input__inner{
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
<template>
|
||||||
|
<el-dialog v-if="showRecord" title="复制记录" :visible.sync="showRecord" width="900px">
|
||||||
|
<div v-loading="loading">
|
||||||
|
<el-table
|
||||||
|
v-loading="loading"
|
||||||
|
:data="tableData.data"
|
||||||
|
style="width: 100%"
|
||||||
|
size="mini"
|
||||||
|
class="table"
|
||||||
|
highlight-current-row
|
||||||
|
>
|
||||||
|
<el-table-column label="ID" prop="mer_id" min-width="50" />
|
||||||
|
<el-table-column label="使用次数" prop="num" min-width="80" />
|
||||||
|
<el-table-column label="复制商品平台名称" prop="type" min-width="120" />
|
||||||
|
<el-table-column label="剩余次数" prop="number" min-width="80" />
|
||||||
|
<el-table-column label="商品复制链接" prop="info" min-width="180" />
|
||||||
|
<el-table-column label="操作时间" prop="create_time" min-width="120" />
|
||||||
|
</el-table>
|
||||||
|
<div class="block">
|
||||||
|
<el-pagination
|
||||||
|
:page-sizes="[10, 20]"
|
||||||
|
:page-size="tableFrom.limit"
|
||||||
|
:current-page="tableFrom.page"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
:total="tableData.total"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
@current-change="pageChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import { productCopyRecordApi } from '@/api/product'
|
||||||
|
export default {
|
||||||
|
name: 'CopyRecord',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
showRecord: false,
|
||||||
|
loading: false,
|
||||||
|
tableData: {
|
||||||
|
data: [],
|
||||||
|
total: 0
|
||||||
|
},
|
||||||
|
tableFrom: {
|
||||||
|
page: 1,
|
||||||
|
limit: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getRecord() {
|
||||||
|
this.showRecord = true
|
||||||
|
this.loading = true
|
||||||
|
productCopyRecordApi(this.tableFrom)
|
||||||
|
.then((res) => {
|
||||||
|
this.tableData.data = res.data.list
|
||||||
|
this.tableData.total = res.data.count
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
.catch((res) => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
this.listLoading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
pageChange(page) {
|
||||||
|
this.tableFrom.page = page
|
||||||
|
this.getRecord()
|
||||||
|
},
|
||||||
|
pageChangeLog(page) {
|
||||||
|
this.tableFromLog.page = page
|
||||||
|
this.getRecord()
|
||||||
|
},
|
||||||
|
handleSizeChange(val) {
|
||||||
|
this.tableFrom.limit = val
|
||||||
|
this.getRecord()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.title {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
color: #17233d;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.description {
|
||||||
|
&-term {
|
||||||
|
display: table-cell;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
line-height: 20px;
|
||||||
|
width: 50%;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,800 @@
|
||||||
|
<template>
|
||||||
|
<div class="Box">
|
||||||
|
<el-dialog
|
||||||
|
v-if="modals"
|
||||||
|
:visible.sync="modals"
|
||||||
|
width="70%"
|
||||||
|
title="商品采集"
|
||||||
|
custom-class="dialog-scustom"
|
||||||
|
>
|
||||||
|
<el-card>
|
||||||
|
<div>复制淘宝、天猫、京东、苏宁、1688;</div>
|
||||||
|
生成的商品默认是没有上架的,请手动上架商品!
|
||||||
|
<span style="color: rgb(237, 64, 20);">商品复制次数剩余:{{ count }}次</span>
|
||||||
|
<router-link :to="{path: roterPre + '/setting/sms/sms_pay/index?type=copy'}">
|
||||||
|
<el-button size="small" type="text">增加采集次数</el-button>
|
||||||
|
</router-link>
|
||||||
|
<el-button size="small" type="primary" style="margin-left: 15px;" @click="openRecords">查看商品复制记录</el-button>
|
||||||
|
</el-card>
|
||||||
|
<el-form
|
||||||
|
ref="formValidate"
|
||||||
|
class="formValidate mt20"
|
||||||
|
:model="formValidate"
|
||||||
|
:rules="ruleInline"
|
||||||
|
label-width="130px"
|
||||||
|
label-position="right"
|
||||||
|
@submit.native.prevent
|
||||||
|
>
|
||||||
|
<el-form-item label="链接地址:">
|
||||||
|
<el-input v-model="soure_link" search placeholder="请输入链接地址" class="numPut" />
|
||||||
|
<el-button :loading="loading" size="small" type="primary" @click="add">确定</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-dialog>
|
||||||
|
<!--商品复制记录-->
|
||||||
|
<copy-record ref="copyRecord" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import {
|
||||||
|
crawlFromApi,
|
||||||
|
categoryListApi,
|
||||||
|
shippingListApi,
|
||||||
|
productCopyApi,
|
||||||
|
categorySelectApi,
|
||||||
|
categoryBrandListApi,
|
||||||
|
productCopyCountApi,
|
||||||
|
guaranteeTemplateListApi,
|
||||||
|
productConfigApi,
|
||||||
|
getProductLabelApi
|
||||||
|
} from '@/api/product'
|
||||||
|
import ueditorFrom from '@/components/ueditorFrom'
|
||||||
|
import copyRecord from './copyRecord'
|
||||||
|
import SettingMer from '@/libs/settingMer'
|
||||||
|
import { getToken } from '@/utils/auth'
|
||||||
|
import { roterPre } from "@/settings";
|
||||||
|
|
||||||
|
const defaultObj = {
|
||||||
|
store_name: '',
|
||||||
|
cate_id: '',
|
||||||
|
temp_id: '',
|
||||||
|
type: 0,
|
||||||
|
guarantee_template_id: '',
|
||||||
|
keyword: '',
|
||||||
|
unit_name: '',
|
||||||
|
store_info: '',
|
||||||
|
image: '',
|
||||||
|
slider_image: [],
|
||||||
|
content: '',
|
||||||
|
ficti: 0,
|
||||||
|
once_count: 0,
|
||||||
|
give_integral: 0,
|
||||||
|
is_show: 0,
|
||||||
|
price: 0,
|
||||||
|
cost: 0,
|
||||||
|
ot_price: 0,
|
||||||
|
stock: 0,
|
||||||
|
soure_link: '',
|
||||||
|
attrs: [],
|
||||||
|
items: [],
|
||||||
|
delivery_way: [],
|
||||||
|
mer_labels: [],
|
||||||
|
delivery_free: 0,
|
||||||
|
spec_type: 0,
|
||||||
|
is_copoy: 1,
|
||||||
|
attrValue: [{
|
||||||
|
image: '',
|
||||||
|
price: 0,
|
||||||
|
cost: 0,
|
||||||
|
ot_price: 0,
|
||||||
|
stock: 0,
|
||||||
|
bar_code: '',
|
||||||
|
weight: 0,
|
||||||
|
volume: 0
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
const objTitle = {
|
||||||
|
price: {
|
||||||
|
title: '售价'
|
||||||
|
},
|
||||||
|
cost: {
|
||||||
|
title: '成本价'
|
||||||
|
},
|
||||||
|
ot_price: {
|
||||||
|
title: '市场价'
|
||||||
|
},
|
||||||
|
stock: {
|
||||||
|
title: '库存'
|
||||||
|
},
|
||||||
|
bar_code: {
|
||||||
|
title: '商品编号'
|
||||||
|
},
|
||||||
|
weight: {
|
||||||
|
title: '重量(KG)'
|
||||||
|
},
|
||||||
|
volume: {
|
||||||
|
title: '体积(m³)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default {
|
||||||
|
name: 'CopyTaoBao',
|
||||||
|
components: { ueditorFrom, copyRecord },
|
||||||
|
data() {
|
||||||
|
const url = SettingMer.https + '/upload/image/0/file?ueditor=1&token=' + getToken()
|
||||||
|
return {
|
||||||
|
roterPre: roterPre,
|
||||||
|
modals: false,
|
||||||
|
loading: false,
|
||||||
|
loading1: false,
|
||||||
|
BaseURL: SettingMer.https || 'http://localhost:8080',
|
||||||
|
OneattrValue: [Object.assign({}, defaultObj.attrValue[0])], // 单规格
|
||||||
|
ManyAttrValue: [Object.assign({}, defaultObj.attrValue[0])], // 多规格
|
||||||
|
columnsBatch: [
|
||||||
|
{
|
||||||
|
title: '图片',
|
||||||
|
slot: 'image',
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 80
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '售价',
|
||||||
|
slot: 'price',
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '成本价',
|
||||||
|
slot: 'cost',
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '市场价',
|
||||||
|
slot: 'ot_price',
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '库存',
|
||||||
|
slot: 'stock',
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '商品编号',
|
||||||
|
slot: 'bar_code',
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '重量(KG)',
|
||||||
|
slot: 'weight',
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '体积(m³)',
|
||||||
|
slot: 'volume',
|
||||||
|
align: 'center',
|
||||||
|
minWidth: 95
|
||||||
|
}
|
||||||
|
],
|
||||||
|
manyTabDate: {},
|
||||||
|
count: 0,
|
||||||
|
modal_loading: false,
|
||||||
|
images: '',
|
||||||
|
soure_link: '',
|
||||||
|
modalPic: false,
|
||||||
|
isChoice: '',
|
||||||
|
gridPic: {
|
||||||
|
xl: 6,
|
||||||
|
lg: 8,
|
||||||
|
md: 12,
|
||||||
|
sm: 12,
|
||||||
|
xs: 12
|
||||||
|
},
|
||||||
|
gridBtn: {
|
||||||
|
xl: 4,
|
||||||
|
lg: 8,
|
||||||
|
md: 8,
|
||||||
|
sm: 8,
|
||||||
|
xs: 8
|
||||||
|
},
|
||||||
|
columns: [],
|
||||||
|
virtual: [
|
||||||
|
{ tit: '普通商品', id: 0, tit2: '物流发货' },
|
||||||
|
{ tit: '虚拟商品', id: 1, tit2: '虚拟发货' }
|
||||||
|
],
|
||||||
|
categoryList: [], // 平台
|
||||||
|
merCateList: [], // 商户
|
||||||
|
BrandList: [], // 品牌
|
||||||
|
propsMer: { emitPath: false, multiple: true },
|
||||||
|
tableFrom: {
|
||||||
|
mer_cate_id: '',
|
||||||
|
cate_id: '',
|
||||||
|
keyword: '',
|
||||||
|
type: '1',
|
||||||
|
is_gift_bag: ''
|
||||||
|
},
|
||||||
|
ruleInline: {
|
||||||
|
cate_id: [
|
||||||
|
{ required: true, message: '请选择商品分类', trigger: 'change' }
|
||||||
|
],
|
||||||
|
mer_cate_id: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '请选择商户分类',
|
||||||
|
trigger: 'change',
|
||||||
|
type: 'array',
|
||||||
|
min: '1'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
temp_id: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '请选择运费模板',
|
||||||
|
trigger: 'change',
|
||||||
|
type: 'number'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
brand_id: [
|
||||||
|
{ required: true, message: '请选择品牌', trigger: 'change' }
|
||||||
|
],
|
||||||
|
store_info: [{ required: true, message: '请输入商品简介', trigger: 'blur' }],
|
||||||
|
delivery_way: [{ required: true, message: '请选择送货方式', trigger: 'change' }]
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
xl: 8,
|
||||||
|
lg: 8,
|
||||||
|
md: 12,
|
||||||
|
sm: 24,
|
||||||
|
xs: 24
|
||||||
|
},
|
||||||
|
grid2: {
|
||||||
|
xl: 12,
|
||||||
|
lg: 12,
|
||||||
|
md: 12,
|
||||||
|
sm: 24,
|
||||||
|
xs: 24
|
||||||
|
},
|
||||||
|
myConfig: {
|
||||||
|
autoHeightEnabled: false, // 编辑器不自动被内容撑高
|
||||||
|
initialFrameHeight: 500, // 初始容器高度
|
||||||
|
initialFrameWidth: '100%', // 初始容器宽度
|
||||||
|
UEDITOR_HOME_URL: '/UEditor/',
|
||||||
|
'serverUrl': url,
|
||||||
|
'imageUrl': url,
|
||||||
|
'imageFieldName': 'file',
|
||||||
|
imageUrlPrefix: '',
|
||||||
|
'imageActionName': 'upfile',
|
||||||
|
'imageMaxSize': 2048000,
|
||||||
|
'imageAllowFiles': ['.png', '.jpg', '.jpeg', '.gif', '.bmp']
|
||||||
|
},
|
||||||
|
formThead: Object.assign({}, objTitle),
|
||||||
|
formValidate: Object.assign({}, defaultObj),
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
image: '',
|
||||||
|
price: 0,
|
||||||
|
cost: 0,
|
||||||
|
ot_price: 0,
|
||||||
|
stock: 0,
|
||||||
|
bar_code: '',
|
||||||
|
weight: 0,
|
||||||
|
volume: 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
shippingList: [],
|
||||||
|
guaranteeList: [], // 服务保障模板
|
||||||
|
isData: false,
|
||||||
|
artFrom: {
|
||||||
|
type: 'taobao',
|
||||||
|
url: ''
|
||||||
|
},
|
||||||
|
tableIndex: 0,
|
||||||
|
labelPosition: 'right',
|
||||||
|
labelWidth: '120',
|
||||||
|
isMore: '',
|
||||||
|
taoBaoStatus: {},
|
||||||
|
attrInfo: {},
|
||||||
|
labelList: [],
|
||||||
|
oneFormBatch: [
|
||||||
|
{
|
||||||
|
image: '',
|
||||||
|
price: 0,
|
||||||
|
cost: 0,
|
||||||
|
ot_price: 0,
|
||||||
|
stock: 0,
|
||||||
|
bar_code: '',
|
||||||
|
weight: 0,
|
||||||
|
volume: 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
attrValue() {
|
||||||
|
const obj = Object.assign({}, defaultObj.attrValue[0])
|
||||||
|
delete obj.image
|
||||||
|
return obj
|
||||||
|
},
|
||||||
|
// oneFormBatch() {
|
||||||
|
// const obj = [Object.assign({}, defaultObj.attrValue[0])]
|
||||||
|
// delete obj[0].bar_code
|
||||||
|
// return obj
|
||||||
|
// }
|
||||||
|
},
|
||||||
|
watch: {},
|
||||||
|
created() {
|
||||||
|
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
|
||||||
|
this.getCopyCount()
|
||||||
|
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 获取标签项
|
||||||
|
getLabelLst() {
|
||||||
|
getProductLabelApi().then(res => {
|
||||||
|
this.labelList = res.data
|
||||||
|
})
|
||||||
|
.catch(res => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 获取剩余复制次数
|
||||||
|
getCopyCount() {
|
||||||
|
productCopyCountApi().then((res) => {
|
||||||
|
this.count = res.data.count
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 查看复制记录
|
||||||
|
openRecords() {
|
||||||
|
this.$refs.copyRecord.getRecord()
|
||||||
|
},
|
||||||
|
batchDel() {
|
||||||
|
this.oneFormBatch = [
|
||||||
|
{
|
||||||
|
image: '',
|
||||||
|
price: 0,
|
||||||
|
cost: 0,
|
||||||
|
ot_price: 0,
|
||||||
|
stock: 0,
|
||||||
|
bar_code: '',
|
||||||
|
weight: 0,
|
||||||
|
volume: 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
batchAdd() {
|
||||||
|
for (const val of this.ManyAttrValue) {
|
||||||
|
this.$set(val, 'image', this.oneFormBatch[0].image)
|
||||||
|
this.$set(val, 'price', this.oneFormBatch[0].price)
|
||||||
|
this.$set(val, 'cost', this.oneFormBatch[0].cost)
|
||||||
|
this.$set(val, 'ot_price', this.oneFormBatch[0].ot_price)
|
||||||
|
this.$set(val, 'stock', this.oneFormBatch[0].stock)
|
||||||
|
this.$set(val, 'bar_code', this.oneFormBatch[0].bar_code)
|
||||||
|
this.$set(val, 'weight', this.oneFormBatch[0].weight)
|
||||||
|
this.$set(val, 'volume', this.oneFormBatch[0].volume)
|
||||||
|
this.$set(val, 'extension_one', this.oneFormBatch[0].extension_one)
|
||||||
|
this.$set(val, 'extension_two', this.oneFormBatch[0].extension_two)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 删除表格中的属性
|
||||||
|
delAttrTable(index) {
|
||||||
|
this.ManyAttrValue.splice(index, 1)
|
||||||
|
},
|
||||||
|
// 获取运费模板;
|
||||||
|
productGetTemplate() {
|
||||||
|
shippingListApi().then((res) => {
|
||||||
|
this.shippingList = res.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 获取服务保障模板
|
||||||
|
getGuaranteeList() {
|
||||||
|
guaranteeTemplateListApi().then(res => {
|
||||||
|
this.guaranteeList = res.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 删除图片
|
||||||
|
handleRemove(i) {
|
||||||
|
this.formValidate.slider_image.splice(i, 1)
|
||||||
|
},
|
||||||
|
// 选择主图
|
||||||
|
checked(item, index) {
|
||||||
|
this.formValidate.image = item
|
||||||
|
},
|
||||||
|
// 商品分类;
|
||||||
|
goodsCategory() {
|
||||||
|
categoryListApi()
|
||||||
|
.then((res) => {
|
||||||
|
this.categoryList = res.data
|
||||||
|
})
|
||||||
|
.catch((res) => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 商户分类;
|
||||||
|
getCategorySelect() {
|
||||||
|
categorySelectApi()
|
||||||
|
.then((res) => {
|
||||||
|
this.merCateList = res.data
|
||||||
|
})
|
||||||
|
.catch((res) => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 品牌筛选;
|
||||||
|
getBrandListApi() {
|
||||||
|
categoryBrandListApi()
|
||||||
|
.then((res) => {
|
||||||
|
this.BrandList = res.data
|
||||||
|
})
|
||||||
|
.catch((res) => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
virtualbtn(id, type) {
|
||||||
|
this.formValidate.type = id
|
||||||
|
this.productCon()
|
||||||
|
},
|
||||||
|
watCh(val) {
|
||||||
|
const tmp = {}
|
||||||
|
const tmpTab = {}
|
||||||
|
this.formValidate.attr.forEach((o, i) => {
|
||||||
|
tmp['value' + i] = { title: o.value }
|
||||||
|
tmpTab['value' + i] = ''
|
||||||
|
})
|
||||||
|
this.ManyAttrValue = this.attrFormat(val)
|
||||||
|
console.log(this.ManyAttrValue)
|
||||||
|
this.ManyAttrValue.forEach((val, index) => {
|
||||||
|
const key = Object.values(val.detail).sort().join('/')
|
||||||
|
if (this.attrInfo[key]) this.ManyAttrValue[index] = this.attrInfo[key]
|
||||||
|
val.image = this.formValidate.image
|
||||||
|
})
|
||||||
|
this.attrInfo = {}
|
||||||
|
this.ManyAttrValue.forEach((val) => {
|
||||||
|
if (val.detail !== 'undefined' && val.detail !== null) {
|
||||||
|
this.attrInfo[Object.values(val.detail).sort().join('/')] = val
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.manyTabTit = tmp
|
||||||
|
this.manyTabDate = tmpTab
|
||||||
|
this.formThead = Object.assign({}, this.formThead, tmp)
|
||||||
|
},
|
||||||
|
attrFormat(arr) {
|
||||||
|
let data = []
|
||||||
|
const res = []
|
||||||
|
return format(arr)
|
||||||
|
function format(arr) {
|
||||||
|
if (arr.length > 1) {
|
||||||
|
arr.forEach((v, i) => {
|
||||||
|
if (i === 0) data = arr[i]['detail']
|
||||||
|
const tmp = []
|
||||||
|
data.forEach(function(vv) {
|
||||||
|
arr[i + 1] && arr[i + 1]['detail'] && arr[i + 1]['detail'].forEach(g => {
|
||||||
|
const rep2 = (i !== 0 ? '' : arr[i]['value'] + '_$_') + vv + '-$-' + arr[i + 1]['value'] + '_$_' + g
|
||||||
|
tmp.push(rep2)
|
||||||
|
if (i === (arr.length - 2)) {
|
||||||
|
const rep4 = {
|
||||||
|
image: '',
|
||||||
|
price: 0,
|
||||||
|
cost: 0,
|
||||||
|
ot_price: 0,
|
||||||
|
stock: 0,
|
||||||
|
bar_code: '',
|
||||||
|
weight: 0,
|
||||||
|
volume: 0,
|
||||||
|
brokerage: 0,
|
||||||
|
brokerage_two: 0
|
||||||
|
}
|
||||||
|
rep2.split('-$-').forEach((h, k) => {
|
||||||
|
const rep3 = h.split('_$_')
|
||||||
|
if (!rep4['detail']) rep4['detail'] = {}
|
||||||
|
rep4['detail'][rep3[0]] = rep3.length > 1 ? rep3[1] : ''
|
||||||
|
})
|
||||||
|
Object.values(rep4.detail).forEach((v, i) => {
|
||||||
|
rep4['value' + i] = v
|
||||||
|
})
|
||||||
|
res.push(rep4)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
data = tmp.length ? tmp : []
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
const dataArr = []
|
||||||
|
arr.forEach((v, k) => {
|
||||||
|
v['detail'].forEach((vv, kk) => {
|
||||||
|
dataArr[kk] = v['value'] + '_' + vv
|
||||||
|
res[kk] = {
|
||||||
|
image: '',
|
||||||
|
price: 0,
|
||||||
|
cost: 0,
|
||||||
|
ot_price: 0,
|
||||||
|
stock: 0,
|
||||||
|
bar_code: '',
|
||||||
|
weight: 0,
|
||||||
|
volume: 0,
|
||||||
|
brokerage: 0,
|
||||||
|
brokerage_two: 0,
|
||||||
|
detail: { [v['value']]: vv }
|
||||||
|
}
|
||||||
|
Object.values(res[kk].detail).forEach((v, i) => {
|
||||||
|
res[kk]['value' + i] = v
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
data.push(dataArr.join('$&'))
|
||||||
|
}
|
||||||
|
console.log(res)
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 生成表单
|
||||||
|
add() {
|
||||||
|
if (this.soure_link) {
|
||||||
|
var reg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/
|
||||||
|
if (!reg.test(this.soure_link)) {
|
||||||
|
return this.$message.warning('请输入以http开头的地址!')
|
||||||
|
}
|
||||||
|
this.artFrom.url = this.soure_link
|
||||||
|
this.loading = true
|
||||||
|
crawlFromApi(this.artFrom)
|
||||||
|
.then((res) => {
|
||||||
|
const info = res.data
|
||||||
|
this.modals = false
|
||||||
|
this.$emit('info-data', info);
|
||||||
|
})
|
||||||
|
.catch((res) => {
|
||||||
|
this.$message.error(res.message)
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.$message.warning('请输入链接地址!')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 提交
|
||||||
|
handleSubmit(name) {
|
||||||
|
this.$refs[name].validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.modal_loading = true
|
||||||
|
this.formValidate.cate_id = this.formValidate.cate_id instanceof Array ? this.formValidate.cate_id.pop() : this.formValidate.cate_id
|
||||||
|
this.formValidate.once_count = this.formValidate.once_count || 0
|
||||||
|
if (this.formValidate.spec_type == 1) {
|
||||||
|
this.formValidate.attrValue = this.ManyAttrValue
|
||||||
|
} else {
|
||||||
|
this.formValidate.attrValue = this.OneattrValue
|
||||||
|
this.formValidate.attr = []
|
||||||
|
}
|
||||||
|
this.formValidate.is_copoy = 1
|
||||||
|
// this.formValidate.attrValue = this.items
|
||||||
|
this.loading1 = true
|
||||||
|
productCopyApi(this.formValidate)
|
||||||
|
.then((res) => {
|
||||||
|
this.$message.success('商品默认为不上架状态请手动上架商品!')
|
||||||
|
this.loading1 = false
|
||||||
|
setTimeout(() => {
|
||||||
|
this.modal_loading = false
|
||||||
|
}, 500)
|
||||||
|
setTimeout(() => {
|
||||||
|
this.modals = false
|
||||||
|
}, 600)
|
||||||
|
this.$emit('getSuccess')
|
||||||
|
})
|
||||||
|
.catch((res) => {
|
||||||
|
this.modal_loading = false
|
||||||
|
this.$message.error(res.message)
|
||||||
|
this.loading1 = false
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
if (!this.formValidate.cate_id) {
|
||||||
|
this.$message.warning('请填写商品分类!')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 点击商品图
|
||||||
|
modalPicTap(tit, num, index) {
|
||||||
|
this.tableIndex = index
|
||||||
|
const _this = this
|
||||||
|
this.$modalUpload(function(img) {
|
||||||
|
console.log(_this.formValidate.attr[_this.tableIndex])
|
||||||
|
if (tit === '1') {
|
||||||
|
if (index === 'pi') {
|
||||||
|
_this.oneFormBatch[0].image = img[0]
|
||||||
|
} else {
|
||||||
|
_this.OneattrValue[0].image = img[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tit === '2') {
|
||||||
|
_this.ManyAttrValue[_this.tableIndex].image = img[0]
|
||||||
|
}
|
||||||
|
_this.modalPic = false
|
||||||
|
// _this.formValidate.image = img[0];
|
||||||
|
// _this.OneattrValue[0].image = img[0];
|
||||||
|
}, tit)
|
||||||
|
},
|
||||||
|
// 获取单张图片信息
|
||||||
|
getPic(pc) {
|
||||||
|
this.callback(pc)
|
||||||
|
this.formValidate.attr[this.tableIndex].pic = pc.att_dir
|
||||||
|
this.modalPic = false
|
||||||
|
},
|
||||||
|
handleDragStart(e, item) {
|
||||||
|
this.dragging = item
|
||||||
|
},
|
||||||
|
handleDragEnd(e, item) {
|
||||||
|
this.dragging = null
|
||||||
|
},
|
||||||
|
// 首先把div变成可以放置的元素,即重写dragenter/dragover
|
||||||
|
handleDragOver(e) {
|
||||||
|
// e.dataTransfer.dropEffect="move";//在dragenter中针对放置目标来设置!
|
||||||
|
e.dataTransfer.dropEffect = 'move'
|
||||||
|
},
|
||||||
|
handleDragEnter(e, item) {
|
||||||
|
// 为需要移动的元素设置dragstart事件
|
||||||
|
e.dataTransfer.effectAllowed = 'move'
|
||||||
|
if (item === this.dragging) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const newItems = [...this.formValidate.slider_image]
|
||||||
|
const src = newItems.indexOf(this.dragging)
|
||||||
|
const dst = newItems.indexOf(item)
|
||||||
|
newItems.splice(dst, 0, ...newItems.splice(src, 1))
|
||||||
|
this.formValidate.slider_image = newItems
|
||||||
|
},
|
||||||
|
// 添加自定义弹窗
|
||||||
|
addCustomDialog(editorId) {
|
||||||
|
window.UE.registerUI(
|
||||||
|
'test-dialog',
|
||||||
|
function(editor, uiName) {
|
||||||
|
const dialog = new window.UE.ui.Dialog({
|
||||||
|
iframeUrl: '/admin/widget.images/index.html?fodder=dialog',
|
||||||
|
editor: editor,
|
||||||
|
name: uiName,
|
||||||
|
title: '上传图片',
|
||||||
|
cssRules: 'width:1200px;height:500px;padding:20px;'
|
||||||
|
})
|
||||||
|
this.dialog = dialog
|
||||||
|
var btn = new window.UE.ui.Button({
|
||||||
|
name: 'dialog-button',
|
||||||
|
title: '上传图片',
|
||||||
|
cssRules: `background-image: url(../../../assets/images/icons.png);background-position: -726px -77px;`,
|
||||||
|
onclick: function() {
|
||||||
|
dialog.render()
|
||||||
|
dialog.open()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return btn
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
/deep/.el-cascader {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.dialog-scustom {
|
||||||
|
width: 1200px;
|
||||||
|
height: 600px;
|
||||||
|
}
|
||||||
|
.ela-btn {
|
||||||
|
color: #2d8cf0;
|
||||||
|
}
|
||||||
|
.Box .ivu-radio-wrapper {
|
||||||
|
margin-right: 25px;
|
||||||
|
}
|
||||||
|
.Box .numPut {
|
||||||
|
width: 80% !important;
|
||||||
|
}
|
||||||
|
.lunBox {
|
||||||
|
/* width 80px */
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
border: 1px solid #0bb20c;
|
||||||
|
}
|
||||||
|
.pictrueBox {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.pictrue {
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
border: 1px dotted rgba(0, 0, 0, 0.1);
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.pictrueTab {
|
||||||
|
width: 40px !important;
|
||||||
|
height: 40px !important;
|
||||||
|
}
|
||||||
|
.upLoad {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border: 1px dotted rgba(0, 0, 0, 0.1);
|
||||||
|
border-radius: 4px;
|
||||||
|
background: rgba(0, 0, 0, 0.02);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.ft {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
.buttonGroup {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
box-sizing: border-box;
|
||||||
|
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
.buttonGroup .small-btn {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
height: 24px;
|
||||||
|
padding: 0 7px;
|
||||||
|
font-size: 14px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.buttonGroup .small-btn:first-child {
|
||||||
|
margin-left: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
}
|
||||||
|
.virtual_boder {
|
||||||
|
border: 1px solid #1890FF;
|
||||||
|
}
|
||||||
|
.virtual_boder2 {
|
||||||
|
border: 1px solid #E7E7E7;
|
||||||
|
}
|
||||||
|
.virtual_san {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-bottom: 26px solid #1890FF;
|
||||||
|
border-left: 26px solid transparent;
|
||||||
|
}
|
||||||
|
.virtual_dui {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -2px;
|
||||||
|
right: 2px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-family: system-ui;
|
||||||
|
}
|
||||||
|
.virtual {
|
||||||
|
width: 120px;
|
||||||
|
height: 60px;
|
||||||
|
background: #FFFFFF;
|
||||||
|
border-radius: 3px;
|
||||||
|
float: left;
|
||||||
|
text-align: center;
|
||||||
|
padding-top: 8px;
|
||||||
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
|
line-height: 23px;
|
||||||
|
.virtual_top {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: rgba(0, 0, 0, 0.85);
|
||||||
|
}
|
||||||
|
.virtual_bottom {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #999999;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.virtual:nth-child(2n) {
|
||||||
|
margin: 0 12px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="divBox">
|
<div class="divBox">
|
||||||
<el-card class="box-card">
|
<el-card class="box-card">
|
||||||
|
<!--顶部内容-->
|
||||||
<div slot="header" class="clearfix">
|
<div slot="header" class="clearfix">
|
||||||
<el-tabs v-model="tableFrom.type" @tab-click="getList(1),getLstFilterApi()">
|
<el-tabs v-model="tableFrom.type" @tab-click="getList(1),getLstFilterApi()">
|
||||||
<el-tab-pane v-for="(item,index) in headeNum" :key="index" :name="item.type.toString()" :label="item.name +'('+item.count +')' " />
|
<el-tab-pane v-for="(item,index) in headeNum" :key="index" :name="item.type.toString()" :label="item.name +'('+item.count +')' " />
|
||||||
|
|
@ -13,6 +14,7 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="商户名称:">
|
<el-form-item label="商户名称:">
|
||||||
<el-select v-model="tableFrom.mer_id" clearable filterable placeholder="请选择" class="selWidth" @change="getList(1)">
|
<el-select v-model="tableFrom.mer_id" clearable filterable placeholder="请选择" class="selWidth" @change="getList(1)">
|
||||||
|
<el-option label="平台" :value="0" />
|
||||||
<el-option v-for="item in merSelect" :key="item.mer_id" :label="item.mer_name" :value="item.mer_id" />
|
<el-option v-for="item in merSelect" :key="item.mer_id" :label="item.mer_name" :value="item.mer_id" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
@ -38,48 +40,49 @@
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="会员价设置:">
|
<el-form-item label="会员价设置:">
|
||||||
<el-select v-model="tableFrom.svip_price_type" placeholder="请选择" class="selWidth" clearable @change="getList(1)">
|
<el-select v-model="tableFrom.svip_price_type" placeholder="请选择" class="selWidth" clearable @change="getList(1)">
|
||||||
<el-option label="未设置" value="0" />
|
<el-option label="未设置" value="0" />
|
||||||
<el-option label="默认设置" value="1" />
|
<el-option label="默认设置" value="1" />
|
||||||
<el-option label="自定义设置" value="2" />
|
<el-option label="自定义设置" value="2" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="商品推荐:">
|
<el-form-item label="商品推荐:">
|
||||||
<el-select v-model="tableFrom.hot_type" placeholder="请选择" class="filter-item selWidth" clearable filterable @change="getList(1)">
|
<el-select v-model="tableFrom.hot_type" placeholder="请选择" class="filter-item selWidth" clearable filterable @change="getList(1)">
|
||||||
<el-option v-for="item in recommendList" :key="item.value" :label="item.name" :value="item.value" />
|
<el-option v-for="item in recommendList" :key="item.value" :label="item.name" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="商品类型:">
|
<el-form-item label="商品类型:">
|
||||||
<el-select v-model="tableFrom.is_ficti" placeholder="请选择" class="filter-item selWidth" clearable @change="getList(1)">
|
<el-select v-model="tableFrom.is_ficti" placeholder="请选择" class="filter-item selWidth" clearable @change="getList(1)">
|
||||||
<el-option v-for="item in productTypeList" :key="item.value" :label="item.label" :value="item.value" />
|
<el-option v-for="item in productTypeList" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="商品搜索:">
|
<el-form-item label="商品搜索:">
|
||||||
<el-input v-model="tableFrom.keyword" @keyup.enter.native="getList(1)" placeholder="请输入商品名称,关键字,产品编号" class="selWidth">
|
<el-input v-model="tableFrom.keyword" @keyup.enter.native="getList(1)" placeholder="请输入商品名称,关键字,产品编号" class="selWidth">
|
||||||
<el-button slot="append" icon="el-icon-search" class="el-button-solt" @click="getList(1)" />
|
<el-button slot="append" icon="el-icon-search" class="el-button-solt" @click="getList(1)" />
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<router-link :to="{ path:`${roterPre}` + '/product/addProduct' }">
|
||||||
|
<el-button size="small" type="primary">添加商品</el-button>
|
||||||
|
</router-link>
|
||||||
|
<el-button v-show="tableFrom.type === '6'" size="mini" :disabled="multipleSelection.length==0" @click="batch">批量审核</el-button>
|
||||||
|
<el-button size="mini" :disabled="multipleSelection.length==0 " @click="batchOff">批量强制下架</el-button>
|
||||||
|
<el-button size="mini" :disabled="multipleSelection.length==0 " @click="batchShow(0)">批量不显示</el-button>
|
||||||
|
<el-button size="mini" :disabled="multipleSelection.length==0 " @click="batchShow(1)">批量显示</el-button>
|
||||||
|
<el-button :disabled="multipleSelection.length==0" size="mini" @click="batchLabel">批量设置标签</el-button>
|
||||||
|
<el-button :disabled="multipleSelection.length==0" size="mini" @click="batchRecommend">批量设置推荐</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-button v-show="tableFrom.type === '6'" size="mini" :disabled="multipleSelection.length==0" @click="batch">批量审核</el-button>
|
<!--表格信息-->
|
||||||
<el-button size="mini" :disabled="multipleSelection.length==0 " @click="batchOff">批量强制下架</el-button>
|
|
||||||
<el-button size="mini" :disabled="multipleSelection.length==0 " @click="batchShow(0)">批量不显示</el-button>
|
|
||||||
<el-button size="mini" :disabled="multipleSelection.length==0 " @click="batchShow(1)">批量显示</el-button>
|
|
||||||
<el-button :disabled="multipleSelection.length==0" size="mini" @click="batchLabel">批量设置标签</el-button>
|
|
||||||
<el-button :disabled="multipleSelection.length==0" size="mini" @click="batchRecommend">批量设置推荐</el-button>
|
|
||||||
</div>
|
|
||||||
<el-table v-loading="listLoading" :data="tableData.data" style="width: 100%" size="mini" @selection-change="handleSelectionChange">
|
<el-table v-loading="listLoading" :data="tableData.data" style="width: 100%" size="mini" @selection-change="handleSelectionChange">
|
||||||
<el-table-column v-if="Number(tableFrom.type)<7" key="2" type="selection" width="55" />
|
<el-table-column v-if="Number(tableFrom.type)<7" key="2" type="selection" width="30" />
|
||||||
<el-table-column type="expand">
|
<el-table-column type="expand" align="center" width="50">
|
||||||
<template slot-scope="props">
|
<template slot-scope="props">
|
||||||
<el-form label-position="left" inline class="demo-table-expand">
|
<el-form label-position="left" inline class="demo-table-expand">
|
||||||
<el-form-item label="平台分类:">
|
<el-form-item label="平台分类:">
|
||||||
<span>{{ props.row.storeCategory?props.row.storeCategory.cate_name:'-' }}</span>
|
<span>{{ props.row.storeCategory?props.row.storeCategory.cate_name:'-' }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="商户类别:">
|
|
||||||
<span v-if="props.row.merchant" class="spBlock">{{ props.row.merchant .is_trader ? '自营' : '非自营' }}</span>
|
|
||||||
</el-form-item> -->
|
|
||||||
<el-form-item label="商品分类:">
|
<el-form-item label="商品分类:">
|
||||||
<template v-if="props.row.merCateId.length">
|
<template v-if="props.row.merCateId.length">
|
||||||
<span v-for="(item, index) in props.row.merCateId" :key="index" class="mr10">{{ item.category ? item.category.cate_name : '-' }}</span>
|
<span v-for="(item, index) in props.row.merCateId" :key="index" class="mr10">{{ item.category ? item.category.cate_name : '-' }}</span>
|
||||||
|
|
@ -101,71 +104,53 @@
|
||||||
<el-form-item label="已售数量:">
|
<el-form-item label="已售数量:">
|
||||||
<span>{{ props.row.ficti | filterEmpty }}</span>
|
<span>{{ props.row.ficti | filterEmpty }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="抵扣积分:">
|
|
||||||
<span>{{ props.row.integral_total }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="积分抵扣金额:">
|
|
||||||
<span>{{ props.row.integral_price_total }}</span>
|
|
||||||
</el-form-item> -->
|
|
||||||
</el-form>
|
</el-form>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="product_id" label="ID" min-width="80" />
|
<el-table-column prop="product_id" label="ID" min-width="50" align="center"/>
|
||||||
<el-table-column label="商品图" min-width="70">
|
<el-table-column label="商品信息" min-width="230" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<div class="demo-image__preview">
|
<div class="user-content">
|
||||||
<el-image style="width: 36px; height: 36px" :src="scope.row.image" :preview-src-list="[scope.row.image]" />
|
<div class="user-avatar">
|
||||||
|
<el-image class="logo" :src="scope.row.image" :preview-src-list="[scope.row.image]" />
|
||||||
|
</div>
|
||||||
|
<div class="user-info">
|
||||||
|
<div class="nickname">{{ scope.row.store_name || '-' }}</div>
|
||||||
|
<div :class="['agent-type-text','tags_name', 'name'+scope.row.spec_type]">{{ scope.row.spec_type==0 ? '[单规格]' : '[多规格]' }}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="store_name" label="商品名称" min-width="200">
|
<el-table-column label="商户名称" min-width="150" align="center">
|
||||||
<template slot-scope="scope">
|
|
||||||
<div><span class="tags_name" :class="'name'+scope.row.spec_type">{{ scope.row.spec_type==0 ? '[单规格]' : '[多规格]' }}</span>{{ scope.row.store_name || '-' }}</div>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="商户名称" min-width="150">
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ scope.row.merchant ? scope.row.merchant.mer_name : '' }}</span>
|
<span>{{ scope.row.merchant ? scope.row.merchant.mer_name : '' }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- <el-table-column prop="mer_name" label="商户类别" min-width="90">
|
<el-table-column prop="price" label="商品售价" min-width="80" align="center"/>
|
||||||
<template slot-scope="scope">
|
<el-table-column prop="sales" label="销量" min-width="70" align="center"/>
|
||||||
<span v-if="scope.row.merchant" class="spBlock">{{ scope.row.merchant .is_trader ? '自营' : '非自营' }}</span>
|
<el-table-column prop="stock" label="库存" min-width="70" align="center"/>
|
||||||
</template>
|
<el-table-column label="推荐级别" min-width="130" align="center">
|
||||||
</el-table-column> -->
|
|
||||||
<el-table-column prop="price" label="商品售价" min-width="80" />
|
|
||||||
<!-- <el-table-column prop="svip_price" label="会员价" min-width="70">
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<span>{{ scope.row.svip_price || '-' }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column> -->
|
|
||||||
<el-table-column prop="sales" label="销量" min-width="70" />
|
|
||||||
<!-- <el-table-column prop="integral_total" label="抵扣积分" min-width="90" />
|
|
||||||
<el-table-column prop="integral_price_total" label="积分抵扣金额" min-width="90" /> -->
|
|
||||||
<el-table-column prop="stock" label="库存" min-width="70" />
|
|
||||||
<el-table-column label="推荐级别" min-width="150">
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-rate disabled v-model="scope.row.star" :colors="colors">
|
<el-rate disabled v-model="scope.row.star" :colors="colors">
|
||||||
</el-rate>
|
</el-rate>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="rank" label="排序" min-width="60" />
|
<el-table-column prop="rank" label="排序" min-width="50" align="center"/>
|
||||||
<el-table-column prop="status" label="是否显示" min-width="80">
|
<el-table-column prop="status" label="是否显示" min-width="80" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-switch v-model="scope.row.is_used" :active-value="1" :inactive-value="0" active-text="显示" inactive-text="隐藏" @change="onchangeIsShow(scope.row)" />
|
<div class="switch-content">
|
||||||
|
<el-switch v-model="scope.row.is_used" :active-value="1" :inactive-value="0" active-text="显示" inactive-text="隐藏" @change="onchangeIsShow(scope.row)" />
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="stock" label="商品状态" min-width="90">
|
<el-table-column prop="stock" label="商品状态" min-width="90" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ scope.row.us_status | productStatusFilter }}</span>
|
<div class="switch-content" v-if="scope.row.mer_id <= 0">
|
||||||
|
<el-switch :value="Number(scope.row.us_status) == 1" active-text="上架" inactive-text="下架" @change="changeStatus(scope.row)" />
|
||||||
|
</div>
|
||||||
|
<span v-else>{{ scope.row.us_status | productStatusFilter }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- <el-table-column prop="stock" label="标签" max-height="120" min-width="90" show-overflow-tooltip>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<span v-for="(item,index) in scope.row.sys_labels" :key="index" class="label-list">{{ item.name }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="create_time" label="创建时间" min-width="150" /> -->
|
|
||||||
<el-table-column v-if="Number(tableFrom.type) < 7" key="8" label="操作" min-width="180" fixed="right" align="center">
|
<el-table-column v-if="Number(tableFrom.type) < 7" key="8" label="操作" min-width="180" fixed="right" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button type="text" size="small" @click="onDetails(scope.row.product_id)">详情</el-button>
|
<el-button type="text" size="small" @click="onDetails(scope.row.product_id)">详情</el-button>
|
||||||
|
|
@ -178,7 +163,7 @@
|
||||||
</span>
|
</span>
|
||||||
<el-dropdown-menu slot="dropdown">
|
<el-dropdown-menu slot="dropdown">
|
||||||
<!-- <el-dropdown-item @click.native="onDetails(scope.row.product_id)">查看详情</el-dropdown-item> -->
|
<!-- <el-dropdown-item @click.native="onDetails(scope.row.product_id)">查看详情</el-dropdown-item> -->
|
||||||
<el-dropdown-item v-if="Number(tableFrom.type) < 7" @click.native="onEdit(scope.row.product_id)">编辑商品</el-dropdown-item>
|
<el-dropdown-item v-if="Number(tableFrom.type) < 7" @click.native="onEdit(scope.row)">编辑商品</el-dropdown-item>
|
||||||
<el-dropdown-item v-if="tableFrom.type != 5">
|
<el-dropdown-item v-if="tableFrom.type != 5">
|
||||||
<router-link :to="{path: roterPre + '/product/comment/?product_id=' + scope.row.product_id}" style="font-size: 14px;">
|
<router-link :to="{path: roterPre + '/product/comment/?product_id=' + scope.row.product_id}" style="font-size: 14px;">
|
||||||
查看评价
|
查看评价
|
||||||
|
|
@ -306,7 +291,8 @@ import {
|
||||||
updatetProductLabel,
|
updatetProductLabel,
|
||||||
batchesLabelsApi,
|
batchesLabelsApi,
|
||||||
batchesRecommendApi,
|
batchesRecommendApi,
|
||||||
batchesOnOffApi
|
batchesOnOffApi,
|
||||||
|
changeProductStatus
|
||||||
} from '@/api/product'
|
} from '@/api/product'
|
||||||
import { roterPre } from '@/settings'
|
import { roterPre } from '@/settings'
|
||||||
import infoFrom from './info'
|
import infoFrom from './info'
|
||||||
|
|
@ -385,7 +371,7 @@ export default {
|
||||||
store_name: '',
|
store_name: '',
|
||||||
rank: '',
|
rank: '',
|
||||||
us_status: '',
|
us_status: '',
|
||||||
star: ''
|
star: 0
|
||||||
},
|
},
|
||||||
productStatusList: [
|
productStatusList: [
|
||||||
{ label: "上架显示", value: 1 },
|
{ label: "上架显示", value: 1 },
|
||||||
|
|
@ -454,15 +440,24 @@ export default {
|
||||||
this.getLstFilterApi()
|
this.getLstFilterApi()
|
||||||
},
|
},
|
||||||
onchangeIsShow(row) {
|
onchangeIsShow(row) {
|
||||||
changeApi(row.product_id, row.is_used).then(({
|
changeApi(row.product_id, row.is_used).then(({message}) => {
|
||||||
message
|
|
||||||
}) => {
|
|
||||||
this.$message.success(message)
|
this.$message.success(message)
|
||||||
this.getList('')
|
this.getList('')
|
||||||
this.getLstFilterApi()
|
this.getLstFilterApi()
|
||||||
}).catch(({
|
}).catch(({message}) => {
|
||||||
message
|
this.$message.error(message)
|
||||||
}) => {
|
})
|
||||||
|
},
|
||||||
|
// 修改商品状态
|
||||||
|
changeStatus(row){
|
||||||
|
// 状态取反
|
||||||
|
let status = Number(row.us_status) == 1 ? 0 : 1;
|
||||||
|
// 发起请求
|
||||||
|
changeProductStatus(row.product_id, status).then(({message}) => {
|
||||||
|
this.$message.success(message)
|
||||||
|
this.getList('')
|
||||||
|
this.getLstFilterApi()
|
||||||
|
}).catch(({message}) => {
|
||||||
this.$message.error(message)
|
this.$message.error(message)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
@ -573,10 +568,16 @@ export default {
|
||||||
this.fullscreenLoading = false
|
this.fullscreenLoading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
onEdit(id) {
|
onEdit(product) {
|
||||||
this.productId = id
|
let merId = product.mer_id || 0;
|
||||||
this.getInfo(id)
|
// 判断:如果merId 大于0 则商品为商户添加商品,只能进行基本信息编辑;否则是平台添加商品 可以进行全部信息编辑
|
||||||
this.dialogVisible = true
|
if(merId <= 0){
|
||||||
|
this.$router.push({path: this.roterPre + '/product/addProduct/' + product.product_id});
|
||||||
|
}else{
|
||||||
|
this.productId = product.product_id
|
||||||
|
this.getInfo(product.product_id)
|
||||||
|
this.dialogVisible = true
|
||||||
|
}
|
||||||
},
|
},
|
||||||
// 编辑虚拟销量
|
// 编辑虚拟销量
|
||||||
toVirtualSales(id) {
|
toVirtualSales(id) {
|
||||||
|
|
@ -752,6 +753,22 @@ export default {
|
||||||
/deep/.el-select-dropdown__item{
|
/deep/.el-select-dropdown__item{
|
||||||
max-width: 350px!important;
|
max-width: 350px!important;
|
||||||
}
|
}
|
||||||
|
/deep/ .el-table__cell {
|
||||||
|
.cell{
|
||||||
|
padding: 0!important;
|
||||||
|
.el-table__expand-icon{
|
||||||
|
height: 50px!important;
|
||||||
|
line-height: 50px!important;
|
||||||
|
.el-icon.el-icon-arrow-right{
|
||||||
|
font-size: 30px !important;
|
||||||
|
height: 50px !important;
|
||||||
|
line-height: 50px !important;
|
||||||
|
text-align: center;
|
||||||
|
position: unset!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.template{
|
.template{
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
@ -768,7 +785,7 @@ export default {
|
||||||
background: rgba(0, 0, 0, 0.5);
|
background: rgba(0, 0, 0, 0.5);
|
||||||
}
|
}
|
||||||
.tags_name{
|
.tags_name{
|
||||||
font-size: 10px;
|
font-size: 13px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
padding: 0 2px;
|
padding: 0 2px;
|
||||||
|
|
@ -812,9 +829,78 @@ table .el-image {
|
||||||
color: #409EFF;
|
color: #409EFF;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-icon-arrow-down {
|
.el-icon-arrow-down {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
.user-content{
|
||||||
|
--user-content-height-: 80px;
|
||||||
|
|
||||||
|
height: var(--user-content-height-);
|
||||||
|
width: 100%;
|
||||||
|
display: inline-flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: center;
|
||||||
|
.user-avatar{
|
||||||
|
height: var(--user-content-height-);
|
||||||
|
width: var(--user-content-height-);
|
||||||
|
display: inline-flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
.logo{
|
||||||
|
height: 80%!important;
|
||||||
|
width: 80%!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.user-info{
|
||||||
|
max-width: calc(100% - var(--user-content-height-));
|
||||||
|
height: var(--user-content-height-);
|
||||||
|
display: inline-flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: flex-start;
|
||||||
|
.nickname{
|
||||||
|
width: 100%;
|
||||||
|
height: 25px;
|
||||||
|
line-height: 25px;
|
||||||
|
text-align: left;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: bold;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
display: inline-flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: center;
|
||||||
|
.user-id{
|
||||||
|
color: #fff;
|
||||||
|
background-color: #409eff;
|
||||||
|
border-color: #409eff;
|
||||||
|
height: 18px;
|
||||||
|
line-height: 20px;
|
||||||
|
font-size: 13px;
|
||||||
|
padding: 0 5px;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-left: 10px;
|
||||||
|
width: max-content!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.user-id{
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: calc(var(--user-content-height- * 35%));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.switch-content{
|
||||||
|
text-align: justify!important;
|
||||||
|
display: inline-flex;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue