index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. <template>
  2. <div class="app-container" v-loading="loading">
  3. <div class="conPanel">
  4. <el-row class="ht50p" :gutter="20">
  5. <el-col class="ht100p" :span="7">
  6. <div class="cardDiv">
  7. <div class="cardTitle">客户年龄段性别分布</div>
  8. <bar-two-way-chart
  9. id="barTwoWayChart"
  10. :width="width"
  11. :height="height"
  12. :data="barTwoWayChartData" />
  13. </div>
  14. </el-col>
  15. <el-col class="ht100p" :span="17">
  16. <div class="cardDiv">
  17. <div class="cardTitle">查询条件</div>
  18. <div class="lunboDiv">
  19. <img class="lineImg" src="../assets/image/line.png" alt="">
  20. <div class="wrapper horizontal demo1">
  21. <ul class="container" style=" transform-style: preserve-3d;transform: rotateX(-5deg) rotateY(0deg);">
  22. <li class="cards-list" v-for="(item,index) in lunboData" :key="index">
  23. <div class="img">
  24. <img class="iconImg" :src="item.iconSrc" alt="">
  25. <img class="shadowImg" src="../assets/image/shadow.png" alt="">
  26. </div>
  27. <div class="main-con">
  28. <div class="name">{{item.name}}</div>
  29. <img src="../assets/image/ItalicsLine.png" alt="">
  30. </div>
  31. </li>
  32. </ul>
  33. </div>
  34. </div>
  35. <div class="infoLeft">
  36. <!-- <img class="lineImg" src="../assets/image/line.png" alt="">-->
  37. <!-- <el-button class="lunboSearchBtn" icon="el-icon-search" circle @click="toUserInfoList"></el-button>-->
  38. <el-button class="lunboSearchBtn" circle @click="toUserInfoList">
  39. <img src="../assets/image/searchBtn.png" alt=""/>
  40. </el-button>
  41. <el-form v-if="lunboActiveIndex == 0" ref="conditionData" :model="conditionData" label-width="96px">
  42. <el-form-item class="formItemFull" label="业绩归属:" size="mini">
  43. <el-select v-model="conditionData.policybelong">
  44. <el-option v-for="(item,index) in policybelongArr" :key="index" :label="item.label" :value="item.value"></el-option>
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item class="formItemFull" label="年缴费区间:" size="mini">
  48. <el-input v-model="conditionData.payS" style="width: 43%;"></el-input>
  49. &nbsp;-&nbsp;
  50. <el-input v-model="conditionData.payE" style="width: 43%;"></el-input>
  51. </el-form-item>
  52. <el-form-item class="formItemFull" label="投保年份:" size="mini">
  53. <el-date-picker
  54. v-model="conditionData.fadate"
  55. type="year"
  56. clearable
  57. value-format="yyyy"
  58. placeholder="选择年">
  59. </el-date-picker>
  60. </el-form-item>
  61. <el-form-item class="formItemFull" label="险种类别:" size="mini">
  62. <el-select v-model="conditionData.productname">
  63. <el-option label="人寿保险" value="L"></el-option>
  64. <el-option label="年金保险" value="R"></el-option>
  65. <el-option label="万能保险" value="U"></el-option>
  66. <el-option label="意外伤害险" value="A"></el-option>
  67. <el-option label="重疾保险" value="S"></el-option>
  68. <el-option label="健康险" value="H"></el-option>
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item class="formItemFull" label="保额区间:" size="mini">
  72. <el-input v-model="conditionData.insuredAmountS" style="width: 43%;"></el-input>
  73. &nbsp;-&nbsp;
  74. <el-input v-model="conditionData.insuredAmountE" style="width: 43%;"></el-input>
  75. </el-form-item>
  76. </el-form>
  77. <el-form v-if="lunboActiveIndex == 1" :inline="true" ref="conditionData" :model="conditionData" label-width="96px">
  78. <el-form-item class="formItem" label="年龄:" size="mini">
  79. <el-input class="age" oninput="value=value.replace(/[^\d]/g,'')" v-model="conditionData.ageS"></el-input>
  80. -
  81. <el-input class="age" oninput="value=value.replace(/[^\d]/g,'')" v-model="conditionData.ageE"></el-input>
  82. </el-form-item>
  83. <el-form-item class="formItem" label="性别:" size="mini">
  84. <el-select v-model="conditionData.gender">
  85. <el-option label="男" value="0"></el-option>
  86. <el-option label="女" value="1"></el-option>
  87. </el-select>
  88. </el-form-item>
  89. <el-form-item class="formItem" label="省份:" size="mini">
  90. <el-input v-model="conditionData.sobirth"></el-input>
  91. </el-form-item>
  92. <el-form-item class="formItem" label="保单件数:" size="mini">
  93. <el-select v-model="conditionData.NOVPolicy">
  94. <el-option label="无保单" value="无保单"></el-option>
  95. <el-option label="1件" value="1件"></el-option>
  96. <el-option label="2件" value="2件"></el-option>
  97. <el-option label="3-5件" value="3-5件"></el-option>
  98. <el-option label="6-10件" value="6-10件"></el-option>
  99. <el-option label="11-20件" value="11-20件"></el-option>
  100. <el-option label="21-50件" value="21-50件"></el-option>
  101. <el-option label="50件以上" value="50件以上"></el-option>
  102. </el-select>
  103. </el-form-item>
  104. <el-form-item class="formItem" label="客户类型:" size="mini">
  105. <el-select v-model="conditionData.custtype">
  106. <el-option label="投保人" value="投保人"></el-option>
  107. <el-option label="被保人" value="被保人"></el-option>
  108. <el-option label="受益人" value="受益人"></el-option>
  109. </el-select>
  110. </el-form-item>
  111. <el-form-item class="formItem" label="核心客户号:" size="mini">
  112. <el-input v-model="conditionData.SCustID"></el-input>
  113. </el-form-item>
  114. <el-form-item class="formItemFull labelM education" label="客户等级:" size="mini" style="width:100%;margin-top: 5px;">
  115. <el-select v-model="conditionData.custclass">
  116. <el-option label="钻石" value="1"></el-option>
  117. <el-option label="白金" value="2"></el-option>
  118. <el-option label="黄金" value="3"></el-option>
  119. <el-option label="普通" value="4"></el-option>
  120. <el-option label="无" value="0"></el-option>
  121. </el-select>
  122. </el-form-item>
  123. <el-form-item class="formItemFull labelM education" label="学历:" size="mini" style="width:100%;margin-top: 5px;">
  124. <el-select v-model="conditionData.education" multiple collapse-tags>
  125. <el-option v-for="(item,index) in educationArr" :key="index" :label="item.label" :value="item.value"></el-option>
  126. </el-select>
  127. </el-form-item>
  128. <el-form-item class="formItemFull labelM dateQj" label="参与方进入时间:" size="mini" style="margin-top: 5px;">
  129. <el-date-picker
  130. v-model="conditionData.participantsDateS"
  131. type="date"
  132. clearable
  133. style="width: 44%;"
  134. value-format="yyyy-MM-dd"
  135. placeholder="选择日期"
  136. :picker-options="pickerOptionsS">
  137. </el-date-picker>
  138. -
  139. <el-date-picker
  140. v-model="conditionData.participantsDateE"
  141. type="date"
  142. clearable
  143. value-format="yyyy-MM-dd"
  144. style="width: 44%;"
  145. placeholder="选择日期"
  146. :picker-options="pickerOptionsE">
  147. </el-date-picker>
  148. </el-form-item>
  149. </el-form>
  150. <el-form v-if="lunboActiveIndex == 2" ref="conditionData" :model="conditionData" label-width="96px">
  151. <el-form-item class="formItemFull" label="年收入:" size="mini">
  152. <el-input v-model="conditionData.PIncomeS" style="width: 43%;"></el-input>
  153. &nbsp;-&nbsp;
  154. <el-input v-model="conditionData.PIncomeE" style="width: 43%;"></el-input>
  155. </el-form-item>
  156. </el-form>
  157. <el-form v-if="lunboActiveIndex == 3" ref="conditionData" :model="conditionData" label-width="96px">
  158. <el-form-item class="formItemFull" label="投保对象:" size="mini">
  159. <el-input v-model="conditionData.Insured"></el-input>
  160. </el-form-item>
  161. </el-form>
  162. <el-form v-if="lunboActiveIndex == 4" ref="conditionData" :model="conditionData" label-width="196px">
  163. <el-form-item class="formItemFull" label="理赔:" size="mini">
  164. <el-radio v-model="conditionData.lp" label="0">是</el-radio>
  165. <el-radio v-model="conditionData.lp" label="1">否</el-radio>
  166. </el-form-item>
  167. <el-form-item class="formItemFull" label="有效:" size="mini">
  168. <el-radio v-model="conditionData.yx" label="0">是</el-radio>
  169. <el-radio v-model="conditionData.yx" label="1">否</el-radio>
  170. </el-form-item>
  171. <el-form-item class="formItemFull" label="关注官微:" size="mini">
  172. <el-radio v-model="conditionData.gzgw" label="0">是</el-radio>
  173. <el-radio v-model="conditionData.gzgw" label="1">否</el-radio>
  174. </el-form-item>
  175. <el-form-item class="formItemFull" label="注册官微:" size="mini">
  176. <el-radio v-model="conditionData.zcgw" label="0">是</el-radio>
  177. <el-radio v-model="conditionData.zcgw" label="1">否</el-radio>
  178. </el-form-item>
  179. </el-form>
  180. </div>
  181. <!-- <div class="infoRight">-->
  182. <!-- <div v-if="lunboActiveIndex == 0">-->
  183. <!-- <div class="infoItem">-->
  184. <!-- <div class="infoItemTitle">基本信息</div>-->
  185. <!-- <el-row class="infoCon">-->
  186. <!-- <el-col :span="12">性别:{{conditionData.sex}}</el-col>-->
  187. <!-- <el-col :span="12">年龄:{{conditionData.age}}</el-col>-->
  188. <!-- </el-row>-->
  189. <!-- </div>-->
  190. <!-- <div class="infoItem">-->
  191. <!-- <div class="infoItemTitle">客户标签</div>-->
  192. <!-- <el-row class="infoCon">-->
  193. <!-- <el-col :span="12" v-for="(item,index) in conditionData.tag" :key="index">{{item}}</el-col>-->
  194. <!-- </el-row>-->
  195. <!-- </div>-->
  196. <!-- </div>-->
  197. <!-- <div v-else>-->
  198. <!-- </div>-->
  199. <!-- <div>-->
  200. <!-- <el-button class="searchBtn" type="primary" size="mini">查询</el-button>-->
  201. <!-- </div>-->
  202. <!-- </div>-->
  203. </div>
  204. </el-col>
  205. </el-row>
  206. <el-row class="ht50p" :gutter="20">
  207. <el-col class="ht100p" :span="7">
  208. <div class="cardDiv">
  209. <div class="cardTitle">险种类别</div>
  210. <bar-chart3
  211. id="barChart"
  212. :width="width"
  213. :height="height"
  214. :data="barChartData" />
  215. </div>
  216. </el-col>
  217. <el-col class="ht100p" :span="10">
  218. <div class="cardDiv">
  219. <div class="cardTitle">近10年有效客户数</div>
  220. <bar-chart
  221. id="barChartVistors"
  222. :width="width"
  223. :height="height"
  224. :data="barChartVistorsData" />
  225. </div>
  226. </el-col>
  227. <el-col class="ht100p" :span="7">
  228. <div class="cardDiv">
  229. <div class="cardTitle">拥有保单件数分布</div>
  230. <pie-chart
  231. id="pieChart"
  232. :width="width"
  233. :height="height"
  234. :data="pieChartData" />
  235. </div>
  236. </el-col>
  237. </el-row>
  238. </div>
  239. </div>
  240. </template>
  241. <script>
  242. import '../assets/styles/lunbo.css'
  243. import '../assets/js/empile.js'
  244. import BarTwoWayChart from './dashboard/BarTwoWayChart'
  245. import BarChart from './dashboard/BarChart2'
  246. import BarChart3 from './dashboard/BarChart3'
  247. import PieChart from './dashboard/PieChart2'
  248. import { ageSexDis, riskcode, bdNumDis } from "@/api/index";
  249. export default {
  250. name: "UserInfoDetails",
  251. components: {
  252. BarTwoWayChart,
  253. BarChart,
  254. BarChart3,
  255. PieChart
  256. },
  257. data() {
  258. return {
  259. loading: true,
  260. // 客户年龄段性别分布
  261. barTwoWayChartData:{
  262. yAxisName:'单位:万',
  263. legendData:[],
  264. xAxisData:[],
  265. seriesData:[]
  266. },
  267. // 险种类别
  268. barChartData:{
  269. yAxisNameL:'单位:万',
  270. yAxisNameR:'单位:元',
  271. color:['#028FF3','#F29700'],
  272. xAxisData:[],
  273. seriesData:[]
  274. },
  275. // 拥有保单件数分布
  276. pieChartData:{
  277. color:['#0084F1','#ED475B','#F39801','#00C7FF','rgb(242,158,194)','rgb(250,216,137)','rgb(127,229,154)','rgb(33,201,205)'],
  278. seriesData:[]
  279. },
  280. // 近10年有效客户数
  281. barChartVistorsData:{
  282. yAxisName:'数量:万个',
  283. color:['#048EF3','#7FE59A','#FAD889','#F29EC2'],
  284. xAxisData:['2011', '2012', '2013', '2014', '2015', '2016', '2017'],
  285. seriesData:[
  286. {
  287. name:'白银',
  288. stack: 'vistors',
  289. data: [79, 52, 200, 334, 390, 330, 220]
  290. },
  291. {
  292. name:'黄金',
  293. stack: 'vistors',
  294. data: [80, 52, 200, 334, 390, 330, 220]
  295. },
  296. {
  297. name:'白金',
  298. stack: 'vistors',
  299. data: [30, 52, 200, 334, 390, 330, 220]
  300. },
  301. {
  302. name:'钻石',
  303. stack: 'vistors',
  304. data: [30, 52, 200, 334, 390, 330, 220]
  305. },
  306. ]
  307. },
  308. width:'100%',
  309. height:'80%',
  310. lunboActiveIndex:'0',
  311. lunboData:[
  312. {
  313. iconSrc:require('../assets/image/productInfo.png'),
  314. name:'产品信息',
  315. },
  316. {
  317. iconSrc:require('../assets/image/baseInfo.png'),
  318. name:'基本信息',
  319. },
  320. {
  321. iconSrc:require('../assets/image/money.png'),
  322. name:'资产信息',
  323. },
  324. {
  325. iconSrc:require('../assets/image/guanlian.png'),
  326. name:'关联信息',
  327. },
  328. {
  329. iconSrc:require('../assets/image/tag.png'),
  330. name:'客户标签',
  331. },
  332. ],
  333. // 学历选项
  334. educationArr:[
  335. {
  336. value: '幼儿园',
  337. label: '幼儿园'
  338. },{
  339. value: '小学',
  340. label: '小学'
  341. },{
  342. value: '中专',
  343. label: '中专'
  344. },{
  345. value: '职高',
  346. label: '职高'
  347. },{
  348. value: '技校',
  349. label: '技校'
  350. },{
  351. value: '初中',
  352. label: '初中'
  353. },{
  354. value: '高中',
  355. label: '高中'
  356. },{
  357. value: '大专',
  358. label: '大专'
  359. },{
  360. value: '本科',
  361. label: '本科'
  362. },{
  363. value: '硕士及以上',
  364. label: '硕士及以上'
  365. },{
  366. value: '其他',
  367. label: '其他'
  368. }
  369. ],
  370. // 业绩归属选项
  371. policybelongArr:[
  372. {
  373. value: '00',
  374. label: '总部团险个单业务'
  375. },{
  376. value: '01',
  377. label: '上分团险个单业务'
  378. },{
  379. value: '02',
  380. label: '个险渠道'
  381. },{
  382. value: '03',
  383. label: '银保渠道'
  384. },{
  385. value: '05',
  386. label: '网销渠道'
  387. },{
  388. value: '06',
  389. label: '健康险事业部'
  390. }
  391. ],
  392. conditionData:{
  393. education:'',
  394. },
  395. pickerOptionsS: {
  396. disabledDate:(time)=> {
  397. if (this.conditionData.participantsDateE) {
  398. return time.getTime() > new Date(this.conditionData.participantsDateE).getTime()
  399. }
  400. }
  401. },
  402. pickerOptionsE: {
  403. disabledDate:(time)=> {
  404. if (this.conditionData.participantsDateS) {
  405. return time.getTime() < new Date(this.conditionData.participantsDateS).getTime() - 86400000
  406. }
  407. }
  408. },
  409. }
  410. },
  411. created() {
  412. },
  413. mounted() {
  414. this.lunboFn();
  415. this.getRiskcode();
  416. this.getAgeSexDis();
  417. this.getBdNumDis();
  418. },
  419. methods: {
  420. _$ (el) {
  421. try {
  422. var item = document.querySelectorAll(el);
  423. return item.length == 1 ? item[0] : item;
  424. } catch (err) {
  425. console.log(err)
  426. }
  427. },
  428. lunboFn(){
  429. var that = this;
  430. var empile1 = new Empile(that._$('.demo1>.container'), {
  431. waitForTransition: true,
  432. isClickSlide: true,
  433. on: {
  434. // 卡片切换时执行
  435. slideChange: function () {
  436. //设置'当前显示的是第[xxx]张'元素的文本内容
  437. // activeIndexEle.textContent = this.activeIndex + 1;
  438. that.lunboActiveIndex = this.activeIndex;
  439. }
  440. },
  441. css: function (coord, absCoord) {
  442. var zIndex = 100 - absCoord,
  443. opacity = Math.pow(.92, absCoord).toFixed(3),
  444. scale = 'scale(' + Math.pow(.9, absCoord).toFixed(2) + ')',
  445. translateX = 'translateX(' + 30 * coord + 'px)',
  446. translateZ = 'translateZ(' + '105px)',
  447. rotateY= 'rotateY('+ coord * 30 +'deg)';
  448. var transform = [translateX,rotateY,translateZ].join(' ');
  449. return {
  450. zIndex: zIndex,
  451. opacity: opacity,
  452. transform: transform,
  453. }
  454. },
  455. });
  456. },
  457. toUserInfoList(){
  458. var that = this;
  459. console.log(that.conditionData)
  460. // this.$router.push({ path:'/userInfoList',query:that.conditionData})
  461. this.$router.push({ name:'UserInfoList',params:that.conditionData},)
  462. },
  463. // 客户年龄段性别分布
  464. getAgeSexDis(){
  465. let that = this;
  466. ageSexDis().then(response => {
  467. console.log(response);
  468. response.data.seriesData.forEach((item,index) => {
  469. item.forEach((num,i) => {
  470. item[i] = ((num-0)/10000).toFixed(2);
  471. })
  472. })
  473. that.barTwoWayChartData.xAxisData = response.data.xaxisData;
  474. that.barTwoWayChartData.seriesData = response.data.seriesData;
  475. that.barTwoWayChartData.legendData = response.data.legendData;
  476. that.loading = false;
  477. }
  478. );
  479. },
  480. // 险种类别
  481. getRiskcode(){
  482. let that = this;
  483. riskcode().then(response => {
  484. console.log(response);
  485. response.data.seriesData.forEach((item,index) => {
  486. if(item.name == '客户数量'){
  487. item.data.forEach((num,i) => {
  488. item.data[i] = ((num-0)/10000).toFixed(2);
  489. })
  490. }
  491. })
  492. that.barChartData.xAxisData = response.data.xaxisData;
  493. that.barChartData.seriesData = response.data.seriesData;
  494. that.loading = false;
  495. }
  496. );
  497. },
  498. // 拥有保单件数分布
  499. getBdNumDis(){
  500. let that = this;
  501. bdNumDis().then(response => {
  502. console.log(response);
  503. that.pieChartData.seriesData = response.data.seriesData;
  504. this.loading = false;
  505. }
  506. );
  507. },
  508. }
  509. };
  510. </script>
  511. <style lang="scss" scoped>
  512. .conPanel{
  513. width: 97%;
  514. height: 96%;
  515. position: absolute;
  516. .cardDiv {
  517. height: 95%;
  518. position: relative;
  519. margin-top: 5px;
  520. background:#FFF;
  521. border-radius:3px;
  522. /*border: 1px solid #122E83;*/
  523. box-sizing: border-box;
  524. /*position:relative;*/
  525. /*&.cardBg{*/
  526. /* background: url("../assets/image/cardBg.png") no-repeat;*/
  527. /* background-size: 100% 100%;*/
  528. /* }*/
  529. /* &.cardBg2{*/
  530. /* background: url("../assets/image/cardBg2.png") no-repeat;*/
  531. /* background-size: 100% 100%;*/
  532. /* }*/
  533. /* &.cardBg3{*/
  534. /* background: url("../assets/image/cardBg3.png") no-repeat;*/
  535. /* background-size: 100% 100%;*/
  536. /* }*/
  537. .cardTitle {
  538. height: 32px;
  539. line-height: 32px;
  540. font-size: 14px;
  541. color: #164993;
  542. font-weight: bold;
  543. padding: 0 15px;
  544. box-sizing: border-box;
  545. background: #DCE4F7;
  546. }
  547. }
  548. }
  549. .ht100p{
  550. height: 100%;
  551. }
  552. .ht50p{
  553. height: 50%;
  554. }
  555. </style>
  556. <style lang="scss">
  557. .age{
  558. width: 40px !important;
  559. .el-input__inner{
  560. padding: 0 6px !important;
  561. }
  562. }
  563. </style>