List.vue 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293
  1. <script setup name="ReportList">
  2. import {computed, nextTick, onMounted, reactive,ref} from 'vue'
  3. import apiReport from '@/api/report'
  4. import {getSystemInfo} from '@/api/common'
  5. import moment from 'moment'
  6. import ListClassify from './components/ListClassify.vue'
  7. import ReportPublishPop from './components/ReportPublishPop.vue'
  8. import { showToast,showDialog,Dialog } from 'vant';
  9. import { useRouter } from 'vue-router';
  10. import { useWindowSize } from '@vueuse/core'
  11. import {useCachedViewsStore} from '@/store/modules/cachedViews'
  12. import {useDownLoadFileAddWaterMark} from '@/hooks/useDownLoadFile'
  13. import {reportManageBtn,useAuthBtn} from '@/hooks/useAuthBtn'
  14. import {useReportApprove} from '@/hooks/useReportApprove'
  15. import {usePublicSettingStore} from '@/store/modules/publicSetting'
  16. import {Base64} from 'js-base64'
  17. import {isWeiXin} from '@/hooks/common'
  18. import AddReportBaseInfoV2 from './components/AddReportBaseInfoV2.vue'
  19. import ReportFilter from './components/ReportFilter.vue'
  20. import AudioBox from './components/AudioBox.vue'
  21. import { useConfigSettingStore } from '@/store/modules/etaConfig'
  22. import { storeToRefs } from 'pinia'
  23. const cachedViewsStore=useCachedViewsStore()
  24. const publicSettingStore = usePublicSettingStore()
  25. const {startDownload}=useDownLoadFileAddWaterMark()
  26. const {isApprove,isOtherApprove,getEtaConfig} = useReportApprove()
  27. const {checkAuthBtn} = useAuthBtn()
  28. //添加按钮和添加选项
  29. const isAddReportBtnShow = computed(()=>{
  30. return checkAuthBtn(reportManageBtn.reportManage_reportAdd)
  31. })
  32. const { width, height } = useWindowSize()
  33. const router=useRouter()
  34. //是否显示一键清空选项
  35. const showCleanFilterBox=computed(()=>{
  36. if(isClickClose.value) return false
  37. if(
  38. listState.ClassifyNameFirst||
  39. listState.ClassifyNameFirst||
  40. listState.EndDate||
  41. listState.MsgIsSend||
  42. listState.publishStatus
  43. ) return true
  44. })
  45. const isClickClose=ref(false)//是否点击过关闭一键清空模块
  46. function handleCleanFilter(){
  47. listState.ClassifyNameFirst=''
  48. listState.ClassifyNameSecond=''
  49. listState.ClassifyNameThird=''
  50. listState.classifyIds=[]
  51. listState.MsgIsSend=''
  52. listState.StartDate=''
  53. listState.EndDate=''
  54. listState.timeType='publish_time'
  55. listState.publishStatus=''
  56. refreshList()
  57. }
  58. const reportTypes = [
  59. { label: '我的研报',key:'3' },
  60. { label: '共享研报',key:'2' },
  61. { label: '公共研报',key:'1' },
  62. ]
  63. const statusMap = new Map([
  64. [1,{ bg:'#EEEEEE', color:'#333', msg:'未发布'}],
  65. [2,{ bg:'rgba(0, 82, 217, 0.1)', color:'#0052D9', msg:'已发布'}],
  66. [3,{ bg:'#FFF1E9', color:'#BE5A00', msg:'待提交'}],
  67. [4,{ bg:'#FFF1E9', color:'#BE5A00', msg:'待审批'}],
  68. [5,{ bg:'#FFF0ED', color:'#AD352F', msg:'已驳回'}],
  69. [6,{ bg:'#E3F9E9', color:'#006C45', msg:'已通过'}]
  70. ])
  71. // 水印
  72. const waterMarkStr=ref('')
  73. const listState = reactive({
  74. listType: '3',
  75. publishStatus:'',
  76. MsgIsSend:'',
  77. timeType: 'publish_time',
  78. classifyIds: [],
  79. ClassifyNameFirst:'',
  80. ClassifyNameSecond:'',
  81. ClassifyNameThird:'',
  82. StartDate:'',
  83. EndDate:'',
  84. list:[],
  85. page:0,
  86. pageSize:20,
  87. finished:false,
  88. loading:false
  89. })
  90. async function getList(){
  91. const res=await apiReport.getList({
  92. CurrentIndex:listState.page,
  93. PageSize:listState.pageSize,
  94. StartDate:listState.StartDate,
  95. EndDate:listState.EndDate,
  96. // ClassifyNameFirst:listState.ClassifyNameFirst,
  97. // ClassifyNameSecond:listState.ClassifyNameSecond,
  98. ClassifyIdFirst: listState.classifyIds
  99. ? listState.classifyIds[0]
  100. : "",
  101. ClassifyIdSecond:
  102. listState.classifyIds &&
  103. listState.classifyIds.length > 1
  104. ? listState.classifyIds[1]
  105. : "",
  106. ClassifyIdThird:
  107. listState.classifyIds &&
  108. listState.classifyIds.length > 2
  109. ? listState.classifyIds[2]
  110. : "",
  111. MsgIsSend:listState.MsgIsSend,
  112. TimeType:listState.timeType,
  113. State:listState.publishStatus,
  114. FilterReportType: listState.listType
  115. })
  116. if(res.Ret===200){
  117. listState.loading=false
  118. if(!res.Data){
  119. listState.finished=true
  120. return
  121. }
  122. listState.finished=res.Data.Paging.IsEnd
  123. const arr=res.Data.List||[]
  124. listState.list= listState.page < 2 ? arr : [...listState.list,...arr]
  125. }
  126. }
  127. function onLoad(){
  128. listState.page++
  129. getList()
  130. }
  131. function refreshList(){
  132. document.documentElement.scrollTop=0
  133. listState.page=1
  134. listState.list=[]
  135. listState.finished=false
  136. getList()
  137. }
  138. // 删除报告
  139. function handleReportDel(item){
  140. showDialog({
  141. title: '提示',
  142. message: '删除操作不可恢复,确认删除吗?',
  143. showCancelButton:true
  144. }).then(() => {
  145. // on close
  146. apiReport.reportDel({ReportIds:item.Id}).then(res=>{
  147. if(res.Ret===200){
  148. showToast('删除成功')
  149. refreshList()
  150. showReportItemOpt.value=false
  151. }
  152. })
  153. }).catch(()=>{})
  154. }
  155. // 发布报告
  156. let activeReportData=ref('')
  157. let showPublishPop=ref(false)
  158. async function handleReportPublish(item){
  159. activeReportData.value=item
  160. //如果走审批流 直接发布
  161. if(isApprove.value){
  162. confirmPublish(item)
  163. return
  164. }
  165. // 判断是否有推送权限
  166. if(!checkAuthBtn(reportManageBtn.reportManage_sendMsg)){
  167. confirmPublish(item)
  168. return
  169. }
  170. showPublishPop.value=true
  171. showReportItemOpt.value=false
  172. }
  173. function confirmPublish(item){
  174. showDialog({
  175. title: '提示',
  176. message: item.PrePublishTime ? '是否立即发布定时报告?' : '是否确定立即发布报告?',
  177. showCancelButton:true
  178. }).then(res=>{
  179. publishReportApprove()
  180. showReportItemOpt.value=false
  181. }).catch(err=>{})
  182. }
  183. function publishReportApprove(){
  184. apiReport.reportPublish({
  185. ReportIds:activeReportData.value.Id.toString(),
  186. ReportUrl:generatePdfLinks(activeReportData.value.ReportCode)
  187. }).then(res=>{
  188. if(res.Ret!==200) return
  189. showToast('发布成功')
  190. handlePublishPopClose('refresh')
  191. })
  192. }
  193. function generatePdfLinks(Code){
  194. return `${publicSettingStore.publicSetting.ReportViewUrl}/reportshare_pdf?code=${Code}&flag=${waterMarkStr.value}`
  195. }
  196. //提交报告
  197. function handleReportSubmit(item){
  198. showDialog({
  199. title: '提示',
  200. message: '是否确认提交该报告进入审批流程?',
  201. showCancelButton:true
  202. }).then(()=>{
  203. apiReport.reportCnSubmit({
  204. ReportId:Number(item.Id)
  205. }).then(res=>{
  206. if(res.Ret!==200) return
  207. showToast('提交成功')
  208. refreshList()
  209. })
  210. }).catch(()=>{})
  211. }
  212. //撤销报告
  213. function handleReportCancel(item){
  214. showDialog({
  215. title: '提示',
  216. message: '确定要撤销审批吗?',
  217. showCancelButton:true
  218. }).then(()=>{
  219. apiReport.reportCnCancel({
  220. ReportId:Number(item.Id)
  221. }).then(res=>{
  222. if(res.Ret!==200) return
  223. showToast('撤销成功')
  224. refreshList()
  225. })
  226. }).catch(()=>{})
  227. }
  228. // type 1-电脑版pdf 2-电脑版长图 3-移动版pdf 4-移动版长图
  229. async function downloadPdfImg(item,type){
  230. let waterMark=''
  231. // 判断是否需要水印
  232. await useConfigSettingStore().getBaseConfigSetting()
  233. const configSettingStore = useConfigSettingStore()
  234. const { etaConfigInfo } = storeToRefs(configSettingStore)
  235. if(etaConfigInfo.value.WatermarkDownloadPdf==='true'){
  236. // 设置水印
  237. waterMark=decodeURIComponent(Base64.decode(waterMarkStr.value))
  238. }
  239. showReportItemOpt.value=false
  240. let name = `${item.Title}${moment().format('YYYYMMDD')}`
  241. if(type == 1){
  242. // window.open(item.DetailPdfUrl,"_blank")
  243. startDownload({
  244. url:item.DetailPdfUrl,
  245. filename:`${name}.pdf`,
  246. waterMark:waterMark,
  247. type:'pdf'
  248. })
  249. }else if(type===2){
  250. startDownload({
  251. url:item.DetailImgUrl,
  252. filename:`${name}.jpg`,
  253. waterMark:waterMark,
  254. type:'img'
  255. })
  256. }else if(type===3){
  257. startDownload({
  258. url:item.DetailPdfUrlMobile,
  259. filename:`${name}.pdf`,
  260. waterMark:waterMark,
  261. type:'pdf'
  262. })
  263. }else if(type===4){
  264. startDownload({
  265. url:item.DetailImgUrlMobile,
  266. filename:`${name}.jpg`,
  267. waterMark:waterMark,
  268. type:'img'
  269. })
  270. }
  271. showDownloadPdfImg.value=false
  272. }
  273. const showDownloadPdfImg=ref(false)
  274. const downloadPdfImgType=ref('pdf')
  275. // 发布弹窗关闭
  276. function handlePublishPopClose(refresh){
  277. if(refresh){
  278. refreshList()
  279. }
  280. activeReportData.value=''
  281. showPublishPop.value=false
  282. }
  283. // 取消发布
  284. function handleReportPublishCancle(item){
  285. showDialog({
  286. title: '提示',
  287. message: `是否确认撤销发布?`,
  288. showCancelButton:true
  289. }).then(()=>{
  290. apiReport.reportPublishCancle({ReportIds:Number(item.Id)}).then(res=>{
  291. if(res.Ret===200){
  292. refreshList()
  293. showReportItemOpt.value=false
  294. }
  295. })
  296. })
  297. }
  298. // 推送消息
  299. function handldReportMsgSend(item){
  300. apiReport.reportMessageSend({
  301. ReportId:Number(item.Id)
  302. }).then(res=>{
  303. if(res.Ret===200){
  304. showToast('推送成功')
  305. showReportItemOpt.value=false
  306. refreshList()
  307. }
  308. })
  309. }
  310. /* 上传章节音频 */
  311. // 上传音频
  312. const showUploadAudio=ref(false)
  313. const temAudioData=reactive({
  314. time:0,
  315. size:0,
  316. url:'',
  317. })
  318. function handleShowUploadAudio(){
  319. showReportItemOpt.value = false;
  320. temAudioData.time=activeItem.value.VideoPlaySeconds
  321. temAudioData.size=activeItem.value.VideoSize
  322. temAudioData.url=activeItem.value.VideoUrl
  323. showUploadAudio.value=true
  324. }
  325. // 获取音频时长
  326. function handleGetAudioDuration(file){
  327. return new Promise((resolve,reject)=>{
  328. if(isWeiXin()){
  329. console.log('微信?');
  330. resolve(0)
  331. }
  332. const fileUrl=URL.createObjectURL(file)
  333. const audioEl=new Audio(fileUrl)
  334. audioEl.addEventListener('loadedmetadata',(e)=>{
  335. console.log('e.path',e.path)
  336. console.log('e.composedPath',e.composedPath())
  337. console.log('获取音频时长',e.composedPath()[0].duration);
  338. console.log(audioEl.duration);
  339. const t=e.composedPath()[0].duration
  340. resolve(t)
  341. })
  342. })
  343. }
  344. async function handleAudioUploadAfterRead(e){
  345. // console.log(e);
  346. const duration=await handleGetAudioDuration(e.file)
  347. temAudioData.time=duration||0
  348. temAudioData.size=e.file.size/1024/1024 //单位MB
  349. temAudioData.name=e.file.name
  350. console.log('音频数据temAudioData',temAudioData);
  351. let params = new FormData();
  352. params.append("file", e.file);
  353. params.append("ReportId", activeItem.value.Id);
  354. const res = await apiReport.uploadAudio(params)
  355. if(res.Ret !== 200) return
  356. temAudioData.url = res.Data.ResourceUrl;
  357. }
  358. function handleUpdateAudio(){
  359. activeItem.value.VideoUrl=temAudioData.url
  360. activeItem.value.VideoPlaySeconds=temAudioData.time
  361. activeItem.value.VideoSize=temAudioData.size
  362. showUploadAudio.value=false
  363. }
  364. //更新下音频时长
  365. function handleUpdateAudioTime(e){
  366. temAudioData.time=e
  367. }
  368. const downloadUrl = `${import.meta.env.VITE_APP_API_URL}/voice/download`
  369. /* 音频下载 */
  370. function handleDownloadAudio(item) {
  371. showReportItemOpt.value = false;
  372. let url = downloadUrl+`?ReportId=${parseInt(item.Id)}`;
  373. const elink = document.createElement('a')
  374. elink.download = item.VideoName
  375. elink.style.display = 'none'
  376. elink.href = url
  377. document.body.appendChild(elink)
  378. elink.click()
  379. window.URL.revokeObjectURL(elink.href)
  380. document.body.removeChild(elink)
  381. }
  382. const selectClassifyName = computed(() => {
  383. return `${listState.ClassifyNameFirst}${listState.ClassifyNameSecond?('/'+listState.ClassifyNameSecond):''}${listState.ClassifyNameThird?('/'+listState.ClassifyNameThird):''}`
  384. })
  385. // 分类弹窗
  386. const showClassify=ref(false)
  387. // 分类筛选
  388. function handleConfirmClassify(arr){
  389. console.log(arr)
  390. listState.ClassifyNameFirst=arr[0]?.text;
  391. listState.ClassifyNameSecond=arr[1]?.text;
  392. listState.ClassifyNameThird=arr[2]?.text;
  393. listState.classifyIds = arr.map(_=>_.id);
  394. refreshList()
  395. showClassify.value=false
  396. }
  397. // 跳转详情
  398. function goDetail(item){
  399. console.log(item);
  400. //若没有预览权限,则不跳转
  401. if(!checkAuthBtn(reportManageBtn.reportManage_reportView)) return
  402. router.push({
  403. path:"/report/preview",
  404. query:{
  405. id:item.Id
  406. }
  407. })
  408. }
  409. // 弹出操作
  410. let activeItem=ref(null)
  411. const showReportItemOpt=ref(false)
  412. async function handleOptReportItem(e){
  413. // 校验是否有人在编辑报告
  414. if(!e.CanEdit){
  415. showToast(`${e.Editor}正在编辑中,不可操作!`)
  416. return
  417. }
  418. //检验权限,如果该状态下无可操作项,则长按不弹出
  419. let checkState = false
  420. if([1,3].includes(e.State)){ //编辑、发布、删除
  421. checkState = checkAuthBtn(reportManageBtn.reportManage_reportEdit)
  422. ||checkAuthBtn(reportManageBtn.reportManage_publish)
  423. ||checkAuthBtn(reportManageBtn.reportManage_reportDel)
  424. }
  425. if([2,6].includes(e.State)){ //推送消息、取消发布
  426. checkState = checkAuthBtn(reportManageBtn.reportManage_sendMsg)
  427. ||checkAuthBtn(reportManageBtn.reportManage_cancelPublish)
  428. }
  429. if([4,5].includes(e.State)){ //撤销
  430. checkState = checkAuthBtn(reportManageBtn.reportManage_cancelPublish)
  431. }
  432. if(!checkState) return
  433. activeItem.value=e
  434. showReportItemOpt.value=true
  435. }
  436. // 更多操作
  437. const isShowFilterPopup = ref(false)
  438. function handleShowFilter(){
  439. isShowFilterPopup.value = true
  440. }
  441. function handleChangeFilter({ publishStatus,msgIsSend,timeType,startDate,endDate }) {
  442. listState.MsgIsSend = msgIsSend
  443. listState.publishStatus = publishStatus
  444. listState.timeType = timeType
  445. listState.StartDate = startDate
  446. listState.EndDate = endDate
  447. isShowFilterPopup.value=false
  448. refreshList()
  449. }
  450. async function goSearch(){
  451. // 删除报告搜索页的缓存
  452. await cachedViewsStore.removeCaches('ReportSearch')
  453. router.push('/report/search')
  454. }
  455. const isShowReportInfoPopup = ref(false)
  456. //添加报告
  457. function handeAddReport(e){
  458. isShowReportInfoPopup.value = true
  459. }
  460. //点击编辑
  461. async function handleReportEdit(e){
  462. console.log(e);
  463. showReportItemOpt.value=false
  464. if(e.CollaborateType===1) {
  465. // 先mark一下
  466. const markRes=await apiReport.reportMark({
  467. Status:1,
  468. ReportId:e.Id
  469. })
  470. if(markRes.Ret===200){
  471. if(markRes.Data.Status===1){
  472. showToast(markRes.Data.Msg || '该研报正在编辑,不可重复编辑')
  473. listState.list.forEach(item=>{
  474. if(item.Id===e.Id){
  475. item.CanEdit=false
  476. item.Editor=markRes.Data.Editor || ''
  477. }
  478. })
  479. return
  480. }else if(markRes.Data.Status===0){
  481. listState.list.forEach(item=>{
  482. if(item.Id===e.Id){
  483. item.CanEdit=true
  484. item.Editor=markRes.Data.Editor || ''
  485. }
  486. })
  487. }
  488. }else{
  489. showToast(markRes.ErrMsg || '未知错误,请稍后重试')
  490. return
  491. }
  492. }
  493. // 晨报周报
  494. if(e.CollaborateType===2){
  495. router.push({
  496. path:"/report/chapter/list",
  497. query:{
  498. id:e.Id
  499. }
  500. })
  501. return
  502. }
  503. // 研报d
  504. router.push({
  505. path:e.ReportLayout===1 ? '/report/edit' : "/smart_report/edit",
  506. query:{
  507. id:e.Id,
  508. coopType: e.CollaborateType
  509. }
  510. })
  511. }
  512. const getSystemInfoFun=()=>{
  513. getSystemInfo().then(res=>{
  514. if(res.Ret===200){
  515. const systemUserInfo=res.Data
  516. // 设置水印文案
  517. let waterMarkString=''
  518. if(systemUserInfo){
  519. waterMarkString=`${systemUserInfo.RealName}${systemUserInfo.Mobile?systemUserInfo.Mobile:systemUserInfo.Email}`
  520. waterMarkString=encodeURIComponent(waterMarkString)
  521. waterMarkStr.value=Base64.encode(waterMarkString)
  522. }
  523. }
  524. })
  525. }
  526. onMounted(async ()=>{
  527. getEtaConfig()
  528. getSystemInfoFun()
  529. })
  530. </script>
  531. <template>
  532. <div class="report-list-page">
  533. <div class="sticky-box">
  534. <div class="clear-filter-box" v-if="showCleanFilterBox">
  535. <span>想要清空所有筛选项?试试</span>
  536. <span @click="handleCleanFilter" style="display:flex;align-items:center">
  537. <span style="color:#0052D9">一键清空</span>
  538. <img class="rocket" src="@/assets/imgs/icon_rocket.png" alt="">
  539. </span>
  540. <van-icon name="cross" class="close-icon" @click="isClickClose=true"/>
  541. </div>
  542. <div class="top-box">
  543. <van-search
  544. style="flex:1"
  545. shape="round"
  546. readonly
  547. placeholder="请输入报告标题或创建人"
  548. @click-input="goSearch"
  549. />
  550. <div :class="['menu-icon',showClassify||listState.ClassifyNameSecond?'active':'']" @click="showClassify=true">
  551. <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
  552. <path d="M33.75 5.25C38.7206 5.25 42.75 9.27944 42.75 14.25C42.75 19.2206 38.7206 23.25 33.75 23.25C28.7794 23.25 24.75 19.2206 24.75 14.25C24.75 9.27944 28.7794 5.25 33.75 5.25ZM27.75 14.25C27.75 17.5637 30.4363 20.25 33.75 20.25C37.0637 20.25 39.75 17.5637 39.75 14.25C39.75 10.9363 37.0637 8.25 33.75 8.25C30.4363 8.25 27.75 10.9363 27.75 14.25Z" fill="currentColor"/>
  553. <path d="M6 9C6 7.34315 7.34315 6 9 6H19.5C21.1569 6 22.5 7.34315 22.5 9V19.5C22.5 21.1569 21.1569 22.5 19.5 22.5H9C7.34315 22.5 6 21.1569 6 19.5V9ZM9 9V19.5H19.5V9H9Z" fill="currentColor"/>
  554. <path d="M6 28.5C6 26.8431 7.34315 25.5 9 25.5H19.5C21.1569 25.5 22.5 26.8431 22.5 28.5V39C22.5 40.6569 21.1569 42 19.5 42H9C7.34315 42 6 40.6569 6 39V28.5ZM9 28.5V39H19.5V28.5H9Z" fill="currentColor"/>
  555. <path d="M25.5 28.5C25.5 26.8431 26.8431 25.5 28.5 25.5H39C40.6569 25.5 42 26.8431 42 28.5V39C42 40.6569 40.6569 42 39 42H28.5C26.8431 42 25.5 40.6569 25.5 39V28.5ZM28.5 39H39V28.5H28.5V39Z" fill="currentColor"/>
  556. </svg>
  557. </div>
  558. <div
  559. :class="['menu-icon',{
  560. 'active': listState.MsgIsSend||listState.publishStatus
  561. }]"
  562. @click="handleShowFilter"
  563. >
  564. <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
  565. <path d="M30.283 23.977L40.824 9.5685C41.3719 8.81954 41.6002 7.88381 41.459 6.96667C41.3177 6.04952 40.8184 5.22589 40.0705 4.6765C39.4715 4.23699 38.7479 4 38.005 4H9.995C8.065 4 6.5 5.567 6.5 7.5C6.5 8.244 6.7365 8.9685 7.1755 9.5685L17.717 23.977V42.5C17.717 43.3285 18.3875 44 19.215 44C19.6125 43.9996 19.9935 43.8414 20.2743 43.5601C20.5552 43.2788 20.7128 42.8975 20.7125 42.5V23.486C20.7125 23.1675 20.611 22.857 20.423 22.5995L9.592 7.7955C9.53761 7.72096 9.50489 7.63283 9.49745 7.54085C9.49001 7.44887 9.50814 7.35663 9.54984 7.27431C9.59155 7.192 9.65519 7.12281 9.73375 7.0744C9.81231 7.02599 9.90272 7.00024 9.995 7H38.005C38.0973 7.00015 38.1878 7.02586 38.2664 7.07427C38.345 7.12268 38.4086 7.1919 38.4503 7.27426C38.492 7.35663 38.51 7.44892 38.5025 7.54092C38.4949 7.63292 38.4621 7.72104 38.4075 7.7955L27.5765 22.5995C27.3884 22.8568 27.287 23.1673 27.287 23.486V38.271C27.287 39.0995 27.9575 39.771 28.785 39.771C28.9819 39.7709 29.1768 39.732 29.3586 39.6565C29.5404 39.5811 29.7056 39.4705 29.8447 39.3312C29.9838 39.192 30.0941 39.0266 30.1693 38.8447C30.2445 38.6628 30.2831 38.4678 30.283 38.271V23.977Z" fill="currentColor"/>
  566. </svg>
  567. </div>
  568. </div>
  569. <div class="report-type">
  570. <van-tabs
  571. v-model:active="listState.listType"
  572. title-active-color="#0052D9"
  573. title-inactive-color="#333"
  574. @change="refreshList"
  575. >
  576. <van-tab
  577. :title="tab.label"
  578. v-for="tab in reportTypes"
  579. :key="tab.key"
  580. :name="tab.key"
  581. ></van-tab>
  582. </van-tabs>
  583. </div>
  584. <div class="classify-name" v-if="listState.classifyIds&&listState.classifyIds.length">{{ selectClassifyName }}</div>
  585. </div>
  586. <van-list
  587. v-model:loading="listState.loading"
  588. :finished="listState.finished"
  589. :offset="100"
  590. :finished-text="listState.list.length>0?'没有更多了':'暂无相关报告'"
  591. @load="onLoad"
  592. >
  593. <img v-if="listState.list.length==0&&listState.finished" class="list-empty-img" src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
  594. <ul class="list-wrap">
  595. <li
  596. v-for="item in listState.list"
  597. :key="item.Id"
  598. class="select-text-disabled item"
  599. @click="goDetail(item)"
  600. >
  601. <div class="list-top">
  602. <h2 class="van-ellipsis title">
  603. <span :class="['tag',item.ChapterType]">{{['周报','晨报'].includes(item.ClassifyNameFirst)?item.ClassifyNameFirst:'研报'}}</span>
  604. {{item.Title}}
  605. <span v-if="item.CreateTime">({{item.CreateTime.substring(5,7)}}{{item.CreateTime.substring(8,10)}})</span>
  606. </h2>
  607. <div class="status">
  608. <van-tag
  609. type="primary"
  610. size="large"
  611. :color="statusMap.get(item.State).bg"
  612. :text-color="statusMap.get(item.State).color"
  613. >{{statusMap.get(item.State).msg}}</van-tag>
  614. </div>
  615. </div>
  616. <p class="van-multi-ellipsis--l2 des">{{item.Abstract}}</p>
  617. <div class="bot-info">
  618. <div class="time">
  619. <span style="margin-right:2px">{{moment(item.ModifyTime).format('YYYY-MM-DD')}}</span>
  620. <svg v-if="item.PrePublishTime&&item.State==1" style="width:14px;height:14px;position: relative;top:2px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28" fill="none">
  621. <path d="M13.0357 6.28571V14.7501L17.8576 19.7857L19.2213 18.422L14.9643 13.9512V6.28571H13.0357Z" fill="#0052D9"/>
  622. <path d="M27.5 14C27.5 21.4558 21.4558 27.5 14 27.5C6.54416 27.5 0.5 21.4558 0.5 14C0.5 6.54416 6.54416 0.5 14 0.5C21.4558 0.5 27.5 6.54416 27.5 14ZM25.5714 14C25.5714 7.60928 20.3907 2.42857 14 2.42857C7.60928 2.42857 2.42857 7.60928 2.42857 14C2.42857 20.3907 7.60928 25.5714 14 25.5714C20.3907 25.5714 25.5714 20.3907 25.5714 14Z" fill="#0052D9"/>
  623. </svg>
  624. <span style="margin-left:10px">{{item.AdminRealName}}</span>
  625. </div>
  626. <div class="read-count">
  627. <span>PV:{{item.Pv}}</span>
  628. <span v-permission="reportManageBtn.reportManage_reportList_uv">UV:{{item.Uv}}</span>
  629. </div>
  630. <div class="handle-icon" @click.stop="handleOptReportItem(item)" v-if="item.ClassifyEnabled">
  631. <svg width="24" height="24" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  632. <path d="M16 8C17.1045 8 18 7.10455 18 6C18 4.89545 17.1045 4 16 4C14.8955 4 14 4.89545 14 6C14 7.10455 14.8955 8 16 8Z" fill="black" fill-opacity="0.9"/>
  633. <path d="M16 18C17.1045 18 18 17.1046 18 16C18 14.8954 17.1045 14 16 14C14.8955 14 14 14.8954 14 16C14 17.1046 14.8955 18 16 18Z" fill="black" fill-opacity="0.9"/>
  634. <path d="M18 26C18 24.8954 17.1045 24 16 24C14.8955 24 14 24.8954 14 26C14 27.1046 14.8955 28 16 28C17.1045 28 18 27.1046 18 26Z" fill="black" fill-opacity="0.9"/>
  635. </svg>
  636. </div>
  637. </div>
  638. </li>
  639. </ul>
  640. </van-list>
  641. </div>
  642. <!-- 添加报告按钮 -->
  643. <div class="add-report-btn" @click="handeAddReport" v-if="isAddReportBtnShow">
  644. <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
  645. <path d="M12.0499 15.9499V27.5H15.9499V15.9499H27.5V12.0499H15.9499V0.5H12.0499V12.0499H0.5V15.9499H12.0499Z" fill="white"/>
  646. </svg>
  647. </div>
  648. <!-- 下载pdf和图片选择下载类型 -->
  649. <van-action-sheet
  650. v-model:show="showDownloadPdfImg"
  651. cancel-text="取消"
  652. close-on-click-action
  653. >
  654. <div class="report-item-action-box" v-if="activeItem">
  655. <div class="title">{{downloadPdfImgType==='pdf'?'下载pdf':'下载长图'}}</div>
  656. <template v-if="downloadPdfImgType==='pdf'">
  657. <div
  658. class="item"
  659. v-if="checkAuthBtn(reportManageBtn.reportManage_exportPdf) && activeItem.DetailPdfUrl"
  660. @click="downloadPdfImg(activeItem,1)"
  661. >电脑版</div>
  662. <div
  663. class="item"
  664. v-if="checkAuthBtn(reportManageBtn.reportManage_exportPdf) && activeItem.DetailPdfUrlMobile"
  665. @click="downloadPdfImg(activeItem,3)"
  666. >手机版</div>
  667. </template>
  668. <template v-if="downloadPdfImgType==='img'">
  669. <div
  670. class="item"
  671. v-if="checkAuthBtn(reportManageBtn.reportManage_exportImg) && activeItem.DetailImgUrl"
  672. @click="downloadPdfImg(activeItem,2)"
  673. >电脑版</div>
  674. <div
  675. class="item"
  676. v-if="checkAuthBtn(reportManageBtn.reportManage_exportImg) && activeItem.DetailImgUrlMobile"
  677. @click="downloadPdfImg(activeItem,4)"
  678. >手机版</div>
  679. </template>
  680. </div>
  681. </van-action-sheet>
  682. <!-- 报告item操作 -->
  683. <van-action-sheet
  684. teleport="body"
  685. v-model:show="showReportItemOpt"
  686. cancel-text="取消"
  687. close-on-click-action
  688. >
  689. <div class="report-item-action-box" v-if="activeItem">
  690. <div class="title">{{activeItem.Title}}</div>
  691. <!-- 操作:未发布——发布、编辑、删除
  692. 已发布——取消发布、推送消息/已推送消息
  693. 待提交——提交、编辑、删除
  694. 待审批——撤销
  695. 已通过——撤销、推送消息/已推送消息
  696. 已驳回——撤销
  697. -->
  698. <!-- 未发布,待提交 -->
  699. <template v-if="[1,3].includes(activeItem.State)">
  700. <div class="item" @click="handleReportEdit(activeItem)" v-permission="reportManageBtn.reportManage_reportEdit">编辑</div>
  701. <div class="item" v-if="checkAuthBtn(reportManageBtn.reportManage_publish)&&activeItem.State===1"
  702. @click="handleReportPublish(activeItem)">发布</div>
  703. <div class="item" v-if="checkAuthBtn(reportManageBtn.reportManage_publish)&&activeItem.State===3"
  704. @click="handleReportSubmit(activeItem)">提交</div>
  705. <div class="item" @click="handleReportDel(activeItem)" v-permission="reportManageBtn.reportManage_reportDel">删除</div>
  706. </template>
  707. <!-- 已发布,已通过 -->
  708. <template v-if="[2,6].includes(activeItem.State)">
  709. <div class="item" v-if="checkAuthBtn(reportManageBtn.reportManage_cancelPublish)&&activeItem.State===2&&activeItem.HasAuth"
  710. @click="handleReportPublishCancle(activeItem)">撤销</div> <!-- 实际上是取消发布 -->
  711. <div class="item" v-if="checkAuthBtn(reportManageBtn.reportManage_cancelPublish)&&activeItem.State===6&&activeItem.HasAuth"
  712. @click="handleReportCancel(activeItem)">撤销</div>
  713. <div class="item" v-if="checkAuthBtn(reportManageBtn.reportManage_exportPdf) && activeItem.DetailPdfUrl"
  714. @click="showDownloadPdfImg=true;downloadPdfImgType='pdf'">下载pdf</div>
  715. <div class="item" v-if="checkAuthBtn(reportManageBtn.reportManage_exportImg) && activeItem.DetailImgUrl"
  716. @click="showDownloadPdfImg=true;downloadPdfImgType='img'">下载长图</div>
  717. <div class="item" @click="handldReportMsgSend(activeItem)" v-if="activeItem.MsgIsSend==0&&checkAuthBtn(reportManageBtn.reportManage_sendMsg)&&activeItem.HasAuth">推送消息</div>
  718. </template>
  719. <!-- 待审批,已驳回 -->
  720. <template v-if="[4,5].includes(activeItem.State)">
  721. <div class="item" v-if="checkAuthBtn(reportManageBtn.reportManage_cancelPublish)&&activeItem.HasAuth"
  722. @click="handleReportCancel(activeItem)">撤销</div>
  723. </template>
  724. <div class="item" v-if="checkAuthBtn(reportManageBtn.reportManage_audioUpload)&&activeItem.HasAuth"
  725. @click="handleShowUploadAudio(activeItem)">音频上传</div>
  726. <div class="item" v-if="checkAuthBtn(reportManageBtn.reportManage_audioDownload)&&(activeItem.VideoUrl || activeItem.ChapterVideoList.length>0)"
  727. @click="handleDownloadAudio(activeItem)">音频下载</div>
  728. </div>
  729. </van-action-sheet>
  730. <!-- 分类弹窗 -->
  731. <van-popup
  732. v-model:show="showClassify"
  733. :position="width>650?'center':'bottom'"
  734. :style="width>650?{ width: '400px'}:''"
  735. round
  736. >
  737. <ListClassify @close="showClassify=false" @confirm="handleConfirmClassify"/>
  738. </van-popup>
  739. <!-- 报告发布弹窗 -->
  740. <van-popup
  741. v-model:show="showPublishPop"
  742. position="center"
  743. round
  744. >
  745. <ReportPublishPop :reportData="activeReportData" :waterMarkStr="waterMarkStr" @close="handlePublishPopClose"/>
  746. </van-popup>
  747. <!-- 筛选项弹窗-->
  748. <van-popup
  749. v-model:show="isShowFilterPopup"
  750. position="bottom"
  751. :style="{ height: '100%' }"
  752. >
  753. <ReportFilter
  754. :filter="listState"
  755. @change="handleChangeFilter"
  756. @close="isShowFilterPopup=false"
  757. />
  758. </van-popup>
  759. <!-- 报告基础信息弹窗 -->
  760. <van-popup
  761. v-model:show="isShowReportInfoPopup"
  762. position="bottom"
  763. :style="{ height: '100%' }"
  764. >
  765. <AddReportBaseInfoV2
  766. @close="isShowReportInfoPopup=false"
  767. />
  768. </van-popup>
  769. <!-- 上传音频 -->
  770. <van-popup
  771. v-model:show="showUploadAudio"
  772. position="bottom"
  773. round
  774. :style="{height:'60%'}"
  775. >
  776. <div class="upload-audio-wrap" v-if="showUploadAudio">
  777. <div style="font-size:12px;color:#666">tips:如果是在微信中访问,请上传完音频点击播放,获取音频时长后方可保存</div>
  778. <template v-if="temAudioData.url">
  779. <h2>音频链接</h2>
  780. <p>{{temAudioData.url}}</p>
  781. <AudioBox :time="temAudioData.time" :url="temAudioData.url" @updateDuration="handleUpdateAudioTime"/>
  782. </template>
  783. <div class="bot-btns">
  784. <van-uploader
  785. accept="*"
  786. :after-read="handleAudioUploadAfterRead"
  787. >
  788. <van-button class="bot-btn" type="default">{{temAudioData.url?'重新上传':'上传音频'}}</van-button>
  789. </van-uploader>
  790. <van-button class="bot-btn" type="primary" :disabled="!temAudioData.url||temAudioData.time===0" @click="handleUpdateAudio">保存</van-button>
  791. </div>
  792. </div>
  793. </van-popup>
  794. </template>
  795. <style lang="scss" scoped>
  796. .add-report-btn{
  797. width: var(--van-back-top-size);
  798. height: var(--van-back-top-size);
  799. position: fixed;
  800. right: var(--van-back-top-right);
  801. bottom: calc(var(--van-back-top-bottom) + var(--van-back-top-size) + 10px);
  802. background-color: $theme-color;
  803. border-radius: 50%;
  804. box-shadow: 0px 6px 28px 4px rgba(0, 0, 0, 0.05), 0px 16px 20px 2px rgba(0, 0, 0, 0.06), 0px 10px 10px -6px rgba(0, 0, 0, 0.1);
  805. svg{
  806. width: 27px;
  807. height: 27px;
  808. position: absolute;
  809. top: 50%;
  810. left: 50%;
  811. transform: translate(-50%,-50%);
  812. }
  813. }
  814. .sticky-box{
  815. position: sticky;
  816. top: 0;
  817. z-index: 99;
  818. border-bottom: 1px solid #E7E7E7;
  819. background: #fff;
  820. :deep(.van-dropdown-menu__bar){
  821. box-shadow: none;
  822. border-bottom: 1px solid $border-color;
  823. }
  824. .bot-btn-box{
  825. border-top: 1px solid $border-color;
  826. padding: 32px;
  827. display: flex;
  828. justify-content: space-between;
  829. .btn{
  830. width: 327px;
  831. height: 80px;
  832. display: flex;
  833. justify-content: center;
  834. align-items: center;
  835. border-radius: 12px;
  836. font-size: 32px;
  837. font-weight: 600;
  838. }
  839. .cancel-btn{
  840. background-color: #F2F3FF;
  841. color: $theme-color;
  842. }
  843. .confirm-btn{
  844. background-color: $theme-color;
  845. color: #fff;
  846. }
  847. }
  848. .frequency-opt-box{
  849. ul{
  850. display: flex;
  851. flex-wrap: wrap;
  852. padding: 32px;
  853. }
  854. .item{
  855. width: 200px;
  856. height: 80px;
  857. display: flex;
  858. align-items: center;
  859. justify-content: center;
  860. color: rgba(0, 0, 0, 0.9);
  861. margin-left: 12px;
  862. margin-right: 12px;
  863. margin-bottom: 24px;
  864. background-color: #F3F3F3;
  865. border-radius: 12px;
  866. }
  867. .item-active{
  868. background-color: #F2F3FF;
  869. color: $theme-color;
  870. }
  871. }
  872. .report-status-box{
  873. ul{
  874. padding: 32px;
  875. }
  876. .status-item{
  877. line-height: 80px;
  878. border-radius: 12px;
  879. background-color: #F3F3F3;
  880. text-align: center;
  881. margin-bottom: 24px;
  882. &.active{
  883. background-color: #F2F3FF;
  884. color: $theme-color;
  885. }
  886. }
  887. }
  888. .clear-filter-box{
  889. padding: 0 34px;
  890. height: 84px;
  891. background-color: #F2F3FF;
  892. display: flex;
  893. align-items: center;
  894. font-size: 28px;
  895. position: relative;
  896. .rocket{
  897. width: 48px;
  898. height: 48px;
  899. }
  900. .close-icon{
  901. position: absolute;
  902. right: 34px;
  903. top: 50%;
  904. transform: translateY(-50%);
  905. }
  906. }
  907. }
  908. .top-box{
  909. padding: 30px 34px;
  910. background-color: #fff;
  911. display: flex;
  912. align-items: center;
  913. .menu-icon{
  914. width: 70px;
  915. height: 70px;
  916. display: flex;
  917. align-items: center;
  918. justify-content: center;
  919. background-color: #F2F6FA;
  920. margin-left: 20px;
  921. border-radius: 50%;
  922. &.active{
  923. color: $theme-color;
  924. }
  925. svg{
  926. width: 48px;
  927. height: 48px;
  928. }
  929. }
  930. :deep(.van-search){
  931. padding: 0;
  932. }
  933. }
  934. .list-wrap{
  935. padding: 30px 34px;
  936. .item{
  937. padding: 20px;
  938. margin-bottom: 20px;
  939. border: 1px solid $border-color;
  940. box-shadow: 0px 3px 12px rgba(52, 75, 120, 0.08);
  941. border-radius: 8px;
  942. .list-top {
  943. display: flex;
  944. justify-content: space-between;
  945. .status {
  946. flex-shrink: 0;
  947. }
  948. }
  949. .title{
  950. .tag{
  951. display: inline-block;
  952. width: 100px;
  953. height: 44px;
  954. line-height: 44px;
  955. text-align: center;
  956. font-size: 28px;
  957. background: rgba(0, 82, 217, 0.1);
  958. border-radius: 4px;
  959. color: $theme-color;
  960. }
  961. .week{
  962. color: $font-success;
  963. background: rgba(43, 164, 113, 0.1);
  964. }
  965. .day{
  966. color: $theme-warning;
  967. background: rgba(227, 115, 24, 0.1);
  968. }
  969. font-size: 32px;
  970. line-height: 44px;
  971. margin: 0;
  972. }
  973. .inline-title{
  974. margin-left: -14px;
  975. }
  976. .des{
  977. margin-top: 10px;
  978. margin-bottom: 20px;
  979. font-size: 28px;
  980. color: $font-grey;
  981. min-height: 60px;
  982. }
  983. .bot-info{
  984. display: flex;
  985. justify-content: space-between;
  986. align-items: center;
  987. color: $font-grey;
  988. font-size: 28px;
  989. .time{
  990. flex: 1;
  991. }
  992. .active-status{
  993. color: $font-success;
  994. }
  995. .read-count{
  996. color: $theme-warning;
  997. margin-right: 30px;
  998. span{
  999. display: inline-block;
  1000. margin: 0 10px;
  1001. }
  1002. }
  1003. }
  1004. }
  1005. }
  1006. .classify-name {
  1007. padding: 30px 34px;
  1008. color: #666;
  1009. }
  1010. .report-item-action-box{
  1011. .title{
  1012. padding: 30px 32px;
  1013. font-weight: 700;
  1014. text-align: center;
  1015. background: #eee;
  1016. }
  1017. .item{
  1018. text-align: center;
  1019. line-height: 48PX;
  1020. font-size: 32px;
  1021. border-top: 1px solid $border-color;
  1022. }
  1023. }
  1024. .calendar-box{
  1025. :deep(.van-calendar__header-title){
  1026. height: auto;
  1027. min-height: var(--van-calendar-header-title-height);
  1028. }
  1029. :deep(.van-calendar__header){
  1030. box-shadow: none;
  1031. }
  1032. .time-type-box{
  1033. font-weight: normal;
  1034. text-align: left;
  1035. padding-left: 32px;
  1036. box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.08);
  1037. .item{
  1038. display: inline-block;
  1039. margin-right: 40px;
  1040. color: $font-grey;
  1041. position: relative;
  1042. &.active{
  1043. color: #333;
  1044. &::after{
  1045. content: '';
  1046. width: 30PX;
  1047. height: 4PX;
  1048. background-color: $theme-color;
  1049. position: absolute;
  1050. bottom: 0;
  1051. left: 50%;
  1052. border-radius: 2px;
  1053. transform: translateX(-50%);
  1054. }
  1055. }
  1056. }
  1057. }
  1058. }
  1059. .upload-audio-wrap{
  1060. height: 100%;
  1061. position: relative;
  1062. overflow: hidden;
  1063. padding: $page-padding;
  1064. p{
  1065. color: rgba(0, 0, 0, 0.6);
  1066. padding-bottom: 32px;
  1067. border-bottom: 1px solid $border-color;
  1068. margin-bottom: 32px;
  1069. word-wrap: break-word;
  1070. }
  1071. .bot-btns{
  1072. // width: 100%;
  1073. position: absolute;
  1074. bottom: 0;
  1075. padding: 20px 0;
  1076. text-align: center;
  1077. .bot-btn{
  1078. width: 315px;
  1079. margin: 0 10px;
  1080. }
  1081. }
  1082. }
  1083. @media screen and (min-width:$media-width){
  1084. .add-report-btn{
  1085. svg{
  1086. width: 14px;
  1087. height: 14px;
  1088. }
  1089. }
  1090. .sticky-box{
  1091. top: 60px;
  1092. .bot-btn-box{
  1093. padding: 32px;
  1094. justify-content: flex-end;
  1095. .btn{
  1096. width: 120px;
  1097. height: 40px;
  1098. border-radius: 6px;
  1099. font-size: 16px;
  1100. margin-left: 20px;
  1101. }
  1102. }
  1103. .frequency-opt-box{
  1104. ul{
  1105. padding: 32px;
  1106. }
  1107. .item{
  1108. width: 100px;
  1109. height: 40px;
  1110. margin-left: 6px;
  1111. margin-right: 6px;
  1112. margin-bottom: 12px;
  1113. border-radius: 6px;
  1114. }
  1115. }
  1116. .report-status-box{
  1117. ul{
  1118. padding: 32px;
  1119. }
  1120. .status-item{
  1121. line-height: 40px;
  1122. border-radius: 6px;
  1123. margin-bottom: 12px;
  1124. }
  1125. }
  1126. .clear-filter-box{
  1127. padding: 0 17px;
  1128. height: 42px;
  1129. font-size: 14px;
  1130. .rocket{
  1131. width: 24px;
  1132. height: 24px;
  1133. }
  1134. .close-icon{
  1135. right: 17px;
  1136. }
  1137. }
  1138. }
  1139. .top-box{
  1140. padding: 15px;
  1141. .menu-icon{
  1142. width: 40px;
  1143. height: 40px;
  1144. svg{
  1145. width: 28px;
  1146. height: 28px;
  1147. }
  1148. }
  1149. }
  1150. .list-wrap{
  1151. padding: 30px;
  1152. .item{
  1153. padding: 20px;
  1154. margin-bottom: 20px;
  1155. border-radius: 4px;
  1156. .title{
  1157. font-size: 16px;
  1158. line-height: 22px;
  1159. .tag{
  1160. width: 50px;
  1161. height: 22px;
  1162. line-height: 22px;
  1163. font-size: 14px;
  1164. border-radius: 2px;
  1165. }
  1166. }
  1167. .inline-title{
  1168. margin-left: -14px;
  1169. }
  1170. .des{
  1171. margin-top: 5px;
  1172. margin-bottom: 10px;
  1173. font-size: 14px;
  1174. min-height: 30px;
  1175. }
  1176. .bot-info{
  1177. font-size: 14px;
  1178. }
  1179. }
  1180. }
  1181. .bot-btns{
  1182. bottom: 24px;
  1183. }
  1184. .report-item-action-box{
  1185. .title{
  1186. padding: 10px 16px;
  1187. }
  1188. .item{
  1189. font-size: 16px;
  1190. }
  1191. }
  1192. .classify-name {
  1193. padding: 15px;
  1194. }
  1195. }
  1196. </style>