浏览代码

战研报告

Karsa 6 月之前
父节点
当前提交
225ad1d7fe

+ 97 - 0
src/api/reportExternal.js

@@ -0,0 +1,97 @@
+import { get,post } from "./index";
+
+export const reportExternalInterface = {
+  /**
+   * 文档分类列表
+   * @param {*} params 
+   * @returns 
+   */
+  getClasssify:params=>{
+    return get('/document_manage/document/classify/list',params)
+  },
+
+  /**
+   * 
+   * @param {*} params 
+   * @returns 
+   */
+  getPermission: params => {
+    return get('/document_manage/document/variety/list',params)
+  },
+
+  /**
+   * 文档报告列表 
+   * @param {*} params 
+   * DocumentType  ChartPermissionIdList ClassifyIdList Keyword OrderField OrderType PageSize CurrentIndex
+   * @returns 
+   */
+  getDocList: params => {
+    return get('/document_manage/document/report/list',params)
+  },
+
+  /**
+   * 睿思报告列表
+   * @param {*} params 
+   * @returns 
+   */
+  getRiseReportList: params => {
+    return get('/document_manage/document/rui/si/report/list',params)
+  },
+
+  /**
+   * 睿思报告详情
+   * @param {*} params 
+   * @returns 
+   */
+  getRiseDetail: params => {
+    return get('/document_manage/document/rui/si/detail',params)
+  },
+
+  /**
+   * 文档报告详情
+   * @param {*} params 
+   * @returns 
+   */
+  getDocDetail: params => {
+    return get('/document_manage/document/detail',params)
+  },
+
+  /**
+   * 收藏分类 ClassifyId
+   * @param {*} params 
+   * @returns 
+   */
+  collectClassify: params => {
+    return post('/document_manage/document/collect/classify',params)
+  },
+
+  /**
+   * 新建文档报告
+   * @param {*} params 
+   * Source Title Abstract ClassifyId ClassifyName Content AttachmentList
+   * @returns 
+   */
+  addReport: params => {
+    return post('/document_manage/document/save',params)
+  },
+
+  /**
+   * 编辑报告
+   * @param {*} params 
+   * OutsideReportId Source Title Abstract ClassifyId ClassifyName Content AttachmentList
+   * @returns 
+   */
+  editReport: params => {
+    return post('/document_manage/document/update',params)
+  },
+  
+  /**
+   * 删除报告
+   * @param {*} params  OutsideReportId
+   * @returns 
+   */
+  delReport: params => {
+    return post('/document_manage/document/delete',params)
+  }
+
+}

+ 3 - 0
src/assets/svg/cancel_collect_ico.svg

@@ -0,0 +1,3 @@
+<svg width="36" height="37" viewBox="0 0 36 37" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M33.6336 24.3152H28.0502V18.7317C28.0502 18.5398 27.8931 18.3828 27.7012 18.3828H26.3053C26.1134 18.3828 25.9564 18.5398 25.9564 18.7317V24.3152H20.373C20.181 24.3152 20.024 24.4722 20.024 24.6641V26.06C20.024 26.2519 20.181 26.4089 20.373 26.4089H25.9564V31.9924C25.9564 32.1843 26.1134 32.3413 26.3053 32.3413H27.7012C27.8931 32.3413 28.0502 32.1843 28.0502 31.9924V26.4089H33.6336C33.8255 26.4089 33.9826 26.2519 33.9826 26.06V24.6641C33.9826 24.4722 33.8255 24.3152 33.6336 24.3152ZM11.8408 7.09378C13.8648 7.09378 15.7841 7.87895 17.2497 9.29226L17.9826 10.0076L18.7154 9.29226C20.181 7.87895 22.1003 7.09378 24.1243 7.09378C28.3991 7.09378 31.8888 10.5834 31.8888 14.8582C31.8888 15.4864 31.7666 16.132 31.5398 16.8124C31.5398 16.8124 31.4351 17.1265 31.4351 17.301C31.4351 17.8768 31.9062 18.3479 32.482 18.3479C32.988 18.3479 33.3544 17.8419 33.5114 17.4929C33.651 17.1788 34 15.7306 34 14.8582C34 9.41439 29.5856 5 24.1418 5C21.8909 5 19.7448 5.75027 18 7.14613C16.2552 5.75027 14.1091 5 11.8582 5C6.41439 5 2 9.41439 2 14.8582C2 21.8026 13.3588 29.8637 16.8135 32.1494C16.831 32.1668 16.8659 32.1843 16.8659 32.1843C16.8659 32.1843 17.2148 32.3413 17.4068 32.3413C17.9826 32.3413 18.4537 31.8702 18.4537 31.2944C18.4537 30.928 18.2617 30.5965 17.9651 30.422C13.6205 27.6303 4.05889 20.3719 4.05889 14.8582C4.07634 10.5834 7.56598 7.09378 11.8408 7.09378Z" fill="#086CE0"/>
+</svg>

+ 3 - 0
src/assets/svg/collect_ico.svg

@@ -0,0 +1,3 @@
+<svg width="36" height="37" viewBox="0 0 36 37" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M25.0021 4C21.5442 4 19.0672 7.11589 17.9997 8.76388C16.931 7.11589 14.4552 4 10.9974 4C6.03545 4 2 8.47141 2 13.967C2 16.5367 3.74303 20.2207 5.8589 22.1488C8.78582 25.9093 17.0143 32.6788 18.0301 32.6788C19.0638 32.6788 27.1157 26.0408 30.0955 22.1938C32.2485 20.232 34 16.5429 34 13.967C34 8.47137 29.9639 4 25.0021 4Z" fill="#086CE0"/>
+</svg>

+ 9 - 0
src/assets/svg/file_doc.svg

