您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

1016 行
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 || '--' }}</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" style="margin-left: 22rpx;">
  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. path: `/pages/mine/reportExcel/weekRepor?id=${this.id}`
  399. }
  400. },
  401. methods: {
  402. // 获取周报详情
  403. getMessage() {
  404. this.$u.get('/zkMessage/findByProjectId', {
  405. id: this.id
  406. }).then(res => {
  407. console.log(res)
  408. let data = JSON.parse(res.zkMessage.content)
  409. console.log(data)
  410. this.bubbleSort(data.customerInfo1, 'pk')
  411. this.bubbleSort(data.customerInfo2, 'pk')
  412. data.customerInfo1.reverse()
  413. data.customerInfo2.reverse()
  414. this.weekObj = {
  415. ...res.zkMessage,
  416. ...data
  417. }
  418. this.weekObj.createTimeName = this.getTimeLine(this.weekObj.createTime, 1)
  419. console.log(this.weekObj, 'this.weekObj')
  420. this.projectName = res.projectName
  421. this.numlist.forEach(item => {
  422. if (data[item.setName]) {
  423. item.num = data[item.setName]
  424. }
  425. if (data[item.percentName]) {
  426. item.percent = data[item.percentName]
  427. }
  428. if (data[item.preNumName]) {
  429. item.preNum = data[item.preNumName]
  430. }
  431. })
  432. this.init()
  433. }).catch(e => {
  434. console.log(e)
  435. })
  436. },
  437. // 把对象转成数组并在后续的步骤方便处理
  438. init() {
  439. console.log(this.weekObj, 'this.weekObj')
  440. this.needList.forEach(item => {
  441. if (this.weekObj[item] && Object.keys(this.weekObj[item]).length > 0) {
  442. this.weekObj[item + 'List'] = [] // 销讲执行
  443. for (let i in this.weekObj[item]) {
  444. this.weekObj[item + 'List'].push({
  445. title: i,
  446. value: this.weekObj[item][i]
  447. })
  448. }
  449. }
  450. })
  451. this.sortInitArr()
  452. },
  453. // 排序对象转换后的数组
  454. sortInitArr() {
  455. this.needList.forEach(item => {
  456. if (this.weekObj[item + 'List']) {
  457. this.bubbleSort(this.weekObj[item + 'List'])
  458. }
  459. })
  460. this.reverseList()
  461. },
  462. // 反转数组
  463. reverseList() {
  464. this.needList.forEach(item => {
  465. if (this.weekObj[item + 'List']) {
  466. this.weekObj[item + 'List'].reverse()
  467. }
  468. })
  469. console.log(this.weekObj, '12312312312')
  470. },
  471. // 冒泡排序
  472. bubbleSort(arr, keys = 'value') {
  473. for (let i = 0; i < arr.length - 1; i += 1) {
  474. //通过 arr.length 次把第一位放到最后,完成排序
  475. //-i是因为最后的位置是会动态改变的,当完成一次后,最后一位会变成倒数第二位
  476. for (let j = 0; j < arr.length - 1 - i; j += 1) {
  477. if (arr[j][keys] > arr[j + 1][keys]) {
  478. const temp = arr[j];
  479. arr[j] = arr[j + 1];
  480. arr[j + 1] = temp;
  481. }
  482. }
  483. }
  484. },
  485. // 转换时间
  486. getTimeLine(date, type = 1) {
  487. let resu = '--'
  488. if (!date) return resu
  489. let time = new Date(date)
  490. time.setDate(time.getDate() - 7)
  491. let arr = date.split(' ')
  492. let str = arr[0]
  493. let result = str.split('-')
  494. let m = (time.getMonth() + 1) < 10 ? `0${time.getMonth() + 1}` : (time.getMonth() + 1)
  495. let d = time.getDate() < 10 ? `0${time.getDate()}` : time.getDate()
  496. if (type == 1) {
  497. resu = `${m}.${d}-${result[1]}.${result[2]}`
  498. } else {
  499. resu = `${m}月${d}日~${result[1]}月${result[2]}日`
  500. }
  501. return resu
  502. },
  503. },
  504. filters: {
  505. // 时间格式转换
  506. fomatDate(date) {
  507. if (!date) return '--'
  508. let arr = date.split(' ')
  509. let str = arr[0]
  510. let result = str.split('-')
  511. return `${result[1]}-${result[2]}`
  512. },
  513. // 转换时间
  514. getTimeLine(date, type = 1) {
  515. if (!date) return '--'
  516. let time = new Date(date)
  517. time.setDate(time.getDate() - 7)
  518. let arr = date.split(' ')
  519. let str = arr[0]
  520. let result = str.split('-')
  521. let m = (time.getMonth() + 1) < 10 ? `0${time.getMonth() + 1}` : (time.getMonth() + 1)
  522. let d = time.getDate() < 10 ? `0${time.getDate()}` : time.getDate()
  523. if (type == 1) {
  524. return `${m}.${d}-${result[1]}.${result[2]}`
  525. } else {
  526. return `${m}月${d}日~${result[1]}月${result[2]}日`
  527. }
  528. },
  529. // 设置颜色
  530. setColor(value) {
  531. let color = ''
  532. switch(true) {
  533. case 0 <= value && value <= 70 :
  534. color = '#4FC78F';
  535. break;
  536. case 70 < value && value <= 80 :
  537. color = '#FFCC00';
  538. break;
  539. case 80 < value && value <= 90 :
  540. color = '#FF8C13';
  541. break;
  542. case 90 < value && value <= 100 :
  543. color = '#E7483C';
  544. break;
  545. }
  546. return color
  547. },
  548. }
  549. }
  550. </script>
  551. <style lang="scss" scoped>
  552. .pages {
  553. width: 100vw;
  554. min-height: 100vh;
  555. display: flex;
  556. flex-direction: column;
  557. background: #F8F8F8;
  558. .nav-header {
  559. flex-shrink: 0;
  560. }
  561. .container {
  562. padding: 30rpx 30rpx 0;
  563. display: flex;
  564. flex-direction: column;
  565. background: #fff;
  566. .c-head-card {
  567. padding: 30rpx;
  568. width: 100%;
  569. min-height: 252rpx;
  570. border: 2rpx solid #000000;
  571. border-radius: 12rpx;
  572. box-shadow: 10rpx 10rpx #2671E2;
  573. display: flex;
  574. flex-direction: column;
  575. .c-title-text {
  576. // position: relative;
  577. flex-grow: 1;
  578. font-size: 48rpx;
  579. font-weight: bold;
  580. color: #303030;
  581. }
  582. .date {
  583. // position: absolute;
  584. // right: 0;
  585. // bottom: 6rpx;
  586. font-size: 30rpx;
  587. color: #303030;
  588. }
  589. .creative-time {
  590. margin: 20rpx 0 0 0;
  591. flex-shrink: 0;
  592. }
  593. }
  594. }
  595. .briefing {
  596. margin: 40rpx 0 0 0;
  597. .briefing-title {
  598. padding: 0 30rpx;
  599. height: 90rpx;
  600. display: flex;
  601. align-items: center;
  602. border: 1rpx solid #E0E0E0;
  603. font-size: 32rpx;
  604. font-weight: bold;
  605. }
  606. .briefing-box {
  607. width: 100%;
  608. display: flex;
  609. flex-wrap: wrap;
  610. .briefing-box-item {
  611. padding: 20rpx 30rpx;
  612. width: 50%;
  613. height: 186rpx;
  614. border: 1px solid #E0E0E0;
  615. border-left: none;
  616. border-top: none;
  617. &:nth-of-type(2n) {
  618. border-right: none;
  619. }
  620. .top {
  621. font-size: 28rpx;
  622. }
  623. .middle {
  624. margin: 14rpx 0 12rpx;
  625. font-size: 32rpx;
  626. font-weight: 600;
  627. color: #333333;
  628. }
  629. .bottom {
  630. font-size: 26rpx;
  631. color: #666666;
  632. .b-text {
  633. margin-left: 20rpx;
  634. &.down {
  635. color: #43CD80;
  636. font-size: 34rpx;
  637. }
  638. &.up {
  639. font-size: 34rpx;
  640. color: #E7483C;
  641. }
  642. }
  643. }
  644. }
  645. }
  646. }
  647. .execution-ranking {
  648. margin: 20rpx 0 0 0;
  649. padding: 30rpx;
  650. background: #fff;
  651. .execution-ranking-title {
  652. font-size: 32rpx;
  653. font-weight: bold;
  654. }
  655. .execution-ranking-desc {
  656. margin-top: 20rpx;
  657. font-size: 30rpx;
  658. }
  659. .ranking-box {
  660. margin: 30rpx 0 0 0;
  661. .ranking-item {
  662. margin-bottom: 18rpx;
  663. display: flex;
  664. &:nth-last-of-type(1) {
  665. margin-bottom: 0;
  666. }
  667. .left {
  668. flex-shrink: 0;
  669. width: 140rpx;
  670. font-size: 30rpx;
  671. overflow: hidden;
  672. text-overflow: ellipsis;
  673. white-space: nowrap;
  674. }
  675. .middle {
  676. flex-grow: 1;
  677. }
  678. .right {
  679. flex-shrink: 0;
  680. width: 118rpx;
  681. font-size: 30rpx;
  682. text-align: center;
  683. }
  684. }
  685. }
  686. }
  687. .statistics {
  688. margin: 20rpx 0 0 0;
  689. background: #fff;
  690. .statistics-title {
  691. padding: 30rpx 30rpx 0;
  692. width: 100%;
  693. font-size: 32rpx;
  694. font-weight: bold;
  695. }
  696. .statistics-desc {
  697. padding: 0 30rpx;
  698. margin-top: 20rpx;
  699. }
  700. .table {
  701. margin: 30rpx 0 0 0;
  702. .thead {
  703. padding: 0 30rpx;
  704. width: 100%;
  705. height: 72rpx;
  706. display: flex;
  707. align-items: center;
  708. border: 1rpx solid #E0E0E0;
  709. border-left: none;
  710. border-right: none;
  711. font-size: 26rpx;
  712. .thead-item {
  713. text-align: center;
  714. }
  715. }
  716. .tbody {
  717. .tbody-item {
  718. padding: 0 30rpx;
  719. display: flex;
  720. align-items: center;
  721. height: 72rpx;
  722. background: #FAFCFF;
  723. &:nth-of-type(2n) {
  724. background: #FFFFFF;
  725. }
  726. .tbody-items {
  727. flex: 1;
  728. display: flex;
  729. justify-content: center;
  730. }
  731. .name {
  732. justify-content: flex-start;
  733. overflow: hidden;
  734. text-overflow: ellipsis;
  735. white-space: nowrap;
  736. }
  737. .time {
  738. flex: 2;
  739. }
  740. .percent {
  741. flex: 2;
  742. }
  743. .week {
  744. flex: 1.5;
  745. }
  746. }
  747. }
  748. .tbottom {
  749. width: 100%;
  750. height: 72rpx;
  751. display: flex;
  752. justify-content: center;
  753. align-items: center;
  754. font-size: 30rpx;
  755. color: #2671E2;
  756. background: #FAFCFF;
  757. }
  758. }
  759. }
  760. .guwen-ranking {
  761. margin: 20rpx 0 0 0;
  762. width: 100%;
  763. padding: 30rpx;
  764. background: #fff;
  765. .guwen-ranking-title {
  766. font-size: 32rpx;
  767. font-weight: 500;
  768. }
  769. .guwen-ranking-desc {
  770. margin-top: 20rpx;
  771. font-size: 30rpx;
  772. }
  773. .ranking-box {
  774. margin: 30rpx 0 0 0;
  775. .ranking-item {
  776. margin-bottom: 18rpx;
  777. display: flex;
  778. &:nth-last-of-type(1) {
  779. margin-bottom: 0;
  780. }
  781. .left {
  782. flex-shrink: 0;
  783. width: 140rpx;
  784. font-size: 30rpx;
  785. overflow: hidden;
  786. text-overflow: ellipsis;
  787. white-space: nowrap;
  788. }
  789. .middle {
  790. flex-grow: 1;
  791. }
  792. .right {
  793. flex-shrink: 0;
  794. width: 118rpx;
  795. font-size: 30rpx;
  796. text-align: center;
  797. }
  798. }
  799. }
  800. }
  801. .proposal {
  802. margin: 20rpx 0 0 0;
  803. padding: 30rpx;
  804. background: #fff;
  805. .proposal-title {
  806. font-size: 32rpx;
  807. font-weight: 500;
  808. }
  809. .proposal-box {
  810. margin: 30rpx 0 0 0;
  811. .proposal-item {
  812. margin: 20rpx 0 0 0;
  813. display: flex;
  814. .lside {
  815. flex-shrink: 0;
  816. margin: 0 12rpx 0 0;
  817. width: 44rpx;
  818. height: 44rpx;
  819. border-radius: 50%;
  820. background: #2671E2;
  821. text-align: center;
  822. line-height: 44rpx;
  823. color: #fff;
  824. }
  825. .rside {
  826. .rside-title {
  827. font-size: 32rpx;
  828. }
  829. .rside-box {
  830. margin: 16rpx 0 0 0;
  831. }
  832. }
  833. }
  834. }
  835. }
  836. .nav-footer {
  837. position: sticky;
  838. bottom: 32rpx;
  839. margin: 32rpx 0;
  840. width: 100%;
  841. display: flex;
  842. justify-content: center;
  843. .footer-item {
  844. width: 686rpx;
  845. height: 88rpx;
  846. display: flex;
  847. justify-content: center;
  848. align-items: center;
  849. color: #2671E2;
  850. border: 2rpx solid #2671E2;
  851. border-radius: 8rpx;
  852. overflow: hidden;
  853. font-size: 32rpx;
  854. &.full {
  855. background: #2671E2;
  856. color: #fff;
  857. .fulls {
  858. width: 100%;
  859. height: 100%;
  860. background: transparent;
  861. color: #fff;
  862. }
  863. }
  864. }
  865. }
  866. .up {
  867. color: #E6273A;
  868. }
  869. .down {
  870. color: #43CD80;
  871. }
  872. .empity {
  873. width: 100%;
  874. height: 300rpx;
  875. display: flex;
  876. justify-content: center;
  877. align-items: center;
  878. font-size: 28rpx;
  879. color: #666666;
  880. }
  881. }
  882. </style>