選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

weekReport.vue 20 KiB

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