@@ -0,0 +1,9 @@
+<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M48.5078 5.25H18.4766C16.1094 5.25 14.1875 7.20313 14.1875 9.61719V70.7656C14.1875 73.1797 16.1094 75.1328 18.4766 75.1328H61.3672C63.7344 75.1328 65.6563 73.1797 65.6563 70.7656V22.7188L48.5078 5.25Z" fill="#398FFF"/>
+<path d="M62.6562 72.3359H17.1953V8.57031H46.8516V25.6719H62.6562V72.3359Z" fill="white"/>
+<path d="M62.6563 72.0781H17.1953V8.3125H46.8516V25.4062H62.6563V72.0781Z" fill="#57A7FF"/>
+<path d="M51.3594 50.9185H53.4186L55.8378 54.5473L58.257 50.9185H60.3162L56.8458 55.8865L60.5466 61.2001H58.4874L55.8378 57.2257L53.1882 61.2001H51.129L54.801 55.8865L51.3594 50.9185Z" fill="white"/>
+<path d="M45.9822 50.7168C47.1918 50.7168 48.1998 51.0336 48.9774 51.6672C49.7262 52.272 50.1726 53.1072 50.331 54.144H48.6894C48.5166 53.4672 48.1998 52.9776 47.7246 52.6608C47.2638 52.344 46.6734 52.2 45.9534 52.2C44.8734 52.2 44.067 52.56 43.5198 53.3088C43.0158 53.9712 42.771 54.8928 42.771 56.0736C42.771 57.2832 43.0158 58.2192 43.5054 58.8672C44.0382 59.5584 44.8734 59.9184 45.9966 59.9184C46.731 59.9184 47.3358 59.7312 47.7966 59.3856C48.2862 58.9968 48.6318 58.4064 48.8334 57.6288H50.475C50.2446 58.8384 49.7118 59.7744 48.8622 60.4512C48.0702 61.0848 47.1198 61.4016 46.011 61.4016C44.2974 61.4016 43.0158 60.8544 42.1806 59.7888C41.4462 58.8672 41.0862 57.6288 41.0862 56.0736C41.0862 54.5472 41.4606 53.2944 42.2238 52.344C43.0878 51.2496 44.3406 50.7168 45.9822 50.7168Z" fill="white"/>
+<path d="M34.9173 50.7168C36.4869 50.7168 37.7253 51.2208 38.6325 52.2432C39.4965 53.208 39.9285 54.4896 39.9285 56.0736C39.9285 57.6576 39.4965 58.9248 38.6325 59.8896C37.7253 60.8976 36.4869 61.4016 34.9173 61.4016C33.3333 61.4016 32.0949 60.8832 31.2021 59.8752C30.3381 58.896 29.9205 57.6288 29.9205 56.0736C29.9205 54.504 30.3381 53.2368 31.2021 52.2576C32.0949 51.2208 33.3333 50.7168 34.9173 50.7168ZM34.9173 52.2C33.8517 52.2 33.0309 52.56 32.4405 53.28C31.8789 53.9712 31.6053 54.8928 31.6053 56.0736C31.6053 57.24 31.8789 58.1616 32.4405 58.8528C33.0165 59.5584 33.8517 59.9184 34.9173 59.9184C35.9829 59.9184 36.8037 59.5728 37.3797 58.896C37.9413 58.2192 38.2293 57.2832 38.2293 56.0736C38.2293 54.864 37.9413 53.9136 37.3797 53.2224C36.8037 52.5312 35.9829 52.2 34.9173 52.2Z" fill="white"/>
+<path d="M19.9885 50.9185H23.7469C25.4173 50.9185 26.6701 51.3793 27.5341 52.3009C28.3549 53.1649 28.7725 54.4177 28.7725 56.0593C28.7725 57.6865 28.3549 58.9393 27.5341 59.8177C26.6701 60.7393 25.4173 61.2001 23.7469 61.2001H19.9885V50.9185ZM21.6733 52.3585V59.7601H23.4301C24.7117 59.7601 25.6477 59.4577 26.2381 58.8673C26.8141 58.2625 27.1021 57.3265 27.1021 56.0593C27.1021 54.7633 26.8141 53.8129 26.2381 53.2369C25.6477 52.6465 24.7117 52.3585 23.4301 52.3585H21.6733Z" fill="white"/>
+</svg>

+ 8 - 0
src/assets/svg/file_img.svg

@@ -0,0 +1,8 @@
+<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M48.5078 5.25H18.4766C16.1094 5.25 14.1875 7.20313 14.1875 9.61719V70.7656C14.1875 73.1797 16.1094 75.1328 18.4766 75.1328H61.3672C63.7344 75.1328 65.6563 73.1797 65.6563 70.7656V22.7188L48.5078 5.25Z" fill="#868EE9"/>
+<path d="M62.6562 72.3359H17.1953V8.57031H46.8516V25.6719H62.6562V72.3359Z" fill="white"/>
+<path d="M62.6563 72.0781H17.1953V8.3125H46.8516V25.4062H62.6563V72.0781Z" fill="#B1B9F6"/>
+<path d="M49.6212 50.7168C50.946 50.7168 51.9828 51.0048 52.746 51.5952C53.4804 52.1712 53.9412 53.0208 54.1284 54.1728H52.4292C52.2852 53.5104 51.9684 53.0208 51.5076 52.6896C51.0324 52.3584 50.3988 52.2 49.6212 52.2C48.6564 52.2 47.8932 52.5168 47.3316 53.1792C46.7124 53.8704 46.41 54.8352 46.41 56.1024C46.41 57.312 46.6836 58.248 47.2308 58.896C47.8212 59.5872 48.7428 59.9328 49.9956 59.9328C50.4852 59.9328 50.946 59.8752 51.378 59.76C51.7812 59.6448 52.1412 59.4864 52.4868 59.2848V57.168H49.7652V55.728H54.1716V60.0768C53.6244 60.5088 53.0052 60.8256 52.2996 61.056C51.5508 61.2864 50.73 61.4016 49.8084 61.4016C48.1668 61.4016 46.8996 60.8832 45.9924 59.8464C45.1428 58.8816 44.7252 57.6288 44.7252 56.1024C44.7252 54.5616 45.1428 53.2944 45.9924 52.3008C46.8852 51.2352 48.0948 50.7168 49.6212 50.7168Z" fill="white"/>
+<path d="M34.6103 50.9185H36.2951L41.3783 58.3345H41.4359V50.9185H43.1351V61.2001H41.4935L36.3527 53.6833H36.2951V61.2001H34.6103V50.9185Z" fill="white"/>
+<path d="M25.1744 50.9185H29.4368C31.9136 50.9185 33.1664 51.9697 33.1664 54.0721C33.1664 56.1889 31.9136 57.2545 29.408 57.2545H26.8592V61.2001H25.1744V50.9185ZM26.8592 52.3585V55.8145H29.3072C30.056 55.8145 30.6032 55.6705 30.9488 55.4113C31.2944 55.1377 31.4672 54.6913 31.4672 54.0721C31.4672 53.4529 31.28 53.0209 30.9344 52.7617C30.5888 52.4881 30.0416 52.3585 29.3072 52.3585H26.8592Z" fill="white"/>
+</svg>

+ 8 - 0
src/assets/svg/file_pdf.svg

@@ -0,0 +1,8 @@
+<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M48.5078 5.25H18.4766C16.1094 5.25 14.1875 7.20313 14.1875 9.61719V70.7656C14.1875 73.1797 16.1094 75.1328 18.4766 75.1328H61.3672C63.7344 75.1328 65.6563 73.1797 65.6563 70.7656V22.7188L48.5078 5.25Z" fill="#FF4242"/>
+<path d="M62.6562 72.3359H17.1953V8.57031H46.8516V25.6719H62.6562V72.3359Z" fill="white"/>
+<path d="M62.6563 72.0781H17.1953V8.3125H46.8516V25.4062H62.6563V72.0781Z" fill="#FF6464"/>
+<path d="M46.5174 50.9185H53.5302V52.3585H48.2022V55.2097H53.2278V56.6497H48.2022V61.2001H46.5174V50.9185Z" fill="white"/>
+<path d="M36.1533 50.9185H39.9117C41.5821 50.9185 42.8349 51.3793 43.6989 52.3009C44.5197 53.1649 44.9373 54.4177 44.9373 56.0593C44.9373 57.6865 44.5197 58.9393 43.6989 59.8177C42.8349 60.7393 41.5821 61.2001 39.9117 61.2001H36.1533V50.9185ZM37.8381 52.3585V59.7601H39.5949C40.8765 59.7601 41.8125 59.4577 42.4029 58.8673C42.9789 58.2625 43.2669 57.3265 43.2669 56.0593C43.2669 54.7633 42.9789 53.8129 42.4029 53.2369C41.8125 52.6465 40.8765 52.3585 39.5949 52.3585H37.8381Z" fill="white"/>
+<path d="M26.7174 50.9185H30.9798C33.4566 50.9185 34.7094 51.9697 34.7094 54.0721C34.7094 56.1889 33.4566 57.2545 30.951 57.2545H28.4022V61.2001H26.7174V50.9185ZM28.4022 52.3585V55.8145H30.8502C31.599 55.8145 32.1462 55.6705 32.4918 55.4113C32.8374 55.1377 33.0102 54.6913 33.0102 54.0721C33.0102 53.4529 32.823 53.0209 32.4774 52.7617C32.1318 52.4881 31.5846 52.3585 30.8502 52.3585H28.4022Z" fill="white"/>
+</svg>

