new-admin-view/src/views/marketing/exchange/pickupPoint/index.vue

639 lines
22 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="divBox">
<el-card class="box-card">
<!--顶部搜索栏-->
<div slot="header" class="clearfix">
<div class="container">
<el-form inline size="small" label-width="80px">
<el-form-item label="搜索:">
<el-input v-model="tableFrom.uid" placeholder="请输入用户ID" class="selWidth" clearable />
<el-input v-model="tableFrom.address" placeholder="请输入地址" class="selWidth" clearable>
<el-button slot="append" icon="el-icon-search" class="el-button-solt" @click="getList(1)" />
</el-input>
</el-form-item>
<el-form-item class="width100">
<el-button size="small" type="primary" @click="addPickupPoint(0)">添加酒道馆</el-button>
</el-form-item>
</el-form>
</div>
</div>
<!--表格信息-->
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="酒道馆管理" name="list">
<el-table v-loading="listLoading" :data="tableData.data" style="width: 100%" size="mini">
<el-table-column prop="id" label="ID" min-width="100" align="center"/>
<el-table-column label="名称" prop="title" align="center"/>
<el-table-column label="地址" prop="address" align="center"/>
<el-table-column label="状态" align="center">
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.is_show == 1" effect="dark">正常</el-tag>
<el-tag type="danger" v-else effect="dark">暂停使用</el-tag>
</template>
</el-table-column>
<el-table-column label="负责人数" align="center" min-width="200" >
<template slot-scope="scope">
<div class="staff">
<div class="block" v-for="(item,index) in Object.values(scope.row.user_list)" :key="index">
<img class="avatar" :src="item.avatar || moren" />
<div class="info">
<div class="name">{{ item.nickname || item.real_name }}</div>
<div class="uid">UID{{ item.uid }}</div>
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="添加时间" prop="create_time" min-width="150" align="center"/>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button type="primary" @click="addPickupPoint(scope.row.id)">编辑</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="提货记录" name="record">
<el-table v-loading="listLoading" :data="tableData.data" style="width: 100%" size="mini">
<el-table-column prop="id" label="ID" min-width="100" align="center"/>
<el-table-column label="提货用户" min-width="150" align="center">
<template slot-scope="scope">
<div class="user-content">
<div class="user-avatar" v-if="scope.row.avatar && scope.row.avatar != 1">
<img :src="scope.row.avatar" />
</div>
<div class="user-info">
<div class="nickname">{{ scope.row.nickname }}</div>
<div class="user-id">ID{{ scope.row.uid }}</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="操作员" min-width="150" align="center">
<template slot-scope="scope">
<div class="user-content">
<div class="user-avatar" v-if="scope.row.staff_avatar && scope.row.staff_avatar != 1">
<img :src="scope.row.staff_avatar" />
</div>
<div class="user-info">
<div class="nickname">{{ scope.row.staff_nickname }}</div>
<div class="user-id">ID{{ scope.row.staff_uid }}</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="酒道馆" min-width="150" align="center">
<template slot-scope="scope">
{{ scope.row.point_title }}<br />
{{ scope.row.point_address }}
</template>
</el-table-column>
<el-table-column label="总价值" prop="total_money" min-width="80" align="center"/>
<el-table-column label="使用积分" prop="use_integral" min-width="80" align="center"/>
<el-table-column label="差价" prop="diff_money" min-width="80" align="center"/>
<el-table-column label="实付差价" prop="diff_money_pay" min-width="80" align="center"/>
<el-table-column label="兑换时间" prop="create_time" min-width="80" align="center"/>
</el-table>
</el-tab-pane>
</el-tabs>
<!--分页-->
<div class="block">
<el-pagination
:page-sizes="[20, 40, 60, 80]"
: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>
</el-card>
<!--编辑弹框-->
<el-drawer :with-header="false" :size="1000" :visible.sync="drawer_show" direction="rtl" :before-close="handleClose">
<el-form ref="editInfoField" size="small" :rules="ruleValidate" :model="editInfo" label-width="130px" @submit.native.prevent>
<el-tabs type="border-card">
<div class="section">
<div class="title">酒道馆信息</div>
<el-row>
<el-col :span="12">
<el-form-item label="名称:" prop="title">
<el-input v-model="editInfo.title" placeholder="请填写酒道馆名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态:" prop="is_show">
<el-switch v-model="editInfo.is_show" :active-value="1" :inactive-value="0" :width="55" active-text="开启" inactive-text="关闭" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="经纬度:" prop="lat">
<el-input :value="(editInfo.lat || '') + ',' + (editInfo.lng || '')" readonly enter-button="查找位置" style="width: 100%;" placeholder="请点击查找位置选择位置">
<el-button slot="append" style="background: #46a6ff; color: #fff; border-radius: 0 4px 4px 0;" @click="onSearchs" >查找位置</el-button>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="详细地址:" prop="address">
<el-input v-model="editInfo.address" placeholder="请填写酒道馆详细地址" />
</el-form-item>
</el-col>
</el-row>
<div class="title">
负责人
<el-button size="small" type="primary" @click="addStaff">添加负责人</el-button>
</div>
<div class="staff-list">
<div class="staff-box" v-for="(item,index) in Object.values(editInfo.user_list)" :key="index">
<img class="staff-avatar" :src="item.avatar || moren" />
<div class="staff-info">
<div class="staff-name">{{ item.nickname || item.real_name }}</div>
<div class="staff-uid">UID{{ item.uid }}</div>
</div>
<el-button type="danger" icon="el-icon-delete" circle @click="closeStaffConfirm(item.uid)"></el-button>
</div>
</div>
<el-button size="small" type="success" @click="submitEditInfo">提交</el-button>
</div>
</el-tabs>
</el-form>
</el-drawer>
<!--用户选择-->
<el-dialog title="负责人选择" :visible.sync="userSelectVisible" width="80%" :before-close="closeStaff">
<el-card class="box-card">
<!--顶部搜索栏-->
<div slot="header" class="clearfix">
<div class="container">
<el-form inline size="small" label-width="80px">
<el-form-item label="">
<el-input v-model="userTableFrom.nickname" placeholder="请输入用户昵称" class="selWidth" clearable />
<el-input v-model="userTableFrom.phone" placeholder="请输入用户手机号" class="selWidth" clearable />
<el-input v-model="userTableFrom.uid" placeholder="请输入用户ID" class="selWidth" clearable>
<el-button slot="append" icon="el-icon-search" class="el-button-solt" @click="getUserList(1)" />
</el-input>
</el-form-item>
</el-form>
</div>
</div>
<!--表格信息-->
<el-table v-loading="userListLoading" :data="userTableData.data" :key="Object.values(editInfo.uid_list).toString()" style="width: 100%" size="mini">
<el-table-column label="用户信息" prop="nickname" min-width="300" align="center">
<template slot-scope="scope">
<div class="user-content">
<div class="user-avatar">
<img :src="scope.row.avatar || moren" />
</div>
<div class="user-info">
<div class="nickname">{{ scope.row.nickname }}</div>
<div class="user-id">ID{{ scope.row.uid }}</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="联系电话" prop="phone" min-width="150" align="center"/>
<el-table-column label="是否为当前酒道馆负责人" min-width="200" align="center">
<template slot-scope="scope">
<el-tag type="success" v-if="Object.values(editInfo.uid_list).includes(String(scope.row.uid))" effect="dark">是</el-tag>
<el-tag type="info" v-else effect="dark">不是</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" min-width="150" align="center">
<template slot-scope="scope">
<el-button type="danger" v-if="Object.values(editInfo.uid_list).includes(String(scope.row.uid))" effect="dark" @click="closeStaffConfirm(scope.row.uid)">取消</el-button>
<el-button type="success" v-else effect="dark" @click="addStaffConfirm(scope.row)">添加</el-button>
</template>
</el-table-column>
</el-table>
<!--分页-->
<div class="block">
<el-pagination
:page-sizes="[20, 40, 60, 80]"
:page-size="userTableFrom.limit"
:current-page="userTableFrom.page"
layout="total, sizes, prev, pager, next, jumper"
:total="userTableData.total"
@size-change="handleUserSizeChange"
@current-change="pageUserChange"
/>
</div>
</el-card>
<span slot="footer" class="dialog-footer">
<el-button @click="userSelectVisible = false">关 闭</el-button>
</span>
</el-dialog>
<!--地图定位-->
<el-dialog
v-if="modalMap"
v-model="modalMap"
:visible.sync="modalMap"
title="选择位置"
close-on-click-modal
class="mapBox"
custom-class="dialog-scustom"
:append-to-body='true'
width="80%"
top="20px"
>
<iframe id="mapPage" width="100%" height="700px" frameborder="0" :src="keyUrl" />
</el-dialog>
</div>
</template>
<script>
import {pickupPointList, pickupPointEdit, pickupPointInfo} from '@/api/marketing'
import {userLstApi} from "@/api/user";
import {configApi} from "@/api/system";
export default {
name: "preSaleProductList",
components: { },
data() {
return {
moren: require("@/assets/images/f.png"),
// 编辑弹框
drawer_show: false,
editInfo: {
title: '',
address: '',
is_show: 1,
uid_list: [],
user_list: {},
},
activeName: 'list',
ruleValidate: {
title: [{ required: true, message: '请填写酒道馆名称', trigger: 'blur' }],
lat: [{ required: true, message: '请选择酒道馆经纬度', trigger: 'blur' }],
address: [{ required: true, message: '请填写酒道馆详细地址', trigger: 'blur' }],
},
// 用户选择弹框
userSelectVisible: false,
userListLoading: true,
userTableFrom: {
page: 1,
limit: 20,
nickname: '',
phone: '',
uid: ''
},
userTableData: {
data: [],
total: 0,
},
// 列表相关
listLoading: true,
tableData: {
data: [],
total: 0,
},
tableFrom: {
page: 1,
limit: 20,
uid: '',
address: '',
title:'',
},
loading: false,
cardLists: [],
// 定位相关
modalMap: false,
mapKey: '',
keyUrl: '',
delivery_type: '',
};
},
watch: {},
mounted() {
window.addEventListener(
'message',
function(event) {
// 接收位置信息,用户选择确认位置点后选点组件会触发该事件,回传用户的位置信息
var loc = event.data
console.log(loc)
if (loc && loc.module === 'locationPicker') {
// 防止其他应用也会向该页面post信息需判断module是否为'locationPicker'
window.parent.selectAddress(loc)
}
},
false
)
window.selectAddress = this.selectAddress
this.getList('');
this.getMapKey();
},
methods: {
// 编辑取货点 - 弹出表单
addPickupPoint(id){
if (Number(id) > 0) {
// 编辑
let _this = this;
pickupPointInfo(id)
.then((res) => {
_this.editInfo = res.data;
_this.drawer_show = true;
})
.catch((res) => {
this.$message.error(res.message);
});
} else {
// 添加
this.editInfo = this.$options.data().editInfo;
this.drawer_show = true;
}
},
// 编辑取货点 - 关闭表单
handleClose() {
this.drawer_show = false;
},
// 编辑取货点 - 添加负责人弹框显示
addStaff(){
this.getUserList(1);
this.userSelectVisible = true;
},
// 编辑取货点 - 添加负责人弹框关闭
closeStaff() {
this.userSelectVisible = false;
},
// 编辑取货点 - 获取用户列表及分页相关
getUserList(num) {
let _this = this;
this.userListLoading = true;
this.userTableFrom.page = num ? num : this.userTableFrom.page;
userLstApi(this.userTableFrom)
.then((res) => {
this.userTableData.data = res.data.list;
this.userTableData.total = res.data.count;
this.userListLoading = false;
})
.catch((res) => {
this.userListLoading = false;
this.$message.error(res.message);
});
},
pageUserChange(page) {
this.userTableFrom.page = page;
this.getUserList('');
},
handleUserSizeChange(val) {
this.userTableFrom.limit = val;
this.getUserList('');
},
// 编辑取货点 - 添加负责人
addStaffConfirm(item){
this.editInfo.uid_list[String(item.uid)] = String(item.uid);
this.editInfo.user_list[String(item.uid)] = item;
this.$forceUpdate();
},
// 编辑取货点 - 删除负责人
closeStaffConfirm(uid){
delete this.editInfo.uid_list[String(uid)];
delete this.editInfo.user_list[String(uid)];
this.$forceUpdate();
},
// 编辑取货点 - 提交信息
submitEditInfo(){
let _this = this;
let editInfo = Object.assign({},_this.editInfo);
editInfo.uid_list = Object.values(editInfo.uid_list);
delete editInfo.user_list
this.$refs['editInfoField'].validate(valid => {
if (valid) {
pickupPointEdit(editInfo).then((res) => {
if(res.status == 200){
_this.$message.success('操作成功');
_this.handleClose();
_this.getList(1);
_this.$forceUpdate();
}
}).catch((res) => {
_this.$message.error(res.message)
})
}
});
},
// 获取列表
getList(num) {
let _this = this;
_this.listLoading = true;
_this.tableFrom.page = num ? num : _this.tableFrom.page;
pickupPointList(_this.activeName, _this.tableFrom)
.then((res) => {
_this.tableData.data = res.data.list;
_this.tableData.total = res.data.count;
_this.listLoading = false;
})
.catch((res) => {
_this.listLoading = false;
_this.$message.error(res.message);
});
},
pageChange(page) {
this.tableFrom.page = page;
this.getList('');
},
handleSizeChange(val) {
this.tableFrom.limit = val;
this.getList('');
},
// 切换选项卡
handleClick(tab, event){
this.tableData = this.$options.data().tableData;
this.tableFrom = this.$options.data().tableFrom;
this.getList(1);
},
// 定位处理 - 获取地图key
getMapKey() {
configApi().then(res => {
console.log(res);
this.mapKey = res.data.tx_map_key
const keys = res.data.tx_map_key
this.keyUrl = `https://apis.map.qq.com/tools/locpicker?type=1&key=${keys}&referer=myapp`
this.delivery_type = res.data.delivery_type
})
.catch(res => {
this.$message.error(res.message)
})
},
// 定位处理
onSearchs() {
if (!this.mapKey || this.mapKey == '') this.$message.error('平台未配置腾讯地图KEY')
else this.modalMap = true
},
// 选择经纬度
selectAddress(data) {
this.editInfo.lat = data.latlng.lat
this.editInfo.lng = data.latlng.lng
this.editInfo.address = data.poiaddress || ''
this.modalMap = false
this.$forceUpdate();
},
},
};
</script>
<style scoped lang="scss">
.selWidth {
width: 350px !important;
}
.seachTiele {
line-height: 35px;
}
.title{
margin-bottom: 16px;
color: #17233d;
font-size: 14px;
font-weight: bold;
}
.scollhide::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
.user-content{
--user-content-height-: 80px;
height: var(--user-content-height-);
width: 100%;
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: center;
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;
img{
height: 80%!important;
width: 80%!important;
border-radius: 50% !important;
}
}
.user-info{
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%;
text-align: left;
font-size: 15px;
font-weight: bold;
line-height: calc(var(--user-content-height- * 65%));
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.user-id{
width: 100%;
text-align: left;
font-size: 13px;
line-height: calc(var(--user-content-height- * 35%));
}
}
}
.marginTop10{
margin-top: 10px!important;
}
.staff{
width: 100%;
display: inline-flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
.block{
margin-bottom: 10px;
margin-right: 10px;
padding-bottom: 5px;
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
border-bottom: 1px solid #CCCCCC;
width: calc((100% - 15px) / 2);
align-items: center;
.avatar{
width: 35px;
height: 35px;
border-radius: 50%;
}
.info{
width: calc(100% - 35px);
padding-left: 10px;
.name{
text-align: left;
width: 100%;
font-size: 15px;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.uid{
text-align: left;
width: 100%;
font-size: 13px;
}
}
}
.block:nth-child(2n){
margin-right: 0!important;
}
}
.staff-list{
width: 100%;
margin-bottom: 30px;
.staff-box{
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
width: calc((100% - 20px)/ 3);
border: 1px solid #CCCCCC;
box-shadow: 0 0 5px 0px #F6F6F6;
padding: 10px;
border-radius: 10px;
margin-bottom: 10px;
margin-right: 10px;
.staff-avatar{
width: 60px;
height: 60px;
border-radius: 50%;
}
.staff-info{
width: calc(100% - (60px + 36px));
padding-left: 10px;
.staff-name{
text-align: left;
width: 100%;
font-size: 15px;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.staff-uid{
text-align: left;
width: 100%;
font-size: 13px;
}
}
}
.staff-box:nth-child(3n){
margin-right: 0px!important;
}
}
#mapPage{
height: calc(100vh - 100px) !important;
}
</style>