You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1018 regels
22 KiB

  1. <template>
  2. <view class="pages">
  3. <!-- 日报内容部分 -->
  4. <view class="container">
  5. <!-- 头部日报卡 -->
  6. <view class="c-head-card">
  7. <view class="c-title-text">
  8. {{ projectName || '' }}数智工牌周报
  9. </view>
  10. <text class="date">{{ getTimeLine(weekObj.createTime) }}</text>
  11. <view class="creative-time">
  12. 生成时间:{{ weekObj.createTime || '--' }}
  13. </view>
  14. </view>
  15. </view>
  16. <!-- 简报 -->
  17. <view class="briefing">
  18. <view class="briefing-title">
  19. 简报
  20. </view>
  21. <!-- 简报表格部分 -->
  22. <view class="briefing-box">
  23. <block v-for="(data, index) in numlist" :key="index">
  24. <view class="briefing-box-item">
  25. <view class="tops">
  26. {{ data.name }}
  27. </view>
  28. <view class="middle">
  29. {{ data.num || 0 }}
  30. </view>
  31. <view class="bottom">
  32. 对比上周: {{ data.preNum || 0 }}
  33. <text class="b-text"
  34. :class="{up: data.percent > 0, down: data.percent < 0}">{{ data.percent || '0' }}</text>
  35. <template v-if="data.percent != 0">
  36. <text style="margin-left: 8rpx;font-size: 34rpx;font-weight: bold;" :class="{up: data.percent > 0, down: data.percent < 0}">{{ data.percent > 0 ? '↑' : '↓' }}</text>
  37. </template>
  38. </view>
  39. </view>
  40. </block>
  41. </view>
  42. </view>
  43. <!-- 销讲场景执行排名 -->
  44. <view class="execution-ranking">
  45. <view class="execution-ranking-title">
  46. 销讲场景执行排名
  47. </view>
  48. <template v-if="isShowXJTop1List">
  49. <view class="execution-ranking-desc">
  50. <text>销讲场景平均执行对比上周</text>
  51. <text>{{ rankTop('fractionPKName') }}</text>
  52. <text>{{ rankTop('fractionPK') }}</text>
  53. <text>%,其中【{{ rankTop('fractionBastName') }}】最强为</text>
  54. <text class="up">{{ rankTop('fractionBastValue') }}</text>
  55. <text>%,【{{ rankTop('fractionLastName') }}】执行最弱为</text>
  56. <text class="down">{{ rankTop('fractionLastValue') }}</text>
  57. <text>%;</text>
  58. </view>
  59. <!-- 排名百分比列表 -->
  60. <view class="ranking-box">
  61. <block v-for="(percent, index) in weekObj.XJTop1List" :key="index">
  62. <view class="ranking-item">
  63. <view class="left">{{ percent.title }}</view>
  64. <view class="middle">
  65. <u-line-progress :active-color="$options.filters.setColor(percent.value)" inactive-color="#F2F2F2" :show-percent="false"
  66. :percent="percent.value"></u-line-progress>
  67. </view>
  68. <view class="right"> {{ percent.value || '0' }} %</view>
  69. </view>
  70. </block>
  71. </view>
  72. </template>
  73. <template v-else>
  74. <view class="empity">
  75. 暂无数据
  76. </view>
  77. </template>
  78. </view>
  79. <!-- 接待统计 -->
  80. <view class="statistics">
  81. <view class="statistics-title">
  82. 接待统计
  83. </view>
  84. <template v-if="rankTop('ranktype')&&rankTop('people')&&weekObj.customerInfo1">
  85. <view class="statistics-desc">
  86. <text>
  87. 顾问平均执行率对比上周
  88. </text>
  89. <text>
  90. {{ rankTop('ranktype') || '' }}
  91. </text>
  92. <text :class="[rankTop('class')]">{{ rankTop('people') || '' }}</text>
  93. <text class="">
  94. 人,其中{{ rankTop('topName') || '' }}上升
  95. </text>
  96. <text class="up">{{ rankTop('topPk') || '' }}</text>
  97. <text class="">
  98. %为最高,{{ rankTop('lastName') || '' }}下降
  99. </text>
  100. <text class="down">{{ rankTop('lastPk') || '' }}</text>
  101. <text class="">
  102. %降幅最大。
  103. </text>
  104. </view>
  105. <view class="table">
  106. <view class="thead">
  107. <block v-for="(head, headIndex) in tableHead" :key="headIndex">
  108. <view class="thead-item" :style="[head.style]">
  109. {{ head.title }}
  110. </view>
  111. </block>
  112. </view>
  113. <view class="tbody">
  114. <block v-for="(data, index) in weekObj.customerInfo1" :key="index">
  115. <view class="tbody-item">
  116. <view class="tbody-items name">{{ data.name }}</view>
  117. <view class="tbody-items nums">{{ data.receptionCount }}</view>
  118. <view class="tbody-items time">{{ data.avgDuration }}m</view>
  119. <view class="tbody-items percent">{{ data.fraction }}%</view>
  120. <view class="tbody-items week" :class="{up: data.pk > 0, down: data.pk < 0}">
  121. {{ data.pk > 0 ? `+${data.pk}` : data.pk }}%
  122. </view>
  123. </view>
  124. </block>
  125. </view>
  126. </view>
  127. </template>
  128. <template v-else>
  129. <view class="empity">
  130. 暂无数据
  131. </view>
  132. </template>
  133. </view>
  134. <!-- 顾问排名 -->
  135. <view class="guwen-ranking">
  136. <view class="guwen-ranking-title">
  137. 顾问销讲执行率排名(TOP10)
  138. </view>
  139. <template v-if="isShowZXLTopList">
  140. <!-- 排名百分比列表 -->
  141. <view class="ranking-box">
  142. <block v-for="(percent, index) in weekObj.ZXLTopList" :key="index">
  143. <view class="ranking-item">
  144. <view class="left">{{ percent.title }}</view>
  145. <view class="middle">
  146. <u-line-progress :active-color="$options.filters.setColor(percent.value)" inactive-color="#F2F2F2" :show-percent="false"
  147. :percent="percent.value">
  148. </u-line-progress>
  149. </view>
  150. <view class="right"> {{ percent.value || '0' }} %</view>
  151. </view>
  152. </block>
  153. </view>
  154. </template>
  155. <template v-else>
  156. <view class="empity">
  157. 暂无数据
  158. </view>
  159. </template>
  160. </view>
  161. <!-- 顾问排名 -->
  162. <view class="guwen-ranking">
  163. <view class="guwen-ranking-title">
  164. 顾问接待量排名(TOP10)
  165. </view>
  166. <template v-if="isShowJDLTopList">
  167. <!-- 排名百分比列表 -->
  168. <view class="ranking-box">
  169. <block v-for="(percent, index) in weekObj.JDLTopList" :key="index">
  170. <view class="ranking-item">
  171. <view class="left">{{ percent.title }}</view>
  172. <view class="middle">
  173. <u-line-progress :active-color="$options.filters.setColor(percent.value)" inactive-color="#F2F2F2" :show-percent="false"
  174. :percent="percent.value">
  175. </u-line-progress>
  176. </view>
  177. <view class="right"> {{ percent.value || '0' }} %</view>
  178. </view>
  179. </block>
  180. </view>
  181. </template>
  182. <template v-else>
  183. <view class="empity">
  184. 暂无数据
  185. </view>
  186. </template>
  187. </view>
  188. <!-- 使用建议 -->
  189. <view class="proposal" v-if="false">
  190. <view class="proposal-title">
  191. 使用建议
  192. </view>
  193. <!-- 建议的文字 -->
  194. <view class="proposal-box">
  195. <block v-for="(data, index) in 3" :key="index">
  196. <view class="proposal-item">
  197. <view class="lside">
  198. {{ index+1 }}
  199. </view>
  200. <view class="rside">
  201. <view class="rside-title">
  202. 执行率整体较低;
  203. </view>
  204. <view class="rside-box">
  205. <view class="reason">
  206. 原因:整体平均执率低
  207. </view>
  208. <view class="advice">
  209. 建议: 1、精简话术(关键词、指标点);
  210. 2、对顾问进行话术培训。
  211. </view>
  212. </view>
  213. </view>
  214. </view>
  215. </block>
  216. </view>
  217. </view>
  218. <!-- 底部按钮 -->
  219. <view class="nav-footer">
  220. <view class="footer-item full">
  221. <button open-type="share" class="fulls">
  222. 分享给好友
  223. </button>
  224. </view>
  225. </view>
  226. </view>
  227. </template>
  228. <script>
  229. export default {
  230. data() {
  231. return {
  232. tableHead: [{
  233. title: '顾问',
  234. style: {
  235. flex: 1
  236. }
  237. },
  238. {
  239. title: '接待量',
  240. style: {
  241. flex: 1
  242. }
  243. },
  244. {
  245. title: '平均接待时长',
  246. style: {
  247. flex: 2
  248. }
  249. },
  250. {
  251. title: '平均执行率',
  252. style: {
  253. flex: 2
  254. }
  255. },
  256. {
  257. title: '对比上周',
  258. style: {
  259. flex: 1.5
  260. }
  261. },
  262. ],
  263. id: '', // id
  264. needList: ['JDLTop', 'ZXLTop', 'XJTop1'], // 需要转换数组的内容
  265. // 简报
  266. numlist: [{
  267. name: '接待量 (次)',
  268. num: '',
  269. setName: 'receptionCount1',
  270. percent: '',
  271. percentName: 'receptionCountPK',
  272. preNum: '', // 上周数量
  273. preNumName: 'receptionCount2', //
  274. }, {
  275. name: '有效接待 (次)',
  276. num: '',
  277. setName: 'activeCustomer1',
  278. percent: '',
  279. percentName: 'activeCustomerPK',
  280. preNum: '', // 上周数量
  281. preNumName: 'activeCustomer2', //
  282. },
  283. {
  284. name: '平均执行率(%)',
  285. num: '',
  286. setName: 'fraction1',
  287. percent: '',
  288. percentName: 'fractionPK',
  289. preNum: '', // 上周数量
  290. preNumName: 'fraction2', //
  291. },
  292. {
  293. name: '平均接待时长(分)',
  294. num: '',
  295. setName: 'avgDuration1',
  296. percent: '',
  297. percentName: 'avgDurationPK',
  298. preNum: '', // 上周数量
  299. preNumName: 'avgDuration2', //
  300. },
  301. {
  302. name: '违禁接待 (次)',
  303. num: '',
  304. setName: 'prohibitedNum1',
  305. percent: '',
  306. percentName: 'prohibitedNumPK',
  307. preNum: '', // 上周数量
  308. preNumName: 'prohibitedNum2', //
  309. },
  310. {
  311. name: '客户画像触达 (次)',
  312. num: '',
  313. setName: 'reachSum1',
  314. percent: '',
  315. percentName: 'reachSumPK',
  316. preNum: '', // 上周数量
  317. preNumName: 'reachSum2', //
  318. },
  319. {
  320. name: '已标记',
  321. num: '',
  322. setName: 'labelledReceptionNum1',
  323. percent: '',
  324. percentName: 'labelledReceptionNumPK',
  325. preNum: '', // 上周数量
  326. preNumName: 'labelledReceptionNum2', //
  327. },
  328. {
  329. name: '未标记',
  330. num: '',
  331. setName: 'unlabelledReceptionNum1',
  332. percent: '',
  333. percentName: 'unlabelledReceptionNumPK',
  334. preNum: '', // 上周数量
  335. preNumName: 'unlabelledReceptionNum2', //
  336. },
  337. ],
  338. // 周报详情
  339. weekObj: {},
  340. projectName: '', // 项目名称
  341. }
  342. },
  343. computed: {
  344. // 排名最高与最低
  345. rankTop() {
  346. return name => {
  347. let obj = {}
  348. try {
  349. if (this.weekObj.customerInfo1.length && this.weekObj.customerInfo2.length) {
  350. obj.ranktype = (this.weekObj.customerInfo1.length - this.weekObj.customerInfo2.length) > 0 ? '上升' : '下降'
  351. obj.people = Math.abs(this.weekObj.customerInfo1.length - this.weekObj.customerInfo2.length)
  352. }
  353. if (this.weekObj.customerInfo1 && this.weekObj.customerInfo1.length > 0) {
  354. obj.topName = this.weekObj.customerInfo1[0].name
  355. obj.topPk = Math.abs(this.weekObj.customerInfo1[0].pk)
  356. obj.lastName = this.weekObj.customerInfo1[this.weekObj.customerInfo1.length-1].name,
  357. obj.lastPk = Math.abs(this.weekObj.customerInfo1[this.weekObj.customerInfo1.length-1].pk)
  358. }
  359. if (this.weekObj.customerInfo1.length && this.weekObj.customerInfo2.length) {
  360. obj.class = (this.weekObj.customerInfo1.length - this.weekObj.customerInfo2.length) > 0 ? 'up' : 'down'
  361. }
  362. if (this.weekObj.fractionPK) {
  363. obj.fractionPKName = this.weekObj.fractionPK > 0 ? '上涨' : '下跌'
  364. obj.fractionPK = Math.abs(this.weekObj.fractionPK)
  365. }
  366. if (this.weekObj.XJTop1List && this.weekObj.XJTop1List.length > 0) {
  367. obj.fractionBastName = this.weekObj.XJTop1List[0].title
  368. obj.fractionBastValue = this.weekObj.XJTop1List[0].value
  369. }
  370. if (this.weekObj.XJTop1List && this.weekObj.XJTop1List.length > 0) {
  371. obj.fractionLastName = this.weekObj.XJTop1List[this.weekObj.XJTop1List.length-1].title
  372. obj.fractionLastValue = this.weekObj.XJTop1List[this.weekObj.XJTop1List.length-1].value
  373. }
  374. return obj[name] || ''
  375. } catch(e) {
  376. console.log(e)
  377. return ''
  378. }
  379. }
  380. },
  381. isShowXJTop1List () {
  382. return this.weekObj.XJTop1List && this.weekObj.XJTop1List.length
  383. },
  384. isShowZXLTopList() {
  385. return this.weekObj.ZXLTopList && this.weekObj.ZXLTopList.length > 0
  386. },
  387. isShowJDLTopList() {
  388. return this.weekObj.JDLTopList && this.weekObj.JDLTopList.length > 0
  389. },
  390. },
  391. onLoad(option) {
  392. if (option.id) this.id = option.id
  393. this.getMessage()
  394. },
  395. onShareAppMessage() {
  396. return {
  397. title: `${this.projectName}数智工牌周报`,
  398. type: 2,
  399. path: `/pages/mine/reportExcel/weekRepor?id=${this.id}`
  400. }
  401. },
  402. methods: {
  403. // 获取周报详情
  404. getMessage() {
  405. this.$u.get('/zkMessage/findByProjectId', {
  406. id: this.id
  407. }).then(res => {
  408. console.log(res)
  409. let data = JSON.parse(res.zkMessage.content)
  410. console.log(data)
  411. this.bubbleSort(data.customerInfo1, 'pk')
  412. this.bubbleSort(data.customerInfo2, 'pk')
  413. data.customerInfo1.reverse()
  414. data.customerInfo2.reverse()
  415. this.weekObj = {
  416. ...res.zkMessage,
  417. ...data
  418. }
  419. this.weekObj.createTimeName = this.getTimeLine(this.weekObj.createTime, 1)
  420. console.log(this.weekObj, 'this.weekObj')
  421. this.projectName = res.projectName
  422. this.numlist.forEach(item => {
  423. if (data[item.setName]) {
  424. item.num = data[item.setName]
  425. }
  426. if (data[item.percentName]) {
  427. item.percent = data[item.percentName]
  428. }
  429. if (data[item.preNumName]) {
  430. item.preNum = data[item.preNumName]
  431. }
  432. })
  433. this.init()
  434. }).catch(e => {
  435. console.log(e)
  436. })
  437. },
  438. // 把对象转成数组并在后续的步骤方便处理
  439. init() {
  440. console.log(this.weekObj, 'this.weekObj')
  441. this.needList.forEach(item => {
  442. if (this.weekObj[item] && Object.keys(this.weekObj[item]).length > 0) {
  443. this.weekObj[item + 'List'] = [] // 销讲执行
  444. for (let i in this.weekObj[item]) {
  445. this.weekObj[item + 'List'].push({
  446. title: i,
  447. value: this.weekObj[item][i]
  448. })
  449. }
  450. }
  451. })
  452. this.sortInitArr()
  453. },
  454. // 排序对象转换后的数组
  455. sortInitArr() {
  456. this.needList.forEach(item => {
  457. if (this.weekObj[item + 'List']) {
  458. this.bubbleSort(this.weekObj[item + 'List'])
  459. }
  460. })
  461. this.reverseList()
  462. },
  463. // 反转数组
  464. reverseList() {
  465. this.needList.forEach(item => {
  466. if (this.weekObj[item + 'List']) {
  467. this.weekObj[item + 'List'].reverse()
  468. }
  469. })
  470. console.log(this.weekObj, '12312312312')
  471. },
  472. // 冒泡排序
  473. bubbleSort(arr, keys = 'value') {
  474. for (let i = 0; i < arr.length - 1; i += 1) {
  475. //通过 arr.length 次把第一位放到最后,完成排序
  476. //-i是因为最后的位置是会动态改变的,当完成一次后,最后一位会变成倒数第二位
  477. for (let j = 0; j < arr.length - 1 - i; j += 1) {
  478. if (arr[j][keys] > arr[j + 1][keys]) {
  479. const temp = arr[j];
  480. arr[j] = arr[j + 1];
  481. arr[j + 1] = temp;
  482. }
  483. }
  484. }
  485. },
  486. // 转换时间
  487. getTimeLine(date, type = 1) {
  488. let resu = '--'
  489. if (!date) return resu
  490. let time = new Date(date)
  491. time.setDate(time.getDate() - 7)
  492. let arr = date.split(' ')
  493. let str = arr[0]
  494. let result = str.split('-')
  495. let m = (time.getMonth() + 1) < 10 ? `0${time.getMonth() + 1}` : (time.getMonth() + 1)
  496. let d = time.getDate() < 10 ? `0${time.getDate()}` : time.getDate()
  497. if (type == 1) {
  498. resu = `${m}.${d}-${result[1]}.${result[2]}`
  499. } else {
  500. resu = `${m}月${d}日~${result[1]}月${result[2]}日`
  501. }
  502. return resu
  503. },
  504. },
  505. filters: {
  506. // 时间格式转换
  507. fomatDate(date) {
  508. if (!date) return '--'
  509. let arr = date.split(' ')
  510. let str = arr[0]
  511. let result = str.split('-')
  512. return `${result[1]}-${result[2]}`
  513. },
  514. // 转换时间
  515. getTimeLine(date, type = 1) {
  516. if (!date) return '--'
  517. let time = new Date(date)
  518. time.setDate(time.getDate() - 7)
  519. let arr = date.split(' ')
  520. let str = arr[0]
  521. let result = str.split('-')
  522. let m = (time.getMonth() + 1) < 10 ? `0${time.getMonth() + 1}` : (time.getMonth() + 1)
  523. let d = time.getDate() < 10 ? `0${time.getDate()}` : time.getDate()
  524. if (type == 1) {
  525. return `${m}.${d}-${result[1]}.${result[2]}`
  526. } else {
  527. return `${m}月${d}日~${result[1]}月${result[2]}日`
  528. }
  529. },
  530. // 设置颜色
  531. setColor(value) {
  532. let color = ''
  533. switch(true) {
  534. case 0 <= value && value <= 70 :
  535. color = '#4FC78F';
  536. break;
  537. case 70 < value && value <= 80 :
  538. color = '#FFCC00';
  539. break;
  540. case 80 < value && value <= 90 :
  541. color = '#FF8C13';
  542. break;
  543. case 90 < value && value <= 100 :
  544. color = '#E7483C';
  545. break;
  546. }
  547. return color
  548. },
  549. }
  550. }
  551. </script>
  552. <style lang="scss" scoped>
  553. .pages {
  554. width: 100vw;
  555. min-height: 100vh;
  556. display: flex;
  557. flex-direction: column;
  558. background: #F8F8F8;
  559. .nav-header {
  560. flex-shrink: 0;
  561. }
  562. .container {
  563. padding: 30rpx 30rpx 0;
  564. display: flex;
  565. flex-direction: column;
  566. background: #fff;
  567. .c-head-card {
  568. padding: 30rpx;
  569. width: 100%;
  570. min-height: 252rpx;
  571. border: 2rpx solid #000000;
  572. border-radius: 12rpx;
  573. box-shadow: 10rpx 10rpx #2671E2;
  574. display: flex;
  575. flex-direction: column;
  576. .c-title-text {
  577. // position: relative;
  578. flex-grow: 1;
  579. font-size: 48rpx;
  580. font-weight: bold;
  581. color: #303030;
  582. }
  583. .date {
  584. // position: absolute;
  585. // right: 0;
  586. // bottom: 6rpx;
  587. font-size: 30rpx;
  588. color: #303030;
  589. }
  590. .creative-time {
  591. margin: 20rpx 0 0 0;
  592. flex-shrink: 0;
  593. }
  594. }
  595. }
  596. .briefing {
  597. margin: 40rpx 0 0 0;
  598. background: #fff;
  599. .briefing-title {
  600. padding: 0 30rpx;
  601. height: 90rpx;
  602. display: flex;
  603. align-items: center;
  604. border: 1rpx solid #E0E0E0;
  605. font-size: 32rpx;
  606. font-weight: bold;
  607. }
  608. .briefing-box {
  609. width: 100%;
  610. display: flex;
  611. flex-wrap: wrap;
  612. .briefing-box-item {
  613. padding: 20rpx 30rpx;
  614. width: 50%;
  615. height: 186rpx;
  616. border: 1px solid #E0E0E0;
  617. border-left: none;
  618. border-top: none;
  619. &:nth-of-type(2n) {
  620. border-right: none;
  621. }
  622. .top {
  623. font-size: 28rpx;
  624. }
  625. .middle {
  626. margin: 14rpx 0 12rpx;
  627. font-size: 32rpx;
  628. font-weight: 600;
  629. color: #333333;
  630. }
  631. .bottom {
  632. font-size: 26rpx;
  633. color: #666666;
  634. .b-text {
  635. margin-left: 20rpx;
  636. &.down {
  637. color: #43CD80;
  638. font-size: 34rpx;
  639. }
  640. &.up {
  641. font-size: 34rpx;
  642. color: #E7483C;
  643. }
  644. }
  645. }
  646. }
  647. }
  648. }
  649. .execution-ranking {
  650. margin: 20rpx 0 0 0;
  651. padding: 30rpx;
  652. background: #fff;
  653. .execution-ranking-title {
  654. font-size: 32rpx;
  655. font-weight: bold;
  656. }
  657. .execution-ranking-desc {
  658. margin-top: 20rpx;
  659. font-size: 30rpx;
  660. }
  661. .ranking-box {
  662. margin: 30rpx 0 0 0;
  663. .ranking-item {
  664. margin-bottom: 18rpx;
  665. display: flex;
  666. &:nth-last-of-type(1) {
  667. margin-bottom: 0;
  668. }
  669. .left {
  670. flex-shrink: 0;
  671. width: 140rpx;
  672. font-size: 30rpx;
  673. overflow: hidden;
  674. text-overflow: ellipsis;
  675. white-space: nowrap;
  676. }
  677. .middle {
  678. flex-grow: 1;
  679. }
  680. .right {
  681. flex-shrink: 0;
  682. width: 118rpx;
  683. font-size: 30rpx;
  684. text-align: center;
  685. }
  686. }
  687. }
  688. }
  689. .statistics {
  690. margin: 20rpx 0 0 0;
  691. background: #fff;
  692. .statistics-title {
  693. padding: 30rpx 30rpx 0;
  694. width: 100%;
  695. font-size: 32rpx;
  696. font-weight: bold;
  697. }
  698. .statistics-desc {
  699. padding: 0 30rpx;
  700. margin-top: 20rpx;
  701. }
  702. .table {
  703. margin: 30rpx 0 0 0;
  704. .thead {
  705. padding: 0 30rpx;
  706. width: 100%;
  707. height: 72rpx;
  708. display: flex;
  709. align-items: center;
  710. border: 1rpx solid #E0E0E0;
  711. border-left: none;
  712. border-right: none;
  713. font-size: 26rpx;
  714. .thead-item {
  715. text-align: center;
  716. }
  717. }
  718. .tbody {
  719. .tbody-item {
  720. padding: 0 30rpx;
  721. display: flex;
  722. align-items: center;
  723. height: 72rpx;
  724. background: #FAFCFF;
  725. &:nth-of-type(2n) {
  726. background: #FFFFFF;
  727. }
  728. .tbody-items {
  729. flex: 1;
  730. display: flex;
  731. justify-content: center;
  732. }
  733. .name {
  734. justify-content: flex-start;
  735. overflow: hidden;
  736. text-overflow: ellipsis;
  737. white-space: nowrap;
  738. }
  739. .time {
  740. flex: 2;
  741. }
  742. .percent {
  743. flex: 2;
  744. }
  745. .week {
  746. flex: 1.5;
  747. }
  748. }
  749. }
  750. .tbottom {
  751. width: 100%;
  752. height: 72rpx;
  753. display: flex;
  754. justify-content: center;
  755. align-items: center;
  756. font-size: 30rpx;
  757. color: #2671E2;
  758. background: #FAFCFF;
  759. }
  760. }
  761. }
  762. .guwen-ranking {
  763. margin: 20rpx 0 0 0;
  764. width: 100%;
  765. padding: 30rpx;
  766. background: #fff;
  767. .guwen-ranking-title {
  768. font-size: 32rpx;
  769. font-weight: 500;
  770. }
  771. .guwen-ranking-desc {
  772. margin-top: 20rpx;
  773. font-size: 30rpx;
  774. }
  775. .ranking-box {
  776. margin: 30rpx 0 0 0;
  777. .ranking-item {
  778. margin-bottom: 18rpx;
  779. display: flex;
  780. &:nth-last-of-type(1) {
  781. margin-bottom: 0;
  782. }
  783. .left {
  784. flex-shrink: 0;
  785. width: 140rpx;
  786. font-size: 30rpx;
  787. overflow: hidden;
  788. text-overflow: ellipsis;
  789. white-space: nowrap;
  790. }
  791. .middle {
  792. flex-grow: 1;
  793. }
  794. .right {
  795. flex-shrink: 0;
  796. width: 118rpx;
  797. font-size: 30rpx;
  798. text-align: center;
  799. }
  800. }
  801. }
  802. }
  803. .proposal {
  804. margin: 20rpx 0 0 0;
  805. padding: 30rpx;
  806. background: #fff;
  807. .proposal-title {
  808. font-size: 32rpx;
  809. font-weight: 500;
  810. }
  811. .proposal-box {
  812. margin: 30rpx 0 0 0;
  813. .proposal-item {
  814. margin: 20rpx 0 0 0;
  815. display: flex;
  816. .lside {
  817. flex-shrink: 0;
  818. margin: 0 12rpx 0 0;
  819. width: 44rpx;
  820. height: 44rpx;
  821. border-radius: 50%;
  822. background: #2671E2;
  823. text-align: center;
  824. line-height: 44rpx;
  825. color: #fff;
  826. }
  827. .rside {
  828. .rside-title {
  829. font-size: 32rpx;
  830. }
  831. .rside-box {
  832. margin: 16rpx 0 0 0;
  833. }
  834. }
  835. }
  836. }
  837. }
  838. .nav-footer {
  839. position: sticky;
  840. bottom: 32rpx;
  841. margin: 32rpx 0;
  842. width: 100%;
  843. display: flex;
  844. justify-content: center;
  845. .footer-item {
  846. width: 686rpx;
  847. height: 88rpx;
  848. display: flex;
  849. justify-content: center;
  850. align-items: center;
  851. color: #2671E2;
  852. border: 2rpx solid #2671E2;
  853. border-radius: 8rpx;
  854. overflow: hidden;
  855. font-size: 32rpx;
  856. &.full {
  857. background: #2671E2;
  858. color: #fff;
  859. .fulls {
  860. width: 100%;
  861. height: 100%;
  862. background: transparent;
  863. color: #fff;
  864. }
  865. }
  866. }
  867. }
  868. .up {
  869. color: #E6273A;
  870. }
  871. .down {
  872. color: #43CD80;
  873. }
  874. .empity {
  875. width: 100%;
  876. height: 300rpx;
  877. display: flex;
  878. justify-content: center;
  879. align-items: center;
  880. font-size: 28rpx;
  881. color: #666666;
  882. }
  883. }
  884. </style>