+ 9 - 0
src/assets/svg/file_xlsx.svg

@@ -0,0 +1,9 @@
+<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M48.5078 5.25H18.4766C16.1094 5.25 14.1875 7.20313 14.1875 9.61719V70.7656C14.1875 73.1797 16.1094 75.1328 18.4766 75.1328H61.3672C63.7344 75.1328 65.6563 73.1797 65.6563 70.7656V22.7188L48.5078 5.25Z" fill="#53DD76"/>
+<path d="M62.6562 72.3359H17.1953V8.57031H46.8516V25.6719H62.6562V72.3359Z" fill="white"/>
+<path d="M62.6563 72.0781H17.1953V8.3125H46.8516V25.4062H62.6563V72.0781Z" fill="#5BE873"/>
+<path d="M49.0532 50.9185H51.1124L53.5316 54.5473L55.9508 50.9185H58.01L54.5396 55.8865L58.2404 61.2001H56.1812L53.5316 57.2257L50.882 61.2001H48.8228L52.4948 55.8865L49.0532 50.9185Z" fill="white"/>
+<path d="M44.0079 50.7168C45.2175 50.7168 46.1679 50.9616 46.8447 51.4656C47.5647 51.9984 47.9823 52.8336 48.0831 53.9568H46.4127C46.2687 53.3232 45.9951 52.8624 45.6207 52.5888C45.2463 52.3008 44.6703 52.1712 43.9215 52.1712C43.2735 52.1712 42.7839 52.2576 42.4383 52.4448C42.0063 52.6608 41.8047 53.0208 41.8047 53.5104C41.8047 53.9424 42.0351 54.3024 42.5247 54.5616C42.7407 54.6768 43.3311 54.8928 44.2815 55.1952C45.6783 55.6272 46.5711 55.9728 46.9743 56.2032C47.8671 56.736 48.3135 57.4704 48.3135 58.4208C48.3135 59.3424 47.9535 60.0768 47.2335 60.6096C46.5135 61.128 45.4911 61.4016 44.1807 61.4016C42.9135 61.4016 41.9199 61.1568 41.2143 60.6672C40.3503 60.0624 39.8751 59.112 39.8031 57.8016H41.4735C41.5887 58.5792 41.8623 59.1408 42.3087 59.472C42.7119 59.76 43.3311 59.9184 44.1807 59.9184C44.9295 59.9184 45.5343 59.7888 45.9663 59.544C46.3983 59.2848 46.6287 58.9536 46.6287 58.5216C46.6287 57.9744 46.2975 57.5424 45.6639 57.2256C45.4623 57.1248 44.7999 56.8944 43.6623 56.5488C42.3951 56.1456 41.6031 55.8576 41.3007 55.6848C40.5087 55.2096 40.1199 54.5184 40.1199 53.6112C40.1199 52.704 40.4943 51.984 41.2719 51.4656C41.9919 50.9616 42.8991 50.7168 44.0079 50.7168Z" fill="white"/>
+<path d="M31.8572 50.9185H33.5276V59.7601H39.086V61.2001H31.8572V50.9185Z" fill="white"/>
+<path d="M21.5891 50.9185H23.6483L26.0675 54.5473L28.4867 50.9185H30.5459L27.0755 55.8865L30.7763 61.2001H28.7171L26.0675 57.2257L23.4179 61.2001H21.3587L25.0307 55.8865L21.5891 50.9185Z" fill="white"/>
+</svg>

+ 3 - 0
src/assets/svg/link_ico.svg

@@ -0,0 +1,3 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M24.2538 7.71181C22.6759 6.15311 20.1356 6.16088 18.5672 7.7292L4.1481 22.1483L2.73389 20.7341L17.153 6.31499C19.499 3.96899 23.299 3.95737 25.6593 6.28897C28.0401 8.64083 28.0519 12.4811 25.6855 14.8475L14.0055 26.5275C12.5344 27.9985 10.1493 27.9985 8.67823 26.5274C7.20715 25.0564 7.20715 22.6713 8.67823 21.2002L20.0261 9.85228L21.4403 11.2665L10.0924 22.6144C9.40241 23.3044 9.40241 24.4232 10.0924 25.1132C10.7825 25.8033 11.9013 25.8033 12.5913 25.1132L24.2713 13.4333C25.8532 11.8513 25.8454 9.28405 24.2538 7.71181Z" fill="#999999" fill-opacity="0.9"/>
+</svg>

+ 432 - 291
src/views/externalReport/List.vue

@@ -1,67 +1,101 @@
 <script setup name="ReportList">
 import {computed, nextTick, onMounted, reactive,ref} from 'vue'
 import apiReport from '@/api/report'
-import {getSystemInfo} from '@/api/common'
+import {reportExternalInterface} from '@/api/reportExternal'
 import moment from 'moment'
-// import ListClassify from '../recomponents/ListClassify.vue'
+import _ from 'lodash'
 import { showToast,showDialog,Dialog } from 'vant';
-import { useRouter } from 'vue-router';
-import {useCachedViewsStore} from '@/store/modules/cachedViews'
-import {reportManageBtn,useAuthBtn} from '@/hooks/useAuthBtn'
+import { useRouter,useRoute } from 'vue-router';
 
-const cachedViewsStore=useCachedViewsStore()
+const router = useRouter()
+const route = useRoute()
 
-const {checkAuthBtn} = useAuthBtn()
 
-
-const router=useRouter()
+const isReportWarResearch = computed(() => {
+    return route.path === '/war_research_report/list'
+})
+//睿思
+const isRise = computed(()=> {
+    return isReportWarResearch.value && listState.reportType===2
+})
 //是否显示一键清空选项
 const showCleanFilterBox=computed(()=>{
     if(isClickClose.value) return false
     if(
-        listState.ClassifyNameFirst||
-        listState.ClassifyNameFirst||
-        listState.EndDate||
-        listState.MsgIsSend||
-        listState.publishStatus
+        listState.classifys.length||
+        listState.permissions.length
     ) return true
 })
