Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

732 linhas
19 KiB

  1. <template>
  2. <div class="box-center">
  3. <!-- 头 -->
  4. <div class="app-titel">
  5. <div style="text-indent: 30px;">接待时间:</div>
  6. <div class="toptimeqhuan">
  7. <div :class="{ tophove: TimetoAhoose == 4 }" @click="tabtimetap(4)">
  8. 近7天
  9. </div>
  10. <div :class="{ tophove: TimetoAhoose == 5 }" @click="tabtimetap(5)">
  11. 近15天
  12. </div>
  13. <div :class="{ tophove: TimetoAhoose == 6 }" @click="tabtimetap(6)">
  14. 近30天
  15. </div>
  16. </div>
  17. <div style="margin-left: 26px">
  18. <el-date-picker
  19. v-model="customtime"
  20. @change="confirmtime()"
  21. type="daterange"
  22. :clearable='false'
  23. range-separator="-"
  24. :default-time="['00:00:00', '23:59:59']"
  25. value-format="yyyy-MM-dd"
  26. start-placeholder="开始日期"
  27. end-placeholder="结束日期"
  28. >
  29. </el-date-picker>
  30. </div>
  31. <el-select
  32. v-model="houseTypes"
  33. @change="sysChange"
  34. style="width: 100px; margin-left: 10px"
  35. placeholder="请选择"
  36. >
  37. <el-option
  38. v-for="item in options2"
  39. :key="item.value"
  40. :label="item.label"
  41. :value="item.value"
  42. >
  43. </el-option>
  44. </el-select>
  45. <div style="margin-left: auto;margin-right:10px;" v-if="sta_bui_downLoad">
  46. <el-button @click="downLoad">导出</el-button>
  47. </div>
  48. </div>
  49. <!-- 表格 -->
  50. <div class="cen-tab">
  51. <el-table
  52. :data="tableData"
  53. stripe
  54. style="width: 100%">
  55. <el-table-column
  56. prop="batchId"
  57. label="序号"
  58. align="center"
  59. >
  60. <template slot-scope="scope">
  61. <span v-if="scope.$index+1==tableData.length"> 合计/平均</span>
  62. <span v-else> {{scope.$index+1}}</span>
  63. </template>
  64. </el-table-column>
  65. <el-table-column
  66. prop="houseName"
  67. label="楼盘"
  68. align="center"
  69. >
  70. </el-table-column>
  71. <el-table-column
  72. prop="accountNum"
  73. label="顾问数"
  74. align="center">
  75. </el-table-column>
  76. <el-table-column
  77. prop="receptionCount"
  78. label="接待量"
  79. align="center">
  80. </el-table-column>
  81. <el-table-column
  82. prop="activeCustomer"
  83. label="有效接待"
  84. align="center"
  85. >
  86. </el-table-column>
  87. <el-table-column
  88. prop="prohibitedCustomer"
  89. label="违禁接待次数"
  90. align="center"
  91. >
  92. </el-table-column>
  93. <el-table-column
  94. prop="sumDuration"
  95. label="接待时长(分钟)"
  96. align="center"
  97. >
  98. <template slot-scope="scope">
  99. {{Math.floor(scope.row.sumDuration/60) || 0}}
  100. </template>
  101. </el-table-column>
  102. <el-table-column
  103. prop="fraction"
  104. label="平均执行率"
  105. align="center"
  106. >
  107. <template slot-scope="{row}">
  108. {{row.fraction}}%
  109. </template>
  110. </el-table-column>
  111. <el-table-column
  112. prop="prohibitedZb"
  113. label="违禁接待占比"
  114. align="center"
  115. >
  116. <template slot-scope="{row}">
  117. {{row.prohibitedZb}}%
  118. </template>
  119. </el-table-column>
  120. </el-table>
  121. <div style="display: flex;justify-content:flex-end;margin-top: 10px;">
  122. <el-pagination
  123. @size-change="handleSizeChange"
  124. @current-change="handleCurrentChange"
  125. :current-page="page"
  126. :page-sizes="[10, 30, 50]"
  127. :page-size="pagesize"
  128. layout="total, sizes, prev, pager, next, jumper"
  129. :total="total">
  130. </el-pagination>
  131. </div>
  132. </div>
  133. <div class="app-box-san">
  134. <div class="zuo">
  135. <div class="title">
  136. <div class="text1">接待量(TOP10)</div>
  137. </div>
  138. <div class="hejisan">
  139. <div class="sanbox1" style="width: 35%;">
  140. <div class="text1-1">接待合计</div>
  141. <div class="text1-2">{{objList1.sum}}次</div>
  142. </div>
  143. <div class="sanbox1" style="width: 40%;">
  144. <div class="text1-1">楼盘总数</div>
  145. <div class="text1-2">{{objList1.num}}个</div>
  146. </div>
  147. <div class="sanbox1" style="width: 25%;">
  148. <div class="text1-1">平均接待</div>
  149. <div class="text1-2">{{objList1.avg}}次</div>
  150. </div>
  151. </div>
  152. <div style="overflow-y:auto;height: 250px;width: 94%;margin: 0 auto;">
  153. <div class="jinbox" v-for="(item,i) in objList1.list" :key='i'>
  154. <div class="jinboxtit">{{item.name}}</div>
  155. <div class="jinbox-box">
  156. <div class="boxbaifenbi" :style="'width:'+(item.zxl1)+'%;'"></div>
  157. </div>
  158. <div class="jinboxbott">{{item.zxl}}</div>
  159. </div>
  160. </div>
  161. </div>
  162. <div class="you">
  163. <div class="title">
  164. <div class="text1">平均执行率(TOP10)</div>
  165. </div>
  166. <div class="hejisan">
  167. <div class="sanbox1" style="width: 50%;">
  168. <div class="text1-1">楼盘总数</div>
  169. <div class="text1-2">{{objList2.num}}个</div>
  170. </div>
  171. <div class="sanbox1" style="width: 50%;">
  172. <div class="text1-1">平均执行率</div>
  173. <div class="text1-2">{{objList2.avg}}%</div>
  174. </div>
  175. </div>
  176. <div style="overflow-y:auto;height: 250px;width: 94%;margin: 0 auto;">
  177. <div class="jinbox" v-for="(item,i) in objList2.list" :key='i'>
  178. <div class="jinboxtit">{{item.name}}</div>
  179. <div class="jinbox-box">
  180. <div class="boxbaifenbi" :style="'width:'+(item.zxl)+'%;'"></div>
  181. </div>
  182. <div class="jinboxbott">{{item.zxl}}%</div>
  183. </div>
  184. </div>
  185. </div>
  186. </div>
  187. <div class="app-box-san">
  188. <div class="zuo">
  189. <div class="title">
  190. <div class="text1">违禁接待次数(TOP10)</div>
  191. </div>
  192. <div class="hejisan">
  193. <div class="sanbox1" style="width: 35%;">
  194. <div class="text1-1">合计</div>
  195. <div class="text1-2">{{objList3.sum}}次</div>
  196. </div>
  197. <div class="sanbox1" style="width: 40%;">
  198. <div class="text1-1">顾问</div>
  199. <div class="text1-2">{{objList3.num}}个</div>
  200. </div>
  201. <div class="sanbox1" style="width: 25%;">
  202. <div class="text1-1">人均接待量</div>
  203. <div class="text1-2">{{objList3.avg}}次</div>
  204. </div>
  205. </div>
  206. <div style="overflow-y:auto;height: 250px;width: 94%;margin: 0 auto;">
  207. <div class="jinbox" v-for="(item,i) in objList3.list" :key='i'>
  208. <div class="jinboxtit">{{item.name}}</div>
  209. <div class="jinbox-box">
  210. <div class="boxbaifenbi" :style="'width:'+(item.zxl1)+'%;'"></div>
  211. </div>
  212. <div class="jinboxbott">{{item.zxl}}</div>
  213. </div>
  214. </div>
  215. </div>
  216. <div class="you">
  217. <div class="title">
  218. <div class="text1">接待时长(分钟)(TOP10)</div>
  219. </div>
  220. <div class="hejisan">
  221. <div class="sanbox1" style="width: 35%;">
  222. <div class="text1-1">时长合计</div>
  223. <div class="text1-2">{{objList4.sum}}分钟</div>
  224. </div>
  225. <div class="sanbox1" style="width: 40%;">
  226. <div class="text1-1">楼盘总数</div>
  227. <div class="text1-2">{{objList4.num}}个</div>
  228. </div>
  229. <div class="sanbox1" style="width: 25%;">
  230. <div class="text1-1">平均时长</div>
  231. <div class="text1-2">{{objList4.avg}}分钟</div>
  232. </div>
  233. </div>
  234. <div style="overflow-y:auto;height: 250px;width: 94%;margin: 0 auto;">
  235. <div class="jinbox" v-for="(item,i) in objList4.list" :key='i'>
  236. <div class="jinboxtit">{{item.name}}</div>
  237. <div class="jinbox-box">
  238. <div class="boxbaifenbi" :style="'width:'+(item.zxl1)+'%;'"></div>
  239. </div>
  240. <div class="jinboxbott">{{item.zxl}}</div>
  241. </div>
  242. </div>
  243. </div>
  244. </div>
  245. </div>
  246. </template>
  247. <script>
  248. import { mapGetters } from "vuex";
  249. import { exportMethodPost} from "@/util/util";
  250. export default {
  251. data() {
  252. return {
  253. role:'',
  254. houseId: "",
  255. orgCode:'',
  256. page:1,
  257. pagesize:10,
  258. buildingoptions:[],
  259. TimetoAhoose: 4,
  260. customtime: [],
  261. currentPage4:1,
  262. total:0,
  263. ceratelist:[
  264. {name:'还是得',avgZxl:80},
  265. {name:'大大奥德赛',avgZxl:90},
  266. {name:'沙发和',avgZxl:20},
  267. {name:'还是得',avgZxl:10},
  268. {name:'还客户家客户是得',avgZxl:80},
  269. ],
  270. tableData:[],
  271. objList1:{
  272. avg:'',
  273. list:[],
  274. num:'',
  275. sum:''
  276. },
  277. objList2:{
  278. avg:'',
  279. list:[],
  280. num:'',
  281. },
  282. objList3:{
  283. avg:'',
  284. list:[],
  285. num:'',
  286. sum:''
  287. },
  288. objList4:{
  289. avg:'',
  290. list:[],
  291. num:'',
  292. sum:''
  293. },
  294. houseTypes: "0,1",
  295. options2: [
  296. {
  297. label: "正式数据",
  298. value: "0,1",
  299. },
  300. {
  301. label: "测试数据",
  302. value: "2,3",
  303. },
  304. ],
  305. };
  306. },
  307. computed: {
  308. ...mapGetters(["permissions"]),
  309. },
  310. created() {
  311. this.sta_bui_downLoad = this.permissions["sta_bui_downLoad"];
  312. },
  313. mounted() {
  314. this.role=localStorage.getItem("orgType");
  315. this.houseId = localStorage.getItem("houseId");
  316. this.orgCode= localStorage.getItem("orgCode");
  317. this.gethouseData()
  318. },
  319. methods: {
  320. downLoad(){
  321. let pamaet={
  322. orgType:this.role,
  323. dateType:0,
  324. statDateStart:this.statDateStart,
  325. statDateEnd:this.statDateEnd,
  326. houseTypes: this.houseTypes,
  327. }
  328. if(this.role==3){
  329. pamaet.houseId=this.houseId
  330. }else{
  331. pamaet.orgCode=this.orgCode
  332. }
  333. if(this.TimetoAhoose==7){
  334. pamaet.dateType=null
  335. }else{
  336. pamaet.dateType=this.TimetoAhoose
  337. }
  338. exportMethodPost('autoSR/cusStageStatistics/houseTableExport','楼盘对比',pamaet)
  339. },
  340. sysChange() {
  341. this.gethouseData()
  342. },
  343. gethouseData(){
  344. this.houseTable()
  345. this.houseData1()
  346. this.houseData2()
  347. this.houseData3()
  348. this.houseData4()
  349. },
  350. houseData1(){
  351. let pamaet={
  352. orgType:this.role,
  353. dateType:0,
  354. statDateStart:this.statDateStart,
  355. statDateEnd:this.statDateEnd,
  356. type:1,
  357. houseTypes: this.houseTypes,
  358. }
  359. if(this.role==3){
  360. pamaet.houseId=this.houseId
  361. }else{
  362. pamaet.orgCode=this.orgCode
  363. }
  364. if(this.TimetoAhoose==7){
  365. pamaet.dateType=null
  366. }else{
  367. pamaet.dateType=this.TimetoAhoose
  368. }
  369. this.$api.http.houseData(pamaet).then((res) => {
  370. let arr=[]
  371. res.data.list.map(item=>{
  372. let obj={}
  373. obj.name=item.houseName
  374. obj.zxl=item.activeCustomer
  375. arr.push(obj)
  376. })
  377. arr=this.dealData(arr)
  378. this.objList1={
  379. avg: res.data.avg || 0,
  380. num: res.data.num || 0,
  381. sum:res.data.sum || 0,
  382. list:arr || []
  383. }
  384. })
  385. },
  386. houseData2(){
  387. let pamaet={
  388. orgType:this.role,
  389. dateType:0,
  390. statDateStart:this.statDateStart,
  391. statDateEnd:this.statDateEnd,
  392. type:2,
  393. houseTypes: this.houseTypes,
  394. }
  395. if(this.role==3){
  396. pamaet.houseId=this.houseId
  397. }else{
  398. pamaet.orgCode=this.orgCode
  399. }
  400. if(this.TimetoAhoose==7){
  401. pamaet.dateType=null
  402. }else{
  403. pamaet.dateType=this.TimetoAhoose
  404. }
  405. this.$api.http.houseData(pamaet).then((res) => {
  406. let arr=[]
  407. res.data.list.map(item=>{
  408. let obj={}
  409. obj.name=item.houseName;
  410. obj.zxl=item.fraction;
  411. arr.push(obj)
  412. })
  413. this.objList2={
  414. avg: res.data.avg || 0,
  415. num: res.data.num || 0,
  416. list:arr || []
  417. }
  418. })
  419. },
  420. houseData3(){
  421. let pamaet={
  422. orgType:this.role,
  423. dateType:0,
  424. statDateStart:this.statDateStart,
  425. statDateEnd:this.statDateEnd,
  426. type:3,
  427. houseTypes: this.houseTypes,
  428. }
  429. if(this.role==3){
  430. pamaet.houseId=this.houseId
  431. }else{
  432. pamaet.orgCode=this.orgCode
  433. }
  434. if(this.TimetoAhoose==7){
  435. pamaet.dateType=null
  436. }else{
  437. pamaet.dateType=this.TimetoAhoose
  438. }
  439. this.$api.http.houseData(pamaet).then((res) => {
  440. console.log(res)
  441. let arr=[]
  442. res.data.list.map(item=>{
  443. let obj={}
  444. obj.name=item.houseName
  445. obj.zxl=item.prohibitedCustomer
  446. arr.push(obj)
  447. })
  448. console.log(arr)
  449. arr=this.dealData(arr)
  450. this.objList3={
  451. avg: res.data.avg || 0,
  452. num: res.data.num || 0,
  453. sum:res.data.sum || 0,
  454. list:arr || []
  455. }
  456. console.log(this.objList3)
  457. })
  458. },
  459. houseData4(){
  460. let pamaet={
  461. orgType:this.role,
  462. dateType:0,
  463. statDateStart:this.statDateStart,
  464. statDateEnd:this.statDateEnd,
  465. type:4,
  466. houseTypes: this.houseTypes,
  467. }
  468. if(this.role==3){
  469. pamaet.houseId=this.houseId
  470. }else{
  471. pamaet.orgCode=this.orgCode
  472. }
  473. if(this.TimetoAhoose==7){
  474. pamaet.dateType=null
  475. }else{
  476. pamaet.dateType=this.TimetoAhoose
  477. }
  478. this.$api.http.houseData(pamaet).then((res) => {
  479. let arr=[]
  480. res.data.list.map(item=>{
  481. let obj={}
  482. obj.name=item.houseName;
  483. obj.zxl=Math.floor(item.sumDuration/60) || 0;
  484. arr.push(obj)
  485. })
  486. arr=this.dealData(arr)
  487. this.objList4={
  488. avg: Math.floor(res.data.avg/60) || 0,
  489. num: res.data.num || 0,
  490. sum:Math.floor(res.data.sum/60) || 0,
  491. list:arr || []
  492. }
  493. })
  494. },
  495. houseTable(){
  496. let pamaet={
  497. orgType:this.role,
  498. dateType:0,
  499. statDateStart:this.statDateStart,
  500. statDateEnd:this.statDateEnd,
  501. current:this.page,
  502. size:this.pagesize,
  503. houseTypes: this.houseTypes,
  504. }
  505. if(this.role==3){
  506. pamaet.houseId=this.houseId
  507. }else{
  508. pamaet.orgCode=this.orgCode
  509. }
  510. if(this.TimetoAhoose==7){
  511. pamaet.dateType=null
  512. }else{
  513. pamaet.dateType=this.TimetoAhoose
  514. }
  515. this.$api.http.houseTable(pamaet).then((res) => {
  516. this.tableData=res.data.records || [];
  517. this.total=res.data.total || 0;
  518. })
  519. },
  520. handleSizeChange(val) {
  521. this.pagesize=val;
  522. this.houseTable()
  523. },
  524. handleCurrentChange(val) {
  525. this.page=val;
  526. this.houseTable()
  527. },
  528. confirmtime(){
  529. this.TimetoAhoose=7
  530. this.statDateStart=this.customtime[0];
  531. this.statDateEnd=this.customtime[1];
  532. this.page=1;
  533. this.gethouseData()
  534. },
  535. //切换时间
  536. tabtimetap(index) {
  537. this.TimetoAhoose = index;
  538. this.statDateStart='';
  539. this.statDateEnd='';
  540. this.page=1;
  541. this.gethouseData()
  542. },
  543. dealData(arr){
  544. let num=Math.max.apply(Math, arr.map(function (o) { return o.zxl })) //结果:3
  545. arr.map(item=>{
  546. item.zxl1=Math.floor(item.zxl/num*100) || 0;
  547. })
  548. return arr
  549. },
  550. },
  551. };
  552. </script>
  553. <style scoped="scoped" lang="scss" >
  554. .box-center {
  555. width: 100%;
  556. padding: 15px;
  557. min-width: 1000px;
  558. padding-bottom: 100px;
  559. }
  560. .cen-tab{
  561. width: 100%;
  562. padding: 15px;
  563. background: #FFFFFF;
  564. margin-top: 15px;
  565. }
  566. .tophove {
  567. color: #ffffff;
  568. background: #2671e2;
  569. }
  570. .app-titel {
  571. width: 100%;
  572. height: 70px;
  573. background: #ffffff;
  574. box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.04);
  575. border-radius: 4px;
  576. display: flex;
  577. align-items: center;
  578. .titel-text {
  579. height: 100%;
  580. font-size: 18px;
  581. font-weight: 600;
  582. color: #32363d;
  583. line-height: 70px;
  584. margin-left: 30px;
  585. }
  586. .toptimeqhuan {
  587. width: 190px;
  588. height: 32px;
  589. background: #ffffff;
  590. border-radius: 4px;
  591. border: 1px solid #e0e0e0;
  592. display: flex;
  593. align-items: center;
  594. overflow: hidden;
  595. margin-left: 20px;
  596. cursor: pointer;
  597. }
  598. .toptimeqhuan div {
  599. flex: 1;
  600. text-align: center;
  601. line-height: 32px;
  602. font-size: 16px;
  603. }
  604. }
  605. .app-box-san{
  606. width: 100%;
  607. height: 400px;
  608. display: flex;
  609. margin-top: 15px;
  610. .zuo{
  611. flex: 1;
  612. height: 100%;
  613. margin-right: 15px;
  614. background: #FFFFFF;
  615. border-radius: 4px;
  616. .title{
  617. width: 100%;
  618. height: 55px;
  619. border-bottom: 1px solid #E0E0E0;
  620. display: flex;
  621. align-content: center;
  622. .text1{
  623. flex: 2;
  624. line-height: 55px;
  625. text-indent: 20px;
  626. font-weight: 500;
  627. font-size: 16px;
  628. color: #333333;
  629. }
  630. .text2{
  631. flex: 1;
  632. height: 55px;
  633. display: flex;
  634. align-items: center;
  635. }
  636. }
  637. }
  638. .you{
  639. height: 100%;
  640. flex: 1;
  641. background: #FFFFFF;
  642. border-radius: 4px;
  643. .title{
  644. width: 100%;
  645. height: 55px;
  646. border-bottom: 1px solid #E0E0E0;
  647. display: flex;
  648. align-content: center;
  649. .text1{
  650. flex: 2;
  651. line-height: 55px;
  652. text-indent: 20px;
  653. font-weight: 500;
  654. font-size: 16px;
  655. color: #333333;
  656. }
  657. .text2{
  658. flex: 1;
  659. height: 55px;
  660. display: flex;
  661. align-items: center;
  662. }
  663. }
  664. }
  665. }
  666. .hejisan{
  667. width: 92%;
  668. margin: 0 auto;
  669. display: flex;
  670. padding-top: 10px;
  671. padding-bottom:10px;
  672. .text1-1{
  673. color: #666666;
  674. }
  675. .text1-2{
  676. color: #333333;
  677. margin-top: 10px;
  678. }
  679. }
  680. // 进度条
  681. .jinbox {
  682. width: 100%;
  683. height: 18px;
  684. line-height: 18px;
  685. display: flex;
  686. font-size: 16px;
  687. color: #2C3542;
  688. margin-top: 10px;
  689. .jinboxtit {
  690. width: 14%;
  691. height: 18px;
  692. padding-right: 6px;
  693. white-space: nowrap;
  694. text-overflow:ellipsis;
  695. overflow: hidden;
  696. }
  697. .jinbox-box {
  698. width: 75%;
  699. height: 100%;
  700. border-radius: 8px;
  701. background: #F2F2F2;
  702. }
  703. .boxbaifenbi {
  704. height: 100%;
  705. background:#60D7A0;
  706. border-radius: 8px;
  707. }
  708. .boxbaifenbi2 {
  709. height: 100%;
  710. background: #5B8FF9;
  711. }
  712. .jinboxbott {
  713. width: 16%;
  714. text-indent: 16px;
  715. }
  716. }
  717. </style>