index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. <template>
  2. <el-table
  3. v-loading="props.loading"
  4. :data="props.list"
  5. :header-cell-style="tableHeaderColor"
  6. :maxHeight="props.height ? props.height : tableHeight()"
  7. @selection-change="handleSelectionChange"
  8. @row-click="handleRowClick"
  9. @sort-change="handleSortChange"
  10. >
  11. <el-table-column width="35" v-if="isResolve || isRadio" fixed>
  12. <template #default="scope">
  13. <el-radio v-model="radioId" :label="scope.row.id" />
  14. </template>
  15. </el-table-column>
  16. <el-table-column
  17. type="selection"
  18. :selectable="handleSelectable"
  19. width="40"
  20. v-if="props.selection"
  21. fixed
  22. />
  23. <el-table-column header-align="center" align="center" label="编号" width="62" fixed>
  24. <template #default="scope">
  25. {{
  26. scope.$index +
  27. (props.queryParams.pageNo * props.queryParams.pageSize - props.queryParams.pageSize) +
  28. 1
  29. }}
  30. </template>
  31. </el-table-column>
  32. <template v-for="(item, index) in props.columns" :key="index">
  33. <!-- 常规渲染 -->
  34. <el-table-column
  35. show-overflow-tooltip
  36. v-if="!item.type"
  37. :prop="item.field"
  38. header-align="center"
  39. :align="item.align || 'center'"
  40. :label="item.label"
  41. :formatter="item.format ? (item.format2 ? dateFormatter : dateFormatter2) : undefined"
  42. :width="item.width"
  43. :fixed="item.fixed ? true : false"
  44. :sortable="item.sortable || false"
  45. />
  46. <!-- 字典值渲染 -->
  47. <el-table-column
  48. v-if="item.type == 1"
  49. :prop="item.field"
  50. header-align="center"
  51. align="center"
  52. :label="item.label"
  53. >
  54. <template #default="scope">
  55. {{ getDictLabel(item.dictArr, scope.row[item.field]) || formatterLabel(scope.row, item) }}
  56. </template>
  57. </el-table-column>
  58. <!-- tag标签渲染 -->
  59. <el-table-column
  60. v-if="item.type == 2"
  61. :prop="item.field"
  62. header-align="center"
  63. align="center"
  64. :label="item.label"
  65. :width="item.width"
  66. >
  67. <template #default="scope">
  68. <dict-tag :type="item.dictArr" :value="scope.row[item.field]" />
  69. </template>
  70. </el-table-column>
  71. <!-- 数字 -->
  72. <el-table-column
  73. v-if="item.type == 3"
  74. :prop="item.field"
  75. header-align="center"
  76. align="center"
  77. :label="item.label"
  78. :width="item.width"
  79. >
  80. <template #default="scope">
  81. {{ formatNum(scope.row[item.field]) }}
  82. </template>
  83. </el-table-column>
  84. <!-- 根据插槽渲染 -->
  85. <el-table-column
  86. v-if="item.type == 4"
  87. :prop="item.field"
  88. header-align="center"
  89. align="center"
  90. :label="item.label"
  91. >
  92. <template #default="scope">
  93. <el-progress
  94. :text-inside="true"
  95. :stroke-width="15"
  96. :percentage="scope.row[item.field]"
  97. :color="[
  98. { color: '#f56c6c', percentage: 35 }, // 0-35
  99. { color: '#e6a23c', percentage: 70 }, // 71-100
  100. { color: '#5cb87a', percentage: 100 }
  101. ]"
  102. />
  103. </template>
  104. </el-table-column>
  105. <!-- 日期数组转换 -->
  106. <el-table-column
  107. v-if="item.type == 5"
  108. :prop="item.field"
  109. header-align="center"
  110. align="center"
  111. :label="item.label"
  112. >
  113. <template #default="scope">
  114. {{
  115. scope.row[item.field] ? formatTime(scope.row[item.field].join('-'), 'yyyy-MM-dd') : ''
  116. }}
  117. </template>
  118. </el-table-column>
  119. <!-- 颜色 -->
  120. <el-table-column
  121. v-if="item.type == 6"
  122. :prop="item.field"
  123. header-align="center"
  124. align="center"
  125. :label="item.label"
  126. >
  127. <template #default="scope">
  128. <div
  129. :style="{ background: scope.row[item.field] }"
  130. style="width: 100px; height: 30px; margin: auto"
  131. ></div>
  132. </template>
  133. </el-table-column>
  134. <!-- 切割识别 -->
  135. <el-table-column
  136. v-if="item.type == 8"
  137. header-align="center"
  138. align="center"
  139. :label="item.label"
  140. >
  141. <template #default="scope">
  142. {{ getText(scope.row, item.field) }}
  143. </template>
  144. </el-table-column>
  145. <!-- 时分秒 -->
  146. <el-table-column
  147. show-overflow-tooltip
  148. v-if="item.type == 9"
  149. :prop="item.field"
  150. header-align="center"
  151. :align="item.align || 'center'"
  152. :label="item.label"
  153. :formatter="dateFormatter"
  154. :width="item.width"
  155. />
  156. <!-- 合并拼接 -->
  157. <el-table-column
  158. v-if="item.type == 10"
  159. header-align="center"
  160. align="center"
  161. :label="item.label"
  162. :width="item.width"
  163. >
  164. <template #default="scope">
  165. {{ mergeText(scope.row, item.field, item.desc) }}
  166. </template>
  167. </el-table-column>
  168. <el-table-column
  169. show-overflow-tooltip
  170. v-if="item.type == 99 && userStore.getOrgTenant.multiple"
  171. :prop="item.field"
  172. header-align="center"
  173. :align="item.align || 'center'"
  174. :label="item.label"
  175. :fixed="item.fixed ? true : false"
  176. :width="item.width"
  177. />
  178. <!-- 标题中添加提示 -->
  179. <el-table-column
  180. v-if="item.type == 11"
  181. header-align="center"
  182. align="center"
  183. :label="item.label"
  184. :width="item.width"
  185. >
  186. <template #header>
  187. {{ item.label }}
  188. <el-tooltip class="item" effect="dark" :content="item.content" placement="top-start">
  189. <Icon icon="ep:info-filled" />
  190. </el-tooltip>
  191. </template>
  192. <template #default="scope">
  193. <dict-tag :type="item.dictArr" :value="scope.row[item.field]" />
  194. </template>
  195. </el-table-column>
  196. <el-table-column
  197. v-if="item.type == 12"
  198. header-align="center"
  199. align="center"
  200. :label="item.label"
  201. :width="item.width"
  202. >
  203. <template #default="scope">
  204. <span v-if="scope.row[item.field] == 1">{{
  205. getDictLabel(item.dictArr, scope.row[item.field]) || formatterLabel(scope.row, item)
  206. }}</span>
  207. <span v-else>{{ scope.row.deviceName }}</span>
  208. </template>
  209. </el-table-column>
  210. <!-- 综合配置数字 -->
  211. <el-table-column
  212. v-if="item.type == 13"
  213. :prop="item.field"
  214. header-align="center"
  215. align="center"
  216. :label="item.label"
  217. :width="item.width"
  218. >
  219. <template #default="scope">
  220. {{ calcPrice(scope.row, item) }}
  221. </template>
  222. </el-table-column>
  223. <!-- 综合配置数字-各值取整相加 -->
  224. <el-table-column
  225. v-if="item.type == 14"
  226. :prop="item.field"
  227. header-align="center"
  228. align="center"
  229. :label="item.label"
  230. :width="item.width"
  231. >
  232. <template #default="scope">
  233. {{ formatActualPrice(scope.row, item) }}
  234. </template>
  235. </el-table-column>
  236. <!-- 入院账单 && isMonthlyExpense && 【入院账单月度费用向上取整设置】是向上取整 -->
  237. <el-table-column
  238. v-if="item.type == 15"
  239. :prop="item.field"
  240. header-align="center"
  241. align="center"
  242. :label="item.label"
  243. :width="item.width"
  244. >
  245. <template #default="scope">
  246. {{ formatAdmissionBillRoundUp(scope.row, item) }}
  247. </template>
  248. </el-table-column>
  249. <!-- 数组类型的字典数据渲染 -->
  250. <el-table-column
  251. v-if="item.type == 16"
  252. :prop="item.field"
  253. header-align="center"
  254. align="center"
  255. :label="item.label"
  256. :width="item.width"
  257. >
  258. <template #default="scope">
  259. {{ getDictLabelArr(item.dictArr, scope.row[item.field]) }}
  260. </template>
  261. </el-table-column>
  262. <el-table-column
  263. v-if="item.type == 17"
  264. :prop="item.field"
  265. header-align="center"
  266. align="center"
  267. :label="item.label"
  268. :width="item.width"
  269. >
  270. <template #default="scope">
  271. {{ scope.row.payStatus != 0 ? toFixedNum(scope.row.payableAmount) : '0.00' }}
  272. </template>
  273. </el-table-column>
  274. <el-table-column
  275. v-if="item.type == 18"
  276. :prop="item.field"
  277. header-align="center"
  278. align="center"
  279. :label="item.label"
  280. :width="item.width"
  281. >
  282. <template #default="scope">
  283. <el-popover :title="scope.row.elderName" :width="530" placement="top-start">
  284. <template #reference>
  285. <el-tag
  286. :type="!scope.row.otherFiles || scope.row.otherFiles == '' ? 'warning' : 'primary'"
  287. >{{
  288. !scope.row.otherFiles || scope.row.otherFiles == '' ? '未上传' : '已上传'
  289. }}</el-tag
  290. >
  291. </template>
  292. <el-table :data="parsingJSON(scope.row.otherFiles)">
  293. <el-table-column label="预览" width="80" align="center">
  294. <template #default="{ row }">
  295. <el-image
  296. v-if="isImageFile(row.fileUrl)"
  297. :src="row.fileUrl"
  298. :preview-src-list="[row.fileUrl]"
  299. fit="cover"
  300. style="width: 40px; height: 40px; cursor: pointer"
  301. />
  302. <Icon v-else icon="ep:document" style="font-size: 20px; color: #909399" />
  303. </template>
  304. </el-table-column>
  305. <el-table-column
  306. width="150"
  307. property="fileName"
  308. label="附件名称"
  309. show-overflow-tooltip
  310. />
  311. <el-table-column width="180" property="createTime" label="创建时间" />
  312. <el-table-column width="90" label="操作" align="center">
  313. <template #default="{ row }">
  314. <el-button type="primary" link size="small" @click="handleDownload(row)"
  315. >下载</el-button
  316. >
  317. </template>
  318. </el-table-column>
  319. </el-table>
  320. </el-popover>
  321. </template>
  322. </el-table-column>
  323. </template>
  324. <el-table-column
  325. label="操作"
  326. align="center"
  327. name="op"
  328. :width="opWidth"
  329. v-if="!props.isResolve && props.showOp"
  330. fixed="right"
  331. >
  332. <template #default="scope">
  333. <slot name="pre" :scope="scope.row"></slot>
  334. <el-button
  335. link
  336. type="primary"
  337. @click="handleEdit(scope.row)"
  338. v-hasPermi="[permissionStr + ':relaunch']"
  339. v-show="scope.row.status == 3 || scope.row.status == 4"
  340. >
  341. 重新发起
  342. </el-button>
  343. <el-button
  344. link
  345. type="primary"
  346. @click="handleCheckIn(scope.row)"
  347. v-hasPermi="[permissionStr + ':checkIn']"
  348. >
  349. 入住
  350. </el-button>
  351. <el-button
  352. link
  353. type="primary"
  354. @click="handleUpload(scope.row)"
  355. v-hasPermi="[permissionStr + ':upload-contract']"
  356. >
  357. 上传合同
  358. </el-button>
  359. <el-button
  360. link
  361. type="primary"
  362. @click="handleEdit(scope.row)"
  363. v-hasPermi="[permissionStr + ':renew']"
  364. :disabled="isDisabledRenewal(scope.row)"
  365. >
  366. 续签
  367. </el-button>
  368. <el-button
  369. link
  370. type="warning"
  371. @click="handleCheck(scope.row)"
  372. v-hasPermi="[permissionStr + ':change']"
  373. >
  374. 变更
  375. </el-button>
  376. <!-- <el-button
  377. link
  378. type="primary"
  379. @click="handleCheck(scope.row)"
  380. v-hasPermi="[permissionStr + ':check']"
  381. v-show="scope.row.status == 1"
  382. >
  383. 办理
  384. </el-button> -->
  385. <el-button
  386. link
  387. type="primary"
  388. @click="handleEdit(scope.row)"
  389. v-hasPermi="[permissionStr + ':edit']"
  390. v-show="props.showEditCondition(scope.row)"
  391. >
  392. 编辑
  393. </el-button>
  394. <el-button
  395. link
  396. type="primary"
  397. @click="handleDetail(scope.row)"
  398. v-hasPermi="[permissionStr + ':detail']"
  399. v-show="props.showDetailCondition(scope.row)"
  400. >
  401. 详情
  402. </el-button>
  403. <el-button
  404. link
  405. type="danger"
  406. @click="handleCancel(scope.row)"
  407. v-hasPermi="[permissionStr + ':cancel']"
  408. v-show="scope.row.status == 1"
  409. >
  410. 撤销
  411. </el-button>
  412. <!-- 不走流程的打印 -->
  413. <el-button
  414. link
  415. type="primary"
  416. @click="handlePrint(scope.row)"
  417. v-hasPermi="[permissionStr + ':print']"
  418. >
  419. 打印
  420. </el-button>
  421. <!-- 走流程的打印 -->
  422. <el-button
  423. link
  424. type="primary"
  425. @click="handlePrint(scope.row)"
  426. v-hasPermi="[permissionStr + ':p-print']"
  427. v-show="scope.row.status == 2 || scope.row.status == 5"
  428. >
  429. 打印
  430. </el-button>
  431. <el-button
  432. link
  433. type="danger"
  434. @click="handleDelete(scope.row)"
  435. v-hasPermi="[permissionStr + ':delete']"
  436. v-show="props.showDeleteCondition(scope.row)"
  437. >
  438. 删除
  439. </el-button>
  440. <slot name="next" :scope="scope.row"></slot>
  441. <slot name="del" :scope="scope.row"></slot>
  442. </template>
  443. </el-table-column>
  444. </el-table>
  445. </template>
  446. <script setup lang="ts">
  447. import { TableColumn } from '@/types/table'
  448. import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
  449. import { getDictLabel, getDictOptions } from '@/utils/dict'
  450. import { useAppStore } from '@/store/modules/app'
  451. import { fixedNum, formatCeil, formatNum, formatRound, formatTrunc } from '@/utils/formatter'
  452. import { tableHeaderColor } from '@/utils/table'
  453. import { breakpointsTailwind, useBreakpoints } from '@vueuse/core'
  454. import { formatTime } from '@/utils'
  455. import { useUserStore } from '@/store/modules/user'
  456. import { useSettingStore } from '@/store/modules/setting'
  457. import { FileItem, isImageFile } from '@/components/UploadFile'
  458. const userStore = useUserStore()
  459. const settingStore = useSettingStore()
  460. const radioId = ref() // 单选表格
  461. const isDisabledRenewal = (row) => {
  462. // 暂时不做“到期前两个月内才可续签”的时间限制,只看 isRenew
  463. // if (!row.expireTime) return false
  464. // const expireDate = new Date(row.expireTime)
  465. // const halfMonthLater = new Date()
  466. // halfMonthLater.setMonth(halfMonthLater.getMonth() + 2)
  467. // return expireDate > halfMonthLater && (row.isRenew || 0) == 0
  468. return (row.isRenew || 0) != 0
  469. }
  470. const props = defineProps({
  471. // 加载
  472. loading: {
  473. type: Boolean,
  474. default: false
  475. },
  476. // 数据
  477. list: {
  478. type: Array as PropType<Recordable[]>,
  479. default: () => []
  480. },
  481. // 列
  482. columns: {
  483. type: Array as PropType<TableColumn[]>,
  484. default: () => []
  485. },
  486. // 搜索
  487. queryParams: {
  488. type: Object,
  489. default: () => {}
  490. },
  491. // 是否多选
  492. selection: {
  493. type: Boolean,
  494. default: false
  495. },
  496. // 是否视图加载
  497. isResolve: {
  498. type: Boolean,
  499. default: false
  500. },
  501. showOp: {
  502. type: Boolean,
  503. default: true
  504. },
  505. opWidth: {
  506. type: Number,
  507. default: 180
  508. },
  509. isRadio: {
  510. // 是否显示单选框
  511. type: Boolean,
  512. default: false
  513. },
  514. disabledSelectedText: {
  515. // 控制是否可以选中
  516. type: String,
  517. default: ''
  518. },
  519. formRef: {
  520. type: Object,
  521. default: () => {}
  522. },
  523. tree: {
  524. type: Number,
  525. default: 1
  526. },
  527. height: {
  528. type: [Number, String],
  529. default: ''
  530. },
  531. showDetailCondition: {
  532. type: Function,
  533. default: () => true
  534. },
  535. showEditCondition: {
  536. type: Function,
  537. default: () => true
  538. },
  539. showDeleteCondition: {
  540. type: Function,
  541. default: () => true
  542. }
  543. })
  544. const toFixedNum = (num: any) => {
  545. try {
  546. return num.toFixed(2)
  547. } catch (e) {
  548. return '0.00'
  549. }
  550. }
  551. const parsingJSON = (row) => {
  552. if (!row || row == '') {
  553. return []
  554. } else {
  555. let json = JSON.parse(row)
  556. return json
  557. }
  558. }
  559. const handleSelectable = (row) => {
  560. if (props.disabledSelectedText) {
  561. return row[props.disabledSelectedText] != 1
  562. }
  563. return true
  564. }
  565. const handleDownload = (row: FileItem) => {
  566. console.log(row)
  567. fetch(row.fileUrl)
  568. .then((response) => {
  569. if (!response.ok) throw new Error('下载失败')
  570. return response.blob()
  571. })
  572. .then((blob) => {
  573. const url = URL.createObjectURL(blob)
  574. const a = document.createElement('a')
  575. a.href = url
  576. a.download = row.fileName
  577. document.body.appendChild(a)
  578. a.click()
  579. document.body.removeChild(a)
  580. URL.revokeObjectURL(url)
  581. })
  582. .catch((error) => console.error('下载失败:', error))
  583. }
  584. const getDictLabelArr = (dictArr, field) => {
  585. const dictLabelArr = getDictOptions(dictArr)
  586. let fields = field.map((item) => item.mealName)
  587. let str = ''
  588. str = dictLabelArr
  589. .filter((item) => fields.includes(item.value))
  590. .map((item) => item.label)
  591. .join(',')
  592. return str
  593. }
  594. const formatterLabel = (row, item) => {
  595. if (Object.keys(row).length > 0) {
  596. // 性别
  597. if (item.field.indexOf('.') > -1) {
  598. let arr = item.field.split('.')
  599. if (arr[0] && arr[1] && row[arr[0]] && row[arr[0]][arr[1]])
  600. return getDictLabel(item.dictArr, row[arr[0]][arr[1]])
  601. } else if (row[item.field] && String(row[item.field]).indexOf(',') > -1) {
  602. // 药物过敏史,返回字符串
  603. let str = '',
  604. tempStr = ''
  605. let arr = JSON.parse(row[item.field])
  606. if (row[item.field].includes('0-')) {
  607. // 0 为 其他
  608. let temp = arr.pop()
  609. arr.push('0')
  610. tempStr = String(temp.split('-')[1])
  611. }
  612. arr.map((a) => {
  613. str += ',' + getDictLabel(item.dictArr, a)
  614. })
  615. str = str.substring(1)
  616. if (tempStr) {
  617. return str + '-' + tempStr
  618. }
  619. return str
  620. }
  621. }
  622. }
  623. const getText = (row, item) => {
  624. if (row) {
  625. const arr = item.split(':')
  626. return formatTime(row[arr[0]], 'yyyy-MM-dd') + ' ' + row[arr[1]]
  627. }
  628. }
  629. const mergeText = (row, t1, t2) => {
  630. return row[t2] + ' - ' + row[t1]
  631. }
  632. const breakpoints = useBreakpoints(breakpointsTailwind)
  633. const smallerThanLg = breakpoints.smaller('xl') // only larger than md
  634. const tableHeight = () => {
  635. return smallerThanLg.value ? 'auto' : '60vh'
  636. // window.outerHeight - (30 + 35 + 40 + 77 + 15 + 20 + 10 + 110 + 180)
  637. }
  638. const formatActualPrice = (item, type) => {
  639. // 统一口径:先对各分量求和成总额 rawSum,再对总额做一次性取整/保留小数。
  640. // 不可逐项取整再加总——分量为负时直接向 0 截断/取整会放大误差(如 -787.5→-787 使 3712.5 变 3713)
  641. const rawSum =
  642. Number(item['bedAmount']) +
  643. Number(item['nurseAmount']) +
  644. Number(item['mealAmount']) +
  645. Number(item['otherAmount']) +
  646. Number(item['insuranceAmount'])
  647. if (item.type == 1) {
  648. if (settingStore.getAdmissionBill == 2) {
  649. // 向上取整
  650. return formatNum(formatCeil(rawSum))
  651. } else if (settingStore.getAdmissionBill == 3) {
  652. // 四舍五入保留两位
  653. return formatNum(fixedNum(rawSum))
  654. } else if (settingStore.getAdmissionBill == 4) {
  655. // 四舍五入取整
  656. return formatNum(formatRound(rawSum))
  657. } else {
  658. // 应收,不取整
  659. return formatNum(rawSum)
  660. }
  661. } else if (settingStore.getRounding) {
  662. // 直丢小数
  663. return formatNum(formatTrunc(rawSum))
  664. } else if (settingStore.getFix2Num) {
  665. // 四舍五入保留两位
  666. return formatNum(fixedNum(rawSum))
  667. } else {
  668. return formatNum(item[type.field])
  669. }
  670. }
  671. const formatAdmissionBillRoundUp = (item, type) => {
  672. if (item.type == 1) {
  673. if (settingStore.getAdmissionBill == 2) {
  674. // 向上取整
  675. return formatCeil(item[type.field])
  676. } else if (settingStore.getAdmissionBill == 3) {
  677. // 四舍五入保留两位
  678. return fixedNum(item[type.field])
  679. } else if (settingStore.getAdmissionBill == 4) {
  680. // 四舍五入取整
  681. return formatRound(item[type.field])
  682. } else {
  683. return formatNum(item[type.field])
  684. }
  685. } else if (settingStore.getRounding) {
  686. return formatTrunc(item[type.field])
  687. } else if (settingStore.getFix2Num) {
  688. return fixedNum(item[type.field])
  689. } else {
  690. return formatNum(item[type.field])
  691. }
  692. }
  693. const calcPrice = (row, item) => {
  694. // 入院账单"四舍五入取整"(getAdmissionBill==4)仍走四舍五入
  695. if (row.type == 1 && settingStore.getAdmissionBill == 4) {
  696. return formatRound(row[item.otherField || item.field])
  697. } else if (settingStore.getRounding) {
  698. // 账单金额单项取整设置:直丢小数
  699. return formatTrunc(row[item.otherField || item.field])
  700. } else if (settingStore.getFix2Num) {
  701. return fixedNum(row[item.field])
  702. } else {
  703. return formatNum(row[item.field])
  704. }
  705. }
  706. const emit = defineEmits([
  707. 'edit',
  708. 'detail',
  709. 'del',
  710. 'sign',
  711. 'print',
  712. 'selectionChange',
  713. 'row-click',
  714. 'sortChange',
  715. 'checkIn',
  716. 'upload',
  717. 'check',
  718. 'audit',
  719. 'cancel'
  720. ])
  721. const handleEdit = (row) => {
  722. emit('edit', row)
  723. }
  724. const handleDetail = (row) => {
  725. emit('detail', row)
  726. }
  727. const handleDelete = (row) => {
  728. emit('del', row.id)
  729. }
  730. const handleCancel = (row) => {
  731. emit('cancel', row.processInstanceId)
  732. }
  733. const handleSign = (row) => {
  734. emit('sign', row)
  735. }
  736. const handlePrint = (row) => {
  737. emit('print', row)
  738. }
  739. const handleSelectionChange = (val) => {
  740. emit('selectionChange', val)
  741. }
  742. const handleRowClick = (row) => {
  743. radioId.value = row.id
  744. emit('row-click', row)
  745. }
  746. const handleSortChange = (val) => {
  747. emit('sortChange', val)
  748. }
  749. const handleCheckIn = (row) => {
  750. emit('checkIn', row)
  751. }
  752. const handleUpload = (row) => {
  753. emit('upload', row)
  754. }
  755. const handleCheck = (row) => {
  756. emit('check', row)
  757. }
  758. const handleAudit = (row) => {
  759. emit('audit', row)
  760. }
  761. const route = useRoute() // 路由信息
  762. const permissionStr = ref('') // 权限字符串
  763. onMounted(() => {
  764. const arr = route.fullPath.substring(1).split('/')
  765. if (props.tree == 1) {
  766. // 需要确定页面有没有携带参数
  767. const str = arr[props.tree].split('?')[0]
  768. permissionStr.value = str
  769. } else if (props.tree == 2) {
  770. permissionStr.value = `${arr[props.tree - 1]}:${arr[props.tree]}` //可能有第三级菜单
  771. }
  772. console.log('权限路径', permissionStr.value, route.fullPath)
  773. })
  774. </script>