index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. <template>
  2. <div class="tenant">
  3. <div class="content">
  4. <byTable
  5. :source="sourceList.data"
  6. :pagination="sourceList.pagination"
  7. :config="config"
  8. :loading="loading"
  9. highlight-current-row
  10. :selectConfig="selectConfig"
  11. :action-list="[
  12. {
  13. text: '发起请款',
  14. action: () => openModal(),
  15. },
  16. ]"
  17. @get-list="getList">
  18. <template #fileSlot="{ item }">
  19. <div style="cursor: pointer; color: #409eff" @click="handleClickFile(item)">
  20. {{ item.fileName }}
  21. </div>
  22. </template>
  23. </byTable>
  24. </div>
  25. <el-dialog title="打印" v-if="openPrint" v-model="openPrint" width="840px">
  26. <div id="pdfDom" style="width: 776px">
  27. <div style="padding: 60px 30px; font-size: 12px !important; color: black">
  28. <div style="font-size: 16px; text-align: center; padding: 8px">
  29. <span>{{ dictDataEcho(printDetails.type, fundsType) }}审批单</span>
  30. </div>
  31. <div style="padding: 8px 0">
  32. <span>{{ printDetails.corporationName }}</span>
  33. <span style="padding-left: 32px">创建时间: {{ printDetails.createTime }}</span>
  34. </div>
  35. <div style="border: 1px solid black">
  36. <div style="display: flex; border-bottom: 1px solid black">
  37. <div style="width: 126px; border-right: 1px solid black; padding: 8px">创建人</div>
  38. <div style="width: calc(100% - 126px); padding: 8px">
  39. {{ dictValueLabel(printDetails.createUser, userList) }}
  40. </div>
  41. </div>
  42. <div style="display: flex; border-bottom: 1px solid black">
  43. <div style="width: 126px; border-right: 1px solid black; padding: 8px">创建人部门</div>
  44. <div style="width: calc(100% - 126px); padding: 8px">
  45. {{ printDetails.deptName }}
  46. </div>
  47. </div>
  48. <div style="display: flex; border-bottom: 1px solid black" v-if="printDetails.type !== '3'">
  49. <div style="width: 126px; border-right: 1px solid black; padding: 4px 8px; display: flex; align-items: center">费用明细</div>
  50. <div style="width: calc(100% - 126px)">
  51. <div style="border-bottom: 1px solid black; display: flex">
  52. <div style="width: 80px; padding: 4px 8px; border-right: 1px solid black; text-align: center">费用类型</div>
  53. <div style="width: 120px; padding: 4px 8px; border-right: 1px solid black; text-align: center">关联合同</div>
  54. <div style="width: calc(100% - 360px); padding: 4px 8px; border-right: 1px solid black; text-align: center">款项说明</div>
  55. <div style="width: 60px; padding: 4px 8px; border-right: 1px solid black; text-align: center">货币</div>
  56. <div style="width: 100px; padding: 4px 8px; text-align: center">付款金额</div>
  57. </div>
  58. <template v-if="printDetails.accountRequestFundsDetailList && printDetails.accountRequestFundsDetailList.length > 0">
  59. <div v-for="(item, index) in printDetails.accountRequestFundsDetailList" :key="index">
  60. <div
  61. :style="
  62. index + 1 !== printDetails.accountRequestFundsDetailList.length ? 'border-bottom: 1px solid black; display: flex' : ' display: flex'
  63. ">
  64. <div style="width: 80px; padding: 4px 8px; border-right: 1px solid black; text-align: center">
  65. {{ dictDataEcho(item.costType, fundsCostType) }}
  66. </div>
  67. <div style="width: 120px; padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">
  68. {{ item.contractCode }}
  69. </div>
  70. <div style="width: calc(100% - 360px); padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">
  71. {{ item.remarks }}
  72. </div>
  73. <div style="width: 60px; padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">
  74. {{ dictDataEcho(printDetails.currency, accountCurrency) }}
  75. </div>
  76. <div style="width: 100px; padding: 4px 8px; display: flex; align-items: center">
  77. {{ item.amount }}
  78. </div>
  79. </div>
  80. </div>
  81. </template>
  82. </div>
  83. </div>
  84. <div style="display: flex; border-bottom: 1px solid black" v-else>
  85. <div style="width: 126px; border-right: 1px solid black; padding: 4px 8px; display: flex; align-items: center">费用明细</div>
  86. <div style="width: calc(100% - 126px)">
  87. <div style="border-bottom: 1px solid black; display: flex">
  88. <div style="width: 80px; padding: 4px 8px; border-right: 1px solid black; text-align: center">费用类型</div>
  89. <div style="width: 120px; padding: 4px 8px; border-right: 1px solid black; text-align: center">关联合同</div>
  90. <div style="width: calc(100% - 420px); padding: 4px 8px; border-right: 1px solid black; text-align: center">款项说明</div>
  91. <div style="width: 60px; padding: 4px 8px; border-right: 1px solid black; text-align: center">货币</div>
  92. <div style="width: 80px; padding: 4px 8px; border-right: 1px solid black; text-align: center">预支金额</div>
  93. <div style="width: 80px; padding: 4px 8px; text-align: center">付款金额</div>
  94. </div>
  95. <template v-if="printDetails.accountRequestFundsDetailList && printDetails.accountRequestFundsDetailList.length > 0">
  96. <div v-for="(item, index) in printDetails.accountRequestFundsDetailList" :key="index">
  97. <div
  98. :style="
  99. index + 1 !== printDetails.accountRequestFundsDetailList.length ? 'border-bottom: 1px solid black; display: flex' : ' display: flex'
  100. ">
  101. <div style="width: 80px; padding: 4px 8px; border-right: 1px solid black; text-align: center">
  102. {{ dictDataEcho(item.costType, fundsCostType) }}
  103. </div>
  104. <div style="width: 120px; padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">
  105. {{ item.contractCode }}
  106. </div>
  107. <div style="width: calc(100% - 420px); padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">
  108. {{ item.remarks }}
  109. </div>
  110. <div style="width: 60px; padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">
  111. {{ dictDataEcho(printDetails.currency, accountCurrency) }}
  112. </div>
  113. <div style="width: 80px; padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">
  114. {{ item.advanceAmount }}
  115. </div>
  116. <div style="width: 80px; padding: 4px 8px; display: flex; align-items: center">
  117. {{ item.amount }}
  118. </div>
  119. </div>
  120. </div>
  121. </template>
  122. </div>
  123. </div>
  124. <div style="display: flex; border-bottom: 1px solid black" v-if="printDetails.type !== '3'">
  125. <div style="width: 126px; border-right: 1px solid black; padding: 8px">总报销金额</div>
  126. <div style="width: calc(100% - 126px); display: flex">
  127. <div style="width: calc(100% - 100px); padding: 8px; border-right: 1px solid black">{{ NumberToChinese(computeMoney("amount")) }}</div>
  128. <div style="width: 100px; padding: 8px">{{ computeMoney("amount") }}</div>
  129. </div>
  130. </div>
  131. <div v-else>
  132. <div style="display: flex; border-bottom: 1px solid black">
  133. <div style="width: 126px; border-right: 1px solid black; padding: 8px">核销总金额</div>
  134. <div style="width: calc(100% - 126px); display: flex">
  135. <div style="width: calc(100% - 80px); padding: 8px; border-right: 1px solid black">{{ NumberToChinese(computeMoney("amount")) }}</div>
  136. <div style="width: 80px; padding: 8px">{{ computeMoney("amount") }}</div>
  137. </div>
  138. </div>
  139. <div style="display: flex; border-bottom: 1px solid black">
  140. <div style="width: 126px; border-right: 1px solid black; padding: 8px">预支总金额</div>
  141. <div style="width: calc(100% - 126px); display: flex">
  142. <div style="width: calc(100% - 80px); padding: 8px; border-right: 1px solid black">{{ NumberToChinese(computeMoney("advanceAmount")) }}</div>
  143. <div style="width: 80px; padding: 8px">{{ computeMoney("advanceAmount") }}</div>
  144. </div>
  145. </div>
  146. <div style="display: flex; border-bottom: 1px solid black">
  147. <div style="width: 126px; border-right: 1px solid black; padding: 8px">差额 (核销 - 预支)</div>
  148. <div style="width: calc(100% - 126px); display: flex">
  149. <div style="width: calc(100% - 80px); padding: 8px; border-right: 1px solid black">{{ NumberToChinese(computeBalance()) }}</div>
  150. <div style="width: 80px; padding: 8px">{{ computeBalance() }}</div>
  151. </div>
  152. </div>
  153. </div>
  154. <div style="display: flex; border-bottom: 1px solid black">
  155. <div style="width: 126px; border-right: 1px solid black; padding: 8px">单据数量</div>
  156. <div style="width: calc(100% - 126px); padding: 8px">
  157. {{ printDetails.quantity }}
  158. </div>
  159. </div>
  160. <div style="display: flex; border-bottom: 1px solid black">
  161. <div style="width: 126px; border-right: 1px solid black; padding: 0 8px; display: flex; align-items: center">收款信息</div>
  162. <div style="width: calc(100% - 126px)">
  163. <div style="border-bottom: 1px solid black; display: flex">
  164. <div style="width: 19%; padding: 0 8px; border-right: 1px solid black; text-align: center">支付方式</div>
  165. <div style="width: 27%; padding: 0 8px; border-right: 1px solid black; text-align: center">收款方户名</div>
  166. <div style="width: 27%; padding: 0 8px; border-right: 1px solid black; text-align: center">开户行</div>
  167. <div style="width: 27%; padding: 0 8px; text-align: center">收款方账号</div>
  168. </div>
  169. <div style="display: flex">
  170. <div style="width: 19%; padding: 0 8px; border-right: 1px solid black; display: flex; align-items: center">
  171. {{ dictDataEcho(printDetails.paymentMethod, fundsPaymentMethod) }}
  172. </div>
  173. <div style="width: 27%; padding: 0 8px; border-right: 1px solid black; display: flex; align-items: center">
  174. {{ printDetails.name }}
  175. </div>
  176. <div style="width: 27%; padding: 0 8px; border-right: 1px solid black; display: flex; align-items: center">
  177. {{ printDetails.openingBank }}
  178. </div>
  179. <div style="width: 27%; padding: 0 8px; display: flex; align-items: center">
  180. {{ printDetails.accountOpening }}
  181. </div>
  182. </div>
  183. </div>
  184. </div>
  185. <div style="display: flex; border-bottom: 1px solid black">
  186. <div style="width: 126px; border-right: 1px solid black; padding: 8px">电子发票(PDF/JPG)</div>
  187. <div style="width: calc(100% - 126px); padding: 8px">{{ printDetails.electronicInvoiceText }}</div>
  188. </div>
  189. <div style="display: flex">
  190. <div style="width: 126px; border-right: 1px solid black; padding: 4px 8px; display: flex; align-items: center">审批流程</div>
  191. <div style="width: calc(100% - 126px)">
  192. <template v-if="printDetails.recordList && printDetails.recordList.length > 0">
  193. <div v-for="(item, index) in printDetails.recordList" :key="index">
  194. <div
  195. :style="
  196. index + 1 !== printDetails.recordList.length
  197. ? 'border-bottom: 1px solid black; padding: 4px 8px; display: flex'
  198. : 'padding: 4px 8px; display: flex'
  199. ">
  200. <div style="width: calc(100% - 120px); word-wrap: break-word">
  201. <span>{{ item.nodeName }}: </span>
  202. <span style="padding-left: 4px">{{ item.processedUser }}</span>
  203. <span style="padding-left: 4px">{{ item.remark }}</span>
  204. </div>
  205. <div style="width: 120px">{{ item.processedDate }}</div>
  206. </div>
  207. </div>
  208. </template>
  209. </div>
  210. </div>
  211. </div>
  212. <div style="padding-top: 16px">
  213. <span>打印时间: {{ presentTime }}</span>
  214. <span style="padding-left: 32px">打印人: {{ useUserStore().user.nickName }}</span>
  215. </div>
  216. </div>
  217. </div>
  218. <template #footer>
  219. <el-button @click="openPrint = false" size="large">取消</el-button>
  220. <el-button type="primary" @click="clickDownload()" size="large">下载PDF</el-button>
  221. </template>
  222. </el-dialog>
  223. </div>
  224. </template>
  225. <script setup>
  226. import byTable from "@/components/byTable/index";
  227. import useUserStore from "@/store/modules/user";
  228. import { ref } from "vue";
  229. import moment from "moment";
  230. const loading = ref(false);
  231. const sourceList = ref({
  232. data: [],
  233. pagination: {
  234. total: 3,
  235. pageNum: 1,
  236. pageSize: 10,
  237. status: "",
  238. },
  239. });
  240. const { proxy } = getCurrentInstance();
  241. const selectConfig = reactive([
  242. {
  243. label: "类型",
  244. prop: "type",
  245. data: [],
  246. },
  247. {
  248. label: "审批状态",
  249. prop: "status",
  250. data: [
  251. {
  252. label: "审批中",
  253. value: "10",
  254. },
  255. {
  256. label: "驳回",
  257. value: "20",
  258. },
  259. {
  260. label: "已通过",
  261. value: "30",
  262. },
  263. ],
  264. },
  265. {
  266. label: "放款状态",
  267. prop: "paymentStatus",
  268. data: [],
  269. },
  270. ]);
  271. const config = computed(() => {
  272. return [
  273. {
  274. attrs: {
  275. label: "归属公司",
  276. prop: "corporationName",
  277. },
  278. width: 180,
  279. },
  280. {
  281. attrs: {
  282. label: "归属部门",
  283. prop: "deptName",
  284. },
  285. width: 140,
  286. },
  287. {
  288. attrs: {
  289. label: "请款类型",
  290. prop: "type",
  291. },
  292. render(type) {
  293. return proxy.dictDataEcho(type, fundsType.value);
  294. },
  295. width: 120,
  296. },
  297. {
  298. attrs: {
  299. label: "请款人",
  300. prop: "userName",
  301. width: 120,
  302. },
  303. },
  304. {
  305. attrs: {
  306. label: "请款时间",
  307. prop: "createTime",
  308. width: 160,
  309. },
  310. },
  311. {
  312. attrs: {
  313. label: "请款金额",
  314. prop: "total",
  315. width: 120,
  316. },
  317. },
  318. {
  319. attrs: {
  320. label: "用款说明",
  321. prop: "paymentRemarks",
  322. 'min-width': 180
  323. },
  324. },
  325. {
  326. attrs: {
  327. label: "付款方式",
  328. prop: "paymentMethod",
  329. width: 120,
  330. },
  331. render(paymentMethod) {
  332. return proxy.dictDataEcho(paymentMethod, fundsPaymentMethod.value);
  333. },
  334. },
  335. {
  336. attrs: {
  337. label: "付款账户",
  338. prop: "accountManagementName",
  339. width: 160,
  340. },
  341. },
  342. {
  343. attrs: {
  344. label: "审批状态",
  345. prop: "status",
  346. width: 120,
  347. },
  348. render(status) {
  349. return status == 10 ? "审批中" : status == 20 ? "驳回" : status == 30 ? "已通过" : "";
  350. },
  351. },
  352. {
  353. attrs: {
  354. label: "放款状态",
  355. prop: "subscribeContent",
  356. width: 120,
  357. },
  358. // render(subscribeContent) {
  359. // return proxy.dictDataEcho(subscribeContent, fundsPaymentMethod.value);
  360. // },
  361. },
  362. {
  363. attrs: {
  364. label: "操作",
  365. width: "80",
  366. align: "center",
  367. fixed: "right",
  368. },
  369. renderHTML(row) {
  370. return [
  371. {
  372. attrs: {
  373. label: "打印",
  374. type: "primary",
  375. text: true,
  376. },
  377. el: "button",
  378. click() {
  379. clickPrint(row);
  380. },
  381. },
  382. ];
  383. },
  384. },
  385. ];
  386. });
  387. const getList = async (req) => {
  388. sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
  389. loading.value = true;
  390. proxy.post("/accountRequestFunds/page", sourceList.value.pagination).then((message) => {
  391. sourceList.value.data = message.rows;
  392. sourceList.value.pagination.total = message.total;
  393. setTimeout(() => {
  394. loading.value = false;
  395. }, 200);
  396. });
  397. };
  398. const openModal = () => {
  399. const flowName = `${userInfo.nickName}的请款申请(发起)`;
  400. proxy.$router.replace({
  401. path: "/platform_manage/process/processApproval",
  402. query: {
  403. flowKey: "account_request_funds_flow",
  404. flowName,
  405. },
  406. });
  407. };
  408. const userInfo = useUserStore().user;
  409. const tenantId = userInfo.tenantId;
  410. const fundsType = ref([]);
  411. const accountData = ref([]);
  412. const userList = ref([]);
  413. const accountCurrency = ref([]);
  414. const fundsCostType = ref([]);
  415. const fundsPaymentMethod = ref([]);
  416. const getDictData = () => {
  417. // 请款类型数据
  418. proxy
  419. .post("/dictTenantData/page", {
  420. pageNum: 1,
  421. pageSize: 999,
  422. tenantId: tenantId,
  423. dictCode: "founds_type",
  424. })
  425. .then((res) => {
  426. fundsType.value = res.rows;
  427. selectConfig[0].data = res.rows.map((x) => ({
  428. label: x.dictValue,
  429. value: x.dictKey,
  430. }));
  431. });
  432. // 请款付款方式数据
  433. proxy
  434. .post("/dictTenantData/page", {
  435. pageNum: 1,
  436. pageSize: 999,
  437. tenantId: tenantId,
  438. dictCode: "funds_payment_method",
  439. })
  440. .then((res) => {
  441. fundsPaymentMethod.value = res.rows;
  442. });
  443. // 货币
  444. proxy
  445. .post("/dictTenantData/page", {
  446. pageNum: 1,
  447. pageSize: 999,
  448. dictCode: "account_currency",
  449. tenantId: useUserStore().user.tenantId,
  450. })
  451. .then((res) => {
  452. accountCurrency.value = res.rows;
  453. });
  454. proxy
  455. .post("/dictTenantData/page", {
  456. pageNum: 1,
  457. pageSize: 999,
  458. dictCode: "funds_cost_type",
  459. tenantId: useUserStore().user.tenantId,
  460. })
  461. .then((res) => {
  462. fundsCostType.value = res.rows;
  463. });
  464. proxy.post("/accountManagement/page", { pageNum: 1, pageSize: 9999 }).then((res) => {
  465. accountData.value = res.rows.map((item) => {
  466. return {
  467. ...item,
  468. label: item.alias,
  469. value: item.id,
  470. };
  471. });
  472. });
  473. proxy
  474. .get("/tenantUser/list", {
  475. pageNum: 1,
  476. pageSize: 10000,
  477. tenantId: useUserStore().user.tenantId,
  478. })
  479. .then((res) => {
  480. if (res.rows && res.rows.length > 0) {
  481. userList.value = res.rows.map((item) => {
  482. return {
  483. deptId: item.deptId,
  484. label: item.nickName,
  485. value: item.userId,
  486. };
  487. });
  488. }
  489. });
  490. };
  491. getDictData();
  492. getList();
  493. const openPrint = ref(false);
  494. const printDetails = ref({});
  495. const presentTime = ref("");
  496. const clickPrint = (row) => {
  497. presentTime.value = moment().format("yyyy-MM-DD HH:mm:ss");
  498. openPrint.value = true;
  499. proxy.post("/accountRequestFunds/detail", { id: row.id }).then((res) => {
  500. printDetails.value = res;
  501. proxy.post("/fileInfo/getList", { businessIdList: [row.id] }).then((resFile) => {
  502. let electronicInvoiceText = "";
  503. if (resFile[row.id] && resFile[row.id].length > 0) {
  504. for (let i = 0; i < resFile[row.id].length; i++) {
  505. if (i === 0) {
  506. electronicInvoiceText = resFile[row.id][0].fileName;
  507. } else {
  508. electronicInvoiceText = electronicInvoiceText + ", " + resFile[row.id][i].fileName;
  509. }
  510. }
  511. }
  512. printDetails.value.electronicInvoiceText = electronicInvoiceText;
  513. });
  514. if (row.flowInfoId) {
  515. proxy.post("/flowExample/getApprovalRecord", { id: row.flowInfoId }).then((record) => {
  516. printDetails.value.recordList = record.recordList;
  517. });
  518. }
  519. });
  520. };
  521. const clickDownload = () => {
  522. proxy.getPdf("请款PDF文件");
  523. };
  524. const computeMoney = (label) => {
  525. let amount = 0;
  526. if (printDetails.value.accountRequestFundsDetailList && printDetails.value.accountRequestFundsDetailList.length > 0) {
  527. for (let i = 0; i < printDetails.value.accountRequestFundsDetailList.length; i++) {
  528. if (printDetails.value.accountRequestFundsDetailList[i][label]) {
  529. amount = Number(parseFloat(Number(amount) + Number(printDetails.value.accountRequestFundsDetailList[i][label])).toFixed(2));
  530. }
  531. }
  532. }
  533. return amount;
  534. };
  535. const toDx = (n) => {
  536. //阿拉伯数字转换函数
  537. switch (n) {
  538. case "0":
  539. return "零";
  540. case "1":
  541. return "壹";
  542. case "2":
  543. return "贰";
  544. case "3":
  545. return "叁";
  546. case "4":
  547. return "肆";
  548. case "5":
  549. return "伍";
  550. case "6":
  551. return "陆";
  552. case "7":
  553. return "柒";
  554. case "8":
  555. return "捌";
  556. case "9":
  557. return "玖";
  558. }
  559. };
  560. const NumberToChinese = (m) => {
  561. let unit = ["仟", "佰", "拾", "", "仟", "佰", "拾", "", "角", "分", "厘"];
  562. m *= 1000;
  563. m = Number(parseFloat(m).toFixed(0));
  564. m += "";
  565. var x = m.length;
  566. var result = "";
  567. for (var i = 0; i < x; i++) {
  568. if (i == 3) {
  569. result = "元" + result;
  570. } else if (i == 7) {
  571. result = "万" + result;
  572. }
  573. if (m.charAt(x - i - 1) == 0) {
  574. if (i != 0 && i != 1 && i != 2) {
  575. if (result.charAt(0) != "零" && result.charAt(0) != "元" && result.charAt(0) != "万") {
  576. result = "零" + result;
  577. }
  578. }
  579. continue;
  580. }
  581. result = toDx(m.charAt(x - i - 1)) + unit[unit.length - i - 1] + result;
  582. }
  583. result += result.charAt(result.length - 1) == "元" ? "整" : "";
  584. return result;
  585. };
  586. const computeBalance = () => {
  587. let balance = 0;
  588. let advanceAmount = computeMoney("advanceAmount");
  589. let amount = computeMoney("amount");
  590. if (amount) {
  591. balance = Number(amount);
  592. }
  593. if (advanceAmount) {
  594. balance = Number(parseFloat(Number(balance) - Number(advanceAmount)).toFixed(2));
  595. }
  596. return balance;
  597. };
  598. </script>
  599. <style lang="scss" scoped>
  600. .tenant {
  601. padding: 20px;
  602. }
  603. </style>