statisticalReport.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872
  1. <template>
  2. <div style="background-color: #fff">
  3. <div class="title">2025年1月-2025年2月通报事项统计</div>
  4. <div>
  5. <el-table
  6. v-loading="isLoading"
  7. :data="tableData"
  8. border
  9. width="100%"
  10. row-key="id"
  11. :span-method="objectSpanMethod"
  12. @expand-change="expandChange"
  13. >
  14. <template v-for="item in columns">
  15. <template v-if="item.id === 'unit'">
  16. <el-table-column :label="item.name" :key="item.id" align="center" fixed>
  17. <el-table-column type="" prop="unitType" :width="110" fixed label="类别" align="center">
  18. <template #default="{ row }">
  19. {{ UnitType[row.unitType] }}
  20. </template>
  21. </el-table-column>
  22. <el-table-column prop="unit" fixed align="center" :width="185" label="名称">
  23. <template #default="scope">
  24. <el-tooltip v-if="clickableTitle(scope.row)" effect="light" placement="right">
  25. <span class="unit-name" @click="viewDetail(scope.row.unit)">{{ scope.row.unit }}</span>
  26. <template #content>
  27. <div>
  28. <div>
  29. {{ scope.row.unit }} <span style="color: #409eff">{{ scope.row.total }}</span> 件
  30. </div>
  31. <el-table
  32. v-if="scope.row.children && scope.row.children.length"
  33. :data="scope.row.children"
  34. style="width: 100%"
  35. >
  36. <el-table-column
  37. prop="unit"
  38. :label="`${UnitType[scope.row.unitType]}单位`"
  39. width="120"
  40. />
  41. <el-table-column prop="total" label="通报数量" width="120">
  42. <template #default>
  43. <div>
  44. <span>{{ scope.row.total }}</span> 件
  45. </div>
  46. </template>
  47. </el-table-column>
  48. <el-table-column prop="proportion" label="占比">
  49. <template #default>
  50. <span style="color: #409eff">{{ scope.row.proportion || '-' }}</span>
  51. </template>
  52. </el-table-column>
  53. <el-table-column prop="proportion" label="同比">
  54. <template #default>
  55. <span style="color: #409eff">{{ scope.row.proportion || '-' }}</span>
  56. </template>
  57. </el-table-column>
  58. <el-table-column prop="proportion" label="环比">
  59. <template #default>
  60. <span style="color: #409eff">{{ scope.row.proportion || '-' }}</span>
  61. </template>
  62. </el-table-column>
  63. </el-table>
  64. </div>
  65. </template>
  66. </el-tooltip>
  67. <span v-else>{{ scope.row.unit }}</span>
  68. </template>
  69. </el-table-column>
  70. </el-table-column>
  71. </template>
  72. <template v-else-if="item.children">
  73. <el-table-column
  74. :label="item.name"
  75. :key="item.id"
  76. align="center"
  77. :prop="item.id"
  78. :fixed="item.id === 'unit'"
  79. >
  80. <template v-for="itx in item.children">
  81. <template v-if="itx?.children">
  82. <el-table-column :label="itx?.name" :key="itx?.id" align="center">
  83. <template v-for="it in itx?.children" :key="it?.id">
  84. <el-table-column
  85. :label="it?.name"
  86. align="center"
  87. :sortable="it?.sortable"
  88. :prop="it.id"
  89. />
  90. </template>
  91. </el-table-column>
  92. </template>
  93. <el-table-column
  94. v-else
  95. :label="itx?.name"
  96. :key="itx?.id"
  97. align="center"
  98. :sortable="itx?.sortable"
  99. :prop="itx?.id"
  100. />
  101. </template>
  102. </el-table-column>
  103. </template>
  104. <el-table-column v-else :label="item.name" :key="item.id" align="center" :prop="item.id" />
  105. </template>
  106. </el-table>
  107. </div>
  108. </div>
  109. </template>
  110. <script setup lang="ts">
  111. import { defineProps } from 'vue';
  112. import type { TableColumnCtx } from 'element-plus';
  113. interface Column {
  114. id: string;
  115. name: string;
  116. fixed?: boolean;
  117. sortable?: boolean;
  118. children?: Array<Column>;
  119. }
  120. // 定义Props
  121. const props = defineProps({
  122. // 表头数据(columns格式)
  123. columns: {
  124. type: Array<Column>,
  125. required: true,
  126. default: () => [],
  127. },
  128. // 表格数据
  129. tableData: {
  130. type: Array,
  131. required: true,
  132. default: () => [],
  133. },
  134. // 表格边框
  135. border: {
  136. type: Boolean,
  137. default: true,
  138. },
  139. });
  140. interface SpanMethodProps {
  141. row: ReportList;
  142. column: TableColumnCtx<ReportList>;
  143. rowIndex: number;
  144. columnIndex: number;
  145. }
  146. interface ReportList {
  147. id: number;
  148. unit: string;
  149. unitType: string;
  150. total: string;
  151. proportion: string;
  152. shanghaiMaritimeTotal: string;
  153. shanghaiMaritimeProportion: string;
  154. tinajinMaritimeTotal: string;
  155. tinajinMaritimeProportion: string;
  156. liaoningMaritimeTotal: string;
  157. liaoningMaritimeProportion: string;
  158. hebeiMaritimeTotal: string;
  159. hebeiMaritimeProportion: string;
  160. shandongMaritimeTotal: string;
  161. shandongMaritimeProportion: string;
  162. departTransTotal: string;
  163. departTransProportion: string;
  164. beijingDepartTransTotal: string;
  165. beijingDepartTransProportion: string;
  166. shanghaiDepartTransTotal: string;
  167. shanghaiDepartTransProportion: string;
  168. hebeiDepartTransTotal: string;
  169. hebeiDepartTransProportion: string;
  170. shanxiDepartTransTotal: string;
  171. shanxiDepartTransProportion: string;
  172. neimengDepartTransTotal: string;
  173. neimengDepartTransProportion: string;
  174. chinaClassificationSocietyTotal: string;
  175. chinaClassificationSocietyProportion: string;
  176. yangtzeRiverTotal: string;
  177. yangtzeRiverProportion: string;
  178. PearlRiverTotal: string;
  179. PearlRiverProportion: string;
  180. children?: Array<ReportList>;
  181. }
  182. const groupCounts = ref({
  183. release: 0,
  184. releaseRowIndex: 0,
  185. receive: 0,
  186. receiveRowIndex: 0,
  187. measure: 0,
  188. measureRowIndex: 0,
  189. });
  190. const UnitType = {
  191. release: '发布通报',
  192. receive: '接收通报',
  193. measure: '采取措施',
  194. };
  195. const clickableTitle = (row: ReportList) => !['总数', '占比', '环比', '同比'].includes(row.unit);
  196. const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => {
  197. if (columnIndex !== 0) return;
  198. if (row.unitType === 'release') {
  199. const firstIndex = tableData.value.findIndex(item => item.unitType === 'release');
  200. if (rowIndex === firstIndex) {
  201. const rowspan = groupCounts.value.release - 1;
  202. return {
  203. rowspan,
  204. colspan: 1,
  205. };
  206. } else {
  207. return {
  208. rowspan: 0,
  209. colspan: 0,
  210. };
  211. }
  212. }
  213. if (row.unitType === 'receive') {
  214. const firstIndex = tableData.value.findIndex(item => item.unitType === 'receive');
  215. if (rowIndex === groupCounts.value.releaseRowIndex) {
  216. return {
  217. rowspan: groupCounts.value.receive - 1,
  218. colspan: 1,
  219. };
  220. } else {
  221. return {
  222. rowspan: 0,
  223. colspan: 0,
  224. };
  225. }
  226. }
  227. if (row.unitType === 'measure') {
  228. const firstIndex = tableData.value.findIndex(item => item.unitType === 'measure');
  229. if (rowIndex === groupCounts.value.releaseRowIndex + groupCounts.value.receiveRowIndex) {
  230. const rowspan = groupCounts.value.measure;
  231. return {
  232. rowspan,
  233. colspan: 1,
  234. };
  235. } else {
  236. return {
  237. rowspan: 0,
  238. colspan: 0,
  239. };
  240. }
  241. }
  242. };
  243. const expandChange = (row: ReportList, expandedRows: any[]) => {
  244. if (expandedRows) {
  245. groupCounts.value[row.unitType] += row?.children?.length;
  246. } else {
  247. const count = row?.children?.length as number;
  248. groupCounts.value[row.unitType] = groupCounts.value[row.unitType] - count;
  249. }
  250. };
  251. const tableData = ref([
  252. {
  253. id: 1,
  254. unit: '总数',
  255. unitType: 'release',
  256. total: '10050',
  257. proportion: '68%',
  258. shanghaiMaritimeTotal: '5672',
  259. shanghaiMaritimeProportion: '18%',
  260. tinajinMaritimeTotal: '5672',
  261. tinajinMaritimeProportion: '18%',
  262. liaoningMaritimeTotal: '5672',
  263. liaoningMaritimeProportion: '18%',
  264. hebeiMaritimeTotal: '5672',
  265. hebeiMaritimeProportion: '18%',
  266. shandongMaritimeTotal: '5672',
  267. shandongMaritimeProportion: '18%',
  268. departTransTotal: '10050',
  269. departTransProportion: '68%',
  270. beijingDepartTransTotal: '5672',
  271. beijingDepartTransProportion: '18%',
  272. shanghaiDepartTransTotal: '5672',
  273. shanghaiDepartTransProportion: '18%',
  274. hebeiDepartTransTotal: '5672',
  275. hebeiDepartTransProportion: '18%',
  276. shanxiDepartTransTotal: '5672',
  277. shanxiDepartTransProportion: '18%',
  278. neimengDepartTransTotal: '5672',
  279. neimengDepartTransProportion: '18%',
  280. chinaClassificationSocietyTotal: '10050',
  281. chinaClassificationSocietyProportion: '68%',
  282. yangtzeRiverTotal: '10050',
  283. yangtzeRiverProportion: '68%',
  284. PearlRiverTotal: '10050',
  285. PearlRiverProportion: '68%',
  286. },
  287. {
  288. id: 2,
  289. unit: '直属海事管理机构',
  290. unitType: 'release',
  291. total: '10050',
  292. proportion: '68%',
  293. shanghaiMaritimeTotal: '5672',
  294. shanghaiMaritimeProportion: '18%',
  295. tinajinMaritimeTotal: '5672',
  296. tinajinMaritimeProportion: '18%',
  297. liaoningMaritimeTotal: '5672',
  298. liaoningMaritimeProportion: '18%',
  299. hebeiMaritimeTotal: '5672',
  300. hebeiMaritimeProportion: '18%',
  301. shandongMaritimeTotal: '5672',
  302. shandongMaritimeProportion: '18%',
  303. departTransTotal: '10050',
  304. departTransProportion: '68%',
  305. beijingDepartTransTotal: '5672',
  306. beijingDepartTransProportion: '18%',
  307. shanghaiDepartTransTotal: '5672',
  308. shanghaiDepartTransProportion: '18%',
  309. hebeiDepartTransTotal: '5672',
  310. hebeiDepartTransProportion: '18%',
  311. shanxiDepartTransTotal: '5672',
  312. shanxiDepartTransProportion: '18%',
  313. neimengDepartTransTotal: '5672',
  314. neimengDepartTransProportion: '18%',
  315. chinaClassificationSocietyTotal: '10050',
  316. chinaClassificationSocietyProportion: '68%',
  317. yangtzeRiverTotal: '10050',
  318. yangtzeRiverProportion: '68%',
  319. PearlRiverTotal: '10050',
  320. PearlRiverProportion: '68%',
  321. children: [
  322. {
  323. id: 21,
  324. unit: '上海海事局',
  325. unitType: 'release',
  326. total: '10050',
  327. proportion: '68%',
  328. shanghaiMaritimeTotal: '5672',
  329. shanghaiMaritimeProportion: '18%',
  330. tinajinMaritimeTotal: '5672',
  331. tinajinMaritimeProportion: '18%',
  332. liaoningMaritimeTotal: '5672',
  333. liaoningMaritimeProportion: '18%',
  334. hebeiMaritimeTotal: '5672',
  335. hebeiMaritimeProportion: '18%',
  336. shandongMaritimeTotal: '5672',
  337. shandongMaritimeProportion: '18%',
  338. departTransTotal: '10050',
  339. departTransProportion: '68%',
  340. beijingDepartTransTotal: '5672',
  341. beijingDepartTransProportion: '18%',
  342. shanghaiDepartTransTotal: '5672',
  343. shanghaiDepartTransProportion: '18%',
  344. hebeiDepartTransTotal: '5672',
  345. hebeiDepartTransProportion: '18%',
  346. shanxiDepartTransTotal: '5672',
  347. shanxiDepartTransProportion: '18%',
  348. neimengDepartTransTotal: '5672',
  349. neimengDepartTransProportion: '18%',
  350. chinaClassificationSocietyTotal: '10050',
  351. chinaClassificationSocietyProportion: '68%',
  352. yangtzeRiverTotal: '10050',
  353. yangtzeRiverProportion: '68%',
  354. PearlRiverTotal: '10050',
  355. PearlRiverProportion: '68%',
  356. },
  357. ],
  358. },
  359. {
  360. id: 3,
  361. unit: '总数',
  362. unitType: 'receive',
  363. total: '10050',
  364. proportion: '68%',
  365. shanghaiMaritimeTotal: '5672',
  366. shanghaiMaritimeProportion: '18%',
  367. tinajinMaritimeTotal: '5672',
  368. tinajinMaritimeProportion: '18%',
  369. liaoningMaritimeTotal: '5672',
  370. liaoningMaritimeProportion: '18%',
  371. hebeiMaritimeTotal: '5672',
  372. hebeiMaritimeProportion: '18%',
  373. shandongMaritimeTotal: '5672',
  374. shandongMaritimeProportion: '18%',
  375. departTransTotal: '10050',
  376. departTransProportion: '68%',
  377. beijingDepartTransTotal: '5672',
  378. beijingDepartTransProportion: '18%',
  379. shanghaiDepartTransTotal: '5672',
  380. shanghaiDepartTransProportion: '18%',
  381. hebeiDepartTransTotal: '5672',
  382. hebeiDepartTransProportion: '18%',
  383. shanxiDepartTransTotal: '5672',
  384. shanxiDepartTransProportion: '18%',
  385. neimengDepartTransTotal: '5672',
  386. neimengDepartTransProportion: '18%',
  387. chinaClassificationSocietyTotal: '10050',
  388. chinaClassificationSocietyProportion: '68%',
  389. yangtzeRiverTotal: '10050',
  390. yangtzeRiverProportion: '68%',
  391. PearlRiverTotal: '10050',
  392. PearlRiverProportion: '68%',
  393. },
  394. {
  395. id: 4,
  396. unit: '直属海事管理机构',
  397. unitType: 'receive',
  398. total: '10050',
  399. proportion: '68%',
  400. shanghaiMaritimeTotal: '5672',
  401. shanghaiMaritimeProportion: '18%',
  402. tinajinMaritimeTotal: '5672',
  403. tinajinMaritimeProportion: '18%',
  404. liaoningMaritimeTotal: '5672',
  405. liaoningMaritimeProportion: '18%',
  406. hebeiMaritimeTotal: '5672',
  407. hebeiMaritimeProportion: '18%',
  408. shandongMaritimeTotal: '5672',
  409. shandongMaritimeProportion: '18%',
  410. departTransTotal: '10050',
  411. departTransProportion: '68%',
  412. beijingDepartTransTotal: '5672',
  413. beijingDepartTransProportion: '18%',
  414. shanghaiDepartTransTotal: '5672',
  415. shanghaiDepartTransProportion: '18%',
  416. hebeiDepartTransTotal: '5672',
  417. hebeiDepartTransProportion: '18%',
  418. shanxiDepartTransTotal: '5672',
  419. shanxiDepartTransProportion: '18%',
  420. neimengDepartTransTotal: '5672',
  421. neimengDepartTransProportion: '18%',
  422. chinaClassificationSocietyTotal: '10050',
  423. chinaClassificationSocietyProportion: '68%',
  424. yangtzeRiverTotal: '10050',
  425. yangtzeRiverProportion: '68%',
  426. PearlRiverTotal: '10050',
  427. PearlRiverProportion: '68%',
  428. children: [
  429. {
  430. id: 41,
  431. unit: '上海海事局',
  432. unitType: 'receive',
  433. total: '10050',
  434. proportion: '68%',
  435. shanghaiMaritimeTotal: '5672',
  436. shanghaiMaritimeProportion: '18%',
  437. tinajinMaritimeTotal: '5672',
  438. tinajinMaritimeProportion: '18%',
  439. liaoningMaritimeTotal: '5672',
  440. liaoningMaritimeProportion: '18%',
  441. hebeiMaritimeTotal: '5672',
  442. hebeiMaritimeProportion: '18%',
  443. shandongMaritimeTotal: '5672',
  444. shandongMaritimeProportion: '18%',
  445. departTransTotal: '10050',
  446. departTransProportion: '68%',
  447. beijingDepartTransTotal: '5672',
  448. beijingDepartTransProportion: '18%',
  449. shanghaiDepartTransTotal: '5672',
  450. shanghaiDepartTransProportion: '18%',
  451. hebeiDepartTransTotal: '5672',
  452. hebeiDepartTransProportion: '18%',
  453. shanxiDepartTransTotal: '5672',
  454. shanxiDepartTransProportion: '18%',
  455. neimengDepartTransTotal: '5672',
  456. neimengDepartTransProportion: '18%',
  457. chinaClassificationSocietyTotal: '10050',
  458. chinaClassificationSocietyProportion: '68%',
  459. yangtzeRiverTotal: '10050',
  460. yangtzeRiverProportion: '68%',
  461. PearlRiverTotal: '10050',
  462. PearlRiverProportion: '68%',
  463. },
  464. ],
  465. },
  466. {
  467. id: 5,
  468. unit: '总数',
  469. unitType: 'measure',
  470. total: '10050',
  471. proportion: '68%',
  472. shanghaiMaritimeTotal: '5672',
  473. shanghaiMaritimeProportion: '18%',
  474. tinajinMaritimeTotal: '5672',
  475. tinajinMaritimeProportion: '18%',
  476. liaoningMaritimeTotal: '5672',
  477. liaoningMaritimeProportion: '18%',
  478. hebeiMaritimeTotal: '5672',
  479. hebeiMaritimeProportion: '18%',
  480. shandongMaritimeTotal: '5672',
  481. shandongMaritimeProportion: '18%',
  482. departTransTotal: '10050',
  483. departTransProportion: '68%',
  484. beijingDepartTransTotal: '5672',
  485. beijingDepartTransProportion: '18%',
  486. shanghaiDepartTransTotal: '5672',
  487. shanghaiDepartTransProportion: '18%',
  488. hebeiDepartTransTotal: '5672',
  489. hebeiDepartTransProportion: '18%',
  490. shanxiDepartTransTotal: '5672',
  491. shanxiDepartTransProportion: '18%',
  492. neimengDepartTransTotal: '5672',
  493. neimengDepartTransProportion: '18%',
  494. chinaClassificationSocietyTotal: '10050',
  495. chinaClassificationSocietyProportion: '68%',
  496. yangtzeRiverTotal: '10050',
  497. yangtzeRiverProportion: '68%',
  498. PearlRiverTotal: '10050',
  499. PearlRiverProportion: '68%',
  500. },
  501. {
  502. id: 6,
  503. unit: '直属海事管理机构',
  504. unitType: 'measure',
  505. total: '10050',
  506. proportion: '68%',
  507. shanghaiMaritimeTotal: '5672',
  508. shanghaiMaritimeProportion: '18%',
  509. tinajinMaritimeTotal: '5672',
  510. tinajinMaritimeProportion: '18%',
  511. liaoningMaritimeTotal: '5672',
  512. liaoningMaritimeProportion: '18%',
  513. hebeiMaritimeTotal: '5672',
  514. hebeiMaritimeProportion: '18%',
  515. shandongMaritimeTotal: '5672',
  516. shandongMaritimeProportion: '18%',
  517. departTransTotal: '10050',
  518. departTransProportion: '68%',
  519. beijingDepartTransTotal: '5672',
  520. beijingDepartTransProportion: '18%',
  521. shanghaiDepartTransTotal: '5672',
  522. shanghaiDepartTransProportion: '18%',
  523. hebeiDepartTransTotal: '5672',
  524. hebeiDepartTransProportion: '18%',
  525. shanxiDepartTransTotal: '5672',
  526. shanxiDepartTransProportion: '18%',
  527. neimengDepartTransTotal: '5672',
  528. neimengDepartTransProportion: '18%',
  529. chinaClassificationSocietyTotal: '10050',
  530. chinaClassificationSocietyProportion: '68%',
  531. yangtzeRiverTotal: '10050',
  532. yangtzeRiverProportion: '68%',
  533. PearlRiverTotal: '10050',
  534. PearlRiverProportion: '68%',
  535. children: [
  536. {
  537. id: 61,
  538. unit: '上海海事局',
  539. unitType: 'measure',
  540. total: '10050',
  541. proportion: '68%',
  542. shanghaiMaritimeTotal: '5672',
  543. shanghaiMaritimeProportion: '18%',
  544. tinajinMaritimeTotal: '5672',
  545. tinajinMaritimeProportion: '18%',
  546. liaoningMaritimeTotal: '5672',
  547. liaoningMaritimeProportion: '18%',
  548. hebeiMaritimeTotal: '5672',
  549. hebeiMaritimeProportion: '18%',
  550. shandongMaritimeTotal: '5672',
  551. shandongMaritimeProportion: '18%',
  552. departTransTotal: '10050',
  553. departTransProportion: '68%',
  554. beijingDepartTransTotal: '5672',
  555. beijingDepartTransProportion: '18%',
  556. shanghaiDepartTransTotal: '5672',
  557. shanghaiDepartTransProportion: '18%',
  558. hebeiDepartTransTotal: '5672',
  559. hebeiDepartTransProportion: '18%',
  560. shanxiDepartTransTotal: '5672',
  561. shanxiDepartTransProportion: '18%',
  562. neimengDepartTransTotal: '5672',
  563. neimengDepartTransProportion: '18%',
  564. chinaClassificationSocietyTotal: '10050',
  565. chinaClassificationSocietyProportion: '68%',
  566. yangtzeRiverTotal: '10050',
  567. yangtzeRiverProportion: '68%',
  568. PearlRiverTotal: '10050',
  569. PearlRiverProportion: '68%',
  570. },
  571. ],
  572. },
  573. ]);
  574. const isLoading = ref(false);
  575. const calculateGroupCounts = () => {
  576. isLoading.value = true;
  577. tableData.value.forEach((item: ReportList) => {
  578. groupCounts.value[`${item.unitType}RowIndex`]++;
  579. groupCounts.value[item.unitType]++;
  580. if (item?.children) {
  581. item.children.forEach((itx: ReportList) => {
  582. groupCounts.value[`${item.unitType}RowIndex`]++;
  583. groupCounts.value[itx.unitType]++;
  584. if (itx?.children) {
  585. itx.children.forEach((it: ReportList) => {
  586. groupCounts.value[`${item.unitType}RowIndex`]++;
  587. groupCounts.value[it.unitType]++;
  588. });
  589. }
  590. });
  591. }
  592. });
  593. isLoading.value = false;
  594. };
  595. calculateGroupCounts();
  596. const columns = ref([
  597. {
  598. id: 'unit',
  599. name: '单位',
  600. },
  601. {
  602. id: 'directlyAdministration',
  603. name: '直属海事局',
  604. children: [
  605. {
  606. id: 'total',
  607. name: '合计',
  608. sortable: true,
  609. },
  610. {
  611. id: 'proportion',
  612. name: '占比',
  613. sortable: true,
  614. },
  615. {
  616. id: 'shanghai',
  617. name: '上海海事局',
  618. children: [
  619. {
  620. id: 'shanghaiMaritimeTotal',
  621. name: '合计',
  622. sortable: true,
  623. },
  624. {
  625. id: 'shanghaiMaritimeProportion',
  626. name: '占比',
  627. sortable: true,
  628. },
  629. ],
  630. },
  631. {
  632. id: 'tianjin',
  633. name: '天津海事局',
  634. children: [
  635. {
  636. id: 'tinajinMaritimeTotal',
  637. name: '合计',
  638. sortable: true,
  639. },
  640. {
  641. id: 'tinajinMaritimeProportion',
  642. name: '占比',
  643. sortable: true,
  644. },
  645. ],
  646. },
  647. {
  648. id: 'liaoning',
  649. name: '辽宁海事局',
  650. children: [
  651. {
  652. id: 'liaoningMaritimeTotal',
  653. name: '合计',
  654. sortable: true,
  655. },
  656. {
  657. id: 'liaoningMaritimeProportion',
  658. name: '占比',
  659. sortable: true,
  660. },
  661. ],
  662. },
  663. {
  664. id: 'hebei',
  665. name: '河北海事局',
  666. children: [
  667. {
  668. id: 'hebeiMaritimeTotal',
  669. name: '合计',
  670. sortable: true,
  671. },
  672. {
  673. id: 'hebeiMaritimeProportion',
  674. name: '占比',
  675. sortable: true,
  676. },
  677. ],
  678. },
  679. {
  680. id: 'shandong',
  681. name: '山东海事局',
  682. children: [
  683. {
  684. id: 'shandongMaritimeTotal',
  685. name: '合计',
  686. sortable: true,
  687. },
  688. {
  689. id: 'shandongMaritimeProportion',
  690. name: '占比',
  691. sortable: true,
  692. },
  693. ],
  694. },
  695. ],
  696. },
  697. {
  698. id: 'departTrans',
  699. name: '交通运输厅海事局',
  700. children: [
  701. {
  702. id: 'departTransTotal',
  703. name: '合计',
  704. sortable: true,
  705. },
  706. {
  707. id: 'departTransProportion',
  708. name: '占比',
  709. sortable: true,
  710. },
  711. {
  712. id: 'beijing',
  713. name: '北京市交通委员会',
  714. children: [
  715. {
  716. id: 'beijingDepartTransTotal',
  717. name: '合计',
  718. sortable: true,
  719. },
  720. {
  721. id: 'beijingDepartTransProportion',
  722. name: '占比',
  723. sortable: true,
  724. },
  725. ],
  726. },
  727. {
  728. id: 'shanghai',
  729. name: '上海市交通委员会',
  730. children: [
  731. {
  732. id: 'shanghaiDepartTransTotal',
  733. name: '合计',
  734. sortable: true,
  735. },
  736. {
  737. id: 'shanghaiDepartTransProportion',
  738. name: '占比',
  739. sortable: true,
  740. },
  741. ],
  742. },
  743. {
  744. id: 'hebei',
  745. name: '河北省交通运输厅',
  746. children: [
  747. {
  748. id: 'hebeiDepartTransTotal',
  749. name: '合计',
  750. sortable: true,
  751. },
  752. {
  753. id: 'hebeiDepartTransProportion',
  754. name: '占比',
  755. sortable: true,
  756. },
  757. ],
  758. },
  759. {
  760. id: 'shanxi',
  761. name: '山西省交通运输厅',
  762. children: [
  763. {
  764. id: 'shanxiDepartTransTotal',
  765. name: '合计',
  766. sortable: true,
  767. },
  768. {
  769. id: 'shanxiDepartTransProportion',
  770. name: '占比',
  771. sortable: true,
  772. },
  773. ],
  774. },
  775. {
  776. id: 'neimeng',
  777. name: '内蒙古自治区交通运输厅',
  778. children: [
  779. {
  780. id: 'neimengDepartTransTotal',
  781. name: '合计',
  782. sortable: true,
  783. },
  784. {
  785. id: 'neimengDepartTransProportion',
  786. name: '占比',
  787. sortable: true,
  788. },
  789. ],
  790. },
  791. ],
  792. },
  793. {
  794. id: 'chinaClassificationSociety',
  795. name: '中国船级社',
  796. children: [
  797. {
  798. id: 'chinaClassificationSocietyTotal',
  799. name: '合计',
  800. sortable: true,
  801. },
  802. {
  803. id: 'chinaClassificationSocietyProportion',
  804. name: '占比',
  805. sortable: true,
  806. },
  807. ],
  808. },
  809. {
  810. id: 'yangtzeRiver',
  811. name: '长江航务管理局',
  812. children: [
  813. {
  814. id: 'yangtzeRiverProportion',
  815. name: '合计',
  816. sortable: true,
  817. },
  818. {
  819. id: 'yangtzeRiverProportion',
  820. name: '占比',
  821. sortable: true,
  822. },
  823. ],
  824. },
  825. {
  826. id: 'pearlRiver',
  827. name: '珠江航务管理局',
  828. children: [
  829. {
  830. id: 'pearlRiverTotal',
  831. name: '合计',
  832. sortable: true,
  833. },
  834. {
  835. id: 'pearlRiverProportion',
  836. name: '占比',
  837. sortable: true,
  838. },
  839. ],
  840. },
  841. ]);
  842. const router = useRouter();
  843. const viewDetail = (unit: string) => {
  844. router.push({
  845. path: '/notificationAnalysis/notificationReleaseReceiptDetail',
  846. query: {
  847. unit,
  848. },
  849. });
  850. };
  851. </script>
  852. <style scoped lang="scss">
  853. .title {
  854. font-weight: 600;
  855. padding: 10px;
  856. }
  857. .unit-name {
  858. cursor: pointer;
  859. color: #409eff;
  860. }
  861. </style>