Commit 50834765 authored by yujinyao's avatar yujinyao

合并客户弹框

parent f59c28a4
...@@ -4707,5 +4707,10 @@ ...@@ -4707,5 +4707,10 @@
"下次跟进时间": "Next follow-up time", "下次跟进时间": "Next follow-up time",
"提交结果": "Submit result", "提交结果": "Submit result",
"增加计划": "add plan", "增加计划": "add plan",
"是否确认导出客户跟进记录数据项?": "Are you sure to export all customer follow-up record data items?" "是否确认导出客户跟进记录数据项?": "Are you sure to export all customer follow-up record data items?",
"合并客户": "Merge customer",
"保留客户": "Retained customer",
"​被合并客户-非主客户": "Consolidated customer - Non-principal customer",
"注意事项": "Matters need attention",
"选择客户": "Select a customer"
} }
<template>
<div class="customer-merge">
<el-dialog append-to-body :title="$t('合并客户')" :visible.sync="dialogVisible" width="900px">
<el-form ref="form" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>{{$t('保留客户')}}</span>
<el-button type="success" size="small" style="float: right">{{$t('请选择')}}</el-button>
</div>
<el-form-item :label="$t('客户编号')+':'">
</el-form-item>
<el-form-item :label="$t('客户名称')+':'">
</el-form-item>
<el-form-item :label="$t('客户经理')+':'">
</el-form-item>
<el-form-item :label="$t('创建时间')+':'">
</el-form-item>
<el-form-item :label="$t('联系方式')+':'">
</el-form-item>
</el-card>
</el-col>
<el-col :span="12">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>{{$t('​被合并客户-非主客户')}}</span>
<el-button type="success" size="small" style="float: right">{{$t('请选择')}}</el-button>
</div>
<el-form-item :label="$t('客户编号')+':'">
</el-form-item>
<el-form-item :label="$t('客户名称')+':'">
</el-form-item>
<el-form-item :label="$t('客户经理')+':'">
</el-form-item>
<el-form-item :label="$t('创建时间')+':'">
</el-form-item>
<el-form-item :label="$t('联系方式')+':'">
</el-form-item>
</el-card>
</el-col>
</el-row>
<div class="stips">
<h2>{{$t('注意事项')}}</h2>
<ul>
<li>1. 保留客户和非主客户,不能在两个不同的客户经理名下,请先确认两个客户在同一个客户经理名下</li>
<li>2. 被合并客户,提交后会直接删除</li>
<li>3. 合并后,非主客户的联系人,跟进记录,报价单,订单,客户投诉,品牌授权都迁移到保留客户中,其他信息不会迁移,如需要维护非主客户的客户档案信息到保留客户中,请先维护好再操作</li>
</ul>
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit">{{$t('确 定')}}</el-button>
<el-button @click="dialogVisible = false">{{$t('取 消')}}</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
name: "CustomerMerge",
data() {
return {
dialogVisible: false,
form: {}
}
},
methods: {
handleSubmit() {
}
}
}
</script>
<style scoped>
.stips h2 {
font-size: 18px;
color: #DD001B;
text-align: center;
}
.stips ul {
padding-left: 0;
}
.stips ul li {
list-style: none;
font-size: 14px;
line-height: 2em;
}
</style>
\ No newline at end of file
<template>
<el-dialog append-to-body :title="$t('选择客户')" :visible.sync="customerDialogVisible" :close-on-click-modal="false" width="80%">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="100px">
<el-form-item :label="$t('客户编号')" prop="number">
<el-input
v-model.trim="queryParams.number"
:placeholder="$t('请输入客户编号')"
clearable
@keyup.enter.native="handleQuery"
@input="queryParams.number=queryParams.number.replace(/\s+/g, '')"
/>
</el-form-item>
<el-form-item :label="$t('客户名称')" prop="name">
<el-input
v-model.trim="queryParams.name"
:placeholder="$t('请输入客户名称')"
clearable
@keyup.enter.native="handleQuery"
@input="queryParams.name=queryParams.name.replace(/\s+/g, '')"
/>
</el-form-item>
<el-form-item :label="$t('区号')">
<el-select
v-model="queryParams.areaCode"
:placeholder="$t('请选择区号')"
>
<el-option
v-for="(item, index) in countryList"
:key="index"
:label="
item.nameShort +
(isChinese ? item.nameZh : item.nameEn) +
' +' +
item.tel
"
:value="item.tel"
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('联系方式')">
<el-input
:placeholder="$t('请输入联系方式')"
v-model.trim="queryParams.defaultContactPhone"
@input="queryParams.defaultContactPhone=queryParams.defaultContactPhone.replace(/\s+/g, '')"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
$t("搜索")
}}</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">{{
$t("重置")
}}</el-button>
</el-form-item>
</el-form>
<el-table :data="list" v-loading="loading" border size="mini">
<el-table-column :label="$t('客户编号')" align="center" fixed>
<template v-slot="{ row }">
<router-link :to="`/customer/query/${row.id}`" class="link-type">
{{ row.number }}
</router-link>
</template>
</el-table-column>
<el-table-column :label="$t('客户名称')" align="center" fixed>
<template slot-scope="{ row }">
<p style="display: inline-block; white-space: pre-wrap">
{{ $l(row, "name") }}
</p>
<el-tag v-if="row.isInOpenSea" size="mini">{{ $t("") }}</el-tag>
</template>
</el-table-column>
<el-table-column
:label="$t('主联系人')"
prop="defaultContactName"
></el-table-column>
<el-table-column :label="$t('主联系方式')" prop="defaultContactPhone">
<template v-slot="{ row }">
+{{ row.defaultContactPhone }} <br />
<contacts :id="row.id">
<el-button type="text">更多</el-button>
</contacts>
</template>
</el-table-column>
<el-table-column :label="$t('客户类别')" align="center" prop="status">
<template slot-scope="scope">
<dict-tag
:type="DICT_TYPE.CUSTOMER_TYPE"
:value="scope.row.type"
/>
</template>
</el-table-column>
<el-table-column :label="$t('角色')" align="center" prop="status">
<template slot-scope="scope">
<dict-tag
:type="DICT_TYPE.CUSTOMER_ROLE"
:value="scope.row.roles"
/>
</template>
</el-table-column>
<el-table-column :label="$t('客户经理')" align="center" prop="customerServiceName"></el-table-column>
<el-table-column :label="$t('国籍')" align="center" prop="country" :formatter="countryFormatter"></el-table-column>
<el-table-column :label="$t('出货渠道')" align="center">
<template slot-scope="{ row }">
{{ channel(row.transportType) }}
</template>
</el-table-column>
<el-table-column :label="$t('客户来源')">
<template slot-scope="scope">
<dict-tag
:type="DICT_TYPE.CUSTOMER_SOURCE"
:value="scope.row.source"
/>
</template>
</el-table-column>
<el-table-column :label="$t('业务国家')">
<template slot-scope="{ row }">
{{ getBusiCountryNames(row.busiCountryIds) }}
</template>
</el-table-column>
<el-table-column :label="$t('常用提货网点')">
<template slot-scope="{ row }">
{{ getPickupPointNames(row.pickupPoints) }}
</template>
</el-table-column>
<el-table-column :label="$t('年度发货量')" align="center">
<template slot-scope="{ row }">
{{ row.weightYearly }}
</template>
</el-table-column>
<el-table-column :label="$t('主营类别')">
<template slot-scope="{ row }">
{{ getProductTypeNames(row.productType) }}
</template>
</el-table-column>
<el-table-column :label="$t('主要竞争对手')" prop="competitorNames">
</el-table-column>
<el-table-column :label="$t('年度发货次数')" align="center">
<template slot-scope="{ row }">
{{ row.numYearly }}
</template>
</el-table-column>
<el-table-column :label="$t('推介人')">
<template slot-scope="{ row }">
{{ getPromoterName(row.promoter) }}
</template>
</el-table-column>
<el-table-column :label="$t('入公海时间')" align="center" width="160">
<template v-slot="{ row }">
{{ parseTime( row.enterOpenSeaTime ? row.enterOpenSeaTime : row.estimateEnterOpenSeaTime)}}
</template>
</el-table-column>
<el-table-column :label="$t('入仓确认')" align="center">
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.arrivalConfirm == 1">{{ $t('') }}</el-tag>
<el-tag type="info" v-else>{{ $t('') }}</el-tag>
</template>
</el-table-column>
<el-table-column :label="$t('控货无收货人')" align="center">
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.noConsignee">{{ $t('') }}</el-tag>
<el-tag type="info" v-else>{{ $t('') }}</el-tag>
</template>
</el-table-column>
<el-table-column :label="$t('默认付款')" align="center">
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.defaultPay">{{ $t('') }}</el-tag>
<el-tag type="info" v-else>{{ $t('') }}</el-tag>
</template>
</el-table-column>
<el-table-column :label="$t('归属时间')" width="160" align="center">
<template slot-scope="scope">
{{ parseTime(scope.row.customerServiceConfirmedTime) }}
</template>
</el-table-column>
<el-table-column :label="$t('首次成交时间')" width="160" align="center">
<template slot-scope="scope">
{{ parseTime(scope.row.firstDealTime) }}
</template>
</el-table-column>
<el-table-column :label="$t('获取方式')" align="center">
<template slot-scope="scope">
<dict-tag
:type="DICT_TYPE.CUSTOMER_GET_METHOD"
:value="scope.row.getMethods"
/>
</template>
</el-table-column>
<el-table-column :label="$t('创建人')" prop="createUsername" align="center">
</el-table-column>
<el-table-column :label="$t('创建时间')" align="center" width="160">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('最后更新时间')" align="center" width="160">
<template slot-scope="scope">
<span >{{ parseTime(scope.row.updateTime) }}</span>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination v-show="offerTotal > 0" :total="offerTotal" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@pagination="getOfferList"/>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="confirm">{{$t('确定')}}</el-button>
</div>
</el-dialog>
</template>
<script>
import { getCustomerPage } from "@/api/ecw/customer"
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
export default {
name: "CustomerMergeSelectCustomer",
components: {
UserSelector
},
props: {
countryList: {
type: Array,
default: () => []
},
getNodeLists: {
type: Array,
default: () => []
},
productTypeList: {
type: Array,
default: () => []
},
customerSelectFn: {
type: Array,
default: () => []
}
},
data() {
return {
loading: false,
customerId: null,
offerDialogVisible: false,
queryParams: {
pageNo: 1,
pageSize: 10
},
list: [],
total: 0
}
},
created() {
},
computed:{
channel() {
return (val) => {
return !!val
? this.getDictDatas(this.DICT_TYPE.ECW_CUSTOMER_TRANSPORT_TYPE)
.filter((i) => (val.split(",") || []).includes(i.value))
.map((i) => (this.isChinese ? i.label : i.labelEn))
.join("")
: "";
};
},
getBusiCountryNames() {
return (ids) => {
if (ids) {
const idsArr = ids.split(',')
const strArr = []
this.countryList.forEach(item => {
if (idsArr.includes(item.id.toString())) {
strArr.push(this.isChinese ? item.nameZh : item.nameEn)
}
})
return strArr.length > 0 ? strArr.join(',') : null
} else {
return null
}
}
},
getPickupPointNames() {
return (ids) => {
if (ids) {
const idsArr = ids.split(',')
const strArr = []
this.getNodeLists.forEach(item => {
if (idsArr.includes(item.id.toString())) {
strArr.push(this.isChinese ? item.titleZh : item.titleEn)
}
})
return strArr.length > 0 ? strArr.join(',') : null
} else {
return null
}
}
},
getProductTypeNames() {
return (ids) => {
if (ids) {
const idsArr = ids.split(',')
const strArr = []
this.productTypeList.forEach(item => {
if (idsArr.includes(item.id.toString())) {
strArr.push(this.isChinese ? item.titleZh : item.titleEn)
}
})
return strArr.length > 0 ? strArr.join(',') : null
} else {
return null
}
}
},
getPromoterName() {
return (id) => {
if (id) {
let strName = ''
for(const item of this.customerSelectFn) {
if (item.id == id) {
strName = item.name
break
}
}
return strName
} else {
return null
}
}
}
},
methods: {
handleQuery() {
this.queryParams.pageNo = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams = {
pageNo: 1,
pageSize: 10
}
this.getList();
},
getList() {
this.loading = true;
getCustomerPage(this.queryParams).then((response) => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
});
},
confirm() {
if (this.offerId) {
this.$emit('select', this.offerId)
this.offerDialogVisible = false
} else {
this.$message.error(this.$t("请选择报价单"))
}
}
}
}
</script>
\ No newline at end of file
...@@ -581,7 +581,6 @@ ...@@ -581,7 +581,6 @@
>{{ $t("新增潜在客户") }}</el-button >{{ $t("新增潜在客户") }}</el-button
> >
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
type="primary" type="primary"
...@@ -589,6 +588,8 @@ ...@@ -589,6 +588,8 @@
icon="el-icon-plus" icon="el-icon-plus"
size="mini" size="mini"
@click="handleMergeCus" @click="handleMergeCus"
v-has-permi="[selectAuthorityFn('ecw:customer:merge')]"
v-if="path === '/customer/customer'"
>{{ $t("合并客户") }}</el-button >{{ $t("合并客户") }}</el-button
> >
</el-col> </el-col>
...@@ -1360,6 +1361,11 @@ ...@@ -1360,6 +1361,11 @@
ref="customerSetting" ref="customerSetting"
@refresh="getList" @refresh="getList"
></customer-setting> ></customer-setting>
<customer-merge
ref="customerMerge"
@refresh="getList"
v-if="customerMergeVisible"
></customer-merge>
<!--业绩类型 --> <!--业绩类型 -->
<el-dialog title="业绩类型" :visible.sync="dialogVisible" width="30%"> <el-dialog title="业绩类型" :visible.sync="dialogVisible" width="30%">
<div> <div>
...@@ -1422,6 +1428,7 @@ import Template from "@/views/cms/template/index.vue"; ...@@ -1422,6 +1428,7 @@ import Template from "@/views/cms/template/index.vue";
import AddPotentialCustom from "@/views/ecw/customer/addPotentialCustom.vue"; import AddPotentialCustom from "@/views/ecw/customer/addPotentialCustom.vue";
import Contacts from "@/views/ecw/customer/components/contacts.vue"; import Contacts from "@/views/ecw/customer/components/contacts.vue";
import CustomerSetting from "./components/customerSetting.vue"; import CustomerSetting from "./components/customerSetting.vue";
import CustomerMerge from "./components/customerMerge.vue";
import AreaCodeSelector from "@/components/AreaCodeSelector/index.vue"; import AreaCodeSelector from "@/components/AreaCodeSelector/index.vue";
import { getCustomerSelect } from "@/api/ecw/customer"; import { getCustomerSelect } from "@/api/ecw/customer";
import { getProductTypeList } from "@/api/ecw/productType"; import { getProductTypeList } from "@/api/ecw/productType";
...@@ -1438,7 +1445,8 @@ export default { ...@@ -1438,7 +1445,8 @@ export default {
customerComplaints, customerComplaints,
transferCustomer, transferCustomer,
AreaCodeSelector, AreaCodeSelector,
CustomerSetting CustomerSetting,
CustomerMerge
}, },
data() { data() {
return { return {
...@@ -1552,6 +1560,7 @@ export default { ...@@ -1552,6 +1560,7 @@ export default {
userId: undefined, //lanbm 2024-05-23 add userId: undefined, //lanbm 2024-05-23 add
customerService: undefined, customerService: undefined,
customerFollowVisible: false, customerFollowVisible: false,
customerMergeVisible: false,
enterOpenSeaTime: [], enterOpenSeaTime: [],
customerServiceConfirmedTime: [], customerServiceConfirmedTime: [],
firstDealTime: [], firstDealTime: [],
...@@ -1712,8 +1721,12 @@ export default { ...@@ -1712,8 +1721,12 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
handleMergeCus() {
//合并客户 //合并客户
handleMergeCus() {
this.customerMergeVisible = true
this.$nextTick(_ => {
this.$refs['customerMerge'].dialogVisible = true
})
}, },
recovery(row) { recovery(row) {
this.$confirm(this.$t("是否要回收当前{name}", row), "提示", { this.$confirm(this.$t("是否要回收当前{name}", row), "提示", {
...@@ -2097,20 +2110,6 @@ export default { ...@@ -2097,20 +2110,6 @@ export default {
return null return null
} }
}, },
getBusiCountryNames(ids) {
if (ids) {
const idsArr = ids.split(',')
const strArr = []
this.countryList.forEach(item => {
if (idsArr.includes(item.id.toString())) {
strArr.push(this.isChinese ? item.nameZh : item.nameEn)
}
})
return strArr.length > 0 ? strArr.join(',') : null
} else {
return null
}
},
getPickupPointNames(ids) { getPickupPointNames(ids) {
if (ids) { if (ids) {
const idsArr = ids.split(',') const idsArr = ids.split(',')
......
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