Commit 30ae2f0a authored by dragondean@qq.com's avatar dragondean@qq.com
parents 84b09b47 222c94e1
import request from '@/utils/request'
// 创建国家区号
export function createCountry(data) {
return request({
url: '/ecw/country/create',
method: 'post',
data: data
})
}
// 更新国家区号
export function updateCountry(data) {
return request({
url: '/ecw/country/update',
method: 'put',
data: data
})
}
// 删除国家区号
export function deleteCountry(id) {
return request({
url: '/ecw/country/delete?id=' + id,
method: 'delete'
})
}
// 获得国家区号
export function getCountry(id) {
return request({
url: '/ecw/country/get?id=' + id,
method: 'get'
})
}
// 获得所有国家区号
export function getCountryListAll() {
return request({
url: '/ecw/country/list-all',
method: 'get'
})
}
// 获得国家区号分页
export function getCountryPage(query) {
return request({
url: '/ecw/country/page',
method: 'get',
params: query
})
}
// 导出国家区号 Excel
export function exportCountryExcel(query) {
return request({
url: '/ecw/country/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
...@@ -37,7 +37,7 @@ export function getCustomerContacts(id) { ...@@ -37,7 +37,7 @@ export function getCustomerContacts(id) {
// 获得客户联系人列表 // 获得客户联系人列表
export function getCustomerContactsList() { export function getCustomerContactsList() {
return request({ return request({
url: '/ecw/customer-contacts/page', url: '/ecw/customer-contacts/list',
method: 'get' method: 'get'
}) })
} }
...@@ -60,3 +60,12 @@ export function exportCustomerContactsExcel(query) { ...@@ -60,3 +60,12 @@ export function exportCustomerContactsExcel(query) {
responseType: 'blob' responseType: 'blob'
}) })
} }
// 根据客户ID获得联系人列表
export function getCustomerContactsListByCustomer(query) {
return request({
url: '/ecw/customer-contacts/list-by-customer',
method: 'get',
params: query
})
}
<template>
<div>
<div style="display: flex;justify-content: right;margin-bottom: 15px">
<el-button type="primary" style="text-align: right" @click="customerFollow.dialogVisible = true">新增</el-button>
</div>
<el-table
:data="customerFollowList"
style="width: 100%"
>
<el-table-column
type="index"
label="#"
>
</el-table-column>
<el-table-column
prop="followType"
label="跟进类型"
:formatter="(row, column, cellValue) => getDictDataLabel(DICT_TYPE.CUSTOMER_FOLLOW_TYPE, cellValue)"
>
</el-table-column>
<el-table-column
prop="contactName"
label="联系人"
>
</el-table-column>
<el-table-column
prop="followMethod"
label="跟进方式"
:formatter="(row, column, cellValue) => getDictDataLabel(DICT_TYPE.CUSTOMER_FOLLOW_METHOD, cellValue)"
>
</el-table-column>
<el-table-column
prop="followTime"
label="跟进时间"
:formatter="(row, column, cellValue) => parseTime(cellValue)"
>
</el-table-column>
<el-table-column
prop="feedback"
label="客户反馈"
>
</el-table-column>
<el-table-column
prop="result"
label="处理结果"
>
</el-table-column>
<el-table-column
prop="followUserId"
label="跟进业务"
:formatter="(row, column, cellValue) => serviceUserList.find(e => e.id === cellValue).nickname"
>
</el-table-column>
</el-table>
<el-dialog
append-to-body
title="客户跟进"
:visible.sync="customerFollow.dialogVisible"
:close-on-click-modal="false"
width="680px">
<el-form ref="customerFollowForm" :model="customerFollow.form" label-width="80px">
<el-row :gutter="10">
<el-col>
<el-form-item label="跟进类型" required>
<dict-selector form-type="radio" v-model="customerFollow.form.followType" :type="DICT_TYPE.CUSTOMER_FOLLOW_TYPE"></dict-selector>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="跟进时间" required>
<el-date-picker v-model="customerFollow.form.followTime" type="datetime" placeholder="选择跟进时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系人" required>
<el-select v-model="customerFollow.form.contactName" placeholder="请选择">
<el-option
v-for="(item, index) in customerContactsList"
:key="index"
:label="item.name"
:value="item.name">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="跟进业务" required>
<el-select v-model="customerFollow.form.followUserId" placeholder="请选择">
<el-option
v-for="item in serviceUserList"
:key="item.id"
:label="item.nickname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="跟进方式" required>
<dict-selector v-model="customerFollow.form.followMethod" :type="DICT_TYPE.CUSTOMER_FOLLOW_METHOD"></dict-selector>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="客户反馈" required>
<el-input type="textarea" v-model="customerFollow.form.feedback"></el-input>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="处理结果" required>
<el-input type="textarea" v-model="customerFollow.form.result"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="customerFollow.dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="customerFollowSubmit">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {createCustomerFollow, getCustomerFollowPage} from "@/api/ecw/customerFollow"
import { DICT_TYPE, getDictDataLabel } from '@/utils/dict'
import { getCustomerContactsListByCustomer } from '@/api/ecw/customerContacts'
import {listServiceUser} from "@/api/system/user"
import { parseTime } from '@/utils/ruoyi'
export default {
/**
* 客户跟进
* 客户投诉跟进
*/
name: "CustomerFollow",
props: {
customerId: Number
},
data() {
return {
DICT_TYPE,
getDictDataLabel,
parseTime,
customerFollowList: [],
serviceUserList: [],
customerContactsList: [],
customerFollow: {
dialogVisible: false,
form: {}
},
}
},
created() {
this.resetCustomerFollowForm()
if (!!this.customerId) getCustomerContactsListByCustomer({customerId: this.customerId}).then(r => {
this.customerContactsList = r.data
})
listServiceUser().then(r => {
this.serviceUserList = r.data
})
this.getCustomerFollowList()
},
methods: {
customerFollowSubmit() {
this.$refs["customerFollowForm"].validate(valid => {
if (!valid) {
return
}
createCustomerFollow(this.customerFollow.form).then(r => {
this.resetCustomerFollowForm()
this.getCustomerFollowList()
this.customerFollow.dialogVisible = false
})
})
},
resetCustomerFollowForm() {
this.customerFollow.form = {
"bizId": this.customerId,
"contactName": undefined,
"feedback": undefined,
"followMethod": undefined,
"followTime": undefined,
"followType": undefined,
"followUserId": undefined,
"result": undefined
}
},
getCustomerFollowList() {
getCustomerFollowPage({bizId: this.customerId}).then(r => {
this.customerFollowList = r.data.list
})
}
}
}
</script>
<style scoped>
</style>
...@@ -34,10 +34,6 @@ ...@@ -34,10 +34,6 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="客户类别" prop="type"> <el-form-item label="客户类别" prop="type">
<dict-selector :type="DICT_TYPE.CUSTOMER_TYPE" form-type="select" multiple v-model="form.type"></dict-selector> <dict-selector :type="DICT_TYPE.CUSTOMER_TYPE" form-type="select" multiple v-model="form.type"></dict-selector>
<!-- <el-select v-model="form.type" placeholder="请选择客户类别">-->
<!-- <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_TYPE)"-->
<!-- :key="dict.value" :label="dict.label" :value="dict.value" />-->
<!-- </el-select>-->
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
...@@ -51,8 +47,8 @@ ...@@ -51,8 +47,8 @@
<el-col :span="13" v-show="form.type && form.type.indexOf('3') !== -1"> <el-col :span="13" v-show="form.type && form.type.indexOf('3') !== -1">
<el-form-item label="所属代理" prop="agentId"> <el-form-item label="所属代理" prop="agentId">
<el-select v-model="form.agentId" placeholder="请选择所属代理"> <el-select v-model="form.agentId" placeholder="请选择所属代理">
<el-option v-for="dict in getDictDatas(DICT_TYPE.COMMON_STATUS)" <el-option v-for="item in serviceUserList"
:key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> :key="item.id" :label="item.nickname" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -75,7 +71,6 @@ ...@@ -75,7 +71,6 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="主营类别" prop="productType"> <el-form-item label="主营类别" prop="productType">
<!-- <el-cascader :options="productTypeList" :props="{label: 'titleZh', value: 'id', lazy: true, lazyLoad}"></el-cascader>-->
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="11"> <el-col :span="11">
<el-select v-model="form.productType" placeholder="请选择产品类别" @change="form.productId = ''"> <el-select v-model="form.productType" placeholder="请选择产品类别" @change="form.productId = ''">
...@@ -109,8 +104,8 @@ ...@@ -109,8 +104,8 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="跟进客服" prop="customerService"> <el-form-item label="跟进客服" prop="customerService">
<el-select v-model="form.customerService" placeholder="请选择跟进客服"> <el-select v-model="form.customerService" placeholder="请选择跟进客服">
<el-option v-for="dict in getDictDatas(DICT_TYPE.COMMON_STATUS)" <el-option v-for="item in serviceUserList"
:key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> :key="item.id" :label="item.nickname" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -122,7 +117,7 @@ ...@@ -122,7 +117,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="客户状态" prop="status"> <el-form-item label="客户状态" prop="status">
<el-select v-model="form.status" placeholder="请选择客户状态"> <el-select v-model="form.status" placeholder="请选择客户状态" disabled>
<el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_STATUS)" <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_STATUS)"
:key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />
</el-select> </el-select>
...@@ -248,9 +243,9 @@ ...@@ -248,9 +243,9 @@
区号 <span style="color: #ff0000">*</span> 区号 <span style="color: #ff0000">*</span>
</template> </template>
<template v-slot="{row}"> <template v-slot="{row}">
<el-select v-model="row.areaCode" placeholder="请选择区号"> <el-select v-model="row.areaCode" placeholder="请选择区号" filterable>
<el-option v-for="dict in getDictDatas(DICT_TYPE.AREA_CODE)" <el-option v-for="(item, index) in countryList"
:key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> :key="index" :label="item.nameShort + item.nameZh + '(' + item.tel + ')'" :value="item.tel" />
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
...@@ -384,6 +379,9 @@ import {getWarehouseList} from "@/api/ecw/warehouse" ...@@ -384,6 +379,9 @@ import {getWarehouseList} from "@/api/ecw/warehouse"
import CustomerLineTable from '@/components/CustomerLineTable' import CustomerLineTable from '@/components/CustomerLineTable'
import {getCustomerSelect} from "@/api/ecw/customer" import {getCustomerSelect} from "@/api/ecw/customer"
import {listServiceUser} from "@/api/system/user" import {listServiceUser} from "@/api/system/user"
import {getZhongPaoPage} from '@/api/ecw/zhongPao'
import { getCustomerContactsListByCustomer } from '@/api/ecw/customerContacts'
import { getCountryListAll } from '@/api/ecw/country'
export default { export default {
name: "edit", name: "edit",
...@@ -396,8 +394,13 @@ export default { ...@@ -396,8 +394,13 @@ export default {
}, },
created() { created() {
this.reset() this.reset()
if(this.customerId !== '0') if(this.customerId !== '0') {
this.getCustomer(this.customerId) this.getCustomer(this.customerId).then(() => {
getCustomerContactsListByCustomer({customerId: this.customerId}).then(r => {
this.form.customerContacts = r.data
})
})
}
getNodeList().then(r => { getNodeList().then(r => {
this.nodeList = r.data this.nodeList = r.data
...@@ -420,6 +423,11 @@ export default { ...@@ -420,6 +423,11 @@ export default {
listServiceUser().then(r => { listServiceUser().then(r => {
this.serviceUserList = r.data this.serviceUserList = r.data
}) })
getCountryListAll().then(r => {
this.countryList = r.data
})
this.getZhongPao()
}, },
data(){ data(){
return { return {
...@@ -452,11 +460,13 @@ export default { ...@@ -452,11 +460,13 @@ export default {
importCityList: [], // 进口地址 importCityList: [], // 进口地址
customerSelect: [], customerSelect: [],
serviceUserList: [], serviceUserList: [],
countryList: [],
zhongLines: [], // 重货线路 zhongLines: [], // 重货线路
paoLines: [], // 泡货线路 paoLines: [], // 泡货线路
} }
}, },
methods: { methods: {
/** 取消按钮 */ /** 取消按钮 */
cancel() { cancel() {
...@@ -471,10 +481,14 @@ export default { ...@@ -471,10 +481,14 @@ export default {
} }
// 修改的提交 // 修改的提交
if (this.form.id != null) { if (this.form.id != null) {
this.form.customerContacts.forEach(e => {
e.customerId = this.customerId
})
updateCustomer(this.form).then(response => { updateCustomer(this.form).then(response => {
this.$modal.msgSuccess("修改成功"); this.$modal.msgSuccess("修改成功");
this.open = false; this.open = false;
this.getList(); // this.getList();
}); });
return; return;
} }
...@@ -482,7 +496,7 @@ export default { ...@@ -482,7 +496,7 @@ export default {
createCustomer(this.form).then(response => { createCustomer(this.form).then(response => {
this.$modal.msgSuccess("新增成功"); this.$modal.msgSuccess("新增成功");
this.open = false; this.open = false;
this.getList(); // this.getList();
}); });
}); });
}, },
...@@ -511,7 +525,7 @@ export default { ...@@ -511,7 +525,7 @@ export default {
customerLines: [], customerLines: [],
lightUnit: undefined, lightUnit: undefined,
promoter: undefined, promoter: undefined,
status: undefined, status: 1,
founder: this.$store.getters.userId, founder: this.$store.getters.userId,
department: undefined, department: undefined,
invoiceTitle: undefined, invoiceTitle: undefined,
...@@ -530,8 +544,8 @@ export default { ...@@ -530,8 +544,8 @@ export default {
this.resetForm("form"); this.resetForm("form");
}, },
getCustomer(id) { getCustomer(id) {
getCustomer(id).then(response => { return getCustomer(id).then(response => {
this.form = { ...this.form, ...response.data }; this.form = { ...this.form, ...response.data, id: this.customerId };
this.open = true; this.open = true;
this.title = "修改客户"; this.title = "修改客户";
}); });
...@@ -561,6 +575,18 @@ export default { ...@@ -561,6 +575,18 @@ export default {
// "userid": 0, // "userid": 0,
// "username": "" // "username": ""
}) })
},
getZhongPao(){
// todo 接口不对,应该用list
getZhongPaoPage().then(r => {
r.data.list.forEach(e => {
if(e.type === 1) {
this.form.lightUnit = e.edge
} else if (e.type === 2 || true){ // todo 缺少type
this.form.weightUnit = e.edge
}
})
})
} }
}, },
computed: { computed: {
......
This diff is collapsed.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="app-container"> <div class="app-container">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch && !!!customerId" label-width="68px">
<el-form-item label="客户名称" prop="customerId"> <el-form-item label="客户名称" prop="customerId">
<el-select v-model="queryParams.customerId" placeholder="请选择客户名称" clearable size="small"> <el-select v-model="queryParams.customerId" placeholder="请选择客户名称" clearable size="small">
<el-option v-for="customer in myFollowCustomerList" :key="customer.id" :value="customer.id" <el-option v-for="customer in myFollowCustomerList" :key="customer.id" :value="customer.id"
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
</el-form> </el-form>
<!-- 操作工具栏 --> <!-- 操作工具栏 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" v-show="!!!customerId" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['ecw:customer-complaint:create']">新增</el-button> v-hasPermi="['ecw:customer-complaint:create']">新增</el-button>
...@@ -92,16 +92,20 @@ ...@@ -92,16 +92,20 @@
@pagination="getList"/> @pagination="getList"/>
<!-- 对话框(添加 / 修改) --> <!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="客户名称" prop="customerId"> <el-form-item label="客户名称" prop="customerId">
<el-select v-model="form.customerId" placeholder="请选择客户名称"> <el-select v-model="form.customerId" placeholder="请选择客户名称" :disabled="!!customerId">
<el-option label="请选择字典生成" value="" /> <el-option
v-for="item in customerSelect"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="投诉类型" prop="type"> <el-form-item label="投诉类型" prop="type">
<el-select v-model="form.type" placeholder="请选择投诉类型"> <el-select v-model="form.type" placeholder="请选择投诉类型">
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.CUSTOMER_COMPLAINT_TYPE)" <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_COMPLAINT_TYPE)"
:key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -116,11 +120,14 @@ ...@@ -116,11 +120,14 @@
</el-form-item> </el-form-item>
<el-form-item label="处理状态" prop="status"> <el-form-item label="处理状态" prop="status">
<el-select v-model="form.status" placeholder="请选择处理状态"> <el-select v-model="form.status" placeholder="请选择处理状态">
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.CUSTOMER_COMPLAINT_STATUS)" <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_COMPLAINT_STATUS)"
:key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
<customer-follow :customer-id="form.id"></customer-follow>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button> <el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button> <el-button @click="cancel">取 消</el-button>
...@@ -131,11 +138,20 @@ ...@@ -131,11 +138,20 @@
<script> <script>
import { createCustomerComplaint, updateCustomerComplaint, deleteCustomerComplaint, getCustomerComplaint, getCustomerComplaintPage, exportCustomerComplaintExcel } from "@/api/ecw/customerComplaint"; import { createCustomerComplaint, updateCustomerComplaint, deleteCustomerComplaint, getCustomerComplaint, getCustomerComplaintPage, exportCustomerComplaintExcel } from "@/api/ecw/customerComplaint";
import { getMyFlowCustomerList } from "@/api/ecw/customer"; import {getCustomerSelect} from '@/api/ecw/customer'
import CustomerFollow from "../../../components/CustomerFollow"
export default { export default {
name: "CustomerComplaint", name: "CustomerComplaint",
/**
* 可以单独作为页面,也可以作为组件被被客户详情页调用。
* 作为组件时要传入 customerId,用于限制范围和隐藏搜索筛选
*/
props: {
customerId: Number
},
components: { components: {
CustomerFollow
}, },
data() { data() {
return { return {
...@@ -158,7 +174,7 @@ export default { ...@@ -158,7 +174,7 @@ export default {
queryParams: { queryParams: {
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
customerId: null, customerId: this.customerId,
type: null, type: null,
orderId: null, orderId: null,
ladingbillId: null, ladingbillId: null,
...@@ -173,14 +189,16 @@ export default { ...@@ -173,14 +189,16 @@ export default {
customerId: [{ required: true, message: "客户名称不能为空", trigger: "change" }], customerId: [{ required: true, message: "客户名称不能为空", trigger: "change" }],
}, },
myFollowCustomerList: [] myFollowCustomerList: [],
customerSelect: []
}; };
}, },
created() { created() {
this.getList(); this.getList();
// 获得邮件账号
getMyFlowCustomerList().then(response => { getCustomerSelect().then(r => {
this.myFollowCustomerList = response.data; this.customerSelect = r.data
}) })
}, },
methods: { methods: {
...@@ -206,7 +224,7 @@ export default { ...@@ -206,7 +224,7 @@ export default {
reset() { reset() {
this.form = { this.form = {
id: undefined, id: undefined,
customerId: undefined, customerId: this.customerId,
type: undefined, type: undefined,
orderId: undefined, orderId: undefined,
ladingbillId: undefined, ladingbillId: undefined,
...@@ -293,7 +311,7 @@ export default { ...@@ -293,7 +311,7 @@ export default {
}, },
/** 格式化邮件账号 */ /** 格式化邮件账号 */
formatCustomerName(customerId) { formatCustomerName(customerId) {
for (const customer of this.myFollowCustomerList) { for (const customer of this.customerSelect) {
if (customer.id === customerId) { if (customer.id === customerId) {
return customer.name; return customer.name;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment