overseasCustomRoadshow.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. <template>
  2. <div class="overseas-custom-roadshow-box">
  3. <div class="tab-box">
  4. <el-button type="primary" :plain="roadshowTab==1?false:true" class="tab-item" @click="tabChange(1)">客户维度</el-button>
  5. <el-button type="primary" :plain="roadshowTab==2?false:true" class="tab-item" @click="tabChange(2)">销售维度</el-button>
  6. <el-button type="primary" :plain="roadshowTab==3?false:true" class="tab-item" @click="tabChange(3)">研究员维度</el-button>
  7. </div>
  8. <template v-if="roadshowTab==1">
  9. <div class="top-wrapper">
  10. <div class="left-select">
  11. <el-cascader
  12. v-model="sales"
  13. :options="salesOptions"
  14. :show-all-levels="false"
  15. :props="{
  16. expandTrigger: 'hover',
  17. children: 'ChildrenList',
  18. emitPath: false,
  19. label:'RealName',
  20. value:'AdminId',
  21. multiple:true
  22. }"
  23. collapse-tags
  24. filterable
  25. clearable
  26. placeholder="请选择销售"
  27. @change="pageChange(1)"
  28. />
  29. <el-cascader
  30. v-model="researchers"
  31. :options="researchersOptions"
  32. :show-all-levels="false"
  33. :props="{
  34. expandTrigger: 'hover',
  35. children: 'ResearcherList',
  36. emitPath: false,
  37. label:'RealName',
  38. value:'AdminId',
  39. multiple:true
  40. }"
  41. collapse-tags
  42. filterable
  43. clearable
  44. placeholder="请选择研究员"
  45. @change="pageChange(1)"
  46. />
  47. <el-select
  48. v-model="status"
  49. placeholder="请选择客户状态"
  50. @change="pageChange(1)"
  51. multiple
  52. collapse-tags
  53. clearable
  54. >
  55. <el-option
  56. v-for="item in statusOptions"
  57. :key="item.val"
  58. :label="item.label"
  59. :value="item.val"
  60. />
  61. </el-select>
  62. <date-picker
  63. v-model="date"
  64. type="date"
  65. range
  66. value-type="format"
  67. placeholder="请选择路演日期"
  68. @change="pageChange(1)"
  69. style="width:200px;margin-right:10px;margin-bottom:8px;"
  70. />
  71. </div>
  72. <el-input
  73. prefix-icon="el-icon-search"
  74. placeholder="客户名称"
  75. style="width:317px;" clearable
  76. v-model="searchWord"
  77. @input="pageChange(1)"
  78. />
  79. </div>
  80. <div class="cont-wrapper">
  81. <el-table
  82. ref="tableRef"
  83. :data="tableData"
  84. :loading="tabeLoading"
  85. border
  86. @sort-change="handleSortChange"
  87. >
  88. <el-table-column
  89. align="center"
  90. v-for="item in columns" :key="item.key"
  91. :prop="item.key" :label="item.label"
  92. :min-width="item.minWidth"
  93. :sortable="item.sortable?'custom':false"
  94. >
  95. <template slot-scope="{row}">
  96. <!-- 客户名称 -->
  97. <div v-if="item.key==='CompanyName'" class="editor" @click="toCustomDetail(row)">{{row[item.key]}}</div>
  98. <span v-else>{{row[item.key]}}</span>
  99. </template>
  100. </el-table-column>
  101. </el-table>
  102. <!-- 页数选择器 -->
  103. <m-page
  104. :page_no="currentIndex"
  105. :pageSize="pageSize"
  106. :total="total"
  107. style="position: absolute;right: 50px;bottom: 50px;"
  108. @handleCurrentChange="pageChange"
  109. />
  110. </div>
  111. </template>
  112. <template v-else-if="roadshowTab==2">
  113. <ul class="date-tab-box">
  114. <li :class="['date-tab-item',{'act':tab === salesDimension.dateTab}]" v-for="tab in staticTabs" :key="tab" @click="changeTabHandle(tab)">
  115. {{tab}}
  116. </li>
  117. <date-picker
  118. v-model="salesDimension.selectDate"
  119. type="date"
  120. range
  121. value-type="format"
  122. :clearable="false"
  123. @change="dateChange"
  124. placeholder="请选择统计时间"/>
  125. </ul>
  126. <div class="table-body-wrapper" v-show="dataLoading">
  127. <table>
  128. <thead>
  129. <tr>
  130. <td rowspan="2" class="thead-rs" style="width: 100px;">销售</td>
  131. <td
  132. :colspan="['周度统计表','月度统计表'].includes(salesDimension.dateTab) ? 3 : 1"
  133. v-for="item in salesDimension.tableTheadColumns"
  134. :key="item"
  135. class="head-column"
  136. >
  137. {{item}}
  138. </td>
  139. </tr>
  140. <tr v-if="['月度统计表','周度统计表'].includes(salesDimension.dateTab)">
  141. <template v-for="(item,index) in new Array(6)">
  142. <td :key="index+'_0'">试用</td>
  143. <td :key="index+'_1'">正式</td>
  144. <td :key="index+'_2'">关闭</td>
  145. </template>
  146. </tr>
  147. </thead>
  148. <tbody>
  149. <tr v-for="item in salesDimension.datalist" :key="item.AdminId">
  150. <td class="thead-rs">{{item.Name}}</td>
  151. <td class="data-cell" v-for="(data,data_key) in item.dataArr" :key="data_key" @click="openDiaHandle(data)">
  152. {{ data.value !== 0 ? data.value : '' }}
  153. </td>
  154. </tr>
  155. </tbody>
  156. <tfoot>
  157. <tr>
  158. <td>合计</td>
  159. <td v-for="(total_data,total_data_key) in salesDimension.totalGroupArr" :key="total_data_key"
  160. class="data-cell" @click="openDiaHandle(total_data)">
  161. {{ total_data.value !== 0 ? total_data.value : '' }}
  162. </td>
  163. </tr>
  164. </tfoot>
  165. </table>
  166. </div>
  167. </template>
  168. <template v-if="roadshowTab==3">
  169. <ul class="date-tab-box">
  170. <li :class="['date-tab-item',{'act':tab === researchersDimension.dateTab}]" v-for="tab in staticTabs" :key="tab" @click="changeTabHandle(tab)">
  171. {{tab}}
  172. </li>
  173. <date-picker
  174. v-model="researchersDimension.selectDate"
  175. type="date"
  176. range
  177. value-type="format"
  178. :clearable="false"
  179. @change="dateChange"
  180. placeholder="请选择统计时间"/>
  181. </ul>
  182. <div class="table-body-wrapper" v-show="dataLoading">
  183. <table>
  184. <thead>
  185. <tr>
  186. <td rowspan="2" class="thead-rs" style="width: 100px;">研究员</td>
  187. <td
  188. :colspan="['周度统计表','月度统计表'].includes(researchersDimension.dateTab) ? 3 : 1"
  189. v-for="item in researchersDimension.tableTheadColumns"
  190. :key="item"
  191. class="head-column"
  192. >
  193. {{item}}
  194. </td>
  195. </tr>
  196. <tr v-if="['月度统计表'].includes(researchersDimension.dateTab)">
  197. <template v-for="(item,index) in new Array(4)">
  198. <td :key="index+'_0'">试用</td>
  199. <td :key="index+'_1'">正式</td>
  200. <td :key="index+'_2'">关闭</td>
  201. </template>
  202. </tr>
  203. <tr v-if="['周度统计表'].includes(researchersDimension.dateTab)">
  204. <template v-for="(item,index) in new Array(3)">
  205. <td :key="index+'_0'">试用</td>
  206. <td :key="index+'_1'">正式</td>
  207. <td :key="index+'_2'">关闭</td>
  208. </template>
  209. </tr>
  210. </thead>
  211. <tbody>
  212. <tr v-for="item in researchersDimension.datalist" :key="item.AdminId">
  213. <td class="thead-rs">{{item.Name}}</td>
  214. <td class="data-cell" v-for="(data,data_key) in item.dataArr" :key="data_key" @click="openDiaHandle(data)">
  215. {{ data.value !== 0 ? data.value : '' }}
  216. </td>
  217. </tr>
  218. </tbody>
  219. <tfoot>
  220. <tr>
  221. <td>合计</td>
  222. <td v-for="(total_data,total_data_key) in researchersDimension.totalGroupArr" :key="total_data_key"
  223. class="data-cell" @click="openDiaHandle(total_data)">
  224. {{ total_data.value !== 0 ? total_data.value : '' }}
  225. </td>
  226. </tr>
  227. </tfoot>
  228. </table>
  229. </div>
  230. </template>
  231. <!-- 详情弹窗 -->
  232. <actiyityDetailDia
  233. :isShow.sync="isShowDia"
  234. :title="diaTitle"
  235. :form="dialogForm"
  236. :fromType="roadshowTab==2?'seller':'researcher'"
  237. region="oversea"
  238. />
  239. </div>
  240. </template>
  241. <script>
  242. import { overseasCustomInterence } from '@/api/modules/overseasCustom.js'
  243. import mPage from '@/components/mPage.vue'
  244. import actiyityDetailDia from '@/views/roadshow_manage/compononts/activityDetailDia';
  245. export default {
  246. components: { mPage,actiyityDetailDia },
  247. data() {
  248. return {
  249. tabeLoading: false,
  250. tableData: [],
  251. total: 0,
  252. currentIndex: 1,
  253. pageSize: 10,
  254. columns: [
  255. { label: "客户名称",key: 'CompanyName',minWidth:200 },
  256. { label: "状态",key: 'CompanyStatus' },
  257. { label: "路演日期",key: 'StartDate',sortable:true },
  258. { label: "路演形式",key: 'RoadshowType' },
  259. { label: "路演平台/路演城市",key: 'RoadshowPlatform' },
  260. { label: "研究员",key: 'ResearcherName' },
  261. { label: "对接销售",key: 'SellerName' },
  262. ],
  263. sales: [],
  264. researchers: [],
  265. date:[],
  266. searchWord: '',
  267. status:[],
  268. sortParams: {
  269. SortField: '',
  270. SortDesc: 1,
  271. },
  272. salesOptions: [],
  273. researchersOptions: [],
  274. statusOptions: [
  275. { label: '正式', val: '正式' },
  276. { label: '试用', val: '试用' },
  277. { label: '关闭', val: '关闭' },
  278. ],
  279. roadshowTab:1,
  280. staticTabs: [ '周度统计表','月度统计表','近1个月','近3个月','近6个月' ],
  281. dataLoading:false,
  282. // 销售维度
  283. salesDimension:{
  284. dateTab:"周度统计表",
  285. selectDate:"",
  286. tableTheadColumns:[],
  287. datalist:[],//表格数据
  288. totalGroupArr:[] //合计数据
  289. },
  290. // 研究员维度
  291. researchersDimension:{
  292. dateTab:"周度统计表",
  293. selectDate:"",
  294. tableTheadColumns:[],
  295. datalist:[],//表格数据
  296. totalGroupArr:[] //合计数据
  297. },
  298. // 详情弹窗
  299. isShowDia:false,
  300. diaTitle:'路演详情',
  301. dialogForm:{}
  302. }
  303. },
  304. mounted(){
  305. this.getSellerList()
  306. this.getResearchersList()
  307. this.getTableData()
  308. },
  309. methods:{
  310. //获取销售列表
  311. async getSellerList() {
  312. const res = await overseasCustomInterence.getOverseasRoadShowUsers({AdminType:'seller'})
  313. if (res.Ret === 200) {
  314. this.salesOptions = res.Data || [];
  315. }
  316. },
  317. //获取研究员列表
  318. async getResearchersList() {
  319. // 发送请求
  320. const res = await overseasCustomInterence.getOverseasRoadShowUsers({AdminType:'researcher'});
  321. if (res.Ret === 200) {
  322. this.researchersOptions = res.Data || [];
  323. }
  324. },
  325. async getTableData() {
  326. this.tabeLoading = true;
  327. let params = {
  328. ResearcherId: this.researchers.join(','),
  329. SellerId: this.sales.join(','),
  330. StartDate: this.date[0]||'',
  331. EndDate: this.date[1]||'',
  332. CompanyStatus: this.status.join(','),
  333. CurrentIndex: this.currentIndex,
  334. PageSize: this.pageSize,
  335. Keyword: this.searchWord,
  336. ...this.sortParams
  337. }
  338. const res = await overseasCustomInterence.getOverseasRoadShowList(params)
  339. this.tabeLoading = false;
  340. if(res.Ret!==200) return
  341. this.tableData = res.Data.List || [];
  342. this.total = res.Data.Paging.Totals;
  343. },
  344. handleSortChange({prop,order}) {
  345. console.log(prop,order)
  346. this.sortParams = {
  347. SortField: order?prop:'',
  348. SortDesc: order==='ascending'?2:1
  349. }
  350. this.pageChange(1)
  351. },
  352. pageChange(page) {
  353. this.currentIndex = page;
  354. this.getTableData()
  355. },
  356. toCustomDetail(data) {
  357. const path = data.Source===1?'/detailCustomEn':'/customDetail'
  358. const query = {
  359. ...data.Source===1?{
  360. companyId:data.CompanyId - 10000000
  361. }:{
  362. id:data.CompanyId
  363. },
  364. from:'overseas'
  365. }
  366. const href = this.$router.resolve({path,query}).href
  367. window.open(href,"_blank")
  368. },
  369. /* 切换筛选 */
  370. changeSelectOpts() {
  371. },
  372. tabChange(tab){
  373. if(this.roadshowTab==tab) return
  374. this.roadshowTab=tab
  375. this.changeTabHandle('周度统计表')
  376. },
  377. /* 获取几周前 周一周日日期 或前几月月份*/
  378. getWeekOrMonthDate(weeknum,type='week') {
  379. if(type === 'week') {
  380. const weekStart = this.$moment().subtract(weeknum, 'week').startOf('isoWeek').format('YYYY.MM.DD'); //周一
  381. const weekEnd = this.$moment().subtract(weeknum, 'week').endOf('isoWeek').format('YYYY.MM.DD'); //周日
  382. // console.log(weekStart,weekEnd)
  383. return `${weekStart}~${weekEnd}`;
  384. } else {
  385. const month = this.$moment().subtract(weeknum,'M').format('YYYY.MM');
  386. return month;
  387. }
  388. },
  389. changeTabHandle(tab){
  390. if(this.roadshowTab == 1){
  391. return
  392. }else if(this.roadshowTab == 2){
  393. this.salesDimension.dateTab = tab;
  394. switch(tab) {
  395. case '周度统计表':
  396. this.salesDimension.tableTheadColumns = [
  397. `本周(${this.getWeekOrMonthDate(0)})`,
  398. `上一周(${this.getWeekOrMonthDate(1)})`,
  399. `上两周(${this.getWeekOrMonthDate(2)})`,
  400. `上三周(${this.getWeekOrMonthDate(3)})`,
  401. `上四周(${this.getWeekOrMonthDate(4)})`,
  402. `上五周(${this.getWeekOrMonthDate(5)})`]
  403. break;
  404. case '月度统计表':
  405. this.salesDimension.tableTheadColumns = [
  406. this.getWeekOrMonthDate(0,'month'),
  407. this.getWeekOrMonthDate(1,'month'),
  408. this.getWeekOrMonthDate(2,'month'),
  409. this.getWeekOrMonthDate(3,'month'),
  410. this.getWeekOrMonthDate(4,'month'),
  411. this.getWeekOrMonthDate(5,'month')]
  412. break;
  413. default:
  414. this.salesDimension.tableTheadColumns = ['试用','正式','关闭']
  415. break;
  416. }
  417. }else{
  418. this.researchersDimension.dateTab = tab;
  419. switch(tab) {
  420. case '周度统计表':
  421. this.researchersDimension.tableTheadColumns = ['上一周','本周','下一周']
  422. break;
  423. case '月度统计表':
  424. this.researchersDimension.tableTheadColumns = [
  425. this.getWeekOrMonthDate(0,'month'),
  426. this.getWeekOrMonthDate(1,'month'),
  427. this.getWeekOrMonthDate(2,'month'),
  428. this.getWeekOrMonthDate(3,'month'),
  429. ]
  430. break;
  431. default:
  432. this.researchersDimension.tableTheadColumns = ['试用','正式','关闭']
  433. break;
  434. }
  435. }
  436. this.$nextTick(()=>{
  437. $('.table-body-wrapper')[0].scrollTop = 0;
  438. })
  439. let typeObj = {
  440. '近1个月': 1,
  441. '近3个月': 3,
  442. '近6个月': 6,
  443. };
  444. typeObj[tab] ? this.filterDate(typeObj[tab]) : this.filterDate(0);
  445. this.getData();
  446. },
  447. dateChange(){
  448. if(this.roadshowTab==2){
  449. this.salesDimension.dateTab = '';
  450. this.salesDimension.tableTheadColumns = ['试用','正式','关闭'];
  451. }else{
  452. this.researchersDimension.dateTab = '';
  453. this.researchersDimension.tableTheadColumns = ['试用','正式','关闭'];
  454. }
  455. this.getData();
  456. },
  457. filterDate(month){
  458. if(month) {
  459. let date_before = this.$moment().subtract(month,'M').format("YYYY-MM-DD");
  460. let date_now = this.$moment().format("YYYY-MM-DD");
  461. let date = [date_before,date_now]
  462. this.roadshowTab==2?(this.salesDimension.selectDate = date):(this.researchersDimension.selectDate = date);
  463. }else {
  464. this.roadshowTab==2?(this.salesDimension.selectDate = ''):(this.researchersDimension.selectDate = '');
  465. }
  466. },
  467. // 销售维度、研究员维度
  468. getData(){
  469. let apiName=this.roadshowTab==2?"getOverseasSellerRoadShowList":"getOverseasResearcherRoadShowList"
  470. let params=this.roadshowTab==2?{
  471. DataType: this.salesDimension.dateTab === '周度统计表' ? 'week' : this.salesDimension.dateTab === '月度统计表' ? 'month' : 'time_interval',
  472. StartDate: this.salesDimension.selectDate ? this.salesDimension.selectDate[0] : '',
  473. EndDate: this.salesDimension.selectDate ? this.salesDimension.selectDate[1] : '',
  474. }:{
  475. DataType: this.researchersDimension.dateTab === '周度统计表' ? 'week' : this.researchersDimension.dateTab === '月度统计表' ? 'month' : 'time_interval',
  476. StartDate: this.researchersDimension.selectDate ? this.researchersDimension.selectDate[0] : '',
  477. EndDate: this.researchersDimension.selectDate ? this.researchersDimension.selectDate[1] : '',
  478. }
  479. this.dataLoading=false
  480. overseasCustomInterence[apiName](params).then(res=>{
  481. if(res.Ret == 200){
  482. // console.log(res,'res');
  483. const dataList=res.Data.List||[]
  484. const totalGroupArr=res.Data.RsReportRecordNumList || []
  485. dataList.forEach((da)=>{
  486. da.dataArr = this.filterTableData(da.RsReportRecordNumList,[da.AdminId])
  487. })
  488. if(this.roadshowTab==2){
  489. this.salesDimension.datalist=dataList
  490. this.salesDimension.totalGroupArr=this.filterTableData(totalGroupArr,dataList.map(it => it.AdminId))
  491. }else{
  492. this.researchersDimension.datalist=dataList
  493. this.researchersDimension.totalGroupArr=this.filterTableData(totalGroupArr,dataList.map(it => it.AdminId))
  494. }
  495. this.dataLoading=true
  496. }
  497. })
  498. },
  499. /* 处理数据结构 便于页面渲染 userid 时间用于弹窗获取列表*/
  500. filterTableData(data,userid=[]) {
  501. let list = data.map(item => ([
  502. {
  503. key: '试用',
  504. value: item.TryOutNum,
  505. startDate: item.StartDate,
  506. endDate: item.EndDate,
  507. userid
  508. },
  509. {
  510. key: '正式',
  511. value: item.FormalNum,
  512. startDate: item.StartDate,
  513. endDate: item.EndDate,
  514. userid
  515. },
  516. {
  517. key: '关闭',
  518. value: item.CloseNum,
  519. startDate: item.StartDate,
  520. endDate: item.EndDate,
  521. userid
  522. }
  523. ]))
  524. return list.flat(Infinity);
  525. },
  526. openDiaHandle({ startDate,endDate,userid,value,key }){
  527. if(value === 0) return;
  528. this.dialogForm = {
  529. startDate,
  530. endDate,
  531. userid,
  532. key
  533. }
  534. this.isShowDia = true;
  535. }
  536. },
  537. }
  538. </script>
  539. <style scoped lang="scss">
  540. .overseas-custom-roadshow-box {
  541. min-height: calc(100vh - 110px);
  542. background-color: white;
  543. border: 1px solid #ECECEC;
  544. border-radius: 2px;
  545. box-sizing: border-box;
  546. padding: 20px 30px 30px 30px;
  547. box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
  548. .tab-box{
  549. margin-bottom: 20px;
  550. display: flex;
  551. align-items: center;
  552. gap: 15px;
  553. .tab-item{
  554. min-width: 120px;
  555. margin: 0;
  556. }
  557. }
  558. .top-wrapper {
  559. display: flex;
  560. flex-wrap: wrap;
  561. justify-content: space-between;
  562. }
  563. .cont-wrapper {
  564. margin-top: 10px;
  565. padding-bottom: 40px;
  566. }
  567. .editor{
  568. color:#409EFF;
  569. cursor: pointer;
  570. &:hover{
  571. text-decoration: underline;
  572. }
  573. }
  574. .date-tab-box{
  575. display: flex;
  576. align-items: center;
  577. color: #333;
  578. margin-bottom: 30px;
  579. gap: 20px;
  580. .date-tab-item{
  581. cursor: pointer;
  582. &:hover {
  583. color: #409EFF;
  584. }
  585. &.act {
  586. color: #409EFF;
  587. position: relative;
  588. &::after {
  589. content: "";
  590. width: 100%;
  591. height: 2px;
  592. position: absolute;
  593. bottom: -10px;
  594. left: 50%;
  595. transform: translateX(-50%);
  596. background: #409EFF;
  597. }
  598. }
  599. }
  600. }
  601. .table-body-wrapper {
  602. max-height: calc(100vh - 300px);
  603. margin-right: -6px;
  604. overflow-y: scroll;
  605. overflow-x: auto;
  606. border-bottom: 1px solid #dcdfe6;
  607. border-top: 1px solid #dcdfe6;
  608. }
  609. table {
  610. width: 100%;
  611. font-size: 14px;
  612. color: #666;
  613. thead{
  614. position: sticky;
  615. top: 0;
  616. left: 0;
  617. border-left: 1px solid #dcdfe6;
  618. border-right: 1px solid #dcdfe6;
  619. td{
  620. border: none;
  621. outline-color: #dcdfe6;
  622. outline-style: solid;
  623. outline-width: 0.5px;
  624. }
  625. }
  626. td,
  627. th {
  628. min-width: 35px;
  629. // word-break: break-all;
  630. border: 1px solid #dcdfe6;
  631. height: 45px;
  632. text-align: center;
  633. background-color: #fff;
  634. }
  635. .head-column {
  636. background-color: #F0F2F5;
  637. }
  638. .data-cell{
  639. color: #409EFF;
  640. cursor: pointer;
  641. }
  642. .thead-sticky {
  643. position: sticky;
  644. top: 0;
  645. }
  646. }
  647. }
  648. </style>