13 Commits

Author SHA1 Message Date
qsh
fe708bd2a8 题库加货车 2023-10-11 11:49:34 +08:00
zcx
fd24f914f7 bug 2023-10-05 12:05:43 +08:00
zcx
59f5885669 bug 2023-10-05 11:08:05 +08:00
zcx
f83a81c02a 题库 2023-09-18 14:14:39 +08:00
zcx
153e7e766c bug 2023-09-18 10:11:04 +08:00
zcx
8bc6ec10c4 bug 2023-09-16 22:45:02 +08:00
zcx
85a36e7fd9 抖音直播线索 2023-09-15 01:56:26 +08:00
f727796d1f Merge pull request '题库自动刷新' (#14) from dev-qsh into master
Reviewed-on: http://114.55.169.15:3000/qiushanhe/dm-manage-web/pulls/14
2023-09-14 15:45:27 +08:00
qsh
e756980625 题库自动刷新 2023-09-14 15:44:51 +08:00
be38cebe38 Merge pull request 'dev-qsh' (#13) from dev-qsh into master
Reviewed-on: http://114.55.169.15:3000/qiushanhe/dm-manage-web/pulls/13
2023-09-13 15:33:23 +08:00
qsh
3454ff1bd5 冲突 2023-09-13 15:31:45 +08:00
zcx
50a64770ee tiku 2023-09-13 15:25:02 +08:00
qsh
cf049fc1e8 题库 2023-09-13 15:11:48 +08:00
14 changed files with 627 additions and 29 deletions

View File

@@ -95,12 +95,10 @@
<script src="/loading/index.js"></script> <script src="/loading/index.js"></script>
<script type="text/javascript"> <script type="text/javascript">
window._AMapSecurityConfig = { window._AMapSecurityConfig = {
// securityJsCode: '420463f2f8c849ab78b9d29548aff7d3'
securityJsCode: 'f653df5a2c5f44ae68faaab6f6a6b8ab' securityJsCode: 'f653df5a2c5f44ae68faaab6f6a6b8ab'
}; };
</script> </script>
<script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script> <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
<!-- <script src="https://webapi.amap.com/maps?v=1.4.15&key=ec6b7ebe38f7ff27126f7088d87a9091&plugin=AMap.Autocomplete,AMap.PlaceSearch,AMap.Geocoder,AMap.Scale"></script> -->
<script src="https://webapi.amap.com/maps?v=1.4.15&key=713d839ff505943b0f18e6df45f3b0dc&plugin=AMap.Autocomplete,AMap.PlaceSearch,AMap.Geocoder,AMap.Scale"></script> <script src="https://webapi.amap.com/maps?v=1.4.15&key=713d839ff505943b0f18e6df45f3b0dc&plugin=AMap.Autocomplete,AMap.PlaceSearch,AMap.Geocoder,AMap.Scale"></script>
</body> </body>
</html> </html>

View File

@@ -24,3 +24,12 @@ export function updateQuestion(data) {
}); });
} }
export function addQuestion(data) {
return request({
url: '/driver-api/tdQuestion/duima/add',
method: 'put',
data: data
});
}

View File

