|
@@ -0,0 +1,545 @@
|
|
|
+<template>
|
|
|
+ <page-header-wrapper>
|
|
|
+ <a-card style="margin-bottom:20px">
|
|
|
+ <a-row>
|
|
|
+ 今日统计
|
|
|
+ </a-row>
|
|
|
+ <a-row>
|
|
|
+ <a-col :sm="8" :xs="24">
|
|
|
+ <info title="今日待跟进线索数" value="0" :bordered="true" />
|
|
|
+ </a-col>
|
|
|
+ <a-col :sm="8" :xs="24">
|
|
|
+ <info title="今日已跟进线索数" value="1" :bordered="true" />
|
|
|
+ </a-col>
|
|
|
+ <a-col :sm="8" :xs="24">
|
|
|
+ <info title="今日签约数" value="2" />
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-card>
|
|
|
+
|
|
|
+ <a-card>
|
|
|
+ <div class="table-page-search-wrapper">
|
|
|
+ <a-form layout="inline">
|
|
|
+ <a-row :gutter="20">
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="搜索线索">
|
|
|
+ <a-input v-model="queryParam.id" placeholder="请输入线索姓名或手机号"/>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="跟进人">
|
|
|
+ <a-select v-model="queryParam.status" placeholder="请选择跟进人" default-value="0">
|
|
|
+ <a-select-option value="0">全部</a-select-option>
|
|
|
+ <a-select-option value="1">关闭</a-select-option>
|
|
|
+ <a-select-option value="2">运行中</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="添加时间">
|
|
|
+ <a-range-picker allowClear v-model="createTime" :format="dateFormat" @change="handleTimeChange" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="跟进添加">
|
|
|
+ <a-range-picker allowClear v-model="createTime" :format="dateFormat" @change="handleTimeChange" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="4" :sm="24">
|
|
|
+ <a-form-item label="最后跟进">
|
|
|
+ <a-range-picker allowClear v-model="createTime" :format="dateFormat" @change="handleTimeChange" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="待回访日期">
|
|
|
+ <a-range-picker allowClear v-model="createTime" :format="dateFormat" @change="handleTimeChange" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="来源渠道">
|
|
|
+ <a-select v-model="queryParam.status" placeholder="请选择来源渠道" default-value="0">
|
|
|
+ <a-select-option value="0">全部</a-select-option>
|
|
|
+ <a-select-option value="1">关闭</a-select-option>
|
|
|
+ <a-select-option value="2">运行中</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="意向度">
|
|
|
+ <a-select v-model="queryParam.status" placeholder="请选择意向度" default-value="0">
|
|
|
+ <a-select-option value="0">全部</a-select-option>
|
|
|
+ <a-select-option value="1">关闭</a-select-option>
|
|
|
+ <a-select-option value="2">运行中</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="意向课程">
|
|
|
+ <a-select v-model="queryParam.status" placeholder="请选择意向课程" default-value="0">
|
|
|
+ <a-select-option value="0">全部</a-select-option>
|
|
|
+ <a-select-option value="1">关闭</a-select-option>
|
|
|
+ <a-select-option value="2">运行中</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="4" :sm="24">
|
|
|
+ <a-form-item label="采单员">
|
|
|
+ <a-select v-model="queryParam.status" placeholder="请选择采单员" default-value="0">
|
|
|
+ <a-select-option value="0">全部</a-select-option>
|
|
|
+ <a-select-option value="1">关闭</a-select-option>
|
|
|
+ <a-select-option value="2">运行中</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="线索状态">
|
|
|
+ <a-select v-model="queryParam.status" placeholder="请选择线索状态" default-value="0">
|
|
|
+ <a-select-option value="0">全部</a-select-option>
|
|
|
+ <a-select-option value="1">关闭</a-select-option>
|
|
|
+ <a-select-option value="2">运行中</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="跟进状态">
|
|
|
+ <a-select v-model="queryParam.status" placeholder="请选择跟进状态" default-value="0">
|
|
|
+ <a-select-option value="0">全部</a-select-option>
|
|
|
+ <a-select-option value="1">关闭</a-select-option>
|
|
|
+ <a-select-option value="2">运行中</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="5" :sm="24">
|
|
|
+ <a-form-item label="就读年级">
|
|
|
+ <a-select v-model="queryParam.status" placeholder="请选择就读年级" default-value="0">
|
|
|
+ <a-select-option value="0">全部</a-select-option>
|
|
|
+ <a-select-option value="1">关闭</a-select-option>
|
|
|
+ <a-select-option value="2">运行中</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row>
|
|
|
+ <a-col span="22">
|
|
|
+ <a-button type="primary" @click="handleAdd">添加线索</a-button>
|
|
|
+ <a-button style="margin-left: 8px" type="primary" @click="handleAssign">分配线索</a-button>
|
|
|
+ <a-button style="margin-left: 8px" type="danger" @click="handleCancelLeads">标为无效</a-button>
|
|
|
+ <a-button style="margin-left: 8px" type="danger" @click="handleMiss">标为流失</a-button>
|
|
|
+ <a-button style="margin-left: 8px" type="danger" @click="handleDel">删除线索</a-button>
|
|
|
+ <a-button style="margin-left: 8px" type="danger" @click="handleReback">退回公海池</a-button>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="!advanced && 2 || 24" :sm="24">
|
|
|
+ <span class="table-page-search-submitButtons" :style="advanced && { float: 'right', overflow: 'hidden' } || {} ">
|
|
|
+ <a-button @click="() => this.queryParam = {}">重置</a-button>
|
|
|
+ <a-button style="margin-left: 8px" type="primary" @click="$refs.table.refresh(true)">导出</a-button>
|
|
|
+ </span>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-form>
|
|
|
+ </div>
|
|
|
+ <s-table
|
|
|
+ ref="table"
|
|
|
+ size="default"
|
|
|
+ :rowKey="record => record.id"
|
|
|
+ :columns="columns"
|
|
|
+ :data="loadData"
|
|
|
+ :alert="false"
|
|
|
+ :rowSelection="rowSelection"
|
|
|
+ showPagination="auto">
|
|
|
+ <span slot="serial" slot-scope="text, record, index">
|
|
|
+ {{ index + 1 }}
|
|
|
+ </span>
|
|
|
+ <span slot="status" slot-scope="text">
|
|
|
+ <a-badge :status="text | statusTypeFilter" :text="text | statusFilter" />
|
|
|
+ </span>
|
|
|
+ <span slot="description" slot-scope="text">
|
|
|
+ <ellipsis :length="4" tooltip>{{ text }}</ellipsis>
|
|
|
+ </span>
|
|
|
+ <span slot="action" slot-scope="text, record">
|
|
|
+ <template>
|
|
|
+ <a @click="handleAddLeads(record)">添加记录</a>
|
|
|
+ <a-divider type="vertical" />
|
|
|
+ <a @click="handlePre(record)">转为试听</a>
|
|
|
+ <a-divider type="vertical" />
|
|
|
+ <a @click="handleSub(record)">购课</a>
|
|
|
+ </template>
|
|
|
+ </span>
|
|
|
+ </s-table>
|
|
|
+ </a-card>
|
|
|
+
|
|
|
+ <!-- 添加线索 -->
|
|
|
+ <member-form
|
|
|
+ ref="createModal"
|
|
|
+ :visible="visible"
|
|
|
+ :loading="confirmLoading"
|
|
|
+ :model="mdl"
|
|
|
+ @cancel="handleCancel"
|
|
|
+ @ok="handleOk">
|
|
|
+ </member-form>
|
|
|
+ <!-- /添加线索 -->
|
|
|
+
|
|
|
+ <!-- 分配线索 -->
|
|
|
+ <assign-sales
|
|
|
+ ref="assignModal"
|
|
|
+ :visible="visibleAssign"
|
|
|
+ :loading="confirmLoading"
|
|
|
+ :model="mdl"
|
|
|
+ @cancel="handleCancel"
|
|
|
+ @ok="handleOk">
|
|
|
+ </assign-sales>
|
|
|
+ <!-- /分配线索 -->
|
|
|
+
|
|
|
+ <!-- 标为无效 -->
|
|
|
+ <cancel-leads
|
|
|
+ ref="assignModal"
|
|
|
+ :visible="visibleCancel"
|
|
|
+ :loading="confirmLoading"
|
|
|
+ :model="mdl"
|
|
|
+ @cancel="handleCancel"
|
|
|
+ @ok="handleOk">
|
|
|
+ </cancel-leads>
|
|
|
+ <!-- /标为无效 -->
|
|
|
+
|
|
|
+ <!-- 添加记录 -->
|
|
|
+ <add-leads
|
|
|
+ ref="assignModal"
|
|
|
+ :visible="visibleAddLeads"
|
|
|
+ :loading="confirmLoading"
|
|
|
+ :model="mdl"
|
|
|
+ @cancel="handleCancel"
|
|
|
+ @ok="handleOk">
|
|
|
+ </add-leads>
|
|
|
+ <!-- /添加记录 -->
|
|
|
+
|
|
|
+
|
|
|
+ </page-header-wrapper>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import moment from 'moment'
|
|
|
+import { STable, Ellipsis } from '@/components';
|
|
|
+import { getRoleList, getServiceList } from '@/api/manage'
|
|
|
+import MemberForm from '../modules/MemberForm' // 添加线索
|
|
|
+import AssignSales from '../modules/AssignSales' // 分配线索
|
|
|
+import CancelLeads from '../modules/CancelLeads' // 标为无效
|
|
|
+import AddLeads from '../modules/AddLeads' // 添加记录
|
|
|
+import Info from '../components/Info'
|
|
|
+
|
|
|
+const columns = [
|
|
|
+ {
|
|
|
+ title: '#',
|
|
|
+ scopedSlots: { customRender: 'serial' }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '规则编号',
|
|
|
+ dataIndex: 'no'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '描述',
|
|
|
+ dataIndex: 'description',
|
|
|
+ scopedSlots: { customRender: 'description' }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '服务调用次数',
|
|
|
+ dataIndex: 'callNo',
|
|
|
+ sorter: true,
|
|
|
+ needTotal: true,
|
|
|
+ customRender: (text) => text + ' 次'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '状态',
|
|
|
+ dataIndex: 'status',
|
|
|
+ scopedSlots: { customRender: 'status' }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '更新时间',
|
|
|
+ dataIndex: 'updatedAt',
|
|
|
+ sorter: true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ scopedSlots: { customRender: 'action' },
|
|
|
+ }
|
|
|
+]
|
|
|
+
|
|
|
+const statusMap = {
|
|
|
+ 0: {
|
|
|
+ status: 'default',
|
|
|
+ text: '关闭'
|
|
|
+ },
|
|
|
+ 1: {
|
|
|
+ status: 'processing',
|
|
|
+ text: '运行中'
|
|
|
+ },
|
|
|
+ 2: {
|
|
|
+ status: 'success',
|
|
|
+ text: '已上线'
|
|
|
+ },
|
|
|
+ 3: {
|
|
|
+ status: 'error',
|
|
|
+ text: '异常'
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+export default {
|
|
|
+ name: 'SeasList',
|
|
|
+ components: {
|
|
|
+ STable,
|
|
|
+ Ellipsis,
|
|
|
+ MemberForm,
|
|
|
+ AssignSales,
|
|
|
+ CancelLeads,
|
|
|
+ AddLeads,
|
|
|
+ Info
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ this.columns = columns
|
|
|
+ return {
|
|
|
+ // create model
|
|
|
+ visible: false,
|
|
|
+ visibleAssign: false,
|
|
|
+ visibleCancel: false,
|
|
|
+ visibleAddLeads: false,
|
|
|
+ confirmLoading: false,
|
|
|
+ dateFormat: 'YYYY/MM/DD',
|
|
|
+ createTime: [],
|
|
|
+ mdl: null,
|
|
|
+ // 高级搜索 展开/关闭
|
|
|
+ advanced: false,
|
|
|
+ // 查询参数
|
|
|
+ queryParam: {},
|
|
|
+ loadData: parameter => {
|
|
|
+ const requestParameters = Object.assign({}, parameter, this.queryParam)
|
|
|
+ console.log('loadData request parameters:', requestParameters)
|
|
|
+ return getServiceList(requestParameters)
|
|
|
+ .then(res => {
|
|
|
+ return res.result
|
|
|
+ })
|
|
|
+ },
|
|
|
+ selectedRowKeys: [],
|
|
|
+ selectedRows: []
|
|
|
+ }
|
|
|
+ },
|
|
|
+ filters: {
|
|
|
+ statusFilter (type) {
|
|
|
+ return statusMap[type].text
|
|
|
+ },
|
|
|
+ statusTypeFilter (type) {
|
|
|
+ return statusMap[type].status
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ rowSelection () {
|
|
|
+ return {
|
|
|
+ selectedRowKeys: this.selectedRowKeys,
|
|
|
+ onChange: this.onSelectChange
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ toggleAdvanced () {
|
|
|
+ this.advanced = !this.advanced
|
|
|
+ },
|
|
|
+ handleAddLeads(record) {
|
|
|
+ this.visibleAddLeads = true;
|
|
|
+ this.mdl = { ...record }
|
|
|
+ },
|
|
|
+ handlePre(record) {
|
|
|
+ this.$confirm({
|
|
|
+ title: '提示',
|
|
|
+ content: `确定将${record.id}转为试听学员?`,
|
|
|
+ okText: '确定',
|
|
|
+ cancelText: '取消',
|
|
|
+ onOk () {
|
|
|
+ console.log('OK')
|
|
|
+ // 在这里调用删除接口
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ setTimeout(Math.random() > 0.5 ? resolve : reject, 1000)
|
|
|
+ }).catch(() => console.log('Oops errors!'))
|
|
|
+ },
|
|
|
+ onCancel () {
|
|
|
+ console.log('Cancel')
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ handleEdit (record) {
|
|
|
+ this.visible = true;
|
|
|
+ this.mdl = { ...record }
|
|
|
+ },
|
|
|
+ handleSub (record) {
|
|
|
+ if (record.status !== 0) {
|
|
|
+ this.$message.info(`${record.no} 订阅成功`)
|
|
|
+ } else {
|
|
|
+ this.$message.error(`${record.no} 订阅失败,规则已关闭`)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onSelectChange (selectedRowKeys, selectedRows) {
|
|
|
+ console.log(selectedRowKeys);
|
|
|
+ console.log(selectedRows);
|
|
|
+ this.selectedRowKeys = selectedRowKeys
|
|
|
+ this.selectedRows = selectedRows
|
|
|
+ },
|
|
|
+ // 分配
|
|
|
+ handleAssign() {
|
|
|
+ const canVisible = this.beforeVisible();
|
|
|
+ if(canVisible) {
|
|
|
+ this.visibleAssign = true;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 标为无效
|
|
|
+ handleCancelLeads() {
|
|
|
+ const canVisible = this.beforeVisible();
|
|
|
+ if(canVisible) {
|
|
|
+ this.visibleCancel = true;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleMiss() {
|
|
|
+ const canVisible = this.beforeVisible();
|
|
|
+ if(canVisible) {
|
|
|
+ this.$confirm({
|
|
|
+ title: '警告',
|
|
|
+ content: `确定要将选择的线索标为流失吗?`,
|
|
|
+ okText: '确定',
|
|
|
+ cancelText: '取消',
|
|
|
+ onOk () {
|
|
|
+ console.log('OK')
|
|
|
+ // 在这里调用删除接口
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ setTimeout(Math.random() > 0.5 ? resolve : reject, 1000)
|
|
|
+ }).catch(() => console.log('Oops errors!'))
|
|
|
+ },
|
|
|
+ onCancel () {
|
|
|
+ console.log('Cancel')
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleDel() {
|
|
|
+ const canVisible = this.beforeVisible();
|
|
|
+ if(canVisible) {
|
|
|
+ this.$confirm({
|
|
|
+ title: '警告',
|
|
|
+ content: `确定要将选择的线索删除吗?`,
|
|
|
+ okType: 'danger',
|
|
|
+ okText: '删除',
|
|
|
+ cancelText: '取消',
|
|
|
+ onOk () {
|
|
|
+ console.log('OK')
|
|
|
+ // 在这里调用删除接口
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ setTimeout(Math.random() > 0.5 ? resolve : reject, 1000)
|
|
|
+ }).catch(() => console.log('Oops errors!'))
|
|
|
+ },
|
|
|
+ onCancel () {
|
|
|
+ console.log('Cancel')
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleReback() {
|
|
|
+ const canVisible = this.beforeVisible();
|
|
|
+ if(canVisible) {
|
|
|
+ this.$confirm({
|
|
|
+ title: '警告',
|
|
|
+ content: `确定要将选择的线索退回公海池?`,
|
|
|
+ okText: '确定',
|
|
|
+ cancelText: '取消',
|
|
|
+ onOk () {
|
|
|
+ console.log('OK')
|
|
|
+ // 在这里调用删除接口
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ setTimeout(Math.random() > 0.5 ? resolve : reject, 1000)
|
|
|
+ }).catch(() => console.log('Oops errors!'))
|
|
|
+ },
|
|
|
+ onCancel () {
|
|
|
+ console.log('Cancel')
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ beforeVisible() {
|
|
|
+ if(this.selectedRows.length <= 0) {
|
|
|
+ this.$message.error('请至少选择一个线索');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ },
|
|
|
+ handleOk () {
|
|
|
+ const form = this.$refs.createModal.form;
|
|
|
+ const ruleForm = this.$refs.createModal.$refs.ruleForm
|
|
|
+ this.confirmLoading = true
|
|
|
+ ruleForm.validate(valid => {
|
|
|
+ if (valid) {
|
|
|
+ if (form.id > 0) {
|
|
|
+ // 修改 e.g.
|
|
|
+ new Promise((resolve, reject) => {
|
|
|
+ setTimeout(() => {
|
|
|
+ resolve()
|
|
|
+ console.log(form)
|
|
|
+ }, 1000)
|
|
|
+ }).then(res => {
|
|
|
+ this.visible = false
|
|
|
+ this.confirmLoading = false
|
|
|
+ // 重置表单数据
|
|
|
+ ruleForm.resetFields()
|
|
|
+ // 刷新表格
|
|
|
+ this.$refs.table.refresh()
|
|
|
+ this.$message.info('修改成功')
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ // 新增
|
|
|
+ new Promise((resolve, reject) => {
|
|
|
+ setTimeout(() => {
|
|
|
+ resolve()
|
|
|
+ console.log(form)
|
|
|
+ }, 1000)
|
|
|
+ }).then(res => {
|
|
|
+ this.visible = false
|
|
|
+ this.confirmLoading = false
|
|
|
+ // 重置表单数据
|
|
|
+ ruleForm.resetFields()
|
|
|
+ // 刷新表格
|
|
|
+ this.$refs.table.refresh()
|
|
|
+
|
|
|
+ this.$message.info('新增成功')
|
|
|
+ })
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.confirmLoading = false
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ handleGainOk() {
|
|
|
+ this.gainVisible = false;
|
|
|
+ this.$refs.table.refresh();
|
|
|
+ this.$message.info('修改成功');
|
|
|
+ },
|
|
|
+ handleCancel () {
|
|
|
+ this.visible = false;
|
|
|
+ this.visibleAddLeads = false;
|
|
|
+ this.visibleCancel = false;
|
|
|
+ },
|
|
|
+ handleGainCancel() {
|
|
|
+ this.gainVisible = false;
|
|
|
+ },
|
|
|
+ handleTimeChange (value, dateString) {
|
|
|
+ this.queryParam.startTime = dateString[0];
|
|
|
+ this.queryParam.endTime = dateString[1];
|
|
|
+ },
|
|
|
+ handleAdd() {
|
|
|
+ this.visible = true;
|
|
|
+ },
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style>
|
|
|
+
|
|
|
+</style>
|