You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2674 lines
72 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container">
<el-descriptions class="margin-top" style="font-size: 18px">
<el-descriptions-item
label="用户总数"
label-style="border-left: solid 2px #419EFF;padding-left:10px;color:#000"
>{{ count.userNum }}
</el-descriptions-item>
<el-descriptions-item
label="已注册用户"
label-style="border-left: solid 2px #419EFF;padding-left:10px;color:#000"
>{{ count.userRegisterNum }}
</el-descriptions-item>
<el-descriptions-item
label="已绑定仪器用户数"
label-style="border-left: solid 2px #419EFF;padding-left:10px;color:#000"
>
{{ count.userDeviceNum }}
</el-descriptions-item>
</el-descriptions>
<el-collapse accordion style="margin-bottom: 10px" v-model="activeNames">
<el-collapse-item name="search">
<template slot="title">
<div
class="margin-top"
style="
border-left: solid 2px #419eff;
padding-left: 10px;
font-size: 18px !important;
color: #000;
"
>
搜索
</div>
</template>
<div style="margin-top: 10px">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="100px"
>
<div style="display: flex">
<el-form-item label="用户类型" prop="userType">
<el-select
style="width: 120px"
v-model="queryParams.userType"
@keyup.enter.native="handleQuery"
>
<el-option label="全部" :value="null"></el-option>
<el-option label="会员" :value="1"></el-option>
<el-option label="游客" :value="0"></el-option>
</el-select>
</el-form-item>
<el-form-item label="会员昵称" prop="nickname">
<el-input
style="width: 200px"
v-model="queryParams.nickname"
placeholder="请输入单个会员昵称进行搜索"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-popover
placement="top-start"
width="200"
trigger="click"
content="手机号码和用户编号,满足其中之一内容即可"
>
<el-form-item label="手机号码" prop="mobile" slot="reference">
<el-input
style="width: 200px"
v-model="queryParams.mobile"
placeholder="搜索多个请用英文逗号隔开"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
</el-popover>
<el-popover
placement="top-start"
width="200"
trigger="click"
content="手机号码和用户编号,满足其中之一内容即可"
>
<el-form-item label="用户编号" prop="id" slot="reference">
<el-input
style="width: 200px"
v-model="queryParams.id"
placeholder="搜索多个请用英文逗号隔开"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
</el-popover>
</div>
<div style="display: flex">
<div style="width: 20px"></div>
<div class="mini-label">
<el-form-item label="生日" prop="birthday">
<el-date-picker
style="width: 126px"
clearable
v-model="queryParams.birthday"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择生日"
>
</el-date-picker>
</el-form-item>
</div>
<div class="mini-label">
<el-form-item label="省" prop="provinceId">
<el-select
style="width: 120px"
v-model="queryParams.provinceId"
@change="getCityList(queryParams.provinceId)"
placeholder="请选择省"
@keyup.enter.native="handleQuery"
filterable
clearable
@clear="clearOption(1)"
>
<el-option
v-for="item in provinceList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</div>
<div class="mini-label">
<el-form-item label="市" prop="cityId">
<el-select
style="width: 120px"
v-model="queryParams.cityId"
@change="getAreaByPid(queryParams.cityId)"
@clear="clearOption(2)"
@keyup.enter.native="handleQuery"
filterable
clearable
placeholder="请选择市"
>
<el-option
v-for="item in cityList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</div>
<div class="mini-label">
<el-form-item label="区" prop="areaId">
<el-select
style="width: 120px"
v-model="queryParams.areaId"
@keyup.enter.native="handleQuery"
filterable
clearable
placeholder="请选择区"
>
<el-option
v-for="item in areaList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</div>
<!-- <div class="mini-label"></div>
<div class="mini-label"></div> -->
<el-form-item label="用户注册时间" prop="createTime">
<el-date-picker
style="width: 360px"
v-model="dateRange"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
value-format="yyyy-MM-dd HH:mm:ss"
end-placeholder="结束日期"
align="right"
>
</el-date-picker>
</el-form-item>
</div>
<div style="display: flex">
<el-form-item label="仪器绑定" prop="devicesTags">
<el-select
v-model="queryParams.devicesIdList"
multiple
placeholder="请选择"
>
<el-option
v-for="item in deviceList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="仪器数量" prop="credit">
<el-input-number
:min="0"
:precision="0"
v-model="queryParams.deviceNumStart"
@keyup.enter.native="handleQuery"
></el-input-number>
<el-input-number
:min="0"
:precision="0"
v-model="queryParams.deviceNumEnd"
@keyup.enter.native="handleQuery"
></el-input-number>
</el-form-item>
<el-form-item label="积分范围" prop="credit">
<el-input-number
:min="0"
:precision="0"
v-model="queryParams.creditStart"
@keyup.enter.native="handleQuery"
></el-input-number>
<el-input-number
:min="0"
:precision="0"
v-model="queryParams.creditEnd"
@keyup.enter.native="handleQuery"
></el-input-number>
</el-form-item>
</div>
<!-- <el-form-item label="购买渠道" prop="purchaseChannels">-->
<!-- <el-select v-model="queryParams.purchaseChannels" multiple placeholder="请选择">-->
<!-- <el-option-->
<!-- v-for="item in purchaseChannels"-->
<!-- :key="item.value"-->
<!-- :label="item.label"-->
<!-- :value="item.value">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<div style="display: flex">
<el-popover
placement="top-start"
width="200"
trigger="click"
content="外部标签和小程序标签,同时满足所选内容"
>
<el-form-item
label="外部标签"
prop="wecomTags"
slot="reference"
>
<el-select
v-model="queryParams.wecomTags"
multiple
placeholder="请选择"
>
<el-option
v-for="item in wecomTags"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-popover>
<el-popover
placement="top-start"
width="200"
trigger="click"
content="外部标签和小程序标签,同时满足所选内容"
>
<el-form-item
label="小程序标签"
prop="miniProgramTags"
slot="reference"
>
<el-select
v-model="queryParams.miniProgramTags"
multiple
placeholder="请选择"
>
<el-option
v-for="item in miniProgramTags"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-popover>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
</el-form-item>
</div>
</el-form>
</div>
</el-collapse-item>
</el-collapse>
<!-- 批量操作下拉选项 -->
<div
class="margin-top"
style="
border-left: solid 2px #419eff;
padding-left: 10px;
font-size: 18px;
color: #000;
margin-bottom: 10px;
"
>
批量操作
</div>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-select
v-model="batchOperateValue"
placeholder="批量操作"
size="mini"
clearable
>
<el-option label="批量添加小程序标签" :value="1"></el-option>
<el-option label="批量删除小程序标签" :value="2"></el-option>
<el-option label="全量添加小程序标签" :value="3"></el-option>
<el-option label="全量删除小程序标签" :value="4"></el-option>
<el-option label="批量加减积分" :value="5"></el-option>
<el-option label="全量加减积分" :value="6"></el-option>
<el-option label="批量发送话术" :value="7"></el-option>
<el-option label="全量发送话术" :value="8"></el-option>
<el-option label="批量备注" :value="9"></el-option>
<el-option label="全量备注" :value="10"></el-option>
<el-option label="注销账号" :value="11"></el-option>
<el-option label="导出数据" :value="12"></el-option>
<el-option label="导出全量数据" :value="13"></el-option>
</el-select>
</el-col>
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-warning"
size="mini"
@click="batchOperate()"
>确认
</el-button>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<!-- 显示表格 -->
<el-table
v-loading="loading"
:data="memberList"
@selection-change="handleSelectionChange"
>
<el-table-column
fixed="left"
type="selection"
width="55"
align="center"
/>
<el-table-column label="头像" align="center">
<template slot-scope="scope">
<el-avatar shape="circle" :size="50" :src="scope.row.headimg" />
</template>
</el-table-column>
<el-table-column label="会员昵称" align="center" prop="nickname" />
<el-table-column label="用户编号" align="center" prop="id" />
<el-table-column
label="手机号码"
align="center"
prop="mobile"
width="120px"
/>
<el-table-column
label="生日"
align="center"
prop="birthday"
width="120px"
/>
<el-table-column
label="地区"
align="center"
prop="province"
width="150px"
>
<template slot-scope="scope">
<span>{{ scope.row.province }}</span
><br />
<span>{{ scope.row.city }}</span
><br />
<span>{{ scope.row.area }}</span>
</template>
</el-table-column>
<el-table-column
label="信息完善"
align="center"
prop="isCompleteInformation"
>
<template slot-scope="scope">
<span style="color: red" v-show="scope.row.isCompleteInformation == 0"
>未完善</span
>
<span v-show="scope.row.isCompleteInformation == 1">已完善</span>
</template>
</el-table-column>
<el-table-column
label="用户注册时间"
align="center"
prop="createTime"
width="200px"
/>
<el-table-column label="仪器" align="center" prop="devicesNum">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
@click="viewUserInstrumentDetail(scope.row)"
>
{{ scope.row.devicesNum }}
</el-button>
</template>
</el-table-column>
<el-table-column
label="小程序标签"
align="center"
prop="miniProgramTags"
width="150px"
>
<template slot-scope="scope">
<el-tag v-for="item in scope.row.miniProgramTags" :key="item.id">
{{ item.tagName }}
</el-tag>
</template>
</el-table-column>
<el-table-column
label="外部标签"
align="center"
prop="wecomTags"
width="150px"
>
<template slot-scope="scope">
<el-tag v-for="item in scope.row.wecomTags" :key="item.id">
{{ item.tagName }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="是否对接" align="center" prop="is_abutment">
<template slot-scope="scope">
<span v-show="scope.row.isAbutment == 1">未对接</span>
<span v-show="scope.row.isAbutment == 2">已对接</span>
<span v-show="scope.row.isAbutment == 3">对接失败</span>
</template>
</el-table-column>
<el-table-column label="积分" align="center" prop="credit">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
@click="viewUserIntegralDetail(scope.row)"
>
{{ scope.row.credit }}
</el-button>
</template>
</el-table-column>
<el-table-column
label="即将过期积分"
align="center"
prop="expireCredit"
/>
<el-table-column label="用户类型" align="center" prop="userType">
<template slot-scope="scope">
<span v-show="scope.row.userType == 0">游客</span>
<span v-show="scope.row.userType == 1">会员</span>
</template>
</el-table-column>
<el-table-column label="unionid" align="center" prop="unionid" />
<el-table-column label="用户权限" align="center" prop="">
<template slot-scope="scope">
<span v-show="scope.row.clock == 1">开启打卡</span>
<span v-show="scope.row.clock == 2">禁止打卡</span>
<span v-show="scope.row.activity == 1">开启活动</span>
<span v-show="scope.row.activity == 2">禁止活动</span>
</template>
</el-table-column>
<el-table-column label="消息列表" align="center" prop="">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
@click="viewMessageDetail(scope.row)"
>
查看详情
</el-button>
</template>
</el-table-column>
<el-table-column
fixed="right"
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:member:edit']"
>查看
</el-button>
<el-button
v-if="scope.row.clock == 1"
size="mini"
type="text"
@click="openOrCloseClock(scope.row)"
>禁止打卡
</el-button>
<el-button
v-if="scope.row.clock == 2"
size="mini"
type="text"
@click="openOrCloseClock(scope.row)"
>开启打卡
</el-button>
<el-button
v-if="scope.row.activity == 1"
size="mini"
type="text"
@click="openOrCloseActivity(scope.row)"
>
禁止活动
</el-button>
<el-button
v-if="scope.row.activity == 2"
size="mini"
type="text"
@click="openOrCloseActivity(scope.row)"
>
开启活动
</el-button>
<el-button
size="mini"
type="text"
@click="informationSynchronization(scope.row)"
>个人信息同步</el-button
>
<el-button
size="mini"
type="text"
@click="integralSynchronization(scope.row)"
>积分同步</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 查看用户信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-dialog
width="30%"
title="修改用户备注"
:visible.sync="editRemarkVisible"
append-to-body
>
<el-form ref="form" :model="editRemarkForm" label-width="50px">
<el-form-item label="备注 " prop="content">
<el-input
v-model="editRemarkForm.content"
type="textarea"
placeholder="请输入备注"
show-word-limit
minlength="1"
maxlength="100"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="ocEditRemarkDialog()">关 闭</el-button>
<el-button type="primary" @click="submitEditRemark()"
>确 定</el-button
>
</div>
</el-dialog>
<el-form ref="form" :model="form" label-width="120px">
<el-form-item label="头像" prop="headimg">
<el-avatar shape="circle" :size="50" :src="form.headimg" />
</el-form-item>
<el-form-item label="会员昵称" prop="nickname" style="width: 44%">
<el-input v-model="form.nickname" placeholder="请输入昵称" />
</el-form-item>
<el-form-item label="手机号码" prop="mobile" style="width: 44%">
<el-input v-model="form.mobile" placeholder="请输入手机" />
</el-form-item>
<el-form-item label="用户编号" prop="id">
<span>{{ form.id }}</span>
</el-form-item>
<el-form-item label="生日" prop="birthday">
<el-date-picker
clearable
v-model="form.birthday"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择生日"
>
</el-date-picker>
</el-form-item>
<el-form-item label="是否完善" prop="isCompleteInformation">
<template slot-scope="scope">
<span v-show="form.isCompleteInformation == 0">未完善</span>
<span v-show="form.isCompleteInformation == 1">完善</span>
</template>
</el-form-item>
<el-form-item label="省" prop="provinceId" style="width: 40%">
<el-select
v-model="form.provinceId"
@change="getSaveCityList(form.provinceId)"
@clear="clearSaveOption(1)"
filterable
clearable
placeholder="请选择省"
>
<el-option
v-for="item in provinceList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="市" prop="cityId" style="width: 40%">
<el-select
v-model="form.cityId"
@change="getSaveAreaByPid(form.cityId)"
@clear="clearSaveOption(2)"
filterable
clearable
placeholder="请选择市"
>
<el-option
v-for="item in saveCityList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="区" prop="areaId" style="width: 40%">
<el-select
v-model="form.areaId"
filterable
clearable
placeholder="请选择区"
>
<el-option
v-for="item in saveAreaList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="小程序标签" prop="tagIdArray" style="width: 80%">
<treeselect
v-model="form.miniProgramTags"
:options="miniProgramTagTree"
:multiple="true"
:show-count="true"
placeholder="请选择小程序标签"
:disable-branch-nodes="true"
/>
</el-form-item>
<el-form-item label="外部标签" prop="tagIdArray" style="width: 80%">
<treeselect
v-model="form.wecomTags"
:options="wecomTagTree"
:multiple="true"
:show-count="true"
placeholder="请选择外部标签"
:disable-branch-nodes="true"
/>
</el-form-item>
<el-form-item label="注册时间" prop="createTime">
<el-date-picker
v-model="form.createTime"
readonly
disabled
type="date"
value-format="yyyy-MM-dd"
/>
</el-form-item>
<el-form-item label="积分" prop="credit">
<span>{{ form.credit }}</span>
</el-form-item>
<el-form-item label="打卡状态" prop="clock">
<el-select v-model="form.clock" style="width: 20%">
<el-option label="开启打卡" :value="1"></el-option>
<el-option label="禁止打卡" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="参与活动状态" prop="activity">
<el-select v-model="form.activity" style="width: 20%">
<el-option label="开启参与" :value="1"></el-option>
<el-option label="禁止参与" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注列表" prop="remark">
<el-table :data="form.wxUserRemarkList" style="width: 100%">
<el-table-column prop="id" label="序号" style="width: 10%" />
<el-table-column
prop="content"
label="备注内容"
style="width: 60%"
/>
<el-table-column
prop="createTime"
label="创建时间"
style="width: 30%"
/>
<el-table-column prop="createTime" label="操作" style="width: 10%">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="ocEditRemarkDialog(scope.row)"
>编辑
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="submitDelRemark(scope.row)"
>删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel">取 消</el-button>
<el-button type="primary" @click="submitForm">确 定</el-button>
</div>
</el-dialog>
<!-- 小程序标签批量操作 -->
<el-dialog
:title="title"
:visible.sync="batchMiniProgramVisible"
width="50%"
:before-close="cancelMiniProgramDialog"
>
<el-form
ref="miniProgramForm"
:model="miniProgramForm"
:rules="batchMiniProgramRules"
label-width="150px"
>
<el-row>
<el-col :span="100">
<el-form-item
label="小程序标签"
prop="tagIdArray"
label-width="100px"
>
<treeselect
v-model="miniProgramForm.tagIdArray"
:options="chatTagOptions"
:multiple="true"
:show-count="true"
placeholder="请选择小程序标签"
:disable-branch-nodes="true"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelMiniProgramDialog(false)">重 置</el-button>
<el-button type="primary" @click="submitBatchOperate">确 定</el-button>
</div>
</el-dialog>
<!-- 积分批量操作 -->
<el-dialog
:title="title"
:visible.sync="batchIntegralVisible"
width="50%"
:before-close="cancelIntegralDialog"
>
<el-form
:model="integralForm"
ref="integralForm"
:rules="batchIntegralRules"
label-width="150px"
>
<el-form-item label="类型" prop="source">
<el-select v-model="integralForm.source" style="width: 50%">
<el-option label="增加" :value="1"></el-option>
<el-option label="减少" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="变动积分" prop="floatScore">
<el-input-number
v-model="integralForm.floatScore"
controls-position="right"
:min="1"
:max="1000"
></el-input-number>
</el-form-item>
<el-form-item label="说明 " prop="remarkContent">
<el-input v-model="integralForm.remarkContent" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelIntegralDialog(false)">重 置</el-button>
<el-button type="primary" @click="submitBatchOperate">确 定</el-button>
</div>
</el-dialog>
<!-- 备注批量操作 -->
<el-dialog
:title="title"
:visible.sync="batchRemarkVisible"
width="50%"
:before-close="cancelRemarkDialog"
>
<el-form
ref="remarkForm"
:model="remarkForm"
:rules="batchRemarkRules"
label-width="150px"
>
<el-form-item label="备注 " prop="content">
<el-input
v-model="remarkForm.content"
type="textarea"
placeholder="请输入备注"
show-word-limit
minlength="1"
maxlength="100"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelRemarkDialog(false)">重 置</el-button>
<el-button type="primary" @click="submitBatchOperate">确 定</el-button>
</div>
</el-dialog>
<!-- 话术批量操作 -->
<el-dialog
:title="title"
:visible.sync="batchScriptVisible"
width="600px"
append-to-body
:before-close="cancelScriptDialog"
>
<el-form
ref="scriptForm"
:model="scriptForm"
:rules="batchScriptRules"
label-width="150px"
>
<el-row>
<el-col :span="24">
<el-form-item label="类型" prop="isCustom">
<el-select v-model="scriptForm.isCustom" @change="clearScript">
<el-option label="话术模板发送" :value="0" :key="0"></el-option>
<el-option label="自定义发送" :value="1" :key="1"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 话术模板发送 -->
<el-row v-if="scriptForm.isCustom == 0">
<el-col :span="40">
<el-form-item label="话术二级标题选择" prop="scriptTemplateId">
<treeselect
v-model="scriptForm.scriptTemplateId"
:options="scriptOptions"
:show-count="true"
@select="selectTree"
placeholder="请选择话术"
:disable-branch-nodes="true"
/>
</el-form-item>
</el-col>
<el-col :span="40">
<el-form-item label="话术通知内容" prop="scriptContent">
<el-input v-model="scriptForm.scriptContent" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 自定义发送 -->
<el-row v-if="scriptForm.isCustom == 1">
<el-col :span="24">
<el-form-item label="话术标题" prop="titile">
<el-input
v-model="scriptForm.titile"
placeholder="请输入话术标题"
show-word-limit
minlength="1"
maxlength="50"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="话术内容" prop="content">
<el-input
v-model="scriptForm.content"
type="textarea"
placeholder="请输入话术内容"
show-word-limit
minlength="1"
maxlength="500"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="小程序标签"
prop="tagIdArray"
label-width="90px"
>
<treeselect
v-model="scriptForm.tagIds"
:options="chatTagOptions"
:multiple="true"
:show-count="true"
placeholder="请选择小程序标签"
:disable-branch-nodes="true"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="跳转类型" prop="type">
<el-select v-model="scriptForm.type">
<el-option label="无跳转" :value="0" :key="0"></el-option>
<el-option label="跳转内部链接" :value="1" :key="1"></el-option>
<el-option label="跳转小程序" :value="4" :key="4"></el-option>
<el-option label="跳转外部链接" :value="3" :key="3"></el-option>
<el-option label="导向视频号" :value="5" :key="5"></el-option>
<el-option
label="导向视频号直播间"
:value="6"
:key="6"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" v-if="scriptForm.type == 1">
<el-form-item label="内部链接" prop="link">
<el-input
v-model="scriptForm.link"
placeholder="请输入内部链接"
/>
</el-form-item>
</el-col>
<el-col :span="24" v-if="scriptForm.type == 1">
<el-form-item label="跳转参数" prop="linkParams">
<el-input
v-model="scriptForm.linkParams"
placeholder="请输入跳转参数"
/>
</el-form-item>
</el-col>
<el-col :span="24" v-if="scriptForm.type == 3">
<el-form-item label="外部链接" prop="link">
<el-input
v-model="scriptForm.link"
placeholder="请输入外部链接"
/>
</el-form-item>
</el-col>
<el-col :span="24" v-if="scriptForm.type == 4">
<el-form-item label="小程序APPID" prop="redirectAppid">
<el-input
v-model="scriptForm.redirectAppid"
placeholder="请输入APPID"
/>
</el-form-item>
</el-col>
<el-col :span="24" v-if="scriptForm.type == 4" label-width="90px">
<el-form-item label="小程序页面" prop="redirectUrl">
<el-input
v-model="scriptForm.redirectUrl"
placeholder="请输入小程序页面"
/>
</el-form-item>
</el-col>
<el-col
:span="24"
v-if="scriptForm.type == 5 || scriptForm.type == 6"
>
<el-form-item label="视频号ID" prop="videoNo">
<el-input
v-model="scriptForm.videoNo"
placeholder="视频号id以“sph”开头的id可再视频号助手获取"
/>
</el-form-item>
</el-col>
<el-col :span="24" v-if="scriptForm.type == 5" label-width="90px">
<el-form-item label="feedId" prop="feedId">
<el-input
v-model="scriptForm.feedId"
placeholder="请输入视频号feedId"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitBatchOperate">确 定</el-button>
<el-button @click="cancelScriptDialog(false)">重 置</el-button>
</div>
</el-dialog>
<!-- 查看用户消息列表 -->
<el-dialog
title="消息记录"
:visible.sync="userScriptLogVisible"
width="90%"
:before-close="cancelUserScriptLogDialog"
>
<template>
<el-table
:data="userScriptLogQuery.userScriptList"
:stripe="true"
style="width: 100%"
>
<el-table-column type="index" width="50"></el-table-column>
<el-table-column prop="messageType" label="消息类型" width="100px">
<template slot-scope="scope">
<span v-show="scope.row.messageType == 0">未知</span>
<span v-show="scope.row.messageType == 1">用户注册</span>
<span v-show="scope.row.messageType == 2">绑定仪器</span>
<span v-show="scope.row.messageType == 3">打卡活动</span>
<span v-show="scope.row.messageType == 4">护理计划</span>
<span v-show="scope.row.messageType == 5">问卷活动</span>
<span v-show="scope.row.messageType == 6">会员管理</span>
<span v-show="scope.row.messageType == 7">消息模板</span>
<span v-show="scope.row.messageType == 8">用户留言</span>
<span v-show="scope.row.messageType == 9">完善用户信息</span>
</template>
</el-table-column>
<el-table-column
prop="titile"
label="标题"
width="200"
></el-table-column>
<el-table-column prop="content" label="内容"></el-table-column>
<el-table-column prop="isRead" label="状态" width="100">
<template slot-scope="scope">
<span v-show="scope.row.isRead == 0">未读</span>
<span v-show="scope.row.isRead == 1">已读</span>
</template>
</el-table-column>
<el-table-column
prop="createTime"
label="发送时间"
width="200"
></el-table-column>
<el-table-column prop="status" label="操作" width="100">
<template slot-scope="scope">
<el-button
v-show="scope.row.status == 0"
size="mini"
type="text"
@click="delUserScriptLog(scope.row)"
>
撤销
</el-button>
<el-button
v-show="scope.row.status == 1"
size="mini"
type="text"
disabled
>已撤销</el-button
>
</template>
</el-table-column>
</el-table>
</template>
<pagination
v-show="userScriptLogQuery.total > 0"
:total="userScriptLogQuery.total"
:page.sync="userScriptLogQuery.pageNum"
:limit.sync="userScriptLogQuery.pageSize"
@pagination="getUserScriptLogList"
/>
</el-dialog>
<!-- 查看用户积分列表 -->
<el-dialog
title="积分记录"
:visible.sync="userIntegralLogVisible"
width="90%"
:before-close="cancelUserIntegralLogDialog"
>
<template>
<el-table
:data="userIntegralLogQuery.userIntegralLogList"
@sort-change="userIntegralSortChang"
:default-sort="{ prop: 'createTime', order: 'desc' }"
:stripe="true"
style="width: 100%"
>
<el-table-column
type="index"
width="50"
label="序号"
></el-table-column>
<el-table-column prop="source" label="类型" width="100px">
<template slot-scope="scope">
<span v-show="scope.row.source == 1">增加积分</span>
<span v-show="scope.row.source == 2">减少积分</span>
</template>
</el-table-column>
<el-table-column
prop="floatScore"
label="变动积分"
:sortable="'custom'"
width="100"
></el-table-column>
<el-table-column
prop="soureId"
label="来源ID"
width="100"
></el-table-column>
<el-table-column prop="remarkContent" label="说明"></el-table-column>
<el-table-column
prop="createTime"
:sortable="'custom'"
label="操作时间"
width="200"
></el-table-column>
</el-table>
</template>
<pagination
v-show="userIntegralLogQuery.total > 0"
:total="userIntegralLogQuery.total"
:page.sync="userIntegralLogQuery.pageNum"
:limit.sync="userIntegralLogQuery.pageSize"
@pagination="getUserIntegralLogList"
/>
</el-dialog>
<!-- 导出字段选择弹窗 -->
<el-dialog
title="自定义导出字段"
:visible.sync="exportFieldsVisible"
width="50%"
:before-close="cancelExportFieldsDialog"
>
<el-form ref="form" label-width="150px">
<el-form-item label="全部字段" prop="allFields">
<el-switch v-model="allFields" @click.native="isExportAllFields()" />
</el-form-item>
</el-form>
<el-form
:inline="true"
ref="form"
:model="exportFieldList"
label-width="150px"
>
<el-form-item label="会员昵称" prop="nickname">
<el-switch
v-model="exportFieldList.nickname"
:active-value="'nickname'"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="用户编号 " prop="id">
<el-switch
v-model="exportFieldList.id"
active-value="id"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="手机号 " prop="mobile">
<el-switch
v-model="exportFieldList.mobile"
active-value="mobile"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="生日 " prop="birthday">
<el-switch
v-model="exportFieldList.birthday"
active-value="birthday"
:inactive-value="null"
/>
</el-form-item>
<el-form-item
label="地区 "
prop="province"
@click.native="exportArea()"
>
<el-switch
v-model="exportFieldList.province"
active-value="province"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="用户注册时间 " prop="createTime">
<el-switch
v-model="exportFieldList.createTime"
active-value="createTime"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="仪器数量 " prop="devicesNum">
<el-switch
v-model="exportFieldList.devicesNum"
active-value="devicesNum"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="仪器名称 " prop="devicesName">
<el-switch
v-model="exportFieldList.devicesName"
active-value="devicesName"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="小程序标签 " prop="miniProgramTags">
<el-switch
v-model="exportFieldList.miniProgramTags"
active-value="miniProgramTags"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="外部标签 " prop="wecomTags">
<el-switch
v-model="exportFieldList.wecomTags"
active-value="wecomTags"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="积分 " prop="credit">
<el-switch
v-model="exportFieldList.credit"
active-value="credit"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="即将过期积分 " prop="expireCredit">
<el-switch
v-model="exportFieldList.expireCredit"
active-value="expireCredit"
:inactive-value="null"
/>
</el-form-item>
<el-form-item label="unionid " prop="unionid">
<el-switch
v-model="exportFieldList.unionid"
active-value="unionid"
:inactive-value="null"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelExportFieldsDialog()">取 消</el-button>
<el-button type="primary" @click="submitBatchOperate">确 定</el-button>
</div>
</el-dialog>
<!-- 查看用户绑定的仪器列表 -->
<el-dialog
title="仪器绑定"
:visible.sync="userInstrumentVisible"
width="63%"
:before-close="cancelUserInstrumentDialog"
>
<template>
<el-table
:data="userInstrumentQuery.userInstrumentList"
style="width: 100%"
>
<el-table-column type="index" width="50" label="序号" />
<el-table-column
prop="instrumentName"
label="仪器名称"
width="150px"
/>
<el-table-column prop="serial" label="仪器序列号" width="200" />
<el-table-column
prop="serialImage"
label="仪器序列号图片"
width="150"
>
<template slot-scope="scope">
<el-image
v-if="scope.row.serialImage"
:src="scope.row.serialImage"
style="width: 100px; height: 100px"
></el-image>
</template>
</el-table-column>
<el-table-column prop="updateTime" label="操作时间" width="200" />
</el-table>
</template>
<pagination
v-show="userInstrumentQuery.total > 0"
:total="userInstrumentQuery.total"
:page.sync="userInstrumentQuery.pageNum"
:limit.sync="userInstrumentQuery.pageSize"
@pagination="getUserInstrumentList"
/>
</el-dialog>
</div>
</template>
<script>
import {
listMember,
getMember,
delMember,
updateMember,
selectUserCount,
getMiniProgramTags,
getWecomTags,
getPurchaseChannel,
getRegionByPid,
batchAddMiniProgramTag,
allAddMiniProgramTag,
batchDelMiniProgramTag,
allDelMiniProgramTag,
batchChangIntegral,
allChangIntegral,
batchSendScript,
allSendScript,
batchAddRemark,
allAddRemark,
getMiniProgramTagsTree,
scriptTreeSelect,
editRemark,
delRemark,
openOrCloseClock,
openOrCloseActivity,
uObtainUserScriptLog,
delUserScriptLog,
obtainUserIntegralLog,
getAllInstrument,
listUserInstrument,
} from '@/api/system/member'
import Treeselect from '@riophae/vue-treeselect'
import { tagTreeSelect } from '@/api/system/wechatTab'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: 'Member',
components: { Treeselect },
data() {
return {
// 折叠搜索
activeNames: ['search'],
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 用户表格数据
memberList: [],
// 弹出层标题
title: '',
// 是否显示弹出层
open: false,
// 修改用户备注弹出层
editRemarkVisible: false,
editRemarkForm: {
id: null,
content: null,
},
// 日期范围
dateRange: [],
// 表头统计
count: {
userNum: 0,
userRegisterNum: 0,
userDeviceNum: 0,
},
// 查询条件:仪器列表
deviceList: [],
// 查询条件,小程序二级标签
miniProgramTags: [],
// 小程序标签树
miniProgramTagTree: [],
// 外部标签树
wecomTagTree: [],
// 查询条件,企微二级标签
wecomTags: [],
// 查询条件:购买渠道
purchaseChannels: null,
// 查询条件:省市区
provinceList: null,
cityList: null,
areaList: null,
// 保存页面的,市区
saveCityList: null,
saveAreaList: null,
chatTagOptions: [],
scriptOptions: [],
tagIdArray: [],
// 批量操作类型-下拉项选择
batchOperateValue: null,
// 批量操作:小程序标签
batchMiniProgramVisible: false,
miniProgramForm: {
tagIdArray: [],
},
// 批量操作:积分
batchIntegralVisible: false,
integralForm: {
source: null,
floatScore: null,
remarkContent: '后台操作',
},
// 批量操作:备注
batchScriptVisible: false,
remarkForm: {
content: null,
userIdList: null,
},
// 批量操作:发送话术
batchRemarkVisible: null,
scriptForm: {
userIdList: null,
isCustom: 0,
scriptTemplateId: null,
scriptName: null,
titile: null,
content: null,
tagType: null,
type: null,
link: null,
linkParams: null,
redirectAppid: null,
redirectUrl: null,
videoNo: null,
feedId: null,
// 当类型为模板发送时,选择了二级话术标题后,显示内容用,不传后端保存
scriptContent: null,
// 选中的小程序标签
tagIds: [],
tagNames: [],
},
// 用户消息记录
userScriptLogVisible: false,
userScriptLogQuery: {
total: 0,
pageNum: 1,
pageSize: 10,
wxUserId: null,
userScriptList: null,
orderByColumn: 'createTime',
isAsc: 'desc',
},
// 用户积分记录
userIntegralLogVisible: false,
userIntegralLogQuery: {
total: 0,
pageNum: 1,
pageSize: 10,
userIntegralLogList: null,
userId: null,
orderByColumn: 'createTime',
isAsc: 'desc',
},
// 用户仪器列表
userInstrumentVisible: false,
userInstrumentQuery: {
total: 0,
pageNum: 1,
pageSize: 10,
userId: null,
userInstrumentList: null,
orderByColumn: 'createTime',
isAsc: 'desc',
},
// 导出数据选择字段
exportFieldsVisible: false,
exportFieldsForm: {
userIdList: null,
exportFields: null,
},
allFields: false,
exportFieldList: {
id: null,
nickname: null,
credit: null,
expireCredit: null,
unionid: null,
mobile: null,
province: null,
city: null,
area: null,
birthday: null,
devicesNum: null,
devicesName: null,
createTime: null,
wecomTags: null,
miniProgramTags: null,
},
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
nickname: null,
headimg: null,
username: null,
deviceNumStart: undefined,
deviceNumEnd: undefined,
creditStart: undefined,
creditEnd: undefined,
openid: null,
unionid: null,
userType: null,
level: null,
mobile: null,
password: null,
userQr: null,
provinceId: null,
province: null,
cityId: null,
city: null,
areaId: null,
area: null,
birthday: null,
clock: null,
activity: null,
wechat: null,
code: null,
isAbutment: null,
collagenDay: null,
collagenMount: null,
loginTime: null,
status: null,
// createTime: [],
devicesIdList: [], //仪器绑定
wecomTags: [], // 外部标签
miniProgramTags: [], // 小程序标签
purchaseChannels: [], // 购买渠道
isCompleteInformation: null, // 用户信息是否完善
wxUserRemarkList: null, // 备注列表
},
// 表单参数
form: {},
// 表单校验
batchMiniProgramRules: {
tagIdArray: [
{ required: true, message: '请选择小程序标签', trigger: 'change' },
],
},
batchIntegralRules: {
source: [
{ required: true, message: '请选择积分操作类型', trigger: 'blur' },
],
floatScore: [
{ required: true, message: '请输入变动积分', trigger: 'change' },
],
remarkContent: [
{ required: true, message: '输入积分操作说明', trigger: 'blur' },
{
min: 1,
max: 500,
message: '长度在 3 到 500 个字符',
trigger: 'blur',
},
],
},
batchRemarkRules: {
content: [{ required: true, message: '请输入备注', trigger: 'blur' }],
},
batchScriptRules: {
isCustom: [
{ required: true, message: '请选择话术类型', trigger: 'change' },
],
scriptTemplateId: [
{ required: true, message: '请选择话术标题', trigger: 'change' },
],
// scriptContent: [
// {required: true, message: '请选择话术标题'}
// ],
titile: [
{ required: true, message: '请输入话术标题', trigger: 'blur' },
],
content: [
{ required: true, message: '请输入话术内容', trigger: 'blur' },
],
type: [
{ required: true, message: '请选择跳转类型', trigger: 'change' },
],
link: [{ required: true, message: '请输入链接地址', trigger: 'blur' }],
linkParams: [
{ required: true, message: '请输入跳转参数', trigger: 'blur' },
],
redirectAppid: [
{ required: true, message: '请输入小程序APPID', trigger: 'blur' },
],
redirectUrl: [
{ required: true, message: '请输入小程序页面', trigger: 'blur' },
],
videoNo: [
{ required: true, message: '请输入视频号ID', trigger: 'blur' },
],
feedId: [
{ required: true, message: '请输入视频号feedId', trigger: 'blur' },
],
},
}
},
created() {
// 查询条件创建时间默认为当天
// let siteStartTime = this.dateUtil(new Date(new Date().toLocaleDateString()));
// let siteEndTime = this.dateUtil(new Date(new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1));
// this.dateRange = [siteStartTime, siteEndTime];
// 获取用户统计信息
this.getUserCount()
// 获取表单数据
this.getList()
// 获取标签
this.getTags()
// 获取省
this.getProvinceList()
// 获取标签树
this.getDeptTree()
this.getScriptTree()
// 获取仪器列表
this.getAllInstrument()
},
methods: {
/** 查询用户列表 */
getList() {
this.loading = true
listMember(this.addDateRange(this.queryParams, this.dateRange)).then(
(response) => {
this.memberList = response.rows
this.total = response.total
this.loading = false
}
)
},
dateUtil(date) {
// 获取年份、月份和日期
const year = date.getFullYear().toString() // 四位数表示的年份
const months = (date.getMonth() + 1).toString().padStart(2, '0') // 补零后的两位数表示的月份
const day = date.getDate().toString().padStart(2, '0') // 补零后的两位数表示的日期
const hours = date.getHours().toString().padStart(2, '0') // 补全两位数的小时
const minutes = date.getMinutes().toString().padStart(2, '0') // 补全两位数的分钟
const seconds = date.getSeconds().toString().padStart(2, '0')
return `${year}-${months}-${day} ${hours}:${minutes}:${seconds}`
},
// 获取仪器列表
getAllInstrument() {
getAllInstrument().then((Response) => {
this.deviceList = Response.data
console.log(this.deviceList)
})
},
getUserCount() {
selectUserCount().then((Response) => {
this.count.userNum = Response.data[0]
this.count.userRegisterNum = Response.data[1]
this.count.userDeviceNum = Response.data[2]
})
},
getTags() {
// 小程序标签
getMiniProgramTags().then((Response) => {
this.miniProgramTags = Response.data
})
// 微信标签
getWecomTags().then((Response) => {
this.wecomTags = Response.data
})
// 购买渠道
getPurchaseChannel().then((Response) => {
this.purchaseChannels = Response.data
})
// 小程序标签树
getMiniProgramTagsTree().then((Response) => {
this.miniProgramTagTree = Response.data
})
// 外部标签树
tagTreeSelect({ type: 2 }).then((response) => {
this.wecomTagTree = response.data
})
},
// 查询条件-获取省市区
getProvinceList() {
getRegionByPid(0).then((Response) => {
this.provinceList = Response.data
})
},
getCityList(pid) {
if (pid == '') {
return
}
this.queryParams.cityId = null
this.queryParams.areaId = null
getRegionByPid(pid).then((Response) => {
this.cityList = Response.data
})
},
getAreaByPid(pid) {
if (pid == '') {
return
}
this.queryParams.areaId = null
getRegionByPid(pid).then((Response) => {
this.areaList = Response.data
})
},
// 查询条件-省市区清空
clearOption(option) {
// 省级清空
if (option == 1) {
this.queryParams.cityId = null
this.queryParams.areaId = null
this.cityList = null
this.areaList = null
}
// 市级清空
if (option == 2) {
this.queryParams.areaId = null
this.areaList = null
}
},
// 修改-获取省市区
getSaveCityList(pid) {
if (pid == '') {
return
}
this.form.cityId = null
this.form.areaId = null
getRegionByPid(pid).then((Response) => {
this.saveCityList = Response.data
})
},
getSaveAreaByPid(pid) {
if (pid == '') {
return
}
this.form.areaId = null
getRegionByPid(pid).then((Response) => {
this.saveAreaList = Response.data
})
},
clearSaveOption(option) {
// 省级清空
if (option == 1) {
this.form.cityId = null
this.form.areaId = null
this.saveCityList = null
this.saveAreaList = null
}
// 市级清空
if (option == 2) {
this.form.areaId = null
this.saveAreaList = null
}
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 关闭添加小程序标签窗口
cancelMiniProgramDialog(isClose) {
this.$refs.miniProgramForm.clearValidate();
this.miniProgramForm.tagIdArray = []
if (isClose) {
this.title = null
this.batchMiniProgramVisible = false
}
},
cancelIntegralDialog(isClose) {
this.$refs.integralForm.clearValidate();
this.integralForm.source = null
this.integralForm.floatScore = null
this.integralForm.remarkContent = '后台操作'
if (isClose) {
this.batchIntegralVisible = false
}
},
cancelRemarkDialog(isClose) {
this.$refs.remarkForm.clearValidate();
this.remarkForm.content = null
if (isClose) {
this.batchRemarkVisible = false
}
},
cancelUserScriptLogDialog() {
this.userScriptLogVisible = false
this.userScriptLogQuery = {
total: 0,
pageNum: 1,
pageSize: 10,
wxUserId: null,
userScriptList: null,
orderByColumn: 'createTime',
isAsc: 'desc',
}
},
cancelUserIntegralLogDialog() {
this.userIntegralLogVisible = false
this.userIntegralLogQuery = {
total: 0,
pageNum: 1,
pageSize: 10,
userIntegralLogList: null,
userId: null,
orderByColumn: 'createTime',
isAsc: 'desc',
}
},
cancelExportFieldsDialog() {
this.allFields = false
this.exportFieldsVisible = false
this.exportFieldList = {
id: null,
nickname: null,
credit: null,
expireCredit: null,
unionid: null,
mobile: null,
province: null,
city: null,
area: null,
birthday: null,
devicesNum: null,
devicesName: null,
createTime: null,
wecomTags: null,
miniProgramTags: null,
}
},
cancelScriptDialog(isClose) {
this.$refs.scriptForm.clearValidate();
this.scriptForm = {
userIdList: null,
isCustom: 0,
scriptTemplateId: null,
scriptName: null,
titile: null,
content: null,
tagType: null,
type: null,
link: null,
linkParams: null,
redirectAppid: null,
redirectUrl: null,
videoNo: null,
feedId: null,
scriptContent: null,
tagNames: [],
tagIds: [],
}
if (isClose) {
this.batchScriptVisible = false
}
},
cancelUserInstrumentDialog() {
this.userInstrumentVisible = false
this.userInstrumentQuery = {
total: 0,
pageNum: 1,
pageSize: 10,
userId: null,
userInstrumentList: null,
orderByColumn: 'createTime',
isAsc: 'desc',
}
},
/** 查询部门下拉树结构 */
getDeptTree() {
tagTreeSelect({ type: 1 }).then((response) => {
this.chatTagOptions = response.data
})
},
/** 查询话术下拉树结构 */
getScriptTree() {
scriptTreeSelect().then((response) => {
this.scriptOptions = response.data
})
},
// 切换 话术发送类型
clearScript() {
if (this.scriptForm.isCustom == 0) {
this.scriptForm.scriptName = null
this.scriptForm.titile = null
this.scriptForm.content = null
this.scriptForm.tagType = null
this.scriptForm.type = null
this.scriptForm.link = null
this.scriptForm.linkParams = null
this.scriptForm.redirectAppid = null
this.scriptForm.redirectUrl = null
this.scriptForm.videoNo = null
this.scriptForm.feedId = null
this.scriptForm.tagNames = null
this.scriptForm.tagIds = null
}
// 自定义发送
if (this.scriptForm.isCustom == 1) {
this.scriptForm.scriptTemplateId = null
this.scriptForm.scriptContent = null
this.scriptForm.type = 0
}
},
selectTree(raw, instanceId) {
this.scriptForm.scriptContent = raw.content
},
// 表单重置
reset() {
this.form = {
id: null,
nickname: null,
headimg: null,
username: null,
credit: null,
openid: null,
unionid: null,
userType: null,
level: null,
mobile: null,
password: null,
userQr: null,
province: null,
provinceId: null,
city: null,
cityId: null,
area: null,
areaId: null,
birthday: null,
clock: null,
activity: null,
wechat: null,
code: null,
isAbutment: null,
collagenDay: null,
collagenMount: null,
loginTime: null,
status: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
}
this.resetForm('form')
},
// 表单重置
resetQueryParams() {
// 查询参数
this.queryParams = {
pageNum: 1,
pageSize: 10,
nickname: null,
headimg: null,
username: null,
deviceNumStart: undefined,
deviceNumEnd: undefined,
creditStart: undefined,
creditEnd: undefined,
openid: null,
unionid: null,
userType: null,
level: null,
mobile: null,
password: null,
userQr: null,
provinceId: null,
province: null,
cityId: null,
city: null,
areaId: null,
area: null,
birthday: null,
clock: null,
activity: null,
wechat: null,
code: null,
isAbutment: null,
collagenDay: null,
collagenMount: null,
loginTime: null,
status: null,
// createTime: [],
devicesName: [], //仪器绑定
wecomTags: [], // 外部标签
miniProgramTags: [], // 小程序标签
purchaseChannels: [], // 购买渠道
isCompleteInformation: null, // 用户信息是否完善
wxUserRemarkList: null, // 备注列表
}
this.resetForm('queryForm')
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = []
this.resetQueryParams()
this.handleQuery()
},
/** 批量操作按钮,显示批量操作弹窗 */
batchOperate() {
if (this.batchOperateValue == null) {
this.$message({
message: '请选择要批量操作类型',
type: 'warning',
})
return
} else {
/* 批量操作 小程序标签 */
if (this.batchOperateValue == 1 || this.batchOperateValue == 2) {
if (this.ids.length == 0) {
this.$message({
message: '请选择要操作的数据',
type: 'warning',
})
return
}
if (this.batchOperateValue == 1) {
this.title = '添加小程序标签'
}
if (this.batchOperateValue == 2) {
this.title = '删除小程序标签'
}
this.batchMiniProgramVisible = true
}
if (this.batchOperateValue == 3 || this.batchOperateValue == 4) {
if (this.batchOperateValue == 3) {
this.title = '添加小程序标签'
}
if (this.batchOperateValue == 4) {
this.title = '删除小程序标签'
}
this.batchMiniProgramVisible = true
}
/* 批量操作:加减分 */
if (this.batchOperateValue == 5) {
if (this.ids.length == 0) {
this.$message({
message: '请选择要操作的数据',
type: 'warning',
})
return
}
this.batchIntegralVisible = true
this.title = '批量加减积分'
}
if (this.batchOperateValue == 6) {
this.batchIntegralVisible = true
this.title = '全量加减积分'
}
/* 批量操作:发送话术 */
if (this.batchOperateValue == 7) {
if (this.ids.length == 0) {
this.$message({
message: '请选择要操作的数据',
type: 'warning',
})
return
}
this.batchScriptVisible = true
this.title = '批量发送话术'
}
if (this.batchOperateValue == 8) {
this.batchScriptVisible = true
this.title = '全量发送话术'
}
/* 批量操作: 备注 */
if (this.batchOperateValue == 9) {
if (this.ids.length == 0) {
this.$message({
message: '请选择要操作的数据',
type: 'warning',
})
return
}
this.batchRemarkVisible = true
this.title = '批量备注'
}
if (this.batchOperateValue == 10) {
this.batchRemarkVisible = true
this.title = '全量备注'
}
/* 批量操作:注销账号 */
if (this.batchOperateValue == 11) {
if (this.ids.length == 0) {
this.$message({
message: '请选择要操作的数据',
type: 'warning',
})
return
}
this.$confirm(
"<span style='font-size: 18px'><strong>确定将选择的数据注销?</strong></span><br/><span style='padding-left:2em'>请谨慎操作,一旦成功将无法撤销。</span>",
'注销账号',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true,
}
)
.then(() => {
delMember(this.ids).then((Response) => {
this.$modal.msgSuccess('批量删除会员成功')
this.cancelIntegralDialog(true)
})
})
.catch(() => {})
}
/* 批量操作:导出数据 */
if (this.batchOperateValue == 12) {
if (this.ids.length == 0) {
this.$message({
message: '请选择要操作的数据',
type: 'warning',
})
return
}
this.exportFieldsVisible = true
}
if (this.batchOperateValue == 13) {
this.exportFieldsVisible = true
}
}
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = '添加用户'
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getMember(id).then((response) => {
// 回显省市区
if (response.data.provinceId != null) {
this.getSaveCityList(response.data.provinceId)
}
if (response.data.areaId != null) {
this.getSaveAreaByPid(response.data.cityId)
}
this.form = response.data
this.open = true
this.title = '修改用户'
})
},
// 开关打卡
openOrCloseClock(row) {
let spanContent
let title
if (row.clock == 1) {
spanContent = '确定将选择的数据禁止打卡?'
title = '禁止打卡'
} else {
spanContent = '确定将选择的数据开启打卡?'
title = '开启打卡'
}
this.$confirm(
"<span style='font-size: 18px'><strong>" +
spanContent +
"</strong></span><br/><span style='padding-left:2em'>请谨慎操作,一旦成功将无法撤销。</span>",
title,
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true,
}
)
.then(() => {
openOrCloseClock(row.id).then((response) => {
this.$modal.msgSuccess('操作成功')
this.getList()
})
})
.catch(() => {})
},
// 开关活动
openOrCloseActivity(row) {
let spanContent
let title
if (row.activity == 1) {
spanContent = '确定将选择的数据禁止活动?'
title = '禁止活动'
} else {
spanContent = '确定将选择的数据开启活动?'
title = '开启活动'
}
this.$confirm(
"<span style='font-size: 18px'><strong>" +
spanContent +
"</strong></span><br/><span style='padding-left:2em'>请谨慎操作,一旦成功将无法撤销。</span>",
title,
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true,
}
)
.then(() => {
openOrCloseActivity(row.id).then((response) => {
this.$modal.msgSuccess('操作成功')
this.getList()
})
})
.catch(() => {})
},
// 信息同步
informationSynchronization(row) {
this.$confirm(
"<span style='font-size: 18px'><strong>确定将选择的数据信息同步?</strong></span><br/><span style='padding-left:2em'>请谨慎操作,一旦成功将无法撤销。</span>",
'信息同步',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true,
}
)
.then(() => {
alert('用户id' + row.id)
})
.catch(() => {})
},
// 积分同步
integralSynchronization(row) {
this.$confirm(
"<span style='font-size: 18px'><strong>确定将选择的数据积分同步?</strong></span><br/><span style='padding-left:2em'>请谨慎操作,一旦成功将无法撤销。</span>",
'积分同步',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true,
}
)
.then(() => {
alert('用户id' + row.id)
})
.catch(() => {})
},
/** 提交按钮 */
submitForm() {
if (this.form.id != null) {
updateMember(this.form).then((response) => {
this.$modal.msgSuccess('修改成功')
this.open = false
this.getList()
})
} else {
this.$modal.msgError('修改失败')
}
},
/* 批量操作提交按钮 */
submitBatchOperate() {
// 批量添加小程序标签
if (this.batchOperateValue == 1) {
this.$refs['miniProgramForm'].validate((valid) => {
if (valid) {
batchAddMiniProgramTag(
this.miniProgramForm.tagIdArray,
this.ids
).then((Response) => {
this.$modal.msgSuccess('批量添加小程序标签成功')
this.cancelMiniProgramDialog(true)
})
}
})
}
// 批量删除小程序标签
if (this.batchOperateValue == 2) {
this.$refs['miniProgramForm'].validate((valid) => {
if (valid) {
batchDelMiniProgramTag(
this.miniProgramForm.tagIdArray,
this.ids
).then((Response) => {
this.$modal.msgSuccess('批量删除小程序标签成功')
this.cancelMiniProgramDialog(true)
})
}
})
}
// 全量添加小程序标签
if (this.batchOperateValue == 3) {
this.$refs['miniProgramForm'].validate((valid) => {
if (valid) {
allAddMiniProgramTag(
this.miniProgramForm.tagIdArray,
this.queryParams
).then((Response) => {
this.$modal.msgSuccess('全量添加小程序标签成功')
this.cancelMiniProgramDialog(true)
})
}
})
}
// 全量删除小程序标签
if (this.batchOperateValue == 4) {
this.$refs['miniProgramForm'].validate((valid) => {
if (valid) {
allDelMiniProgramTag(
this.miniProgramForm.tagIdArray,
this.queryParams
).then((Response) => {
this.$modal.msgSuccess('全量删除小程序标签成功')
this.cancelMiniProgramDialog(true)
})
}
})
}
// 批量操作积分
if (this.batchOperateValue == 5) {
this.$refs['integralForm'].validate((valid) => {
if (valid) {
batchChangIntegral(this.ids, this.integralForm).then((Response) => {
this.$modal.msgSuccess('批量操作积分成功')
this.cancelIntegralDialog(true)
})
}
})
}
// 全量操作积分
if (this.batchOperateValue == 6) {
this.$refs['integralForm'].validate((valid) => {
if (valid) {
allChangIntegral(this.integralForm, this.queryParams).then(
(Response) => {
this.$modal.msgSuccess('批量操作积分成功')
this.cancelIntegralDialog(true)
}
)
}
})
}
/* 批量操作:发送话术 */
if (this.batchOperateValue == 7) {
this.scriptForm.userIdList = this.ids
batchSendScript(this.scriptForm).then((Response) => {
this.$modal.msgSuccess('批量发送话术成功')
this.cancelScriptDialog(true)
})
}
if (this.batchOperateValue == 8) {
allSendScript(this.scriptForm, this.queryParams).then((Response) => {
this.$modal.msgSuccess('全量发送话术成功')
this.cancelScriptDialog(true)
})
}
// 批量操作备注
if (this.batchOperateValue == 9) {
this.$refs['remarkForm'].validate((valid) => {
if (valid) {
this.remarkForm.userIdList = this.ids
batchAddRemark(this.remarkForm).then((Response) => {
this.$modal.msgSuccess('批量备注成功')
this.cancelRemarkDialog(true)
})
}
})
}
// 全量操作备注
if (this.batchOperateValue == 10) {
this.$refs['remarkForm'].validate((valid) => {
if (valid) {
allAddRemark(this.remarkForm.content, this.queryParams).then(
(Response) => {
this.$modal.msgSuccess('批量备注成功')
this.cancelRemarkDialog(true)
}
)
}
})
}
// 导出用户数据
if (this.batchOperateValue == 12) {
let exportFields = Object.values(this.exportFieldList).filter(
(val) => val != null
)
if (exportFields.length == 0) {
this.$modal.msgError('请选择导出字段')
return
}
this.exportFieldsForm.userIdList = this.ids
this.exportFieldsForm.exportFields = exportFields
this.download(
'/system/member/batchExport',
{
...this.exportFieldsForm,
},
`微信会员_${new Date().getTime()}.xlsx`
)
this.cancelExportFieldsDialog()
}
if (this.batchOperateValue == 13) {
let exportFields = Object.values(this.exportFieldList).filter(
(val) => val != null
)
if (exportFields.length == 0) {
this.$modal.msgError('请选择导出字段')
return
}
this.download(
'/system/member/allExport',
{
...Object.assign({}, this.queryParams, {
exportFields: exportFields,
}),
},
`微信会员_${new Date().getTime()}.xlsx`
)
this.cancelExportFieldsDialog()
}
},
// 打开用户备注修改
ocEditRemarkDialog(row) {
this.editRemarkVisible = !this.editRemarkVisible
if (this.editRemarkVisible) {
this.editRemarkForm.id = row.id
this.editRemarkForm.content = row.content
} else {
this.editRemarkForm.content = null
this.editRemarkForm.id = null
}
},
// 保存用户备注
submitEditRemark() {
editRemark(this.editRemarkForm).then((Response) => {
this.$modal.msgSuccess('修改备注成功')
if (
this.form.wxUserRemarkList != null &&
this.form.wxUserRemarkList.length > 0
) {
let that = this
this.form.wxUserRemarkList.forEach(function (item) {
if (item.id == that.editRemarkForm.id) {
item.content = that.editRemarkForm.content
}
})
}
this.ocEditRemarkDialog()
})
},
// 删除用户备注
submitDelRemark(row) {
this.$confirm(
"<span style='font-size: 18px'><strong>确定将选择的备注删除吗?</strong></span><br/>",
'删除备注',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true,
}
)
.then(() => {
delRemark(row.id).then((Response) => {
this.$modal.msgSuccess('删除用户备注成功')
let list = this.form.wxUserRemarkList
for (let i = 0; i < list.length; i++) {
if (list[i].id == row.id) {
this.form.wxUserRemarkList.splice(i, 1)
}
}
})
})
.catch(() => {})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal
.confirm('是否确认删除用户编号为"' + ids + '"的数据项?')
.then(function () {
return delMember(ids)
})
.then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
})
.catch(() => {})
},
// 打开用户消息列表窗口
viewMessageDetail(row) {
this.userScriptLogQuery.wxUserId = row.id
this.getUserScriptLogList()
this.userScriptLogVisible = true
},
// 分页获取 用户消息列表
getUserScriptLogList() {
uObtainUserScriptLog(this.userScriptLogQuery).then((response) => {
this.userScriptLogQuery.userScriptList = response.rows
this.userScriptLogQuery.total = response.total
})
},
// 打开用户仪器列表窗口
viewUserInstrumentDetail(row) {
this.userInstrumentQuery.userId = row.id
this.getUserInstrumentList()
this.userInstrumentVisible = true
},
// 分页获取 用户消息列表
getUserInstrumentList() {
listUserInstrument(this.userInstrumentQuery).then((response) => {
this.userInstrumentQuery.userInstrumentList = response.rows
this.userInstrumentQuery.total = response.total
})
},
// 删除用户消息
delUserScriptLog(row) {
let wxUserScriptLog = {
id: row.id,
status: row.status == 0 ? 1 : 0,
}
delUserScriptLog(wxUserScriptLog).then((Response) => {
row.status = wxUserScriptLog.status
this.$modal.msgSuccess('撤销成功')
})
},
// 打开用户积分列表窗口
viewUserIntegralDetail(row) {
this.userIntegralLogQuery.userId = row.id
this.getUserIntegralLogList()
this.userIntegralLogVisible = true
},
// 分页获取用户积分列表
getUserIntegralLogList() {
obtainUserIntegralLog(this.userIntegralLogQuery).then((Response) => {
this.userIntegralLogQuery.userIntegralLogList = Response.rows
this.userIntegralLogQuery.total = Response.total
})
},
userIntegralSortChang({ column, prop }) {
this.userIntegralLogQuery.orderByColumn = prop
this.userIntegralLogQuery.isAsc =
column.order == 'ascending' ? 'asc' : 'desc'
this.getUserIntegralLogList()
},
isExportAllFields() {
if (this.allFields) {
this.exportFieldList.nickname = 'nickname'
this.exportFieldList.id = 'id'
this.exportFieldList.credit = 'credit'
this.exportFieldList.expireCredit = 'expireCredit'
this.exportFieldList.unionid = 'unionid'
this.exportFieldList.mobile = 'mobile'
this.exportFieldList.province = 'province'
this.exportFieldList.city = 'city'
this.exportFieldList.area = 'area'
this.exportFieldList.birthday = 'birthday'
this.exportFieldList.devicesNum = 'devicesNum'
this.exportFieldList.devicesName = 'devicesName'
this.exportFieldList.createTime = 'createTime'
this.exportFieldList.wecomTags = 'wecomTags'
this.exportFieldList.miniProgramTags = 'miniProgramTags'
} else {
this.exportFieldList.nickname = null
this.exportFieldList.id = null
this.exportFieldList.credit = null
this.exportFieldList.expireCredit = null
this.exportFieldList.unionid = null
this.exportFieldList.mobile = null
this.exportFieldList.province = null
this.exportFieldList.city = null
this.exportFieldList.area = null
this.exportFieldList.birthday = null
this.exportFieldList.devicesNum = null
this.exportFieldList.devicesName = null
this.exportFieldList.createTime = null
this.exportFieldList.wecomTags = null
this.exportFieldList.miniProgramTags = null
}
},
exportArea() {
if (this.exportFieldList.province != null) {
this.exportFieldList.city = 'city'
this.exportFieldList.area = 'area'
} else {
this.exportFieldList.city = null
this.exportFieldList.area = null
}
},
},
}
</script>
<style lang="scss">
.mini-label .el-form-item__label {
width: 50px !important;
}
</style>