@@ -0,0 +1,211 @@
<template>
<el-dialog title="试题" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="900px" @close="closeDialog">
<div>
<el-form ref="dialogForm" :model="dialogForm" :rules="dataRule" label-position="left" @keyup.enter.native="dialogFormSubmit()">
<el-row>
<el-col :span="24">
<el-form-item label="题目" prop="question">
<el-input v-model="dialogForm.question" maxlength="200" placeholder="请输入题目" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="选项A" prop="question">
<el-input v-model="dialogForm.chooseA" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="选项B" prop="question">
<el-input v-model="dialogForm.chooseB" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="选项C" prop="question">
<el-input v-model="dialogForm.chooseC" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="选项D" prop="question">
<el-input v-model="dialogForm.chooseD" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="选项E" prop="question">
<el-input v-model="dialogForm.chooseE" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="选项F" prop="question">
<el-input v-model="dialogForm.chooseF" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="选项G" prop="question">
<el-input v-model="dialogForm.chooseG" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="答案" prop="trueAnswer">
<el-input v-model="dialogForm.trueAnswer" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="科目" prop="subject">
<span v-if="dialogForm.subject == 1">科一</span>
<span v-if="dialogForm.subject == 4">科四</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="精选500题" prop="isVip">
<el-radio-group v-model="dialogForm.isVip" size="small">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="精选600题" prop="isVip2">
<el-radio-group v-model="dialogForm.isVip2" size="small">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否易错题" prop="isError">
<el-radio-group v-model="dialogForm.isError" size="small">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否新规" prop="isNew">
<el-radio-group v-model="dialogForm.isNew" size="small">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否密卷1" prop="isExam1">
<el-radio-group v-model="dialogForm.isExam1" size="small">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否密卷2" prop="isExam2">
<el-radio-group v-model="dialogForm.isExam2" size="small">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<!-- <el-row>
<el-col :span="24">
<el-form-item label="考点" prop="examKeys">
<el-input v-model="dialogForm.examKeys" maxlength="200" placeholder="请输入考点" clearable />
<span style="color:red;">包含多个考点,以英文";"分割</span>
</el-form-item>
</el-col>
</el-row> -->
<el-row>
<el-col :span="24">
<el-form-item label="答题技巧" prop="skillInfo">
<el-input v-model="dialogForm.skillInfo" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button plain @click="(visible=false)">取消</el-button>
<el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button>
</span>
</el-dialog>
</template>
<script>
import { addQuestion } from '@/api/question';
export default {
data () {
return {
visible: false,
canSubmit: true,
dialogForm: {
questionId: undefined,
isVip: 0,
isVip2: 0,
isError: 0,
isNew: 0,
isExam1: 0,
isExam2: 0,
examKeys: undefined
},
dataRule: {
schoolName: [{ required: true, message: '驾校名称不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
}
};
},
methods: {
init (info = undefined) {
// debugger
this.visible = true;
this.$nextTick(() => {
this.resetDialogForm();
// this.$refs['dialogForm'].resetFields();
if (info) {
this.dialogForm = this.deepClone(info);
}
});
},
resetDialogForm () {
this.dialogForm = {
questionId: undefined,
isVip: 0,
isVip2: 0,
isError: 0,
isNew: 0,
isExam1: 0,
isExam2: 0,
examKeys: undefined
};
},
closeDialog () {
this.$emit('update:dialogVisible', false);
},
// 表单提交
dialogFormSubmit () {
this.$refs.dialogForm.validate((valid) => {
if (valid) {
updateQuestion(this.dialogForm).then(response => {
if (response.code == 200) {
this.$modal.msgSuccess('修改成功');
// this.visible = true;
}
});
}
});
}
}
};
</script>

View File

@@ -4,7 +4,7 @@
<el-form ref="dialogForm" :model="dialogForm" :rules="dataRule" label-position="left" @keyup.enter.native="dialogFormSubmit()"> <el-form ref="dialogForm" :model="dialogForm" :rules="dataRule" label-position="left" @keyup.enter.native="dialogFormSubmit()">
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="题" prop="question"> <el-form-item label="题" prop="question">
<div>{{ dialogForm.question }}</div> <div>{{ dialogForm.question }}</div>
<img v-if="dialogForm.imageUrl" :src="dialogForm.imageUrl" width="100" alt=""> <img v-if="dialogForm.imageUrl" :src="dialogForm.imageUrl" width="100" alt="">
</el-form-item> </el-form-item>
@@ -88,13 +88,20 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <!-- <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="考点" prop="examKeys"> <el-form-item label="考点" prop="examKeys">
<el-input v-model="dialogForm.examKeys" maxlength="200" placeholder="请输入考点" clearable /> <el-input v-model="dialogForm.examKeys" maxlength="200" placeholder="请输入考点" clearable />
<span style="color:red;">包含多个考点,以英文";"分割</span> <span style="color:red;">包含多个考点,以英文";"分割</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> -->
<el-row>
<el-col :span="24">
<el-form-item label="答题技巧" prop="skillInfo">
<el-input v-model="dialogForm.skillInfo" maxlength="200" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>

View File

@@ -1,12 +1,29 @@
<template> <template>
<div class="app-container" style="text-align:center"> <div class="app-container" style="text-align:center">
<el-form size="small" :inline="true" label-width="68px" @submit.native.prevent> <el-form size="small" :inline="true" label-width="68px" @submit.native.prevent>
<el-row :gutter="20">
<el-form-item label="车型">
<el-radio-group v-model="queryParams.carTypeId">
<el-radio :label="1001">小车</el-radio>
<el-radio :label="1002">摩托车</el-radio>
<el-radio :label="1003">货车</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="科目">
<el-radio-group v-model="queryParams.subject">
<el-radio :label="1">科一</el-radio>
<el-radio :label="4">科四</el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<el-form-item label="题目"> <el-form-item label="题目">
<el-input v-model="queryParams.question" placeholder="请输入题目" clearable style="width:400px" @keyup.enter.native="handleQuery" /> <el-input v-model="queryParams.question" placeholder="请输入题目" clearable style="width:400px" @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <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-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
<el-button type="primary" icon="el-icon-plus" @click="handleAdd">新增</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -36,6 +53,11 @@
{{ row.isNew ? '是' : '' }} {{ row.isNew ? '是' : '' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="车型" align="center" min-width="100">
<template slot-scope="{row}">
{{ row.carTypeId == 1001 ? '小车' : '摩托车' }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-download" @click="handleEdit(scope.row)">编辑</el-button> <el-button size="mini" type="text" icon="el-icon-download" @click="handleEdit(scope.row)">编辑</el-button>
@@ -45,17 +67,20 @@
<!-- <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> --> <!-- <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> -->
<QuestionForm v-if="dialogVisible" ref="dialogForm" :dialog-visible="dialogVisible" @update="getList" /> <QuestionForm v-if="dialogVisible" ref="dialogForm" :dialog-visible="dialogVisible" @update="getList" />
<QuestionAddForm v-if="dialogAddVisible" ref="dialogAddForm" :dialog-visible="dialogAddVisible" @update="getList" />
</div> </div>
</template> </template>
<script> <script>
import { searchQuestion } from '@/api/question'; import { searchQuestion } from '@/api/question';
import QuestionForm from './components/QuestionForm.vue'; import QuestionForm from './components/QuestionForm.vue';
import QuestionAddForm from './components/QuestionAddForm.vue';
export default { export default {
name: 'Question', name: 'Question',
components: { components: {
QuestionForm QuestionForm, QuestionAddForm
}, },
data() { data() {
return { return {
@@ -66,9 +91,12 @@ export default {
tableList: [], tableList: [],
// 查询参数 // 查询参数
queryParams: { queryParams: {
question: '' question: '',
carTypeId: 1001,
subject: 1
}, },
dialogVisible: false dialogVisible: false,
dialogAddVisible: false
}; };
}, },
created() { created() {
@@ -103,6 +131,12 @@ export default {
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.dialogForm.init(item); this.$refs.dialogForm.init(item);
}); });
},
handleAdd(item) {
this.dialogAddVisible = true;
this.$nextTick(() => {
this.$refs.dialogAddForm.init(item);
});
} }
} }
}; };

View File

@@ -281,7 +281,6 @@ export default {
}, },
// 导入地图 // 导入地图
importMap() { importMap() {
// const url = 'https://webapi.amap.com/maps?v=1.4.15&key=f2f35d6adc4a16bb879d303cead56237&callback=onLoad';
const url = 'https://webapi.amap.com/maps?v=1.4.15&key=0e62be0896c6b8d27d453445f0fb8bc4&callback=onLoad'; const url = 'https://webapi.amap.com/maps?v=1.4.15&key=0e62be0896c6b8d27d453445f0fb8bc4&callback=onLoad';
var jsapi = document.createElement('script'); var jsapi = document.createElement('script');
jsapi.charset = 'utf-8'; jsapi.charset = 'utf-8';
@@ -547,7 +546,7 @@ export default {
for (let i = 0; i < this.tableData.length; i++) { for (let i = 0; i < this.tableData.length; i++) {
const element = this.tableData[i]; const element = this.tableData[i];
const tempSchool = this.schoolList.filter((item) => item.schoolId === element.schoolId)[0]; const tempSchool = this.schoolList.filter((item) => item.schoolId === element.schoolId)[0];
if (!tempSchool.showInMap || !element.showInMap) { if (!element.schoolShow || !element.showInMap) {
continue; continue;
} }
const tmpMarker = new AMap.Marker({ const tmpMarker = new AMap.Marker({

View File

@@ -64,6 +64,16 @@
<el-input v-model="clueForm.weChat" placeholder="请输入微信号" /> <el-input v-model="clueForm.weChat" placeholder="请输入微信号" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24" v-if="clueForm.source == '抖音直播'">
<el-form-item label="商品名称" prop="goodName">
<el-input v-model="clueForm.goodName" placeholder="请输入商品名称" />
</el-form-item>
</el-col>
<el-col :span="24" v-if="clueForm.source == '抖音直播'">
<el-form-item label="订单实收" prop="amountReceived">
<el-input v-model="clueForm.amountReceived" placeholder="请输入订单实收" />
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="跟进人员" prop="followUser"> <el-form-item label="跟进人员" prop="followUser">
<el-select style="width: 100%;" v-model="clueForm.followUser" multiple clearable :disabled="admin != 'true' && clueForm.clueId != undefined"> <el-select style="width: 100%;" v-model="clueForm.followUser" multiple clearable :disabled="admin != 'true' && clueForm.clueId != undefined">
@@ -73,16 +83,34 @@
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="意向状态" prop="intentionState"> <el-form-item label="意向状态" prop="intentionState" v-if="clueForm.source == '抖音直播'">
<el-select style="width: 100%;" v-model="clueForm.intentionState" placeholder="请选择" clearable> <el-select style="width: 100%;" v-model="clueForm.intentionState" placeholder="请选择" clearable>
<el-option v-for="dict in intentionOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue"> <el-option v-for="dict in intentionOptions.filter(item => item.remark == undefined || item.remark == '抖音')" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue">
<i class="el-icon-star-on" :style="dict.cssClass" /> <i class="el-icon-star-on" :style="dict.cssClass" />
<span style="float: right; color: #8492a6; font-size: 13px"> <span style="float: right; color: #8492a6; font-size: 13px">
{{ dict.dictValue }} {{ dict.dictValue }}
</span> </span>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="意向状态" prop="intentionState" v-else>
<el-select style="width: 100%;" v-model="clueForm.intentionState" placeholder="请选择" clearable>
<el-option v-for="dict in intentionOptions.filter(item => item.remark == undefined || item.remark == '正常')" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue">
<i class="el-icon-star-on" :style="dict.cssClass" />
<span style="float: right; color: #8492a6; font-size: 13px">
{{ dict.dictValue }}
</span>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" v-if="clueForm.source == '抖音直播'">
<el-form-item label="核销时间" prop="writeOffTime">
<el-date-picker style="width: 100%;" v-model="clueForm.writeOffTime" value-format="yyyy-MM-dd" format="yyyy-MM-dd" type="date" />
</el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="下次跟进时间" prop="followTime"> <el-form-item label="下次跟进时间" prop="followTime">

View File

@@ -108,5 +108,29 @@ export const defaultColumns = [{
width: 140, width: 140,
visible: true, visible: true,
overflow: true overflow: true
},
{
key: 14,
prop: 'goodName',
label: '商品名称',
width: 140,
visible: true,
overflow: true
},
{
key: 15,
prop: 'amountReceived',
label: '订单实收',
width: 140,
visible: true,
overflow: true
},
{
key: 16,
prop: 'writeOffTime',
label: '核销时间',
width: 140,
visible: true,
overflow: true
} }
]; ];

View File

@@ -0,0 +1,257 @@
<template>
<div style="margin-bottom: 50px">
<el-dialog title="抖音线索" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="700px" @close="visible = false">
<el-form ref="clueForm" :model="clueForm" :rules="rules" label-width="110px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker style="width: 100%;" v-model="clueForm.createTime" value-format="yyyy-MM-dd HH:mm" format="yyyy-MM-dd HH:mm" type="datetime" :disabled="admin!='true'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="线索来源" prop="source">
<el-select style="width: 100%;" v-model="clueForm.source" placeholder="请选择" clearable>
<el-option v-for="dict in sourceOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名" prop="name">
<el-input v-model="clueForm.name" placeholder="请输入姓名" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式" prop="phone">
<el-input v-model="clueForm.phone" placeholder="请输入联系方式" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="商品名称" prop="goodName">
<el-input v-model="clueForm.goodName" placeholder="请输入微信号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="订单实收" prop="amountReceived">
<el-input v-model="clueForm.amountReceived" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="跟进人员" prop="followUser">
<el-select style="width: 100%;" v-model="clueForm.followUser" multiple clearable :disabled="admin != 'true' && clueForm.clueId != undefined">
<el-option v-for="dict in userOptions" :key="dict.id" :label="dict.name" :value="dict.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="意向状态" prop="intentionState">
<el-select style="width: 100%;" v-model="clueForm.intentionState" placeholder="请选择" clearable>
<el-option v-for="dict in intentionOptions.filter(item => item.remark == undefined || item.remark == '抖音')" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue">
<i class="el-icon-star-on" :style="dict.cssClass" />
<span style="float: right; color: #8492a6; font-size: 13px">
{{ dict.dictValue }}
</span>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="核销时间" prop="writeOffTime">
<el-date-picker style="width: 100%;" v-model="clueForm.writeOffTime" value-format="yyyy-MM-dd" format="yyyy-MM-dd" type="date" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下次跟进时间" prop="followTime">
<el-date-picker style="width: 100%;" v-model="clueForm.followTime" value-format="yyyy-MM-dd" format="yyyy-MM-dd" type="date" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="clueMemo">
<el-input v-model="clueForm.clueMemo" type="textarea" :rows="5" maxlength="10009" />
</el-form-item>
</el-col>
<!-- 跟进记录 -->
<el-col :span="24" style="margin-top: 20px;">
<el-form-item label="跟进记录" prop="clueMemo" label-position="top">
<FollowRecord v-if="clueId" :clueId="clueId" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button plain @click="(visible = false)">取消</el-button>
<el-button v-jclick type="primary" :disabled="!canSubmit" @click="clueSubmit()">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<!-- eslint-disable no-undef -->
<script>
import { getConsultRecord, addClue, updateClue, } from '@/api/zs/clue'
import empApi from '@/api/system/employee'
import FollowRecord from '../ClueForm/components/FollowRecord.vue';
// import AMap from 'AMap';
export default {
name: 'ClueForm',
components: {
FollowRecord
},
data() {
return {
admin: localStorage.getItem('admin'),
userId: localStorage.getItem('userId'),
clueId: undefined,
clueForm: {
followTime: undefined
},
rules: {
name: { required: true, message: '姓名不为空', trigger: 'blur' },
phone: [{ required: true, message: '联系方式不为空', trigger: 'blur' },
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }],
createTime: { required: true, message: '创建时间不为空', trigger: 'blur,change' },
consultTime: { required: true, message: '咨询时间不为空', trigger: 'blur,change' },
source: { required: true, message: '线索来源不为空', trigger: 'blur,change' },
address: { required: true, message: '位置不为空', trigger: 'blur' },
intentionState: { required: true, message: '意向状态不为空', trigger: 'blur,change' },
goodName: { required: true, message: '商品名称不为空', trigger: 'blur,change' },
amountReceived: { required: true, message: '订单实收不为空', trigger: 'blur,change' }
},
userOptions: [],//跟进人员
sourceOptions: [],//线索来源
intentionOptions: [],//意向状态
placeList: [],//场地信息
mapDialogVisible: false,
consultRecord: [],
canSubmit: true,
saveNextShow: true,
saveNext: false,
visible: false
};
},
created() {
this.getEmployee();
// 线索来源
this.getDicts('dm_source').then((response) => {
this.sourceOptions = response.data;
});
// 意向状态
this.getDicts('dm_intention_state').then((response) => {
this.intentionOptions = response.data.filter(item => item.remark == undefined || item.remark == '抖音');
});
},
methods: {
init(info){
this.canSubmit = true;
this.$nextTick(() => {
this.resetDialogForm();
// this.$refs['dialogForm'].resetFields();
if (info) {
this.clueForm = this.deepClone(info);
if(this.clueForm.clueId){
this.clueId = this.clueForm.clueId
this.getConsultRecord(this.clueForm.phone);
}
}
this.visible = true;
});
},
resetDialogForm() {
this.clueForm = {
clueId: undefined,
createTime: this.parseTime(new Date(), '{y}-{m}-{d} {h}:{i}'),
consultTime: undefined,
source: "抖音直播",
name: undefined,
phone: undefined,
address: undefined,
intentionState: undefined,
followInfo: undefined,
followTime: undefined,
followUser: [],
signupInfo: undefined,
requirement: undefined,
licenseType: undefined,
lng: undefined,
lat: undefined,
goodName: undefined,
amountReceived: undefined,
writeOffTime: undefined
}
if (this.admin == 'false') {
this.clueForm.followUser.push(Number(this.userId))
}
},
// 查询咨询记录
getConsultRecord(phone) {
getConsultRecord({ phone }).then((resp) => {
if (resp && resp.code === 200 && resp.data) {
this.consultRecord = resp.data
if (this.consultRecord && this.consultRecord.length > 0) {
this.clueForm.consultCount = this.consultRecord.length
}
}
})
},
// 查询不能接收线索的员工
getEmployee() {
empApi.getEmployee().then((resp) => {
if (resp.code === 200) {
this.userOptions = resp.data;
// this.userOptions = this.userOptions.filter((item) => {
// return item.accept;
// });
}
});
},
//表单提交
clueSubmit() {
this.$refs.clueForm.validate(async (valid) => {
if (valid) {
this.canSubmit = false
let resp
if (this.clueForm.clueId) {
resp = await updateClue(this.clueForm)
this.canSubmit = true
if (resp.code === 200) {
this.$message.success('修改成功')
this.$emit('refreshDataList');
this.visible = false
}
} else {
resp = await addClue(this.clueForm)
this.canSubmit = false
if (resp.code === 200) {
if (resp.data && resp.data == 1) {
this.$message({
message: resp.msg,
type: 'warning'
});
} else {
this.$message.success('新增成功')
}
this.$emit('refreshDataList');
this.visible = false
}
}
}
})
},
}
};
</script>

View File

@@ -1,6 +1,6 @@
<template> <template>
<el-dialog :title="title" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="400px"> <el-dialog :title="title" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="400px">
<el-upload ref="upload" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?ydtData=' + ydtData" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag> <el-upload ref="upload" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?ydtData=' + ydtData+ '&dYData=' + dYData" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
<i class="el-icon-upload" /> <i class="el-icon-upload" />
<div class="el-upload__text"> <div class="el-upload__text">
将文件拖到此处 将文件拖到此处
@@ -28,6 +28,7 @@ export default {
canSubmit: true, canSubmit: true,
isUploading: true, isUploading: true,
ydtData: false, ydtData: false,
dYData: false,
title: '学员信息导入', title: '学员信息导入',
upload: { upload: {
// 是否禁用上传 // 是否禁用上传
@@ -40,19 +41,30 @@ export default {
}; };
}, },
methods: { methods: {
init(info = false) { init(info = {}) {
this.visible = true; this.visible = true;
this.ydtData = false; this.ydtData = false;
this.ydtData = false;
this.canSubmit = true;
this.$nextTick(() => { this.$nextTick(() => {
if (info) { if (info) {
this.ydtData = info; this.ydtData = info.ydtData;
this.title = '一点通-' + this.title; this.dYData = info.dYData;
if(this.ydtData){
this.title = "一点通" + this.title;
}
if(this.dYData){
this.title = "抖音" + this.title;
}
} }
}); });
}, },
/** 下载模板操作 */ /** 下载模板操作 */
importTemplate() { importTemplate() {
this.download('zs/clue/importTemplate?ydtData=' + this.ydtData, {}, `clue_template_${new Date().getTime()}.xlsx`); debugger
this.download('zs/clue/importTemplate?ydtData=' + this.ydtData + '&dYData=' + this.dYData, {}, `clue_template_${new Date().getTime()}.xlsx`);
}, },
// 文件上传中处理 // 文件上传中处理
handleFileUploadProgress(event, file, fileList) { handleFileUploadProgress(event, file, fileList) {

View File

@@ -4,8 +4,12 @@
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['zs:clue:add']" icon="el-icon-plus" type="primary" @click="handleAddandUpdate(undefined)">新增</el-button> <el-button v-hasPermi="['zs:clue:add']" icon="el-icon-plus" type="primary" @click="handleAddandUpdate(undefined)">新增</el-button>
<el-button v-hasPermi="['zs:clue:import']" icon="el-icon-upload" type="warning" @click="handleImport(false)">导入</el-button> <el-button v-hasPermi="['zs:clue:add']" icon="el-icon-plus" type="primary" @click="handleDYAddandUpdate(undefined)">抖音新增</el-button>
<el-button v-hasPermi="['zs:clue:import']" icon="el-icon-upload" type="warning" @click="handleImport(true)">一点通导入</el-button>
<el-button v-hasPermi="['zs:clue:import']" icon="el-icon-upload" type="warning" @click="handleImport(false,false)">导入</el-button>
<el-button v-hasPermi="['zs:clue:import']" icon="el-icon-upload" type="warning" @click="handleImport(true, false)">一点通导入</el-button>
<el-button v-hasPermi="['zs:clue:import']" icon="el-icon-upload" type="warning" @click="handleImport(false, true)">抖音导入</el-button>
<el-button v-hasPermi="['zs:clue:export']" icon="el-icon-download" type="warning" @click="handleExport">导出</el-button> <el-button v-hasPermi="['zs:clue:export']" icon="el-icon-download" type="warning" @click="handleExport">导出</el-button>
<el-button v-hasPermi="['zs:clue:edit']" icon="el-icon-edit" type="primary" :disabled="multiple" @click="handleBatChUpdate()">批量修改</el-button> <el-button v-hasPermi="['zs:clue:edit']" icon="el-icon-edit" type="primary" :disabled="multiple" @click="handleBatChUpdate()">批量修改</el-button>
<el-button type="primary" @click="handlePublicClue">公海</el-button> <el-button type="primary" @click="handlePublicClue">公海</el-button>
@@ -25,6 +29,7 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" fixed="right" align="left" min-width="200"> <el-table-column label="操作" fixed="right" align="left" min-width="200">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- <el-button v-if="(admin == 'true' || scope.row.followUser2.indexOf(userId) != -1 ) && scope.row.source == '抖音直播'" v-hasPermi="['zs:clue:edit']" type="text" style="color: red;" @click.native.stop="handleDYAddandUpdate(scope.row)">编辑</el-button> -->
<el-button v-if="(admin == 'true' || scope.row.followUser2.indexOf(userId) != -1 )" v-hasPermi="['zs:clue:edit']" type="text" style="color: red;" @click.native.stop="handleAddandUpdate(scope.row)">编辑</el-button> <el-button v-if="(admin == 'true' || scope.row.followUser2.indexOf(userId) != -1 )" v-hasPermi="['zs:clue:edit']" type="text" style="color: red;" @click.native.stop="handleAddandUpdate(scope.row)">编辑</el-button>
<el-button v-if="(admin == 'true' || scope.row.followUser2.indexOf(userId) != -1 )" v-hasPermi="['zs:clue:distribute']" type="text" @click.native.stop="handleDistribute(scope.row)">分发</el-button> <el-button v-if="(admin == 'true' || scope.row.followUser2.indexOf(userId) != -1 )" v-hasPermi="['zs:clue:distribute']" type="text" @click.native.stop="handleDistribute(scope.row)">分发</el-button>
<el-button v-if="(admin == 'true' || scope.row.followUser2.indexOf(userId) != -1 ) && scope.row.state" v-hasPermi="['zs:clue:sign']" type="text" style="color: #26a69a" @click.native.stop="handleSign(scope.row)">已登记</el-button> <el-button v-if="(admin == 'true' || scope.row.followUser2.indexOf(userId) != -1 ) && scope.row.state" v-hasPermi="['zs:clue:sign']" type="text" style="color: #26a69a" @click.native.stop="handleSign(scope.row)">已登记</el-button>
@@ -51,6 +56,8 @@
<ZhuangDanDialog ref="zhuangDanDialog" /> <ZhuangDanDialog ref="zhuangDanDialog" />
<!-- 备注编辑 --> <!-- 备注编辑 -->
<MemoFormDialog ref="memoDialog" @refreshDataList="_getTableList" /> <MemoFormDialog ref="memoDialog" @refreshDataList="_getTableList" />
<!-- 抖音直播弹框 -->
<DYClueFormDialog ref="DYClueFormDialog" @refreshDataList="_getTableList"/>
</div> </div>
</template> </template>
@@ -64,6 +71,7 @@ import DistributeFormDialog from './components/DistributeFormDialog.vue';
import SignFormDialog from '../sign/components/SignFormDialog.vue'; import SignFormDialog from '../sign/components/SignFormDialog.vue';
import ZhuangDanDialog from './components/ZhuangDanDialog.vue'; import ZhuangDanDialog from './components/ZhuangDanDialog.vue';
import MemoFormDialog from './components/MemoFormDialog.vue'; import MemoFormDialog from './components/MemoFormDialog.vue';
import DYClueFormDialog from './components/DYClueFormDialog.vue';
import { defaultColumns } from './columns.js'; import { defaultColumns } from './columns.js';
import { getClueList, deleteClue, getClueCountBadge, discardClue, getSign, getConsultRecord } from '@/api/zs/clue'; import { getClueList, deleteClue, getClueCountBadge, discardClue, getSign, getConsultRecord } from '@/api/zs/clue';
@@ -80,7 +88,8 @@ export default {
} }
}, },
components: { components: {
SearchForm, BatchUpdateDialog, PublicDialog, UploadDialog, SignFormDialog, DistributeFormDialog, ZhuangDanDialog, MemoFormDialog SearchForm, BatchUpdateDialog, PublicDialog, UploadDialog, SignFormDialog, DistributeFormDialog, ZhuangDanDialog, MemoFormDialog,
DYClueFormDialog
}, },
data() { data() {
return { return {
@@ -156,6 +165,12 @@ export default {
handleAddandUpdate(info) { handleAddandUpdate(info) {
this.$router.push('/zs/clue-form/index/' + (info ? info.clueId : 0)); this.$router.push('/zs/clue-form/index/' + (info ? info.clueId : 0));
}, },
//抖音新增
handleDYAddandUpdate(info){
this.$nextTick(() => {
this.$refs.DYClueFormDialog.init(info);
});
},
// 多选框选中数据 // 多选框选中数据
handleSelectionChange(selection) { handleSelectionChange(selection) {
console.log(selection); console.log(selection);
@@ -198,9 +213,9 @@ export default {
.catch(function () { }); .catch(function () { });
}, },
// 导入 // 导入
handleImport(ydtData) { handleImport(ydtData, dYData) {
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.uploadDialogForm.init(ydtData); this.$refs.uploadDialogForm.init({ydtData: ydtData, dYData: dYData});
}); });
}, },
/** 导出按钮操作 */ /** 导出按钮操作 */
@@ -269,7 +284,11 @@ export default {
}, },
handleRowClick(row) { handleRowClick(row) {
if (this.quickSearch != 8) { if (this.quickSearch != 8) {
// if(row.source == '抖音直播'){
// this.handleDYAddandUpdate(row);
// } else {
this.handleAddandUpdate(row) this.handleAddandUpdate(row)
// }
} }
}, },
handleCellClick(row, column, cell, event) { handleCellClick(row, column, cell, event) {

View File

@@ -332,7 +332,7 @@ export default {
}); });
}, },
getPlaces(schoolId) { getPlaces(schoolId) {
getAllPlaces({ schoolId: schoolId, status: '0' }).then((resp) => { getAllPlaces({ schoolId: schoolId, status: '0' , showInMap : true}).then((resp) => {
this.placeOptions = resp.data; this.placeOptions = resp.data;
}); });
}, },

View File

@@ -30,9 +30,9 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" fixed="right" align="center" width="160"> <el-table-column label="操作" fixed="right" align="center" width="160">
<template slot-scope="{row}"> <template slot-scope="{row}">
<el-button v-show="row.checkState == 0 || row.checkState == 3" v-hasPermi="['zs:sign:edit']" size="mini" type="text" icon="el-icon-edit" @click="handleAddAndUpdate(scope.row)">修改</el-button> <el-button v-show="row.checkState == 0 || row.checkState == 3" v-hasPermi="['zs:sign:edit']" size="mini" type="text" icon="el-icon-edit" @click="handleAddAndUpdate(row)">修改</el-button>
<el-button v-if="row.checkState == 1" v-hasPermi="['zs:sign:check']" size="mini" type="text" @click="handleCheck(scope.row)">审核</el-button> <el-button v-if="row.checkState == 1" v-hasPermi="['zs:sign:check']" size="mini" type="text" @click="handleCheck(row)">审核</el-button>
<el-button v-hasPermi="['zs:sign:remove']" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button> <el-button v-hasPermi="['zs:sign:remove']" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

View File

@@ -34,7 +34,7 @@ module.exports = {
open: true, open: true,
proxy: { proxy: {
[process.env.VUE_APP_BASE_API + '/driver-api']: { [process.env.VUE_APP_BASE_API + '/driver-api']: {
target: `https://jwl.ahduima.com/driver-api/`, target: `http://118.31.23.45:8888/driver-api/`,
// target: `http://localhost:8888/driver-api/`, // target: `http://localhost:8888/driver-api/`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
@@ -43,8 +43,8 @@ module.exports = {
}, },
// detail: https://cli.vuejs.org/config/#devserver-proxy // detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
target: `https://xueche.ahduima.com/duima/`, // target: `https://xueche.ahduima.com/duima/`,
// target: `http://localhost:8086`, target: `http://localhost:8086`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ['^' + process.env.VUE_APP_BASE_API]: ''