Files
ibs-fullstack/ruoyi-ui/src/views/customer/charts/360charts/indexcharts/index.vue

2972 lines
89 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="common-wrap-cnt">
<section class="header-top">
<div class="header_top_left">
<div class="icon_box">
<div class="header_icon_box">
<i class="header_icon el-icon-s-custom" />
</div>
</div>
<div class="base-info">
<el-form ref="profileForm" :model="baseHeaderForm" class="headerForm">
<el-form-item prop="custName" label-width="25px" label=" ">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="建档输入/取核心数据"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
</span>
<span
v-if="!isEditing || !iscustName"
style="font-size: 24px; font-weight: 600; text-align: center"
>{{ baseHeaderForm.custName }}</span>
<!-- <el-tag v-if="isShow" type="danger" class="wjd">未建档</el-tag> -->
<el-input
v-if="isEditing"
v-model="baseHeaderForm.custName"
maxlength="18"
/>
</el-form-item>
<el-form-item
label-width="82px"
prop="socialCreditCode"
label="身份证号:"
>
<span>{{ baseHeaderForm.custIdc }}</span>
</el-form-item>
</el-form>
</div>
</div>
<section class="form-operate">
<span style="margin-right: 20px; color: #f50;font-weight: bold;">{{ customLevel }}</span>
<el-button
type="plain"
size="small"
@click="goBackToIndex"
>返回</el-button>
<el-button type="primary" size="small" @click="editProfile">{{
editText
}}</el-button>
<el-button
type="primary"
size="small"
:disabled="isSaveDisable"
@click="saveAll"
>保存</el-button>
<el-button
type="primary"
size="small"
@click="handleExport"
>导出</el-button>
<el-button
v-if="
isHeadAdmin || isPublic || isPrivate || isHeadOps || isBranchAdmin
"
type="primary"
size="small"
@click="handleAddZf"
>添加走访</el-button>
<el-button
type="primary"
size="small"
@click="handleSecondVisit"
>二次走访</el-button>
<el-button
type="primary"
size="small"
@click="handleRecource"
>资源申请</el-button>
</section>
</section>
<section class="common-create-main">
<p class="common-title">基础信息</p>
<div class="line" />
<el-form
v-if="profile"
ref="profileForm"
:model="profile"
:rules="rules"
class="profileForm"
>
<el-row>
<el-col :span="8">
<el-form-item prop="custGender" label-width="85px">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="取身份证号17位值计算"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
性别:
</span>
<span v-if="!isEditing">{{ profile.custGender }}</span>
<el-radio-group v-if="isEditing" v-model="profile.custGender">
<el-radio label="男">男</el-radio>
<el-radio label="女">女</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="custAge" label-width="85px">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="取身份证号7-14位值计算"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
年龄:
</span>
<span v-if="!isEditing">{{ profile.custAge }}</span>
<el-input
v-if="isEditing"
v-model="profile.custAge"
maxlength="3"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label-width="115px" prop="custIdc">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="建档输入/取核心数据"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
身份证号:
</span>
<span>{{ profile.custIdc }}</span>
<!-- <el-input v-model="profile.custIdc" v-if="isEditing" maxlength="18"></el-input> -->
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label-width="113px" prop="birthday">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="取身份证号7-14位值计算"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
出生日期:
</span>
<span v-if="!isEditing">{{ profile.birthday }}</span>
<el-date-picker
v-if="isEditing"
v-model="profile.birthday"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
@change="handleChangeBirthday"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label-width="113px" prop="custPhone">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="建档输入/取信贷中心数据"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
联系方式:
</span>
<span v-if="!isEditing">{{ profile.custPhone }}</span>
<el-input
v-if="isEditing"
v-model="profile.custPhone"
maxlength="11"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label-width="115px">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="建档输入/取核心数据"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
婚姻状况:
</span>
<span v-if="!isEditing">{{ profile.isMarried }}</span>
<el-select v-if="isEditing" v-model="profile.isMarried">
<el-option
v-for="(item, index) in isMarriedList"
:key="index"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label-width="99px">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="建档输入/取核心数据"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
年收入:
</span>
<span v-if="!isEditing">{{ profile.custSalary }}</span>
<el-input
v-if="isEditing"
v-model="profile.custSalary"
maxlength="18"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label-width="85px" prop="custEdu">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="建档输入/取核心数据"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
学历:
</span>
<span v-if="!isEditing">{{ profile.custEdu }}</span>
<el-select v-if="isEditing" v-model="profile.custEdu">
<el-option
v-for="(item, index) in custEduList"
:key="index"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label-width="115px" prop="belongBusi">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="建档输入/取核心数据"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
行业名称:
</span>
<span v-if="!isEditing">{{
!isNaN(Number(profile.belongBusi))
? belongBusiStr
: profile.belongBusi
}}</span>
<el-cascader
v-if="isEditing"
v-model="profile.belongBusi"
:options="industryOptions"
:props="{
expandTrigger: 'hover',
label: 'label',
value: 'value',
checkStrictly: true,
}"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="客户号:" prop="custId">
<span>{{ profile.custId }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label-width="113px" prop="custIsn">
<span slot="label">
<el-tooltip
placement="top"
trigger="hover"
content="取核心数据"
>
<span class="quesiton"><i class="el-icon-question" /></span>
</el-tooltip>
客户内码:
</span>
<span>{{ profile.custIsn }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="更新时间:"
prop="updateTime"
label-width="98px"
>
<span>{{ profile.updateTime }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row />
<el-row>
<!-- <el-col :span="8">
<el-form-item label="资产情况:">
<span>{{ profile.asset }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="信用状况:">
<span>{{ profile.credit }}</span>
</el-form-item>
</el-col> -->
<el-col :span="8">
<el-form-item label="行政归属网格区划:">
<span>{{ profile.community }}</span>
</el-form-item>
</el-col>
<el-col v-if="!isHeadOps" :span="8">
<el-form-item label="行政网格客户经理(零售部)">
<span>{{ profile.xzLsGridUserName }}</span>
</el-form-item>
</el-col>
<el-col v-if="!isHeadOps" :span="8">
<el-form-item label="行政归属网格(零售部)">
<span>{{ profile.xzLsGridName }}</span>
</el-form-item>
</el-col>
<el-col v-if="!isPrivate" :span="8">
<el-form-item label="行政网格客户经理(运管部)">
<span>{{ profile.xzYgGridUserName }}</span>
</el-form-item>
</el-col>
<el-col v-if="!isPrivate" :span="8">
<el-form-item label="行政归属网格(运管部)">
<span>{{ profile.xzYgGridName }}</span>
</el-form-item>
</el-col>
<el-col v-for="(item, index) in cliList" :key="index" :span="8">
<el-form-item
v-if="item.cmpmType == '贷款客户经理'"
:label="`${item.cmpmType}`"
>
<span>{{ is932Dept ? `${profile.belongUserName}-${profile.belongUserId}` : item.cmpmUserList }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</section>
<el-collapse v-model="activeName" accordion @change="handleCollapse">
<el-collapse-item name="0">
<template slot="title">
<p class="common-title">地址信息</p>
</template>
<div class="dzBox">
<div class="dzBox_top">
<div class="dzBox_item">
<div class="dzBox_title">家庭地址</div>
<div class="dzBox_wapper">
<div
v-for="(item, index) in jtdzList"
:key="index"
class="dzBox_content"
>
<div>
<span>{{ item.address }}</span>
<el-tag style="margin-left: 5px">{{ item.source }}</el-tag>
</div>
</div>
</div>
</div>
<div class="dzBox_item">
<div class="dzBox_title">户籍地址</div>
<div class="dzBox_wapper">
<div
v-for="(item, index) in hjdzList"
:key="index"
class="dzBox_content"
>
<div>
<span>{{ item.address }}</span>
<el-tag style="margin-left: 5px">{{ item.source }}</el-tag>
</div>
</div>
</div>
</div>
<div class="dzBox_item">
<div class="dzBox_title">工作地址</div>
<div class="dzBox_wapper">
<div
v-for="(item, index) in gzdzList"
:key="index"
class="dzBox_content"
>
<div>
<span>{{ item.address }}</span>
<el-tag style="margin-left: 5px">{{ item.source }}</el-tag>
</div>
</div>
</div>
</div>
</div>
<div class="dzBox_top">
<div class="dzBox_item">
<div class="dzBox_title">常住地址</div>
<div class="dzBox_wapper">
<div
v-for="(item, index) in czdzList"
:key="index"
class="dzBox_content"
>
<div>
<span>{{ item.address }}</span>
<el-tag style="margin-left: 5px">{{ item.source }}</el-tag>
</div>
</div>
</div>
</div>
<div class="dzBox_item">
<div class="dzBox_title">联系地址</div>
<div class="dzBox_wapper">
<div
v-for="(item, index) in lxdzList"
:key="index"
class="dzBox_content"
>
<div>
<span>{{ item.address }}</span>
<el-tag style="margin-left: 5px">{{ item.source }}</el-tag>
</div>
</div>
</div>
</div>
<div class="dzBox_item">
<div class="dzBox_title">身份证地址</div>
<div class="dzBox_wapper">
<div
v-for="(item, index) in sfzdzList"
:key="index"
class="dzBox_content"
>
<div>
<span>{{ item.address }}</span>
<el-tag style="margin-left: 5px">{{ item.source }}</el-tag>
</div>
</div>
</div>
</div>
</div>
</div>
</el-collapse-item>
<!-- <el-collapse-item name="1">
<template slot="title">
<p class="common-title">社保信息</p>
</template>
<el-row :gutter="24" class="socialItem">
<el-col :span="8">
<span class="socialLabel">浙江省社保缴纳状态:</span>
<span class="social">{{ socialSecurity.paymentStatus }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">参保单位类型:</span>
<span class="social">{{ socialSecurity.unitType }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">参保单位所属行业:</span>
<span class="social">{{ socialSecurity.belongBusi }}</span>
</el-col>
</el-row>
<el-row :gutter="24" class="socialItem">
<el-col :span="8">
<span class="socialLabel">参保单位经济类型:</span>
<span class="social">{{ socialSecurity.economicType }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">优质客户标签:</span>
<span class="social">{{ socialSecurity.qualityLabel }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">参保单位缴费基数排名:</span>
<span class="social">{{ socialSecurity.paymentBaseRank }}</span>
</el-col>
</el-row>
<el-row :gutter="24" class="socialItem">
<el-col :span="8">
<span class="socialLabel">参保单位缴费人数排名:</span>
<span class="social">{{ socialSecurity.paymentCountRank }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">参保单位缴费类型:</span>
<span class="social">{{ socialSecurity.paymentType }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">客户参保状态:</span>
<span class="social">{{ socialSecurity.insuranceStatus }}</span>
</el-col>
</el-row>
<el-row :gutter="24" class="socialItem">
<el-col :span="8">
<span class="socialLabel">过去24个月参保单位数</span>
<span class="social">{{ socialSecurity.recentTwoYearsCount }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">过去12个月参保单位数</span>
<span class="social">{{ socialSecurity.recentOneYearsCount }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">过去24个月平均缴费基数</span>
<span class="social">{{ socialSecurity.paymentBase }}</span>
</el-col>
</el-row>
<el-row :gutter="24" class="socialItem">
<el-col :span="8">
<span class="socialLabel">单位/个人是否命中被劳动仲裁:</span>
<span class="social">{{ socialSecurity.labourArbitration }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">单位/个人是否命中拖欠工资黑名单:</span>
<span class="social">{{ socialSecurity.blackList }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">当前社保缴费基数:</span>
<span class="social">{{ socialSecurity.paymentBase }}</span>
</el-col>
</el-row>
<el-row :gutter="24" class="socialItem">
<el-col :span="8">
<span class="socialLabel">领取养老待遇标签:</span>
<span class="social">{{ socialSecurity.receivePensionBenefits }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">领取失业待遇标签:</span>
<span class="social">{{ socialSecurity.receiveUnemploymentBenefits }}</span>
</el-col>
<el-col :span="8">
<span class="socialLabel">当前社保缴费基数:</span>
<span class="social">{{ socialSecurity.paymentBase }}</span>
</el-col>
</el-row>
</el-collapse-item> -->
<!-- <el-collapse-item name="2">
<template slot="title">
<p class="common-title">公积金信息</p>
</template>
<div style="margin-top: 30px">
<el-empty description="公积金信息准备中..."></el-empty>
</div>
</el-collapse-item> -->
<!-- <el-collapse-item name="3">
<template slot="title">
<p class="common-title">征信信息</p>
</template>
<div style="margin-top: 30px">
<el-empty description="征信信息准备中..."></el-empty>
</div>
<div class="zxxx">
<el-row class="zxxx_top">
<el-col :span="4" class="zxxx_top_title">推荐利率2.1%</el-col>
<el-col :span="5"><el-button>利率测算</el-button></el-col>
<el-col :span="5" class="zxxx_top_title">推荐利率测算时间2024-12-31</el-col>
</el-row>
<div class="zxxx_table">
<div class="add_btn">
<el-button type="primary" size="small" @click="addzx">新增</el-button>
</div>
<el-table :data="zxData" class="zxData">
<el-table-column label="他行名称" align="center" prop="bank"></el-table-column>
<el-table-column label="利率" align="center" prop="rate"></el-table-column>
<el-table-column label="数据来源" align="center" prop="source"></el-table-column>
<el-table-column label="更新时间" align="center" prop="updateTime"></el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button type="text" @click="editzx(scope.row)">编辑</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</el-collapse-item> -->
<el-collapse-item name="4">
<template slot="title">
<p class="common-title">签约产品</p>
</template>
<div style="height: 250px">
<div
v-if="Object.keys(this.signedProducts).length != 0"
class="t360-production"
>
<div class="title_box1">
<div
v-if="this.signedProducts.deposit"
class="t360-production-item"
>
存款
</div>
<div class="ejTitle">
<div class="ejTitle_item">
{{
this.signedProducts.deposit
? this.signedProducts.deposit.currdeposFlag
? this.signedProducts.deposit.currdeposFlag
: ""
: ""
}}
</div>
</div>
</div>
<div class="t360-production">
<div class="title_box2">
<div
v-if="this.signedProducts.loan"
class="t360-production-item"
>
贷款
</div>
<div class="ejTitle">
<div class="ejTitle_item">
{{
this.signedProducts.loan
? this.signedProducts.loan.hatflowcostbookFlag
? this.signedProducts.loan.hatflowcostbookFlag
: ""
: ""
}}
</div>
<div class="ejTitle_item">
{{
this.signedProducts.loan
? this.signedProducts.loan.zheliloanFlag
? this.signedProducts.loan.zheliloanFlag
: ""
: ""
}}
</div>
<div class="ejTitle_item">
{{
this.signedProducts.loan
? this.signedProducts.loan.phmortgloanFlag
? this.signedProducts.loan.phmortgloanFlag
: ""
: ""
}}
</div>
</div>
</div>
</div>
<div class="t360-production">
<div class="title_box3">
<div
v-if="this.signedProducts.wealth"
class="t360-production-item"
>
财富
</div>
<div class="ejTitle">
<div class="ejTitle_item">
{{
this.signedProducts.wealth
? this.signedProducts.wealth.bondbookFlag
? this.signedProducts.wealth.bondbookFlag
: ""
: ""
}}
</div>
<div class="ejTitle_item">
{{
this.signedProducts.wealth
? this.signedProducts.wealth.financialbookFlag
? this.signedProducts.wealth.financialbookFlag
: ""
: ""
}}
</div>
<div class="ejTitle_item">
{{
this.signedProducts.wealth
? this.signedProducts.wealth.fundbookFlag
? this.signedProducts.wealth.fundbookFlag
: ""
: ""
}}
</div>
<div class="ejTitle_item">
{{
this.signedProducts.wealth
? this.signedProducts.wealth.frcdFlag
? this.signedProducts.wealth.frcdFlag
: ""
: ""
}}
</div>
<div class="ejTitle_item">
{{
this.signedProducts.wealth
? this.signedProducts.wealth.insurbookFlag
? this.signedProducts.wealth.insurbookFlag
: ""
: ""
}}
</div>
</div>
</div>
</div>
<div class="t360-production">
<div class="title_box4">
<div
v-if="this.signedProducts.intermediate"
class="t360-production-item"
>
中间业务
</div>
<div class="ejTitle">
<div class="ejTitle_item">
{{
this.signedProducts.intermediate
? this.signedProducts.intermediate.elefeeWhcFlag
? this.signedProducts.intermediate.elefeeWhcFlag
: ""
: ""
}}
</div>
<div class="ejTitle_item">
{{
this.signedProducts.intermediate
? this.signedProducts.intermediate.gasfeeWhcFlag
? this.signedProducts.intermediate.gasfeeWhcFlag
: ""
: ""
}}
</div>
<div class="ejTitle_item">
{{
this.signedProducts.intermediate
? this.signedProducts.intermediate.watfeeWhcFlag
? this.signedProducts.intermediate.watfeeWhcFlag
: ""
: ""
}}
</div>
<div class="ejTitle_item">
{{
this.signedProducts.intermediate
? this.signedProducts.intermediate.etcFlag
? this.signedProducts.intermediate.etcFlag
: ""
: ""
}}
</div>
</div>
</div>
</div>
</div>
<div v-if="Object.keys(this.signedProducts).length == 0">
<el-empty description="无签约产品" />
</div>
</div>
</el-collapse-item>
<el-collapse-item name="9">
<template slot="title">
<p class="common-title">自定义备注</p>
</template>
<el-form
ref="bzFormRef"
:model="bzForm"
:rules="bzRules"
class="special_bzform"
style="margin-top:20px"
>
<el-row>
<el-col :span="16">
<el-form-item label="备注" prop="label" label-width="85px">
<el-input
v-model="bzForm.label"
placeholder="请输入备注"
style="width:100%"
:disabled="bzFlag"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<div class="bz_row_end">
<el-button
type="primary"
size="small"
@click="bzEditFn"
>{{bzFlag?'编辑':'退出编辑'}}</el-button>
<el-button
type="primary"
size="small"
@click="bzSaveFn"
v-if="!bzFlag"
>保存</el-button>
</div>
</el-col>
</el-row>
</el-form>
</el-collapse-item>
<el-collapse-item name="5">
<template slot="title">
<p class="common-title">省行客户标签</p>
</template>
<div class="message-box">
<div class="message-box-right">
<div style="margin-bottom:20px">
<el-cascader v-model="tagName" :options="selectTagsList" :props="tagProps" @change="tagChangeFn"></el-cascader>
</div>
<el-tag
v-for="(item, index) in showTagsList"
:key="index"
:type="item.enableFlag == true ? '' : 'info'"
:style="{
'margin-right': '15px',
'margin-bottom': '12px',
cursor: editTag ? 'pointer' : 'default',
}"
:closable="editTag && item.enableFlag == true"
@click="handleClickTag(item)"
@close="handleCloseTag(item)"
>{{ item.names }}</el-tag>
<div>
<el-button
v-if="!editTag"
size="mini"
type="primary"
@click="handleEditTag"
>编辑标签</el-button>
<el-button
v-if="editTag"
type="success"
size="mini"
@click="handleSaveTag"
>保存</el-button>
<el-button
v-if="editTag"
size="mini"
@click="handleCancelEditTag"
>取消</el-button>
</div>
<!-- <div style="margin-top:20px">
<el-input
v-if="editTag"
v-model="addTagName"
placeholder="请输入新增客户标签"
/>
<el-button
style="margin-left:20px"
v-if="editTag"
type="success"
@click="handleAddTag"
>新增</el-button>
</div> -->
</div>
</div>
</el-collapse-item>
<!-- 莲都-特色客户标签 -->
<el-collapse-item name="11" v-if="userName.indexOf('931') === 0">
<template slot="title">
<p class="common-title">特色客户标签</p>
</template>
<el-form class="lianduForm">
<el-row>
<el-col :span="8" v-for="item in ldCustomTags" :key="item.label">
<el-form-item
:label="item.label + ''"
:prop="item.label"
>
<span>{{ item.value }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-collapse-item>
<Custom :tagManualList="tagManualList" name="自定义标签" nameKey="10" typeKey="ls" @getDetailData="getDetailData" />
<el-collapse-item name="6">
<template slot="title">
<p class="common-title">
走访记录(总共走访{{ visitRecords.length }}次)
</p>
</template>
<el-timeline v-if="visitRecords.length > 0" style="margin-top: 30px">
<el-table
:data="visitRecords"
style="width: 100%"
max-height="600"
>
<el-table-column
align="left"
prop="campaignName"
label="活动名称"
show-overflow-tooltip
width="150px"
></el-table-column>
<el-table-column
align="left"
prop="visName"
label="柜员名称"
show-overflow-tooltip
width="150px"
></el-table-column>
<el-table-column
align="left"
prop="visId"
label="柜员号"
show-overflow-tooltip
width="150px"
></el-table-column>
<el-table-column
align="left"
prop="deptId"
label="柜员部门"
show-overflow-tooltip
width="150px"
></el-table-column>
<el-table-column
align="left"
prop="deptName"
label="部门名称"
show-overflow-tooltip
width="200px"
></el-table-column>
<el-table-column
align="left"
prop="custName"
label="走访客户名称"
show-overflow-tooltip
width="150px"
></el-table-column>
<el-table-column
align="left"
prop="custIdc"
label="客户证件号"
show-overflow-tooltip
width="200px"
></el-table-column>
<el-table-column
align="left"
prop="custType"
label="客户类型"
show-overflow-tooltip
>
<template slot-scope="scope">
<span v-if="scope.row.custType == '0'">个人</span>
<span v-if="scope.row.custType == '1'">商户</span>
<span v-if="scope.row.custType == '2'">企业</span>
</template>
</el-table-column>
<el-table-column
align="left"
prop="signInTime"
label="签到时间"
show-overflow-tooltip
width="180px"
></el-table-column>
<el-table-column
align="left"
prop="signOutTime"
label="签退时间"
show-overflow-tooltip
width="180px"
></el-table-column>
<el-table-column
align="left"
prop="signInAddress"
label="签到地址"
show-overflow-tooltip
width="150px"
></el-table-column>
<el-table-column
align="left"
prop="signOutAddress"
label="签退地址"
show-overflow-tooltip
width="150px"
></el-table-column>
<el-table-column
align="left"
prop="signInCoordinate"
label="签到坐标"
show-overflow-tooltip
width="150px"
></el-table-column>
<el-table-column
align="left"
prop="signOutCoordinate"
label="签退坐标"
show-overflow-tooltip
width="150px"
></el-table-column>
<el-table-column
align="left"
prop="abnormalVisitTag"
label="异常走访标签"
show-overflow-tooltip
width="150px"
v-if="is875"
>
<template slot-scope="scope">
<span v-if="scope.row.abnormalVisitTag == '0'">正常</span>
<span v-if="scope.row.abnormalVisitTag == '1'">走访频率异常</span>
<span v-if="scope.row.abnormalVisitTag == '2'">走访持续时长异常</span>
<span v-if="scope.row.abnormalVisitTag == '3'">签退时间异常</span>
</template>
</el-table-column>
<el-table-column
align="left"
prop="abnormalVisitInfo"
label="异常走访信息"
show-overflow-tooltip
width="150px"
v-if="is875"
></el-table-column>
<el-table-column
align="left"
prop="isValidCust"
label="是否为有效客户"
show-overflow-tooltip
width="150px"
>
<template slot-scope="scope">
<span v-if="scope.row.isValidCust == '0'">否</span>
<span v-if="scope.row.isValidCust == '1'">是</span>
</template>
</el-table-column>
<el-table-column
align="left"
prop="remark"
label="走访备注"
show-overflow-tooltip
width="150px"
></el-table-column>
</el-table>
<!-- <el-timeline-item
v-for="(record, index) in visitRecords"
:key="index"
:timestamp="record.date"
>
<el-card>
<p class="record_item">任务名称:{{ record.campaignName }}</p>
<p class="record_item">走访时间:{{ record.visTime }}</p>
<p class="record_item">走访机构:{{ record.deptName }}</p>
<p class="record_item">走访人:{{ record.visName }}</p>
<p class="zfRemark record_item">
走访备注:
<span v-if="record.isRemarkEdit">{{ record.remark }}</span>
<el-input
v-if="!record.isRemarkEdit"
v-model="record.remark"
class="remarkTitle"
type="textarea"
:row="3"
/>
</p>
<div class="record_btn">
<el-button
v-if="record.isRemarkEdit && record.isZfEdit"
type="primary"
size="small"
@click="handleClickRecord(record, index)"
>编辑</el-button>
<el-button
v-if="!record.isRemarkEdit"
type="plain"
size="small"
@click="handleCommitRecord(record, index)"
>保存</el-button>
<el-button
v-if="!record.isRemarkEdit"
type="primary"
size="small"
@click="handleCancleRecord(record, index)"
>取消</el-button>
</div>
</el-card>
</el-timeline-item> -->
</el-timeline>
<!-- <el-button v-if="!visitRecords.length > 0" type="text">暂无走访记录</el-button> -->
</el-collapse-item>
<CustContact :custId="pageId" v-if="is875" name="客户接触记录" nameKey="12" />
<!-- <el-collapse-item name="7">
<template slot="title">
<p class="common-title">关联商户/企业
<el-tooltip placement="top" trigger="hover" content="大信贷股东信息表">
<span class="quesiton"><i class="el-icon-question"></i></span>
</el-tooltip>
</p>
</template>
<div style="margin-top: 30px">
<el-table :data="merchantList" class="affiliatedData">
<el-table-column label="商户名称" align="center">
<template slot-scope="scope">
<el-button type="text" @click="goMerchantDetail(scope.row)">{{ scope.row.custName }}</el-button>
</template>
</el-table-column>
</el-table>
<el-table :data="businessList" class="affiliatedData">
<el-table-column label="企业名称" align="center">
<template slot-scope="scope">
<el-button type="text" @click="goBusinessDetail(scope.row)">{{ scope.row.custName }}</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-collapse-item> -->
<el-collapse-item name="8">
<template slot="title">
<p class="common-title">关系图谱</p>
</template>
<div style="margin-top: 30px">
<el-tabs v-model="tabActiveName">
<el-tab-pane label="列表视角" name="1">
<el-table :data="gxData" class="affiliatedData">
<el-table-column label="姓名" align="center" prop="name" />
<el-table-column label="关系" align="center" prop="callName" />
<el-table-column
label="身份证号"
align="center"
prop="idCard"
/>
<el-table-column label="年龄" align="center" prop="age" />
</el-table>
</el-tab-pane>
<el-tab-pane label="家族图谱" name="2">
<el-button
type="primary"
@click="handleGoFamily"
>家庭族谱</el-button>
</el-tab-pane>
</el-tabs>
</div>
</el-collapse-item>
</el-collapse>
<el-dialog
title="添加成员信息"
:visible.sync="familyVisible"
width="500px"
:before-close="handleClosefamily"
class="fimalyDialog"
>
<el-form
ref="fimalyForm"
:model="fimalyForm"
label-width="100px"
:rules="familyRules"
>
<el-form-item prop="fmyName" label="姓名">
<el-input v-model="fimalyForm.fmyName" maxlength="16" />
</el-form-item>
<el-form-item prop="fmyRln" label="关系">
<el-select v-model="fimalyForm.fmyRln">
<el-option
v-for="(item, index) in FmyRlnList"
:key="index"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item prop="tel" label="手机号">
<el-input v-model="fimalyForm.tel" />
</el-form-item>
<el-form-item prop="fmyCustIdc" label="身份证号">
<el-input v-model="fimalyForm.fmyCustIdc" />
</el-form-item>
</el-form>
<span slot="footer" class="person-footer">
<el-button @click="handleClosefamily">取消</el-button>
<el-button
type="primary"
class="commit_btn"
@click="handlFimalyCommit"
>确定</el-button>
</span>
</el-dialog>
<el-dialog
title="该客户尚未建档,请先进行营销建档"
:visible.sync="filingVisible"
width="25%"
:before-close="handleClosefiling"
class="filingDialog"
>
<span slot="footer" class="person-footer">
<el-button @click="handleClosefiling">取消</el-button>
<el-button
type="primary"
class="commit_btn"
@click="handlFilingCommit"
>确定</el-button>
</span>
</el-dialog>
<el-dialog
title="他行利率"
:visible.sync="thllVisible"
width="500px"
:before-close="handleClosefamily"
class="fimalyDialog"
>
<el-form
ref="thllForm"
:model="thllForm"
label-width="100px"
:rules="thllRules"
>
<el-form-item prop="bank" label="他行名称">
<el-input v-model="thllForm.bank" maxlength="16" />
</el-form-item>
<el-form-item prop="rate" label="利率">
<el-input v-model="thllForm.rate" maxlength="16" />
</el-form-item>
<el-form-item prop="source" label="数据来源">
<el-input v-model="thllForm.source" />
</el-form-item>
</el-form>
<span slot="footer" class="person-footer">
<el-button @click="handleClosethll">取消</el-button>
<el-button
type="primary"
class="commit_btn"
@click="handlThllcommit"
>确定</el-button>
</span>
</el-dialog>
<el-dialog
:title="addressTitle"
:visible.sync="addressVisible"
width="500px"
class="fimalyDialog"
>
<el-table :data="addressList">
<el-table-column label="地址类型" align="center" prop="addressName" />
<el-table-column label="地址" align="center" prop="address" />
<el-table-column label="来源" align="center" prop="source" />
</el-table>
</el-dialog>
<el-dialog
title="添加走访"
:visible.sync="zfVisible"
width="25%"
:before-close="handleCloseZf"
class="zfDialog"
>
<el-form
ref="formObj"
:model="formObj"
:rules="formRules"
class="my-form"
>
<el-form-item label="" prop="campaignId" label-width="50px">
<el-select
v-model="formObj.campaignId"
style="width: 300px"
placeholder="请选择任务"
filterable
>
<el-option
v-for="item in taskOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>{{ item.label }}</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="person-footer">
<el-button @click="handleCloseZf">取消</el-button>
<el-button
type="primary"
class="commit_btn"
@click="handlZfCommit"
>确定</el-button>
</span>
</el-dialog>
<el-dialog
title="二次走访"
:visible.sync="secondVisitShow"
width="500px"
class="fimalyDialog"
>
<el-form ref="secondRef" :model="secondForm" :rules="secondRules" label-width="100px">
<el-form-item prop="visitTime" label="走访时间">
<el-date-picker
v-model="secondForm.visitTime"
align="right"
type="date"
clearable
placeholder="请选择走访时间"
value-format="yyyy-MM-DD"
format="yyyy-MM-DD"
/>
</el-form-item>
</el-form>
<span slot="footer" class="person-footer">
<el-button @click="handleCloseSecond">取消</el-button>
<el-button
type="primary"
class="commit_btn"
@click="handleSubmitSecond"
>确定</el-button>
</span>
</el-dialog>
<el-dialog
title="资源申请"
:visible.sync="secoureShow"
width="500px"
class="fimalyDialog"
>
<el-form ref="secoureRef" :model="secoureForm" :rules="secoureRules" label-width="100px">
<!-- <el-form-item prop="userName" label="客户经理">
<el-select v-model="secoureForm.userName" filterable clearable>
<el-option
v-for="(item, index) in secoureOption"
:key="index"
:label="item.nickName"
:value="item.userName"
/>
</el-select>
</el-form-item> -->
<el-form-item label="" label-width="0">
<section class="user-info">
<span>归属机构</span>
<treeselect
ref="orgTree"
size="small"
v-model="userDeptList"
:options="deptOptions"
placeholder="请选择"
:show-count="true"
noOptionsText="暂无数据"
noResultsText="暂无数据"
@select="(node) => onDeptTreeSelect(node)"
@deselect="clearTreeSelect"
@open="onOrgTreeFocus"
:flat="false"
style="margin-bottom: 10px"
/>
</section>
<section class="user-info">
<span>客户经理</span>
<el-select
@focus="onClientManagerFocus"
ref="clientManager"
v-model="authUser"
:multiple-limit="0"
filterable
placeholder="请选择"
class="input-box"
style="width: 100%"
>
<el-option
v-for="option in managerOptions"
:key="option.userId"
:label="`${option.deptName}-${option.userName}-${option.nickName}`"
:value="`${option.userName}-${option.nickName}`"
></el-option>
</el-select>
</section>
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input v-model="secoureForm.remark" :rows="5" type="textarea" />
</el-form-item>
</el-form>
<span slot="footer" class="person-footer">
<el-button @click="handleCloseSecoure">取消</el-button>
<el-button
type="primary"
class="commit_btn"
@click="handleSubmitSecoure"
>确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
updateCust,
getInfoByCustId,
addFamily,
getIndustryTree,
getIndividualfold,
addThll,
editThll,
getInfoByCustIdc,
exportRetailDetail,
listByIdCard,
getVisitInfoList,
editVisitInfo,
editCustTag,
editCustTag1,
getcustomLevel,
appointmentSecondVisit,
systemUserAllTreeUser,
appointmentResourceAssist
} from '@/api/system/listByRetailKeywords.js'
import { Message } from 'element-ui'
import { getVisitData } from '@/api/task/taskList.js'
import { getAddressTree, getDetailRegion, systemUserDeptTreeAll } from '@/api/grid/address/tree.js'
import { getCurrentExistTask,systemRecordEditLable } from '@/api/system/grouplist'
import { addAppointCustCamp, getTagSearch } from '@/api/grid/mycustomer.js'
import { getUserListByDeptIds } from "@/api/grid/region.js";
import { custEduList } from '../custEdu'
import { downloadFiles } from '@/utils'
import { mapGetters } from 'vuex'
import { cloneDeep, isEmpty } from 'lodash'
import _ from 'lodash'
import Custom from '../custom.vue'
import CustContact from '../custContact.vue'
export default {
data() {
var validatePhone = (rule, value, callback) => {
if (!value?.trim()) {
callback()
}
const regExp = /^1(3|4|5|6|7|8|9)[0-9]{9}$/
if (!regExp.test(value)) {
this.showCode = false
this.canClick = false
callback(new Error('请输入正确的手机号'))
} else {
this.canClick = true
callback()
}
}
var validateCustIdc = (rule, value, callback) => {
if (!value?.trim()) {
return callback(new Error('请输入身份证号码'))
}
const regex =
/^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
if (!regex.test(value)) {
callback(new Error('请输入正确的身份证号码'))
} else {
callback()
}
}
return {
customLevel: '',
baseHeaderForm: {
custName: '',
custIdc: ''
},
custEduList,
activeName: '',
isSaveDisable: true,
filingVisible: false,
isShow: false,
iscustName: false,
iscustGender: false,
isbelongBusi: false,
iscustPhone: false,
iscustSalary: false,
isbirthday: false,
isactiveBranchName: false,
isbelongUserName: false,
isrisk: false,
isEditing: false,
editText: '编辑',
newTag: '',
cliList: [],
originTagList: [],
editTag: false,
tagsList: [],
isAddTag: false,
tabActiveName: '1',
registerLocationNum: '',
custLocationNum: '',
jobLocationNum: '',
profile: {},
zfVisible: false,
formObj: {
campaignId: ''
},
taskOptions: [],
formRules: {
campaignId: [
{
required: true,
message: '任务不能为空',
trigger: 'blur'
}
]
},
visitRecords: [],
isMarriedList: [
{
label: '未婚',
value: '未婚'
},
{
label: '已婚',
value: '已婚'
},
{
label: '离异',
value: '离异'
}
],
rules: {
// custName: [{ required: true, message: '请输入', trigger: 'blur' }],
// custGender: [{ required: true, message: '请选择', trigger: 'change' }],
// custAge: [{ required: true, message: '请输入', trigger: 'blur' }],
// custIdc: [{ required: true, validator: validateCustIdc, trigger: 'blur' }],
// birthday: [{ required: true, message: '请选择出生日期', trigger: 'change' }],
// custPhone: [{ validator: validatePhone, trigger: 'blur' }],
},
signedProducts: {},
familyData: [],
gxData: [],
merchantList: [],
businessList: [],
adressOptions: [],
regAddress: {
lazy: true,
lazyLoad(node, resolve) {
setTimeout(() => {
const nodes = []
const query = {
level: node.level + 1,
code: node.level == 0 ? '33' : node.value.value
}
getAddressTree(query).then((res) => {
res.data.map((item) => {
const obj = {
value: item,
label: item.label,
leaf: item.level >= 5
}
nodes.push(obj)
})
resolve(nodes)
})
}, 500)
}
},
familyVisible: false,
fimalyForm: {
fmyName: '',
fmyRln: '',
tel: '',
fmyCustIdc: ''
},
familyRules: {
fmyName: [{ required: true, message: '请输入', trigger: 'blur' }],
fmyRln: [{ required: true, message: '请选择', trigger: 'change' }],
tel: [{ required: true, validator: validatePhone, trigger: 'blur' }]
},
FmyRlnList: [
{ label: '父亲', value: '父亲' },
{ label: '母亲', value: '母亲' },
{ label: '祖父', value: '祖父' },
{ label: '祖母', value: '祖母' },
{ label: '儿子', value: '儿子' },
{ label: '女儿', value: '女儿' },
{ label: '孙子', value: '孙子' },
{ label: '孙女', value: '孙女' },
{ label: '兄弟', value: '兄弟' },
{ label: '表兄弟', value: '表兄弟' },
{ label: '堂兄弟', value: '堂兄弟' },
{ label: '姐妹', value: '姐妹' },
{ label: '表姐妹', value: '表姐妹' },
{ label: '堂姐妹', value: '堂姐妹' },
{ label: '妻子', value: '妻子' },
{ label: '丈夫', value: '丈夫' }
],
belongBusiStr: '',
registerLocationStr: '',
custLocationStr: '',
jobLocationStr: '',
industryOptions: [],
sbCustIdc: '',
socialSecurity: '',
zxData: [],
thllVisible: false,
thllForm: {},
thllRules: {},
thllDialog: '',
addressTitle: '',
addressVisible: false,
addressList: [],
adressArr: [],
jtdzList: [],
hjdzList: [],
gzdzList: [],
czdzList: [],
lxdzList: [],
sfzdzList: [],
bzForm:{
label:"",
oldLabel:"",
},
bzRules:{},
bzFlag:true,
tagName:[],
tagProps:{
label:"names",
value:"names",
children:"children"
},
selectTagsList:[],
showTagsList:[],
addTagName:"",
newCustTag:[],
tagManualList: [],
secondVisitShow: false,
secoureShow: false,
secondForm: {
visitTime: null
},
secondRules: {
visitTime: [{ required: true, message:'请选择走访时间', trigger:'change' }]
},
secoureOption: [],
secoureForm: {
// userName: null,
remark: null
},
secoureRules: {
// userName: [{ required: true, message:'请选择客户经理', trigger:'change' }]
},
authUser: '',
deptOptions: [],
userDeptList: null,
managerOptions: [],
ldCustomTags: []
}
},
watch: {
userDeptList(val) {
if (!val) {
this.managerOptions = []
this.authUser = ''
}
}
},
components: {
Custom,
CustContact
},
computed: {
...mapGetters(['roles', 'userName', 'deptId']),
isHeadAdmin() {
return this.roles.includes('headAdmin')
},
// 公司部
isPublic() {
return this.roles.includes('headPublic')
},
// 零售部
isPrivate() {
return this.roles.includes('headPrivate')
},
// 是否932开头部门
is932Dept() {
return String(this.deptId || '').substring(0, 3) === '932'
},
// 运管部
isHeadOps() {
return this.roles.includes('headOps')
},
// 支行
isBranchAdmin() {
return this.roles.includes('branchAdmin')
},
// 网点主任
isOutletAdmin() {
return this.roles.includes('outletAdmin')
},
// 客户经理
isCommonManager() {
return this.roles.includes('commonManager')
},
pageId() {
return this.$route.query.custId
},
// 海宁
is875() {
return this.userName.slice(0, 3) === '875'
}
},
created() {
// console.log(this.userName, 'userNameuserNameuserName')
// if (this.userName.indexOf('875') === 0 || this.userName.indexOf('965') === 0) {
// if (!this.pageId) return
// getcustomLevel(0, this.pageId).then(res => {
// if (res.code === 200) {
// this.customLevel = res.msg
// }
// })
// }
this.getDeptTreeSelect()
},
mounted() {
this.getDetailData()
// systemUserAllTreeUser().then(res => {
// this.secoureOption = res
// })
},
methods: {
handleAddTag(){
if(!this.addTagName){
this.$message.error('请输入客户标签')
return;
}
let existsFlag=_.includes(_.map(this.showTagsList,'names'),this.addTagName)
if(existsFlag){
this.$message.error('客户标签已存在')
return;
}
this.showTagsList.push({
children: [],
enableFlag: true,
names: this.addTagName,
type: "",
useFlag: false,
})
this.updateListFn(this.showTagsList);
this.newCustTag.push({
custTagLevel1:this.tagName[0],
custTagLevel2:this.tagName[1],
custTagName:this.addTagName,
})
this.addTagName="";
},
bzEditFn(){
if(this.bzFlag){
this.bzForm.oldLabel=this.bzForm.label
}else{
this.bzForm.label=this.bzForm.oldLabel
}
this.bzFlag=!this.bzFlag
},
bzSaveFn(){
systemRecordEditLable({
custId:this.pageId,
custType:"0",
lable:this.bzForm.label
}).then((res) => {
this.$message.success('保存成功')
this.bzFlag=true;
})
},
initIndustryTree() {
getIndustryTree().then((res) => {
this.industryOptions = res.data.map((item) => {
return {
value: item.code,
label: item.name,
children: item.industryTrees
}
})
console.log(this.industryOptions)
this.industryOptions.forEach((item) => {
item.children.forEach((el) => {
el.value = el.code
el.label = el.name
})
})
this.initBelongBusiStr(this.profile.belongBusi)
})
},
async getDetailData(fimId) {
const id = fimId || this.pageId
const { data } = await getInfoByCustId(id)
this.initIndustryTree()
this.profile = {
...data.custInfoRetail,
custType:
data.custInfoRetail.custType == 0
? '营销中'
: data.custInfoRetail.custType == 1
? '已签约'
: '未营销'
}
if (data.addressDetails && data.addressDetails.length > 0) {
this.adressArr = data.addressDetails
}
this.baseHeaderForm.custName = this.profile.custName
this.baseHeaderForm.custIdc = this.profile.custIdc
this.profile.community = data.community
this.profile.xzLsGridName = data.xzLsGridName
this.profile.xzLsGridUserName = data.xzLsGridUserName
this.profile.xzYgGridName = data.xzYgGridName
this.profile.xzYgGridUserName = data.xzYgGridUserName
this.cliList = data.cmpmUserLists
this.sbCustIdc = data.custInfoRetail.custIdc
this.customLevel = data.custInfoRetail.custLevel
this.signedProducts = data.signedProducts ? data.signedProducts : {}
this.familyData = data.familyMembers
this.total = data.familyMembers ? data.familyMembers.length : []
this.merchantList = data.merchantList
this.businessList = data.businessList
this.id = data.custInfoRetail.id
this.originTagList = cloneDeep(data.tabEnmuVos) || []
this.tagsList = cloneDeep(data.tabEnmuVos) || []
if (this.profile.recordStatus && this.profile.recordStatus != '0') {
this.isShow = false
} else {
this.isShow = true
}
// if ((!this.profile.recordStatus || this.profile.custIdc == '') && (!this.profile.custIsn || this.profile.custIsn == '')) {
// this.isShow = true
// } else {
// this.isShow = false
// }
this.profile.belongBusi = data.custInfoRetail.belongBusi
this.registerLocationStr = data.custInfoRetail.registerLocation
this.custLocationStr = data.custInfoRetail.custLocation
this.jobLocationStr = data.custInfoRetail.jobLocation
this.bzForm.label = data.custInfoRetail.label||"";
this.initGetVisitInfoList()
this.selectTagsList=this.getTwoLevels(this.tagsList);
this.tagName=[this.selectTagsList[0].names,this.selectTagsList[0].children[0].names];
this.showTagsList=this.tagsList[0].children[0].children||[];
this.tagManualList = cloneDeep(data.tagManual) || []
},
getTwoLevels(nodes){
return _.map(nodes, parent => ({
names: parent.names,
children: _.map(parent.children, child => ({
names: child.names // 清除子节点的 children 属性
// 或_.omit(child, ['children']) // 如果需要保留其他属性
}))
}));
},
initBelongBusiStr(data) {
this.industryOptions.forEach((item) => {
if (item.value == data) {
this.belongBusiStr = item.label
} else {
item.children.forEach((el) => {
if (el.value == data) {
this.belongBusiStr = el.label
}
})
}
})
},
flattenArray(arr) {
const result = []
arr.forEach((item) => {
if (Array.isArray(item)) {
result.push(...this.flattenArray(item))
} else {
result.push(item)
}
})
return result
},
handleChangeBirthday(val) {
const currentYear = new Date().getFullYear()
const birthdayYear = Number(val.slice(0, 4))
this.profile.custAge = currentYear - birthdayYear
},
goBackToIndex() {
const { query } = this.$route
if (query.backUrl) {
this.$router.replace({
path: query.backUrl,
query
})
} else {
this.$router.go(-1)
}
},
// splitTags() {
// const tagsArray = this.profile.label
// .replace(/,\s*/g, ',')
// .split(/,\s*|\s+/)
// .map((tag) => tag.trim())
// this.tags = tagsArray.filter((tag) => tag)
// },
editProfile() {
this.isEditing = !this.isEditing
if (this.isEditing === true) {
this.editText = '退出编辑'
this.isSaveDisable = false
} else {
this.editText = '编辑资料'
this.$refs.profileForm.clearValidate()
this.isSaveDisable = true
this.getDetailData()
}
},
saveAll() {
if (
this.profile.custPhone == '' &&
this.profile.registerLocation == null &&
this.profile.jobLocation == null &&
this.profile.custLocation == null
) {
Message.warning('请输入手机号或者任意一个地址!')
} else {
this.$refs.profileForm.validate((valid) => {
if (valid) {
let registerLocationStrs = ''
let jobLocationStrs = ''
let custLocationStrs = ''
// 户籍地址
if (Array.isArray(this.profile.registerLocation)) {
const registerLocationArr = this.profile.registerLocation.map(
(item) => {
return item.label
}
)
registerLocationStrs = registerLocationArr
.join(' ')
.replace(/\s/g, '')
}
// 单位地址
if (Array.isArray(this.profile.jobLocation)) {
const jobLocationArr = this.profile.jobLocation.map((item) => {
return item.label
})
jobLocationStrs = jobLocationArr.join(' ').replace(/\s/g, '')
}
// 住宅地址
if (Array.isArray(this.profile.custLocation)) {
const custLocationArr = this.profile.custLocation.map((item) => {
return item.label
})
custLocationStrs = custLocationArr.join(' ').replace(/\s/g, '')
}
const params = {
custName: this.baseHeaderForm.custName,
custGender: this.profile.custGender,
custAge: this.profile.custAge,
custIdc: this.profile.custIdc,
birthday: this.profile.birthday,
custPhone: this.profile.custPhone,
isMarried: this.profile.isMarried,
custSalary: this.profile.custSalary,
custEdu: this.profile.custEdu,
belongBusi: Array.isArray(this.profile.belongBusi)
? this.profile.belongBusi.pop()
: this.profile.belongBusi,
custId: this.profile.custId,
registerLocation: Array.isArray(this.profile.registerLocation)
? `${registerLocationStrs}${this.registerLocationNum}`
: this.profile.registerLocation,
custIsn: this.profile.custIsn,
jobLocation: Array.isArray(this.profile.jobLocation)
? `${jobLocationStrs}${this.jobLocationNum}`
: this.profile.jobLocation,
custLocation: Array.isArray(this.profile.custLocation)
? `${custLocationStrs}${this.custLocationNum}`
: this.profile.custLocation,
updateTime: this.profile.updateTime,
belongUserName: this.profile.belongUserName,
XzlsGridUserName: this.profile.XzlsGridUserName,
XzlsGridName: this.profile.XzlsGridName,
XzYgGridUserName: this.profile.XzYgGridUserName,
XzYgGridName: this.profile.XzYgGridName,
community: this.profile.community,
id: this.id
}
updateCust(params).then((response) => {
if (response.code == 200) {
Message.success('保存成功!')
this.isSaveDisable = true
this.getDetailData()
this.initIndustryTree()
}
})
this.isEditing = false
this.editText = '编辑资料'
} else {
return false
}
})
}
},
handleExport() {
exportRetailDetail(this.pageId).then((res) => {
downloadFiles(res, `个人详情_${new Date().getTime()}.xlsx`)
})
},
cancelEdit() {
this.isEditing = false
},
goFamilyDetail(item) {
getInfoByCustIdc(item.fmyCustIdc).then((res) => {
if (res.data) {
const fimId = res.data.id
this.getDetailData(fimId)
} else {
this.isShow = true
}
})
},
goMerchantDetail(item) {
this.$router.push({
path: '/360charts/commercial/',
query: { custId: item.custId }
})
},
goBusinessDetail(item) {
this.$router.push({
path: '/360charts/firm/',
query: { custId: item.custId }
})
},
handleClickTag(val) {
if (!this.editTag || val.enableFlag == true) return
this.showTagsList.filter(
(item) => item.names === val.names
)[0].enableFlag = true
this.updateListFn(this.showTagsList);
},
handleCloseTag(val) {
this.showTagsList.filter(
(item) => item.names === val.names
)[0].enableFlag = false
this.updateListFn(this.showTagsList);
},
updateListFn(showTagsList){
for(let i=0;i<this.tagsList.length;i++){
if(this.tagsList[i].names == this.tagName[0]){
for(let j=0;j<this.tagsList[i].children.length;j++){
if(this.tagsList[i].children[j].names == this.tagName[1]){
this.tagsList[i].children[j].children=showTagsList;
}
}
}
}
},
handleEditTag() {
this.editTag = true
},
handleCancelEditTag() {
this.editTag = false
this.tagsList = cloneDeep(this.originTagList)
},
tagChangeFn(){
for(let i=0;i<this.tagsList.length;i++){
if(this.tagsList[i].names == this.tagName[0]){
for(let j=0;j<this.tagsList[i].children.length;j++){
if(this.tagsList[i].children[j].names == this.tagName[1]){
this.showTagsList=this.tagsList[i].children[j].children||[];
}
}
}
}
},
collectNamesWithFlagTrue(nodes){
return _.flatMap(nodes, (node) => {
// 1. 收集当前节点的name若 flag 为 true
const current = node.enableFlag ? [{custTagName: node.names, id: node.id}] : [];
// 2. 递归处理 children若存在并获取子节点中符合的 name
const children = _.get(node, 'children', []);
const childNames = children.length
? this.collectNamesWithFlagTrue(children) // 递归处理子节点
: [];
// 3. 合并当前节点和子节点的结果
return [...current, ...childNames];
});
},
handleSaveTag() {
const custTagList = this.collectNamesWithFlagTrue(this.tagsList)
editCustTag({
custTagList: custTagList,
custId: this.$route.query.custId,
newCustTags:this.newCustTag,
custTagType:"ls"
}).then((res) => {
if (res.code === 200) {
this.$message.success('修改成功')
this.originTagList = cloneDeep(this.tagsList)
this.editTag = false
}
})
},
handleCollapse(val) {
if (val == '1' || val == '3') {
// this.sbCustIdc
// let custIdc = '142601199608096413'
this.initFold(this.sbCustIdc)
}
if (val == '8') {
this.initListByIdCard()
}
if (val == '0') {
this.initgetVisitData()
}
if (val === '11' && this.userName.indexOf('931') === 0) {
// 莲都特色客户标签
this.queryLianduTag()
}
},
initgetVisitData() {
getVisitData({ custId: this.pageId }).then((res) => {
if (res.code == 200) {
const list = res.data.addressDetails
this.jtdzList = list.filter((item) => item.addressName == '家庭地址')
this.hjdzList = list.filter((item) => item.addressName == '户籍地址')
this.gzdzList = list.filter((item) => item.addressName == '工作地址')
this.czdzList = list.filter((item) => item.addressName == '常住地址')
this.lxdzList = list.filter((item) => item.addressName == '联系地址')
this.sfzdzList = list.filter(
(item) => item.addressName == '身份证地址'
)
}
})
},
queryLianduTag() {
getTagSearch({ custIdc: this.profile.custIdc }).then((res) => {
if (res.code == 200) {
const { data = {} } = res
this.ldCustomTags = Object.keys(data).map(key => {
return {
label: key,
value: data[key]
}
})
}
})
},
initFold(custIdc) {
if (custIdc != '') {
getIndividualfold(custIdc).then((res) => {
this.socialSecurity = res.data.socialSecurity
? res.data.socialSecurity
: {}
this.zxData = res.data.otherBankRates
})
}
},
initListByIdCard() {
listByIdCard(this.profile.custIdc).then((res) => {
if (res.code == 200) {
this.gxData = res.rows
}
})
},
addFamily() {
this.familyVisible = true
},
handleClosefamily() {
this.fimalyForm = {}
this.familyVisible = false
this.$refs.fimalyForm.resetFields()
},
formDataPamars(json) {
const params = []
for (const key in json) {
const value = json[key]
if (value && typeof value === 'object' && !Array.isArray(value)) {
params.push(
...Object.keys(value).map(
(k) => `${key}[${k}]=${encodeURIComponent(value[k])}`
)
)
} else if (Array.isArray(value)) {
value.forEach((item) => {
params.push(`${key}[]=${encodeURIComponent(item)}`)
})
} else {
params.push(`${key}=${encodeURIComponent(value)}`)
}
}
return params.join('&')
},
handlFimalyCommit() {
this.$refs.fimalyForm.validate((valid) => {
if (valid) {
this.fimalyForm.custId = this.profile.custId
addFamily(this.formDataPamars(this.fimalyForm)).then((res) => {
if (res.code == 200) {
Message.success(res.msg)
this.familyVisible = false
this.getDetailData()
this.$refs.fimalyForm.resetFields()
}
})
} else {
return false
}
})
},
handleClosefiling() {
this.filingVisible = false
},
handlFilingCommit() {
this.$router.push({ path: '/individual' })
},
addzx() {
this.thllVisible = true
this.thllDialog = 'add'
},
editzx(row) {
this.thllVisible = true
this.thllForm = row
this.thllDialog = 'edit'
},
handleClosethll() {
this.thllVisible = false
this.thllForm = {}
this.initFold(this.sbCustIdc)
},
handlThllcommit() {
if (this.thllDialog == 'add') {
this.thllForm.custIdc = this.sbCustIdc
addThll(this.formDataPamars(this.thllForm)).then((res) => {
console.log(res, 'resssssssssss')
this.thllVisible = false
Message.success('新增成功!')
this.initFold(this.sbCustIdc)
this.thllForm = {}
})
} else {
editThll(this.formDataPamars(this.thllForm)).then((res) => {
console.log(res, 'edit')
this.thllVisible = false
Message.success('编辑成功!')
this.initFold(this.sbCustIdc)
this.thllForm = {}
})
}
},
handleViewRegisterLocation() {
this.addressTitle = '户籍地址'
this.addressVisible = true
this.addressList = this.adressArr.filter(
(item) => item.addressName == '户籍地址'
)
},
handleViewJobLocation() {
this.addressTitle = '工作地址'
this.addressVisible = true
this.addressList = this.adressArr.filter(
(item) => item.addressName == '工作地址'
)
},
handleViewCustLocation() {
this.addressTitle = '家庭地址'
this.addressVisible = true
this.addressList = this.adressArr.filter(
(item) => item.addressName == '家庭地址'
)
},
handleGoFamily() {
if (this.profile.custIdc) {
this.$router.push({
path: '/360charts/familyDetail',
query: { custIdc: this.profile.custIdc }
})
// this.$confirm('是否跳转该客户家庭试图', '提示', {
// confirmButtonText: '确认',
// cancelButtonText: '取消',
// type: 'warning'
// }).then(() => {
// this.$router.push({ path: '/360charts/familyDetail', query: { custIdc: this.profile.custIdc } })
// }).catch(() => {
// Message.info('已取消')
// })
} else {
Message.warning('改客户无证件号,故无法查看家庭图谱')
}
},
initGetVisitInfoList() {
getVisitInfoList((this.pageId+"").substring(3), 0).then((res) => {
if (res.code == 200) {
// const arr = res.rows.map((item) => {
// return item.infoList
// })
// const list = arr.flat()
// list.forEach((item) => {
// item.isRemarkEdit = true
// item.isZfEdit = item.visId == this.userName
// })
// this.visitRecords = JSON.parse(JSON.stringify(list))
this.visitRecords = res.rows
console.log(this.visitRecords, 'this.visitRecordsthis.visitRecords')
}
})
},
handleClickRecord(item, index) {
this.$set(this.visitRecords[index], 'isRemarkEdit', false)
},
handleCancleRecord(item, index) {
this.initGetVisitInfoList()
},
handleCommitRecord(item, index) {
const params = {
id: item.id,
remark: item.remark
}
editVisitInfo(params).then((res) => {
if (res.code == 200) {
Message.success('修改成功!')
this.initGetVisitInfoList()
}
})
},
handleAddZf() {
this.zfVisible = true
this.searchCurrentExistTask()
},
handleCloseZf() {
this.zfVisible = false
this.formObj.campaignId = ''
},
handlZfCommit() {
const params = {
custId: this.profile.custId,
campaignId: this.formObj.campaignId,
custType: 0
}
addAppointCustCamp(params).then((res) => {
if (res.code == 200) {
this.zfVisible = false
this.formObj.campaignId = ''
Message.success('添加成功!')
}
})
},
searchCurrentExistTask() {
const params = {
custType: 0
}
getCurrentExistTask(params).then((res) => {
if (res.code == 200) {
this.taskOptions = res.data.map((item) => {
return {
label: item.campaignName,
value: item.campaignId
}
})
}
})
},
handleSecondVisit() {
this.secondVisitShow = true
},
handleCloseSecond() {
this.secondVisitShow = false
this.secondForm.visitTime = null
},
handleSubmitSecond() {
this.$refs.secondRef.validate((valid) => {
if(valid) {
const params = {
custIdc: this.profile.custId,
custName: this.baseHeaderForm.custName,
custType: 0
}
appointmentSecondVisit(this.secondForm.visitTime, params).then(res => {
this.secondVisitShow = false
this.$message.success(res.msg)
this.secondForm.visitTime = null
})
}
})
},
handleRecource() {
this.secoureShow = true
},
handleCloseSecoure() {
this.secoureShow = false
this.secoureForm.userName = null
this.secoureForm.remark = null
},
handleSubmitSecoure() {
this.$refs.secoureRef.validate((valid) => {
if(valid) {
// const nickName = this.secoureOption.filter(item => item.userName === this.secoureForm.userName)[0].nickName
if (!this.authUser) {
Message.success('客户经理不能为空!')
return
}
const nickName = this.authUser.split('-')[1]
const userName = this.authUser.split('-')[0]
const params = {
custIdc: this.profile.custId,
custName: this.baseHeaderForm.custName,
custType: 0,
applyRemark: this.secoureForm.remark
}
appointmentResourceAssist(userName, nickName, params).then(res => {
this.secoureShow = false
this.$message.success(res.msg)
// this.secoureForm.userName = null
this.secoureForm.remark = null
this.authUser = ''
this.userDeptList = null
})
}
})
},
getDeptTreeSelect() {
systemUserDeptTreeAll().then((response) => {
this.deptOptions = response.data
})
},
// 选择归属机构
onDeptTreeSelect(node) {
this.fetchSelectOptions([node.id]);
},
// 取消勾选归属机构
clearTreeSelect(node) {
const index = this.checkedArr.findIndex((id) => id === node.id);
if (index > -1) {
this.checkedArr.splice(index, 1);
}
const { children = [] } = node;
if (children.length > 0) {
children.map((child) => {
const index = this.checkedArr.findIndex((id) => id === child.id);
if (index > -1) {
this.checkedArr.splice(index, 1);
}
});
}
},
onOrgTreeFocus() {
// this.$refs.clientManager.blur()
},
onClientManagerFocus() {
// this.$refs.orgTree.blurInput()
},
fetchSelectOptions(deptIds) {
if (isEmpty(deptIds)) {
return (this.managerOptions = []);
}
getUserListByDeptIds({ deptIds: deptIds }).then((response) => {
this.managerOptions = response.data;
});
},
}
}
</script>
<style lang="scss" scoped>
@import "./create-style.scss";
.common-wrap-cnt {
background-color: rgb(242, 243, 245);
overflow: hidden;
box-shadow: 0 3px 8px 0 #00000017;
border-radius: 16px 16px 0 0;
height: calc(100vh - 135px);
overflow-y: auto;
padding: 10px;
}
.header-top {
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
padding: 20px;
border-radius: 10px;
}
.t360-production {
display: flex;
align-items: center;
}
.t360-production-item {
width: 250px;
height: 43px;
background: #eaf5ff;
border-radius: 4px;
text-align: center;
line-height: 43px;
margin-right: 20px;
margin-top: 25px;
margin-bottom: 25px;
}
.t360-production-1 {
display: flex;
align-items: center;
}
.t360-production-item-1 {
width: 250px;
height: 43px;
background: #eaf5ff;
border-radius: 4px;
text-align: center;
line-height: 43px;
margin-right: 20px;
margin-top: 25px;
margin-bottom: 25px;
}
.file-upload {
display: flex;
align-items: center;
flex-direction: column;
justify-content: space-between;
height: 320px;
.group-input {
width: 702px;
height: 288px;
margin-top: 25px;
}
.group-select {
width: 702px;
height: 288px;
margin-top: 25px;
}
.file-upload-bg {
width: 702px;
height: 288px;
background: #f7f8fa;
// display: flex;
// align-items: center;
// justify-content: center;
}
.el-icon-upload {
text-align: center;
font-size: 47.36px;
color: #cccccc;
}
.file-upload-desc {
font-weight: 400;
font-size: 14px;
color: #666666;
letter-spacing: 0;
text-align: center;
line-height: 12px;
margin-top: 8px;
}
.file-upload-btn {
display: flex;
align-items: center;
justify-content: center;
height: 50px;
margin-top: 20px;
}
.file-upload-download {
display: flex;
align-items: center;
justify-content: center;
height: 20px;
margin-top: 15px;
font-size: 14px;
}
.file-upload-progress {
display: flex;
align-items: center;
justify-content: center;
height: 20px;
margin-top: 15px;
font-size: 14px;
}
}
.socialItem {
padding-left: 20px;
margin: 20px 0;
font-size: 14px;
}
.preview-table {
width: 100%;
margin-top: 16px;
}
.preview-cnt {
margin-top: 40px;
}
.chose-cnt {
::v-deep .el-form-item__content {
display: flex;
justify-content: space-between;
.el-button {
width: 88px;
margin-left: 24px;
}
.el-select {
flex: 1;
}
}
}
.profileForm {
::v-deep .el-form-item__content {
padding-right: 20px;
}
}
.lianduForm {
::v-deep label{
font-weight: normal;
}
::v-deep .el-form-item {
margin-bottom: 2px;
}
}
.title_box1 {
position: relative;
}
.title_box1:hover .ejTitle {
display: block;
}
.title_box2 {
position: relative;
}
.title_box2:hover .ejTitle {
display: block;
}
.title_box3 {
position: relative;
}
.title_box3:hover .ejTitle {
display: block;
}
.title_box4 {
position: relative;
}
.title_box4:hover .ejTitle {
display: block;
}
.ejTitle {
width: 250px;
line-height: 32px;
background: #ffffff;
border-radius: 4px;
box-shadow: 0 6px 16px 0 #1e1f2714;
margin-right: 20px;
margin-top: 8px;
padding-left: 10px;
padding-bottom: 10px;
position: absolute;
top: 80px;
z-index: 10;
display: none;
}
.ejTitle_item {
line-height: 32px;
font-size: 14px;
}
.message-box {
display: flex;
margin: 20px;
}
.message-box-left {
display: flex;
width: 10%;
justify-content: center;
align-items: center;
}
.tag-box {
margin-bottom: 10px;
}
::v-deep .el-input {
width: 200px;
}
.add_btn {
text-align: right;
padding-bottom: 20px;
}
.fimalyDialog {
::v-deep .el-dialog__header {
border-bottom: 1px solid #ebedf0;
padding-bottom: 10px;
}
::v-deep .el-dialog__footer {
border-top: 1px solid #ebedf0;
padding-bottom: 10px;
}
::v-deep .el-dialog__body {
padding: 30px 37px;
}
::v-deep .el-input {
width: 250px;
}
}
.zxxx_top {
margin: 20px;
font-size: 16px;
font-weight: 600;
}
.zxxx_top_title {
line-height: 36px;
}
.ccyc {
display: inline-block;
width: 95%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.qbdz {
::v-deep .el-form-item__content {
display: flex;
}
}
.quesiton {
color: #b9b9b9;
}
.zfRemark {
display: flex;
}
.remarkTitle {
width: 70%;
}
.record_btn {
margin-top: 20px;
}
.record_item {
line-height: 30px;
}
.dzBox_top {
display: flex;
}
.dzBox_item {
width: 33%;
display: flex;
min-height: 80px;
gap: 2%;
border: 1px solid #ddd;
}
.dzBox_title {
width: 20%;
display: flex;
justify-content: center;
align-items: center;
background-color: #eaf5ff;
border-right: 1px solid #ddd;
}
.dzBox_content {
padding: 15px;
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
div {
line-height: 25px;
}
}
.dzBox_wapper {
width: 80%;
display: flex;
flex-direction: column;
justify-content: center;
}
.source {
background: #eaf5ff;
border-radius: 2px;
padding: 1px 0px;
// margin-left: 4px;
}
.header_top_left {
display: flex;
}
.icon_box {
width: 60px;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
background-color: rgb(231, 242, 255);
}
.header_icon_box {
width: 35px;
height: 35px;
display: flex;
justify-content: center;
align-items: center;
}
.header_icon {
font-size: 28px;
color: #4886f8;
}
.base-info {
margin-left: 20px;
}
.wjd {
margin-left: 20px;
}
.line {
width: 100%;
background-color: #ccc;
height: 1px;
margin: 15px 0;
}
::v-deep .el-collapse-item {
margin-top: 15px;
border-radius: 10px;
}
::v-deep .el-collapse-item__header {
padding-left: 20px;
}
::v-deep .el-collapse-item__content {
padding-left: 20px;
}
.headerForm {
::v-deep .el-form-item {
margin-bottom: 0px;
}
::v-deep .el-form-item__label {
padding-right: 5px;
}
::v-deep .el-form-item__content {
display: flex;
align-items: center;
}
}
.common-create-main {
padding: 20px;
background-color: #ffffff;
margin-top: 20px;
border-radius: 10px;
::v-deep .el-form {
width: 100%;
.el-form-item {
margin-bottom: 16px;
.el-input__inner {
border: 1px solid #ccc;
color: #3d3d3d;
}
.el-input {
width: 200px;
}
}
.el-form-item__label {
font-weight: 400;
line-height: 38px;
font-size: 14px;
color: #3d3d3d;
padding-right: 24px;
}
}
}
.my-form {
::v-deep .el-input {
width: 300px;
}
}
.bz_row_end{
display: flex;
flex-direction: row;
justify-content: flex-end;
padding-right: 20px;
}
.user-info {
margin-bottom: 5px;
margin-left: 26px;
display: flex;
align-items: center;
::v-deep .vue-treeselect__control {
width: 320px !important;
height: 32px;
}
::v-deep .el-input {
width: 100%
}
span {
width: 70px !important;
margin-right: 10px;
font-size: 14px;
color: #606266;
&::before {
content: "*";
left: -3px;
color: #ff4d42;
position: relative;
top: 2px;
}
}
.input-box {
width: 320px !important;
}
}
</style>