+
+
 const isClickClose=ref(false)//是否点击过关闭一键清空模块
 function handleCleanFilter(){
-    listState.ClassifyNameFirst=''
-    listState.ClassifyNameSecond=''
-    listState.ClassifyNameThird=''
-    listState.classifyIds=[]
-
-    listState.MsgIsSend=''
-    listState.StartDate=''
-    listState.EndDate=''
-    listState.timeType='publish_time'
-    listState.publishStatus=''
+    listState.classifys=[]
+    listState.permissions=[]
+
+    listState.keyWord=''
     refreshList()
 }
 
-const statusMap = new Map([
-    [1,{ bg:'#EEEEEE', color:'#333', msg:'未发布'}],
-    [2,{ bg:'rgba(0, 82, 217, 0.1)', color:'#0052D9', msg:'已发布'}],
-    [3,{ bg:'#FFF1E9', color:'#BE5A00', msg:'待提交'}],
-    [4,{ bg:'#FFF1E9', color:'#BE5A00', msg:'待审批'}],
-    [5,{ bg:'#FFF0ED', color:'#AD352F', msg:'已驳回'}],
-    [6,{ bg:'#E3F9E9', color:'#006C45', msg:'已通过'}]
-])
+
+
+const classifyOptions = ref([])
+const permissionOptions = ref([])
+async function getClassify() {
+
+    const res = await reportExternalInterface.getClasssify()
+    if (res.Ret !== 200) return 
+
+    classifyOptions.value = res.Data||[];
+    filterEmpty(classifyOptions.value)
+}
+getClassify()
+function filterEmpty(arr) {
+    arr.length && arr.forEach(item => {
+        item.Children.length && filterEmpty(item.Children)
+        if(!item.Children.length) {
+            item.Children = null
+        }
+    })
+}
+async function getPermissionList() {
+    const res = await reportExternalInterface.getPermission()
+
+    if(res.Ret !== 200) return
+    permissionOptions.value = res.Data || []
+    filterEmpty(permissionOptions.value)
+}
+getPermissionList()
+
+
+//收藏分类 只用在战研报告
+const collectClassifyOpts = computed(() => {
+    console.log(findCollectItem(classifyOptions.value))
+    return isReportWarResearch.value ? findCollectItem(classifyOptions.value) : []
+})
+function findCollectItem(arr) {
+    let collectArr = []
+    function traverse(node) {
+        if (node.IsCollect === 1) {
+            collectArr.push(node);
+        }
+        if (node.Children && node.Children.length) {
+            node.Children.forEach(child => traverse(child));
+        }
+    }
+
+    arr.forEach(item => traverse(item));
+
+    return collectArr
+}
+
 
 
 const listState = reactive({
-    listType: '3',
-    publishStatus:'',
-    MsgIsSend:'',
-    timeType: 'publish_time',
-    classifyIds: [],
-    ClassifyNameFirst:'',
-    ClassifyNameSecond:'',
-    ClassifyNameThird:'',
-    StartDate:'',
-    EndDate:'',
+    reportType: 1,
+    classifys: collectClassifyOpts.value.map(_ => _.Id) || [],   
+    permissions:[],
+    keyWord:'',
     list:[],
     page:0,
     pageSize:20,
@@ -69,32 +103,27 @@ const listState = reactive({
     loading:false
 })
 async function getList(){
-    const res=await apiReport.getList({
-        CurrentIndex:listState.page,
-        PageSize:listState.pageSize,
-        StartDate:listState.StartDate,
-        EndDate:listState.EndDate,
-        // ClassifyNameFirst:listState.ClassifyNameFirst,
-        // ClassifyNameSecond:listState.ClassifyNameSecond,
-        ClassifyIdFirst: listState.classifyIds
-          ? listState.classifyIds[0]
-          : "",
-        ClassifyIdSecond:
-          listState.classifyIds &&
-          listState.classifyIds.length > 1
-            ? listState.classifyIds[1]
-            : "",
-        ClassifyIdThird:
-          listState.classifyIds &&
-          listState.classifyIds.length > 2
-            ? listState.classifyIds[2]
-            : "",
-        MsgIsSend:listState.MsgIsSend,
-        TimeType:listState.timeType,
-        State:listState.publishStatus,
-        FilterReportType: listState.listType
-    })
-    if(res.Ret===200){
+    const res = isRise.value
+        ? await reportExternalInterface.getRiseReportList({
+            Keyword: listState.keyWord,
+            PageSize: listState.pageSize,
+            CurrentIndex: listState.page,
+            ClassifyIdList:  listState.classifys.join(','),
+            OrderField: '',
+            OrderType: ''
+          })
+        : await reportExternalInterface.getDocList({
+            DocumentType: isReportWarResearch.value ? 2 : 1,
+            ChartPermissionIdList: listState.permissions.join(','),
+            ClassifyIdList:  listState.classifys.join(','),
+            Keyword: listState.keyWord,
+            PageSize: listState.pageSize,
+            CurrentIndex: listState.page,
+            OrderField: '',
+            OrderType: ''
+          })
+
+        if(res.Ret !== 200) return 
         listState.loading=false
         if(!res.Data){
             listState.finished=true
@@ -104,7 +133,6 @@ async function getList(){
         listState.finished=res.Data.Paging.IsEnd
         const arr=res.Data.List||[]
         listState.list= listState.page < 2 ? arr : [...listState.list,...arr]
-    }
 }
 function onLoad(){
     listState.page++
@@ -113,61 +141,94 @@ function onLoad(){
 function refreshList(){
     document.documentElement.scrollTop=0
     listState.page=1
-    // listState.list=[]
+    listState.list=[]
     listState.finished=false
     getList()
 }
-
-
-
-
-
-const selectClassifyName = computed(() => {
-    return `${listState.ClassifyNameFirst}${listState.ClassifyNameSecond?('/'+listState.ClassifyNameSecond):''}${listState.ClassifyNameThird?('/'+listState.ClassifyNameThird):''}`
-})
-// 分类弹窗
-const showClassify=ref(false)
-// 分类筛选
-function handleConfirmClassify(arr){
-    console.log(arr)
-    listState.ClassifyNameFirst=arr[0]?.text;
-    listState.ClassifyNameSecond=arr[1]?.text;
-    listState.ClassifyNameThird=arr[2]?.text;
-    listState.classifyIds = arr.map(_=>_.id);
+function handleReportChange() {
+    listState.keyWord = '';
+    listState.classifys = [];
+    listState.permissions = [];
+    showMoreFilter.value = false
     refreshList()
-    showClassify.value=false
 }
 
 
-// 跳转详情
-function goDetail(item){
-    console.log(item);
-    //若没有预览权限,则不跳转
-    if(!checkAuthBtn(reportManageBtn.reportManage_reportView)) return 
-    router.push({
-        path:"/report/preview",
-        query:{
-            id:item.Id
-        }
+
+const showMoreFilter=ref(false)
+const permissionDropMenuIns = ref(null)
+function handleShowFilter() {
+    selectPermissionVal.value=_.cloneDeep(listState.permissions)
+    selectClassifyVal.value=_.cloneDeep(listState.classifys)
+    showMoreFilter.value=true
+    nextTick(()=>{
+        setTimeout(() => {
+            permissionDropMenuIns.value?.toggle(true);
+        }, 100);
     })
 }
 
+const selectPermissionVal = ref([])
+function handleChangeSelectPermission(item) {
+    selectPermissionVal.value.includes(item.chart_permission_id) 
+        ? selectPermissionVal.value.splice(selectPermissionVal.value.findIndex(_ => _===item.chart_permission_id),1)
+        : selectPermissionVal.value.push(item.chart_permission_id)
 
+        console.log(selectPermissionVal.value)
+}
+function handleConfirmPermission() {
+    listState.permissions = selectPermissionVal.value;
+    refreshList()
+    showMoreFilter.value=false
+}
 
 
+const selectClassifyVal = ref([])
+function handleChangeClassify(item) {
+    if(item.Children?.length) {
+        item.isSlide = !item.isSlide 
+    }else {
+        selectClassifyVal.value.includes(item.Id) 
+        ? selectClassifyVal.value.splice(selectClassifyVal.value.findIndex(_ => _===item.Id),1)
+        : selectClassifyVal.value.push(item.Id)
+    }
+}
+function handleConfirmClassify() {
+    listState.classifys = selectClassifyVal.value;
+    refreshList()
+    showMoreFilter.value=false
+}
+async function handleChangeCollect(item) {
+    const res = await reportExternalInterface.collectClassify({
+        ClassifyId: item.Id
+    })
 
-async function goSearch(){
-    // 删除报告搜索页的缓存
-    await cachedViewsStore.removeCaches('ReportSearch')
-    router.push('/report/search')
+    if(res.Ret !== 200) return
+    showToast('操作成功')
+    item.IsCollect = item.IsCollect?0:1
 }
 
 
 
-onMounted(async ()=>{
-    getEtaConfig()
-    getSystemInfoFun()
-})
+// 跳转详情
+function goDetail(item){
+    console.log(item);
+    if(isRise.value) { //普通报告预览
+        router.push({
+            path:"/report/preview",
+            query:{
+                id:item.Id
+            }
+        })
+    }else {
+        router.push({
+            path:"/external_report/preview",
+            query:{
+                id:item.OutsideReportId
+            }
+        })
+    }
+}
 
 </script>
 
@@ -182,24 +243,29 @@ onMounted(async ()=>{
                 </span>
                 <van-icon name="cross" class="close-icon" @click="isClickClose=true"/>
             </div>
+
+            <van-tabs 
+                v-if="isReportWarResearch"
+                v-model:active="listState.reportType" 
+                type="card"
+                sticky 
+                border
+                @change="handleReportChange"
+            >
+                <van-tab title="PCI研报" :name="1"/>
+                <van-tab title="睿思研报" :name="2"/>
+            </van-tabs>
+
             <div class="top-box">
                 <van-search
+                    v-model="listState.keyWord"
                     style="flex:1"
                     shape="round"
-                    readonly 
                     placeholder="请输入报告标题或创建人"
-                    @click-input="goSearch"
+                    @search="refreshList"
                 />
-                <div :class="['menu-icon',showClassify||listState.ClassifyNameSecond?'active':'']" @click="showClassify=true">
-                    <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
-                        <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"/>
-                        <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"/>
-                        <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"/>
-                        <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"/>
-                    </svg>
-                </div>
 
-                <div 
+                <div
                     :class="['menu-icon',{
                         'active': listState.MsgIsSend||listState.publishStatus
                     }]" 
@@ -211,7 +277,168 @@ onMounted(async ()=>{
                 </div>
             </div>
 
-            <div class="classify-name" v-if="listState.classifyIds&&listState.classifyIds.length">{{ selectClassifyName }}</div>
+            <template v-if="showMoreFilter">
+                <van-dropdown-menu :close-on-click-overlay="false" :close-on-click-outside="false">
+                    <van-dropdown-item title="品种标签" ref="permissionDropMenuIns">
+                        <div class="drop-opt-box">
+                            <ul class="list">
+                                <li 
+                                    :class="['item',selectPermissionVal.includes(item.chart_permission_id)?'active':'']" 
+                                    v-for="item in permissionOptions" 
+                                    :key="item.chart_permission_id"
+                                    @click="item.isSlide = !item.isSlide"
+                                >
+                                    <div class="list-top">
+                                        <h4>{{item.chart_permission_name}}</h4>
+                                        <van-icon 
+                                            v-if="item.Children" 
+                                            :name="item.isSlide?'arrow-up':'arrow-down'" 
+                                        />
+                                    </div>
+                                    <ul class="sub-list" v-if="item.Children&&item.isSlide">
+                                        <li 
+                                            :class="['sub-item',{'active':selectPermissionVal.includes(subItem.chart_permission_id)}]" 
+                                            v-for="subItem in item.Children"
+                                            :key="subItem.chart_permission_id"
+                                            @click.stop="handleChangeSelectPermission(subItem)"
+                                        >{{subItem.chart_permission_name}}</li> 
+                                    </ul>
+                                </li>
+                                <li class="item" style="height:0"></li>
+                            </ul>
+                            <div class="bot-btn-box">
+                                <div class="btn cancel-btn" @click="showMoreFilter=false">取消</div>
+                                <div class="btn confirm-btn" @click="handleConfirmPermission">确定</div>
+                            </div>
+                        </div>
+                    </van-dropdown-item>
+                    <van-dropdown-item title="全部分类" ref="clasifyDropMenuIns">
+                        <div class="drop-opt-box classify-box">
+                            <ul class="list">
+                                <li 
+                                    :class="['item',
+                                        {'active':selectClassifyVal.includes(item.Id)},
+                                    ]" 
+                                    v-for="item in classifyOptions" 
+                                    :key="item.Id"
+                                    @click="handleChangeClassify(item)"
+                                >
+                                    <div class="list-top">
+                                        <h4>{{item.ClassifyName}}</h4>
+                                        <van-icon 
+                                            v-if="item.Children" 
+                                            :name="item.isSlide?'arrow-up':'arrow-down'" 
+                                        />
+                                        
+                                        <svg-icon
+                                            v-else-if="!item.Children&&isReportWarResearch"
+                                            :name="item.IsCollect?'collect_ico':'cancel_collect_ico'"
+                                            size="20px"
+                                            @click.stop="handleChangeCollect(item)"
+                                        />
+                                        
+                                    </div>
+                                    <ul class="classify-sub-list" v-if="item.Children&&item.isSlide">
+                                        <li 
+                                            :class="['sub-item',
+                                                {'active':selectClassifyVal.includes(subItem.Id)}
+                                            ]" 
+                                            v-for="subItem in item.Children"
+                                            :key="subItem.Id"
+                                            @click.stop="handleChangeClassify(subItem)"
+                                        >
+
+                                            <div class="list-top">
+                                                <span>{{subItem.ClassifyName}}</span>
+                                                <van-icon 
+                                                    v-if="subItem.Children" 
+                                                    :name="subItem.isSlide?'arrow-up':'arrow-down'" 
+                                                />
+                                                
+                                                <svg-icon
+                                                    v-else-if="!subItem.Children&&isReportWarResearch"
+                                                    :name="subItem.IsCollect?'collect_ico':'cancel_collect_ico'"
+                                                    size="20px"
+                                                    @click.stop="handleChangeCollect(subItem)"
+                                                />
+                                                
+                                            </div>
+
+                                            <ul class="classify-sub-list" v-if="subItem.Children&&subItem.isSlide">
+                                                <li 
+                                                    :class="['sub-item',
+                                                        {'active':selectClassifyVal.includes(thirdItem.Id)}
+                                                    ]" 
+                                                    v-for="thirdItem in subItem.Children"
+                                                    :key="thirdItem.Id"
+                                                    @click.stop="handleChangeClassify(thirdItem)"
+                                                >
+
+                                                    <div class="list-top">
+                                                        <span>{{thirdItem.ClassifyName}}</span>
+                                                        <van-icon 
+                                                            v-if="thirdItem.Children" 
+                                                            :name="thirdItem.isSlide?'arrow-up':'arrow-down'" 
+                                                        />
+                                                        
+                                                        <svg-icon
+                                                            v-else-if="!thirdItem.Children&&isReportWarResearch"
+                                                            :name="thirdItem.IsCollect?'collect_ico':'cancel_collect_ico'"
+                                                            size="20px"
+                                                            @click.stop="handleChangeCollect(thirdItem)"
+                                                        />
+                                                        
+                                                    </div>
+                                                </li> 
+                                            </ul>
+                                        </li> 
+                                    </ul>
+                                </li>
+                            </ul>
+                            
+                            <div class="bot-btn-box">
+                                <div class="btn cancel-btn" @click="showMoreFilter=false">取消</div>
+                                <div class="btn confirm-btn" @click="handleConfirmClassify">确定</div>
+                            </div>
+                        </div>
+                    </van-dropdown-item>
+                    <van-dropdown-item title="收藏分类" ref="collectDropMenuIns" v-if="isReportWarResearch">
+                        <div class="drop-opt-box classify-box">
+                            <ul class="list" v-if="collectClassifyOpts.length">
+                                <li 
+                                    :class="['item',
+                                        {'active':selectClassifyVal.includes(item.Id)},
+                                    ]" 
+                                    v-for="item in collectClassifyOpts" 
+                                    :key="item.Id"
+                                    @click="handleChangeClassify(item)"
+                                >
+                                    <div class="list-top">
+                                        <h4>{{item.ClassifyName}}</h4>
+
+                                        <svg-icon
+                                            :name="item.IsCollect?'collect_ico':'cancel_collect_ico'"
+                                            size="20px"
+                                            @click.stop="handleChangeCollect(item)"
+                                        />
+                                        
+                                    </div>
+                                </li>
+                            </ul>
+
+                            <div class="no-list" v-else>
+                                暂无收藏
+                            </div>         
+                            
+                            <div class="bot-btn-box">
+                                <div class="btn cancel-btn" @click="showMoreFilter=false">取消</div>
+                                <div class="btn confirm-btn" @click="handleConfirmPermission">确定</div>
+                            </div>
+                        </div>
+                    </van-dropdown-item>
+                </van-dropdown-menu>
+            </template>
+
         </div>
         <van-list
             v-model:loading="listState.loading"
@@ -229,56 +456,20 @@ onMounted(async ()=>{
                     @click="goDetail(item)"
                 >   
                     <div class="list-top">
-                        <h2 class="van-ellipsis title">
-                            <span :class="['tag',item.ChapterType]">{{['周报','晨报'].includes(item.ClassifyNameFirst)?item.ClassifyNameFirst:'研报'}}</span>
-                            {{item.Title}}
-                            <span v-if="item.CreateTime">({{item.CreateTime.substring(5,7)}}{{item.CreateTime.substring(8,10)}})</span>
-                        </h2>
-                        <div class="status">
-                            <van-tag 
-                                type="primary" 
-                                size="large"
-                                :color="statusMap.get(item.State).bg"
-                                :text-color="statusMap.get(item.State).color"
-                            >{{statusMap.get(item.State).msg}}</van-tag>
-                        </div>
+                        <h2 class="van-ellipsis title">{{item.Title}}</h2>
                     </div>
                     <p class="van-multi-ellipsis--l2 des">{{item.Abstract}}</p>
                     <div class="bot-info">
                         <div class="time">
                             <span style="margin-right:2px">{{moment(item.ModifyTime).format('YYYY-MM-DD')}}</span>
-                            <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">
-                                <path d="M13.0357 6.28571V14.7501L17.8576 19.7857L19.2213 18.422L14.9643 13.9512V6.28571H13.0357Z" fill="#0052D9"/>
-                                <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"/>
-                            </svg>
-                            <span style="margin-left:10px">{{item.AdminRealName}}</span>
-                        </div>
-                        <div class="read-count">
-                            <span>PV:{{item.Pv}}</span>
-                            <span v-permission="reportManageBtn.reportManage_reportList_uv">UV:{{item.Uv}}</span>
-                        </div>
-                        
-                        <div class="handle-icon" @click.stop="handleOptReportItem(item)">
-                            <svg width="24" height="24" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
-                                <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"/>
-                                <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"/>
-                                <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"/>
-                            </svg>
-
                         </div>
+                        <span style="margin-left:10px">{{item.SysUserName}}</span>
                     </div>
                 </li>
             </ul>
         </van-list>
     </div>
 
-    <!-- 添加报告按钮 -->
-    <div class="add-report-btn" @click="handeAddReport" v-if="isAddReportBtnShow">
-        <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
-            <path d="M12.0499 15.9499V27.5H15.9499V15.9499H27.5V12.0499H15.9499V0.5H12.0499V12.0499H0.5V15.9499H12.0499Z" fill="white"/>
-        </svg>
-    </div>
-
 </template>
 
 <style lang="scss" scoped>
@@ -292,6 +483,12 @@ onMounted(async ()=>{
         box-shadow: none;
         border-bottom: 1px solid $border-color;
     }
+    :deep(.van-tabs) {
+        padding-top: 20px;
+    }
+    :deep(.van-tabs__nav--card) {
+        height: 70px;
+    }
     .bot-btn-box{
         border-top: 1px solid $border-color;
         padding: 32px;
@@ -316,47 +513,7 @@ onMounted(async ()=>{
             color: #fff;
         }
     }
-    .frequency-opt-box{
-        ul{
-            display: flex;
-            flex-wrap: wrap;
-            padding: 32px;
-        }
-        .item{
-            width: 200px;
-            height: 80px;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            color: rgba(0, 0, 0, 0.9);
-            margin-left: 12px;
-            margin-right: 12px;
-            margin-bottom: 24px;
-            background-color: #F3F3F3;
-            border-radius: 12px;
-        }
-        .item-active{
-            background-color: #F2F3FF;
-            color: $theme-color;
-        }
-    }
-    .report-status-box{
-        ul{
-           padding: 32px; 
-        }
-        
-        .status-item{
-            line-height: 80px;
-            border-radius: 12px;
-            background-color: #F3F3F3;
-            text-align: center;
-            margin-bottom: 24px;
-            &.active{
-                background-color: #F2F3FF;
-                color: $theme-color;
-            }
-        }
-    }
+
     .clear-filter-box{
         padding: 0 34px;
         height: 84px;
@@ -479,87 +636,58 @@ onMounted(async ()=>{
     }
 }
 
-.classify-name {
-    padding: 30px 34px;
-    color: #666;
-}
-
-.report-item-action-box{
-    .title{
-        padding: 30px 32px;
-        font-weight: 700;
-        text-align: center;
-        background: #eee;
-    }
-    .item{
-        text-align: center;
-        line-height: 48PX;
-        font-size: 32px;
-        border-top: 1px solid $border-color;
-    }
-}
-
-.calendar-box{
-    :deep(.van-calendar__header-title){
-        height: auto;
-        min-height: var(--van-calendar-header-title-height);
+.drop-opt-box {
+    /* padding: 0 30px; */
+    .list {
+        padding: 0 40px;
+        max-height: 40vh;
+        overflow: auto;
     }
-    :deep(.van-calendar__header){
-        box-shadow: none;
+    .list-top {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin: 40px 0;
+        h4 {
+            margin: 0;
+        }
     }
-    .time-type-box{
-        font-weight: normal;
-        text-align: left;
-        padding-left: 32px;
-        box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.08);
-        .item{
-            display: inline-block;
-            margin-right: 40px;
-            color: $font-grey;
-            position: relative;
-            &.active{
-                color: #333;
-                &::after{
-                    content: '';
-                    width: 30PX;
-                    height: 4PX;
-                    background-color: $theme-color;
-                    position: absolute;
-                    bottom: 0;
-                    left: 50%;
-                    border-radius: 2px;
-                    transform: translateX(-50%);
-                }
+    .sub-list {
+        display: flex;
+        flex-wrap: wrap;
+        gap: 20px;
+        .sub-item {
+            padding: 6px 20px;
+            background-color: #F8F8FA;
+            &.active {
+                color: $theme-color;
+                background-color: #F2F3FF;
             }
         }
     }
 }
-
-.upload-audio-wrap{
-    height: 100%;
-    position: relative;
-    overflow: hidden;
-    padding: $page-padding;
-    p{
-        color: rgba(0, 0, 0, 0.6);
-        padding-bottom: 32px;
-        border-bottom: 1px solid $border-color;
-        margin-bottom: 32px;
-        word-wrap: break-word;
+.classify-box {
+    .classify-sub-list {
+        .sub-item {
+            margin-left: 20px;
+        }
     }
-    .bot-btns{
-        // width: 100%;
-        position: absolute;
-        bottom: 0;
-        padding: 20px 0;
-        text-align: center;
-        .bot-btn{
-            width: 315px;
-            margin: 0 10px;
+    .active {
+        color: $theme-color;
+        position: relative;
+        &::after {
+            content: '√';
+            position: absolute;
+            left: -22px;
+            top: 0;
         }
     }
-}
 
+    .no-list {
+        text-align: center;
+        padding: 50px 0;
+    }
+}
 
 @media screen and (min-width:$media-width){
     .sticky-box{
@@ -575,29 +703,6 @@ onMounted(async ()=>{
                 margin-left: 20px;
             }
         }
-        .frequency-opt-box{
-            ul{
-                padding: 32px;
-            }
-            .item{
-                width: 100px;
-                height: 40px;
-                margin-left: 6px;
-                margin-right: 6px;
-                margin-bottom: 12px;
-                border-radius: 6px;
-            }
-        }
-        .report-status-box{
-            ul{
-                padding: 32px;
-            }
-            .status-item{
-                line-height: 40px;
-                border-radius: 6px;
-                margin-bottom: 12px;
-            }
-        }
         .clear-filter-box{
             padding: 0 17px;
             height: 42px;
@@ -610,6 +715,11 @@ onMounted(async ()=>{
                 right: 17px;
             }
         }
+
+        
+        :deep(.van-tabs__nav--card) {
+            height: 40px;
+        }
     }
     .top-box{
         padding: 15px;
@@ -655,6 +765,37 @@ onMounted(async ()=>{
         }
     }
 
+    .drop-opt-box {
+        /* padding: 0 30px; */
+        .list {
+            padding: 0 40px;
+            max-height: 40vh;
+            overflow: auto;
+        }
+        .list-top {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            margin: 40px 0;
+            h4 {
+                margin: 0;
+            }
+        }
+        .sub-list {
+            display: flex;
+            flex-wrap: wrap;
+            gap: 20px;
+            .sub-item {
+                padding: 6px 20px;
+                background-color: #F8F8FA;
+                &.active {
+                    color: $theme-color;
+                    background-color: #F2F3FF;
+                }
+            }
+        }
+    }
+
     .bot-btns{
         bottom: 24px;
     }

+ 158 - 42
src/views/externalReport/Preview.vue

@@ -2,46 +2,135 @@
 import { ref,computed, nextTick, reactive,toRefs } from 'vue'
 import { useRoute, useRouter } from "vue-router";
 import apiReport from '@/api/report'
-import {showToast} from 'vant'
-import {reportManageBtn,useAuthBtn} from '@/hooks/useAuthBtn'
+import {reportExternalInterface} from '@/api/reportExternal'
+import { showToast,FloatingPanel,FloatingBubble  } from 'vant'
+import { copyText } from 'vue3-clipboard'
+import moment from 'moment';
+import PreViewFile from './components/PreviewFile.vue'
+import {usePublicSettingStore} from '@/store/modules/publicSetting'
 
 
-const {checkAuthBtn} = useAuthBtn()
-
 const route=useRoute()
 const router=useRouter()
 
+const publicSettingStore = usePublicSettingStore()
+
+const fileLen = computed(() => {
+    return reportInfo.value?.AttachmentList.length
+})
 
 // 获取报告详情
 let reportInfo=ref(null)
-async function getChapterDetail(){
-    const res=await apiReport.getChapterDetail({ReportChapterId:Number(route.query.id)})
+async function getReportDetail(){
+    const res=await reportExternalInterface.getDocDetail({ OutsideReportId: Number(route.query.id) })
     if(res.Ret===200){
         reportInfo.value=res.Data
         document.title=res.Data.Title
     }
 }
-getChapterDetail()
+getReportDetail()
+
+const isShowPreview = ref(false)
+const previewUrl = ref('')
+function handlePreviewAttachment(row) {
+    // previewUrl.value = row.Url;
+    // isShowPreview.value = true
+    // // 预览文件
+    let href;
+    if(row.Url.endsWith('.doc') || row.Url.endsWith('.docx')||row.Url.endsWith('.xlsx')){
+        href = 'https://view.officeapps.live.com/op/view.aspx?src='+row.Url
+    }else{
+        href=row.Url
+    }
+    window.open(href, "_blank")
+}
+
+
+const linkUrl = computed(() => {
+    let str=''
+    const baseUrl= publicSettingStore.publicSetting.ReportViewUrl;
+
+    str= `${baseUrl}/reportshare_external?code=${reportInfo.value.ReportCode}&flag=& ${reportInfo.value.Title}`
+    
+    return str
+})
+function handleCopyLink() {
+    copyText(linkUrl.value,undefined,(error,event)=>{
+        if(error){
+            showToast('复制链接成功')
+
+            throw new Error('复制数据失败'+JSON.stringify(error))
+        }else{
+            showToast('复制链接成功')
+        }
+    })
+}
+
+
+function getFileIcon(name) {
+    let fileName=name.toLocaleLowerCase()
+    if(fileName.endsWith('.pdf')){
+        return 'file_pdf'
+    }else if(fileName.endsWith('.xlsx')){
+        return 'file_xlsx'
+    }else if(fileName.endsWith('.png') || fileName.endsWith('.jpg')){
+        return 'file_img'
+    }else if(fileName.endsWith('.doc') || fileName.endsWith('.docx')){
+        return 'file_doc'
+    }else {
+         return 'file_img'
+    }
+}
 </script>
 <template>
     <div class="report-detail-page" v-if="reportInfo">
         <h1 class="report-title">{{reportInfo.Title}}</h1>
         <div class="auth-box">
-            <span>{{reportInfo.Author}}</span>
-            <span v-if="[2,6].includes(reportInfo.PublishState)">{{reportInfo.PublishTime}}</span>
+            <span>{{reportInfo.SysUserName}}</span>
+            <span>{{reportInfo.CreateTime||moment().format('YYYY-MM-DD')}}</span>
         </div>
         <div class="report-abstract" v-if="reportInfo.Abstract">摘要:{{reportInfo.Abstract}}</div>
         
         <div class="report-html-wrap" v-html="reportInfo.Content"></div>
+        
+        <van-floating-panel :content-draggable="false" v-if="fileLen">
+            <div class="attachments-wrapper">
+                <div>
+                    <svg-icon name="link_ico" size="20px"></svg-icon>
+                    附件{{fileLen}}个(10MB)
+                </div>
 
+                <ul class="list-cont">
+                    <li class="item" v-for="(item,index) in reportInfo.AttachmentList" :key="index" @click="handlePreviewAttachment(item)">
+                        <svg-icon class="file-ico" :name="getFileIcon(item.Title)"></svg-icon>
+                        <div class="right-info">
+                            <p class="van-ellipsis file-name">{{item.Title}}</p>
+                            <span style="color:#999">5.0MB</span>
+                        </div>
+                    </li>
+                </ul>
+            </div>
+        </van-floating-panel>
     </div>
+
+    <van-floating-bubble 
+        icon="share" 
+        gap="10"
+        @click="handleCopyLink"
+    />
+
+    <!-- 预览-->
+    <van-popup
+        v-model:show="isShowPreview"
+        position="bottom"
+        closeable
+        :style="{ height: '100%' }"
+    >
+        <PreViewFile v-if="isShowPreview" :url="previewUrl"/>
+    </van-popup>
 </template>
 
 <style lang="scss" scoped>
-  .report-drag-item-wrap{
-        padding: 6px;
-        margin-bottom: 3px;
-    }
 .report-detail-page{
     padding: 30px 34px;
     margin-bottom: 112px;
@@ -57,8 +146,6 @@ getChapterDetail()
         font-size: $font-grey;
         font-size: 36px;
         padding-bottom: 40px;
-        border-bottom: 1px solid $border-color;
-        margin-bottom: 40px;
     }
     .report-abstract{
         font-size: 34px;
@@ -69,25 +156,46 @@ getChapterDetail()
         margin: 40px 0;
     }
 
-  
-}
-.top-stage-box{
-    .stage{
-        display: inline-block;
-        background-color: #F2F3FF;
-        border-radius: 8px;
-        height: 72px;
-        line-height: 72px;
-        padding: 0 20px;
-        font-size: 28px;
+    :deep(.van-floating-panel) {
+        box-shadow: 0 -4px 8px rgba($color: #000000, $alpha: 0.2);
     }
-    .edit-icon{
-        float: right;
-        width: 70px;
-        height: 70px;
+    .attachments-wrapper {
+        padding:20px 30px;
+        .list-cont {
+            margin-top: 15px;
+            display: flex;
+            align-items: center;
+            flex-wrap: wrap;
+            gap:20px;
+            .item{
+                width: 100%;
+                display: flex;
+                border: 1px solid #dcdcdc;
+                padding: 15px 30px;
+                border-radius: 8px;
+                overflow: hidden;
+                .file-ico {
+                    margin-right: 20px;
+                    /* font-size: 40px; */
+                    width: 80px;
+                    height: 80px;
+                    flex-shrink: 0;
+                }
+                .file-name {
+                    margin-bottom: 10px;
+                    max-width: 500px;
+                }
+
+            }
+        }
     }
 }
 
+.van-floating-bubble {
+    width: 48px;
+    height: 48px;
+}
+
 @media screen and (min-width:$media-width){
     .report-detail-page{
         max-width: 800px;
@@ -108,18 +216,26 @@ getChapterDetail()
             line-height: 27px;
             margin: 20px 0;
         }
-    }
-    .top-stage-box{
-        .stage{
-            border-radius: 4px;
-            height: 36px;
-            line-height: 36px;
-            padding: 0 10px;
-            font-size: 14px;
-        }
-        .edit-icon{
-            width: 35px;
-            height: 35px;
+
+        .attachments-wrapper {
+            padding:20px 30px;
+            .list-cont {
+                .item{
+                    max-width: 45%;
+                    padding: 10px 30px;
+                    border-radius: 4px;
+                    .file-ico {
+                        margin-right: 10px;
+                        width: 45px;
+                        height: 45px;
+                    }
+                    .file-name {
+                        margin-bottom: 10px;
+                        max-width: 250px;
+                    }
+
+                }
+            }
         }
     }
 }

+ 30 - 0
src/views/externalReport/components/PreviewFile.vue

@@ -0,0 +1,30 @@
+<script setup>
+import { ref,computed } from 'vue'
+
+const props = defineProps({
+  url: {
+    type: String
+  }
+})
+
+const linkUrl = computed(() => {
+  if(props.url.endsWith('.doc') || props.url.endsWith('.docx')||props.url.endsWith('.xlsx')){ 
+    return `https://view.officeapps.live.com/op/view.aspx?src=${props.url}`
+  }else {
+    return props.url
+  }
+  
+})
+
+</script>
+<template>
+  <div>
+    <iframe :src="linkUrl" frameborder="0"></iframe>
+  </div>
+</template>
+<style scoped lang="scss">
+  iframe {
+    width: 100%;
+    height: 100vh;
+  }
+</style>

+ 3 - 3
src/views/tabbar/Home.vue

@@ -79,7 +79,7 @@ const menuConfig=[
         key:'文档管理库',
         type:'zh',
         level:2,
-        path:'/report/list',
+        path:'/external_report/list',
         icon:getStaticImg('tabbar/icon_report.png'),
         backgroundColor:'#FFFBF6',
         show:false
@@ -87,10 +87,10 @@ const menuConfig=[
     {
         name:'战研中心研报',
         des:'',
-        key:'战研中心报',
+        key:'战研中心报',
         type:'zh',
         level:1,
-        path:'/report/list',
+        path:'/war_research_report/list',
         icon:getStaticImg('tabbar/icon_report.png'),
         backgroundColor:'#FFFBF6',
         show:false