paymentRequestDetails.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. <template>
  2. <div class="borderless">
  3. <div class="customer-head">
  4. <div class="customer-back">
  5. <el-button v-if="!auditDisabled" type="danger" style="border: none;background: none;color: red"
  6. icon="el-icon-arrow-left" @click="backToList">返回列表
  7. </el-button>
  8. <div v-if="!auditDisabled" class="upper_right_button">
  9. <el-button type="primary" size="small" v-if="viewDisabled" class="el-button--small-yh "
  10. :loading="buttonLoading" @click.stop="openEdit()">编辑
  11. </el-button>
  12. <el-dropdown style="padding: 0 8px;line-height: 0">
  13. <el-button type="warning" :disabled="viewDisabled" :loading="buttonLoading" size="small">
  14. 审批处理<i class="el-icon-arrow-down el-icon--right"></i>
  15. </el-button>
  16. <el-dropdown-menu slot="dropdown">
  17. <el-dropdown-item :loading="buttonLoading" :disabled="checkDisabled || viewDisabled"
  18. @click.native="paymentCheck">{{ form.checkStatus == '审批中' ? '审批中' : '审批提交' }}
  19. </el-dropdown-item>
  20. <el-dropdown-item :loading="buttonLoading" :disabled="!checkDisabled || viewDisabled"
  21. @click.native="checkScheduleDialog = true, checkId = form.id">审批进度
  22. </el-dropdown-item>
  23. <el-dropdown-item :disabled="!recallDisabled || viewDisabled" @click.native="cancelAudit">撤销审批
  24. </el-dropdown-item>
  25. </el-dropdown-menu>
  26. </el-dropdown>
  27. <el-button type="warning" size="small" :loading="buttonLoading" class="el-button--small-yh"
  28. :disabled="form.checkStatus !== '审批通过' || viewDisabled" @click.stop="settlement">结算
  29. </el-button>
  30. <el-button type="primary" size="small" :disabled="viewDisabled" :loading="buttonLoading"
  31. class="el-button--small-yh" @click.stop="confirmEdit">保存数据
  32. </el-button>
  33. </div>
  34. <div v-if="auditDisabled" class="upper_right_button">
  35. <el-button type="primary" size="small" class="el-button--small-yh" :loading="buttonLoading"
  36. @click.stop="checkScheduleDialog = true, checkId = detailData.check.srcBillId">
  37. 审批流程
  38. </el-button>
  39. <el-button type="primary" size="small" class="el-button--small-yh" :loading="buttonLoading"
  40. :disabled="buttonDisabled" @click.stop="openCheckDialog">
  41. 审批
  42. </el-button>
  43. </div>
  44. </div>
  45. </div>
  46. <div class="customer-main">
  47. <containerTitle title="基础信息"></containerTitle>
  48. <basic-container>
  49. <avue-form class="trading-form" ref="form" v-model="form" :option="option">
  50. <template slot="corpId">
  51. <crop-select v-model="form.corpId" corpType="KG" :disabled="checkDisabled || auditDisabled || viewDisabled"
  52. @getCorpData="returnBack" style="width: 100%"></crop-select>
  53. </template>
  54. <template slot="belongToCorpId">
  55. <crop-select v-model="form.belongToCorpId" corpType="GS"
  56. :disabled="checkDisabled || auditDisabled || viewDisabled" style="width: 100%"></crop-select>
  57. </template>
  58. <template slot="accountNo">
  59. <el-select v-model="form.accountNo" placeholder="请选择" @change="accountNoChange"
  60. :disabled="checkDisabled || auditDisabled || viewDisabled" clearable allow-create default-first-option
  61. filterable>
  62. <el-option v-for="(item, index) in form.bankList" :key="index" :label="item.accountNo"
  63. :value="item.accountNo">
  64. </el-option>
  65. </el-select>
  66. </template>
  67. <template slot="remark">
  68. <el-input type="textarea" v-model="form.remark" :disabled="viewDisabled" size="small" rows="2"
  69. autocomplete="off" placeholder="">
  70. </el-input>
  71. </template>
  72. </avue-form>
  73. </basic-container>
  74. <containerTitle title="明细列表"></containerTitle>
  75. <basic-container>
  76. <avue-crud :option="itemOption" :data="dataList" ref="crud" v-model="itemForm" :page.sync="page"
  77. :cell-style="cellStyle" @search-reset="searchReset" @row-update="rowUpdate"
  78. @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
  79. @saveColumn="saveColumn" @resetColumn="resetColumn" @refresh-change="refreshChange">
  80. <template slot-scope="scope" slot="menu">
  81. <el-button type="text" size="small" icon="el-icon-edit"
  82. :disabled="checkDisabled || auditDisabled || viewDisabled" @click="rowCell(scope.row, scope.index)">{{
  83. scope.row.$cellEdit ? '修改完成' : '修改'
  84. }}
  85. </el-button>
  86. <el-button type="text" size="small" icon="el-icon-delete"
  87. :disabled="checkDisabled || auditDisabled || viewDisabled" @click.stop="rowDel(scope.row, scope.index)">删除
  88. </el-button>
  89. </template>
  90. <template slot="srcOrderno" slot-scope="{ row }">
  91. <span style="color: #409EFF;cursor: pointer" @click.stop="editOpen(row)">{{ row.srcOrderno }}
  92. </span>
  93. </template>
  94. <template slot="costType" slot-scope="{ row }">
  95. <breakdown-select v-if="row.$cellEdit" v-model="row.costType" :configuration="breakConfiguration">
  96. </breakdown-select>
  97. <span v-else>{{ row.itemName }}</span>
  98. </template>
  99. <template slot="price" slot-scope="{ row }">
  100. <el-input v-if="row.$cellEdit" v-model="row.price" placeholder="请输入" size="small"
  101. oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'></el-input>
  102. <span v-else>{{ row.price }}</span>
  103. </template>
  104. <template slot="currency" slot-scope="{row,index}">
  105. <el-select v-if="row.$cellEdit" v-model="row.currency" size="small" @change="currencyChange(row)" clearable
  106. filterable>
  107. <el-option v-for="(item, index) in currencyDic" :key="index" :label="item.dictValue"
  108. :value="item.dictValue"></el-option>
  109. </el-select>
  110. <span v-else>{{ row.currency }}</span>
  111. </template>
  112. </avue-crud>
  113. </basic-container>
  114. </div>
  115. <el-dialog append-to-body title="审批进度" class="el-dialogDeep" :visible.sync="checkScheduleDialog" width="40%"
  116. :close-on-click-modal="false" :destroy-on-close="true" :close-on-press-escape="false" v-dialog-drag>
  117. <check-schedule :checkId="checkId" :batchNo="batchNo" @choceScheduleFun="choceScheduleFun">
  118. </check-schedule>
  119. </el-dialog>
  120. <el-dialog append-to-body title="审批" class="el-dialogDeep" :visible.sync="checkDialog" width="50%"
  121. :close-on-click-modal="false" :destroy-on-close="true" :close-on-press-escape="false" v-dialog-drag>
  122. <check :checkData="checkData" :checkDetail="false" :idList="[]" @choceCheckFun="choceCheckFun">
  123. </check>
  124. </el-dialog>
  125. </div>
  126. </template>
  127. <script>
  128. import itemOption from "./configuration/detailsPage.json";
  129. import { contrastObj, contrastList } from "@/util/contrastData";
  130. import { getDetails, paymentCheck, getlistBankBy, saveOrEdit, deleteDetail } from "@/api/financialManagement/paymentRequest";
  131. import checkSchedule from "../../../components/check/checkSchedule";
  132. import check from "@/components/check/check";
  133. import { cancelCheck } from "@/api/check/check";
  134. import option from "./configuration/mainList.json";
  135. export default {
  136. name: "paymentDetailsPage",
  137. props: {
  138. detailData: {
  139. type: Object
  140. }
  141. },
  142. components: {
  143. checkSchedule,
  144. check
  145. },
  146. data() {
  147. return {
  148. form: {},
  149. itemForm: {},
  150. checkData: {},
  151. itemOption: itemOption,
  152. viewDisabled: false,
  153. checkDisabled: false,
  154. auditDisabled: false,
  155. buttonDisabled: true,
  156. buttonLoading: false,
  157. checkScheduleDialog: false,
  158. recallDisabled: false,
  159. checkDialog: false,
  160. checkId: '',
  161. batchNo: '',
  162. parentId: 0,
  163. id: "",
  164. dataList: [],
  165. currencyDic: [],
  166. page: {
  167. pageSize: 10,
  168. pagerCount: 5,
  169. total: 0,
  170. },
  171. breakConfiguration: {
  172. multipleChoices: false,
  173. multiple: false,
  174. disabled: false,
  175. searchShow: true,
  176. collapseTags: false,
  177. placeholder: '请点击右边按钮选择',
  178. dicData: []
  179. },
  180. query: {},
  181. option: {
  182. menuBtn: false,
  183. labelWidth: 100,
  184. column: [
  185. {
  186. label: '系统号',
  187. prop: 'sysNo',
  188. span: 8,
  189. disabled: true
  190. }, {
  191. label: '合同号',
  192. prop: 'srcOrderno',
  193. span: 8,
  194. rules: [
  195. {
  196. required: true,
  197. message: ' ',
  198. trigger: 'blur'
  199. }
  200. ]
  201. }, {
  202. label: '往来单位',
  203. prop: 'corpId',
  204. sort: true,
  205. span: 8,
  206. rules: [
  207. {
  208. required: false,
  209. message: ' ',
  210. trigger: 'blur'
  211. }
  212. ]
  213. },
  214. {
  215. label: '银行账号',
  216. prop: 'accountNo',
  217. type: "select",
  218. span: 8,
  219. rules: [
  220. {
  221. required: false,
  222. message: ' ',
  223. trigger: 'blur'
  224. }
  225. ]
  226. },
  227. {
  228. label: '开户银行',
  229. prop: 'accountBank',
  230. span: 8,
  231. rules: [
  232. {
  233. required: false,
  234. message: ' ',
  235. trigger: 'blur'
  236. }
  237. ]
  238. }, {
  239. label: '银行户头',
  240. prop: 'accountName',
  241. span: 8,
  242. rules: [
  243. {
  244. required: false,
  245. message: ' ',
  246. trigger: 'blur'
  247. }
  248. ]
  249. },
  250. {
  251. label: '人民币金额',
  252. prop: 'amount',
  253. span: 8,
  254. rules: [
  255. {
  256. pattern: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/,
  257. message: ' ',
  258. trigger: 'blur'
  259. }
  260. ]
  261. },
  262. {
  263. label: '外币金额',
  264. prop: 'foreignAmount',
  265. span: 8,
  266. rules: [
  267. {
  268. pattern: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/,
  269. message: ' ',
  270. trigger: 'blur'
  271. }
  272. ]
  273. },
  274. {
  275. label: '所属公司',
  276. prop: 'belongToCorpId',
  277. sort: true,
  278. span: 8,
  279. rules: [
  280. {
  281. required: false,
  282. message: ' ',
  283. trigger: 'blur'
  284. }
  285. ]
  286. },
  287. {
  288. label: '申请人',
  289. prop: 'createUserName',
  290. span: 8,
  291. disabled: true,
  292. rules: [
  293. {
  294. required: false,
  295. message: ' ',
  296. trigger: 'blur'
  297. }
  298. ]
  299. }, {
  300. label: '申请日期',
  301. prop: 'createTime',
  302. span: 8,
  303. type: "date",
  304. disabled: true,
  305. rules: [
  306. {
  307. required: false,
  308. message: ' ',
  309. trigger: 'blur'
  310. }
  311. ]
  312. },
  313. {
  314. label: '备注',
  315. prop: 'remark',
  316. span: 24,
  317. minRows: 2,
  318. rules: [
  319. {
  320. required: false,
  321. message: ' ',
  322. trigger: 'blur'
  323. }
  324. ]
  325. },
  326. ],
  327. },
  328. oldForm: {},
  329. oldDataList: [],
  330. }
  331. },
  332. async created() {
  333. this.itemOption = await this.getColumnData(this.getColumnName(62), itemOption);
  334. if (JSON.parse(localStorage.getItem("saber-userInfo")).content.tenant_id === '681169') {
  335. for (let item in this.itemOption.column) {
  336. if (this.itemOption.column[item].prop === 'billNo') {
  337. this.itemOption.column.splice(item, 1)
  338. }
  339. }
  340. }
  341. //是否需要根据 登录人所属公司 区分不用option
  342. //币别
  343. this.getWorkDicts("currency").then(res => {
  344. this.currencyDic = res.data.data
  345. })
  346. if (this.detailData.view) {
  347. this.viewDisabled = true
  348. this.option.disabled = true
  349. }
  350. if (this.detailData.id) {
  351. this.id = this.detailData.id;
  352. this.buttonLoading = true;
  353. getDetails(this.id).then(res => {
  354. this.afterEcho(res.data.data)
  355. }).finally(() => {
  356. this.buttonLoading = false
  357. })
  358. }
  359. if (this.detailData.check) {
  360. //待审批状态才可选择通过或者驳回
  361. if (this.detailData.check.auditStatus === "S") {
  362. this.buttonDisabled = false
  363. }
  364. this.auditDisabled = true
  365. this.buttonLoading = true;
  366. this.batchNo = this.detailData.check.batchNo
  367. getDetails(this.detailData.check.srcBillId).then(res => {
  368. this.afterEcho(res.data.data)
  369. }).finally(() => {
  370. this.buttonLoading = false;
  371. })
  372. }
  373. },
  374. methods: {
  375. //选择客户
  376. returnBack(corpValue) {
  377. getlistBankBy(corpValue.id).then(res => {
  378. this.form.bankList = res.data
  379. })
  380. },
  381. //选择银行账号
  382. accountNoChange(value) {
  383. this.form.bankList.forEach(item => {
  384. if (item.accountNo == value) {
  385. this.$set(this.form, "accountBank", item.accountBank)
  386. this.$set(this.form, "accountName", item.accountName)
  387. }
  388. })
  389. },
  390. //选择币别 带汇率
  391. currencyChange(row) {
  392. if (row.currency === "CNY") {
  393. row.exchangeRate = 1
  394. } else if (row.currency === "USD") {
  395. row.exchangeRate = 6.384300
  396. } else {
  397. row.exchangeRate = 7.174900
  398. }
  399. },
  400. searchReset() {
  401. console.log('1')
  402. },
  403. selectionChange() {
  404. console.log('1')
  405. },
  406. currentChange() {
  407. console.log('1')
  408. },
  409. sizeChange() {
  410. console.log('1')
  411. },
  412. refreshChange() {
  413. console.log('1')
  414. },
  415. rowUpdate(row, index, done, loading) {
  416. done(row);
  417. },
  418. rowCell(row, index) {
  419. this.$refs.crud.rowCell(row, index)
  420. },
  421. rowDel(row, index) {
  422. this.$confirm("确定删除数据?", {
  423. confirmButtonText: "确定",
  424. cancelButtonText: "取消",
  425. type: "warning"
  426. }).then(() => {
  427. if (row.id) {
  428. deleteDetail({ ids: row.id }).then(res => {
  429. this.$message({
  430. type: 'success',
  431. message: '删除成功!'
  432. })
  433. this.dataList.splice(row.$index, 1);
  434. })
  435. } else {
  436. this.$message({
  437. type: "success",
  438. message: "删除成功!"
  439. });
  440. this.dataList.splice(row.$index, 1);
  441. }
  442. });
  443. },
  444. //打开审核
  445. openCheckDialog() {
  446. this.checkData = this.detailData.check
  447. this.checkDialog = true;
  448. },
  449. //关闭审核
  450. choceCheckFun() {
  451. this.checkDialog = false;
  452. },
  453. choceScheduleFun() {
  454. this.checkScheduleDialog = false
  455. },
  456. //审核
  457. paymentCheck() {
  458. if (this.verification()) {
  459. this.$confirm("您确定提交此次申请吗?", {
  460. confirmButtonText: "确定",
  461. cancelButtonText: "取消",
  462. type: "warning"
  463. }).then(() => {
  464. this.buttonLoading = true
  465. const params = {
  466. id: this.form.id,
  467. billType: this.form.billType,
  468. url: "/financialManagement/paymentRequest/index",
  469. pageStatus: "this.$store.getters.pqStatus",
  470. pageLabel: "付费申请",
  471. checkType: 'ffsq'
  472. }
  473. paymentCheck(params).then(res => {
  474. if (res.data.success) {
  475. this.$message.success("申请成功!");
  476. this.afterEcho(res.data.data)
  477. }
  478. }).finally(() => {
  479. this.buttonLoading = false
  480. })
  481. })
  482. }
  483. },
  484. //撤销审核
  485. cancelAudit() {
  486. this.buttonLoading = true
  487. cancelCheck(this.form.id).then(res => {
  488. if (res.data.success) {
  489. this.$message.success("操作成功!")
  490. this.afterEcho(res.data.data)
  491. }
  492. }).finally(() => {
  493. this.buttonLoading = false
  494. })
  495. },
  496. //结算
  497. settlement() {
  498. if (this.verification()) {
  499. if (this.$store.getters.paySettle) {
  500. this.$alert("结算页面已存在,请关闭结算页面再进行操作", "温馨提示", {
  501. confirmButtonText: "确定",
  502. type: 'warning',
  503. callback: action => {
  504. }
  505. });
  506. } else {
  507. //关闭一下存在的列表页 跳转
  508. this.$router.$avueRouter.closeTag('/financialManagement/paymentSettle/paymentSettle');
  509. this.$router.push({
  510. path: "/financialManagement/paymentSettle/paymentSettle",
  511. query: { params: this.form.id },
  512. });
  513. }
  514. }
  515. },
  516. confirmEdit(status) {
  517. this.$refs["form"].validate((valid, done) => {
  518. done();
  519. if (valid) {
  520. this.form.billNo = this.dataList.map(item => { return item.billNo }).join(",")
  521. const params = {
  522. ...this.form,
  523. billType: "申请",
  524. itemsList: this.dataList
  525. }
  526. this.buttonLoading = true
  527. saveOrEdit(params).then(res => {
  528. this.$message.success("操作成功!")
  529. this.afterEcho(res.data.data)
  530. }).finally(() => {
  531. this.buttonLoading = false
  532. })
  533. if (status === true) {
  534. this.$emit("goBack");
  535. }
  536. }
  537. })
  538. },
  539. //验证新旧数据
  540. verification() {
  541. if (contrastObj(this.form, this.oldForm) || contrastList(this.dataList, this.oldDataList)) {
  542. this.$confirm("您已改动数据,是否先保存在进行操作!", {
  543. confirmButtonText: "保存",
  544. cancelButtonText: "取消",
  545. type: "warning"
  546. }).then(() => {
  547. this.confirmEdit()
  548. }).catch(() => {
  549. return false; //取消改动数据
  550. })
  551. } else {
  552. return true; //没有动过数据
  553. }
  554. },
  555. afterEcho(data) {
  556. this.form = data;
  557. this.oldForm = Object.assign({}, data);
  558. this.checkDisabled = data.checkStatus === "录入" ? false : true;
  559. this.recallDisabled = data.checkStatus === "审批提交" ? true : false;
  560. this.option.column.forEach(item => {
  561. if (item.prop == "remark") {
  562. this.$set(item, "disabled", (this.auditDisabled || false))
  563. } else if (item.prop == "createUserName" || item.prop == "createTime" || item.prop == "sysNo") {
  564. this.$set(item, "disabled", true)
  565. } else {
  566. this.$set(item, "disabled", this.checkDisabled)
  567. }
  568. })
  569. if (data.itemsList) {
  570. this.dataList = data.itemsList
  571. this.oldDataList = this.deepClone(data.itemsList)
  572. }
  573. },
  574. async openEdit() {
  575. //标签页保存key
  576. this.inDetailsKey(this.$route.name, this.detailData.lockData);
  577. //单据是否锁定
  578. if (!await this.checkLocks(this.detailData.lockData)) {
  579. this.onLock(this.detailData.lockData); //上锁
  580. this.viewDisabled = false
  581. this.option = this.$options.data().option;
  582. } else {
  583. this.$message.warning('此单据已被锁定,请稍后再进行操作!')
  584. }
  585. },
  586. backToList() {
  587. //如果为审核页面 则直接返回
  588. if (this.viewDisabled || this.detailData.check || !this.detailData.lockData) {
  589. this.$emit("goBack");
  590. return
  591. }
  592. if (contrastObj(this.form, this.oldForm) || contrastList(this.dataList, this.oldDataList)
  593. ) {
  594. this.$confirm("是否保存当前页面?", "提示", {
  595. confirmButtonText: "保存",
  596. cancelButtonText: "取消",
  597. type: "warning",
  598. }).then(() => {
  599. this.editCustomer(true)
  600. }).catch(() => {
  601. this.$emit("goBack");
  602. }).finally(() => {
  603. if (this.form.id) {
  604. this.unLock(this.detailData.lockData);
  605. this.leaveDetailsKey(this.$route.name);
  606. }
  607. })
  608. } else {
  609. this.$emit("goBack");
  610. if (this.form.id) {
  611. this.unLock(this.detailData.lockData);
  612. this.leaveDetailsKey(this.$route.name);
  613. }
  614. }
  615. },
  616. //列保存触发
  617. async saveColumn() {
  618. const inSave = await this.saveColumnData(
  619. this.getColumnName(62),
  620. this.itemOption
  621. );
  622. if (inSave) {
  623. this.$message.success("保存成功");
  624. //关闭窗口
  625. this.$refs.crud.$refs.dialogColumn.columnBox = false;
  626. }
  627. },
  628. async resetColumn() {
  629. const inSave = await this.delColumnData(
  630. this.getColumnName(62),
  631. itemOption
  632. );
  633. if (inSave) {
  634. this.$message.success("重置成功");
  635. this.itemOption = itemOption;
  636. if (JSON.parse(localStorage.getItem("saber-userInfo")).content.tenant_id === '681169') {
  637. for (let item in this.itemOption.column) {
  638. if (this.itemOption.column[item].prop === 'billNo') {
  639. this.itemOption.column.splice(item, 1)
  640. }
  641. }
  642. }
  643. //关闭窗口
  644. this.$refs.crud.$refs.dialogColumn.columnBox = false;
  645. }
  646. },
  647. editOpen(row) {
  648. this.$router.$avueRouter.closeTag("/businessManagement/purchaseOrder/index");
  649. this.$router.push({
  650. path: "/businessManagement/purchaseOrder/index",
  651. query: {
  652. params: row.srcParentId
  653. },
  654. });
  655. },
  656. cellStyle() {
  657. return "padding:0;height:40px;";
  658. },
  659. }
  660. }
  661. </script>
  662. <style lang="scss" scoped>
  663. ::v-deep .el-form-item {
  664. margin-bottom: 0;
  665. }
  666. .trading-form ::v-deep .el-form-item {
  667. margin-bottom: 8px !important;
  668. }
  669. .upper_right_button {
  670. display: flex;
  671. position: fixed;
  672. right: 12px;
  673. top: 47px;
  674. }
  675. </style>