add.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  1. <template>
  2. <el-dialog
  3. top="5vh"
  4. :visible.sync="visible"
  5. :title="isView ? '查看收发明细表明细' : '选择收发明细表明细'"
  6. width="90vw"
  7. >
  8. <el-card shadow="never" style="height: 70vh">
  9. <!-- 数据表格 -->
  10. <div>
  11. <el-form
  12. ref="formRef"
  13. label-position="left"
  14. class="ele-form-search"
  15. :model="formData"
  16. :rules="rules"
  17. @keyup.enter.native="search"
  18. @submit.native.prevent
  19. >
  20. <el-row :gutter="15">
  21. <el-col :span="6">
  22. <el-form-item label-width="90px" label="编码:" prop="code">
  23. <el-input
  24. disabled
  25. v-model="formData.code"
  26. placeholder="请输入"
  27. ></el-input>
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="6">
  31. <el-form-item label-width="90px" label="名称:" prop="name">
  32. <el-input
  33. :disabled="isView"
  34. v-model="formData.name"
  35. placeholder="请输入"
  36. ></el-input>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="6">
  40. <el-form-item label-width="90px" label="起止时间:" prop="time">
  41. <el-date-picker
  42. :disabled="isView"
  43. style="width: 100%"
  44. class="w100"
  45. size="small"
  46. v-model="formData.time"
  47. type="daterange"
  48. range-separator="至"
  49. start-placeholder="开始日期"
  50. end-placeholder="结束日期"
  51. value-format="yyyy-MM-dd"
  52. :picker-options="pickerOptions"
  53. ></el-date-picker>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="6">
  57. <el-form-item label-width="90px" label="关键词:" prop="keyWord">
  58. <el-input
  59. :disabled="isView"
  60. v-model="formData.keyWord"
  61. placeholder="请输入物品名称/型号/批次号/物品编码/颜色/客户"
  62. ></el-input>
  63. </el-form-item>
  64. </el-col>
  65. <el-col :span="6">
  66. <el-form-item label-width="90px" label="出入库:" prop="type">
  67. <el-select
  68. filterable
  69. placeholder="请选择"
  70. v-model="formData.type"
  71. clearable
  72. :disabled="isView"
  73. @change="handleOutInChange"
  74. >
  75. <el-option
  76. v-for="item in outInOption"
  77. :key="item.code"
  78. :value="item.code + ''"
  79. :label="item.label"
  80. ></el-option>
  81. </el-select>
  82. </el-form-item>
  83. </el-col>
  84. <el-col :span="6">
  85. <el-form-item label-width="90px" :label="formData.type == 2 ? '出库类型:' : '入库类型:'" prop="bizType">
  86. <el-select
  87. filterable
  88. placeholder="请选择"
  89. v-model="formData.bizType"
  90. :disabled="isView"
  91. clearable
  92. >
  93. <el-option
  94. v-for="item in outInStateOption"
  95. :key="item.code"
  96. :value="item.code + ''"
  97. :label="item.label"
  98. ></el-option>
  99. </el-select>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="6">
  103. <el-form-item label-width="90px" label="物品类型:" prop="categoryLevelId">
  104. <el-select
  105. filterable
  106. placeholder="请选择"
  107. v-model="formData.categoryLevelId"
  108. :disabled="isView"
  109. clearable
  110. >
  111. <el-option
  112. v-for="item in codeOption"
  113. :key="item.dictCode"
  114. :value="item.dictCode"
  115. :label="item.dictValue"
  116. ></el-option>
  117. </el-select>
  118. </el-form-item>
  119. </el-col>
  120. <!-- <el-col :span="6">
  121. <el-form-item label-width="90px" label="型号:" prop="modelType">
  122. <el-input
  123. :disabled="isView"
  124. v-model="formData.modelType"
  125. placeholder="请输入"
  126. ></el-input>
  127. </el-form-item>
  128. </el-col> -->
  129. <el-col v-if="!isView" :span="6">
  130. <div class="ele-form-actions">
  131. <el-button
  132. type="primary"
  133. icon="el-icon-search"
  134. class="ele-btn-icon"
  135. @click="search"
  136. size="small"
  137. >
  138. 查询
  139. </el-button>
  140. <el-button
  141. @click="reset"
  142. icon="el-icon-refresh-left"
  143. size="small"
  144. type="primary"
  145. >重置</el-button
  146. >
  147. </div>
  148. </el-col>
  149. </el-row>
  150. </el-form>
  151. </div>
  152. <ele-pro-table
  153. ref="table"
  154. class="table"
  155. :columns="columns"
  156. :datasource="datasource"
  157. height="calc(100% - 100px)"
  158. full-height="calc(100vh - 56px)"
  159. tool-class="ele-toolbar-form"
  160. :page-size="20"
  161. style="margin-top: 18px"
  162. >
  163. <!-- 状态 -->
  164. <!-- <template v-slot:verifyStatus="{ row }">
  165. <span :class="status[row.verifyStatus].class">
  166. {{ status[row.verifyStatus].label }}
  167. </span>
  168. </template> -->
  169. <template v-slot:bizType="{ row }">
  170. {{ handleBizType(row.bizType, row.type) }}
  171. </template>
  172. <template v-slot:assetType="{ row }">
  173. {{ handleAssetType(row?.extInfo?.assetType) }}
  174. </template>
  175. </ele-pro-table>
  176. </el-card>
  177. <div slot="footer" class="dialog-footer" style="margin-right: 2%">
  178. <el-button
  179. v-if="!isView"
  180. size="small"
  181. @click="downLoad('statistics')"
  182. :loading="loading"
  183. type="primary"
  184. >统计导出</el-button
  185. >
  186. <el-button
  187. v-if="!isView"
  188. size="small"
  189. @click="downLoad('detail')"
  190. :loading="loading"
  191. type="primary"
  192. >明细导出</el-button
  193. >
  194. <el-button v-else size="small" @click="visible = false" type="primary"
  195. >确定</el-button
  196. >
  197. <el-button size="small" @click="visible = false">关闭</el-button>
  198. </div>
  199. </el-dialog>
  200. </template>
  201. <script>
  202. import { getCode } from '@/api/codeManagement/index.js';
  203. import ItemSearch from './components/item-search.vue';
  204. import {
  205. sendReceiveExcel,
  206. sendReceiveDetailListExcel,
  207. outintwoPage
  208. } from '@/api/warehouseManagement/statisticalReports';
  209. import storageApi from '@/api/warehouseManagement';
  210. import { allCategoryLevel } from '@/api/classifyManage';
  211. import { getTreeByGroup } from '@/api/classifyManage';
  212. import {
  213. warehousingType,
  214. sceneState,
  215. outputSceneState,
  216. auditStatus,
  217. useDict
  218. } from '@/utils/dict/index';
  219. export default {
  220. components: { ItemSearch },
  221. data() {
  222. return {
  223. auditStatus,
  224. outputSceneState,
  225. warehousingType,
  226. sceneState,
  227. status: [
  228. { label: '未审核', class: 'ele-text-info' },
  229. { label: '审核中', class: 'ele-text-primary' },
  230. { label: '审核通过', class: 'ele-text-success' },
  231. { label: '驳回', class: 'ele-text-danger' }
  232. ],
  233. outInOption: [
  234. { code: '2', label: '出库' },
  235. { code: '1', label: '入库' }
  236. ],
  237. codeOption: [],
  238. loading: false,
  239. isView: false,
  240. formData: {
  241. code: '',
  242. name: '',
  243. time: [],
  244. status: 2,
  245. keyWord: '',
  246. bizType: '',
  247. categoryLevelId: '',
  248. type: ''
  249. },
  250. // 表单验证规则
  251. rules: {
  252. name: [
  253. { required: true, message: '请输入库存余额名称', trigger: 'blur' }
  254. ],
  255. time: [
  256. { required: true, message: '请选择起止时间', trigger: 'change' }
  257. ]
  258. },
  259. pickerOptions: {
  260. shortcuts: [
  261. {
  262. text: '最近一周',
  263. onClick(picker) {
  264. const end = new Date();
  265. const start = new Date();
  266. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  267. picker.$emit('pick', [start, end]);
  268. }
  269. },
  270. {
  271. text: '最近一个月',
  272. onClick(picker) {
  273. const end = new Date();
  274. const start = new Date();
  275. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  276. picker.$emit('pick', [start, end]);
  277. }
  278. },
  279. {
  280. text: '最近三个月',
  281. onClick(picker) {
  282. const end = new Date();
  283. const start = new Date();
  284. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  285. picker.$emit('pick', [start, end]);
  286. }
  287. },
  288. {
  289. text: '最近一年',
  290. onClick(picker) {
  291. const end = new Date();
  292. const start = new Date();
  293. start.setTime(start.getTime() - 3600 * 1000 * 24 * 365);
  294. picker.$emit('pick', [start, end]);
  295. }
  296. }
  297. ]
  298. },
  299. visible: false
  300. };
  301. },
  302. computed: {
  303. // 表格列配置
  304. columns() {
  305. console.log(this.isView);
  306. let arr = [
  307. {
  308. type: 'index',
  309. label: '序号',
  310. width: 50,
  311. align: 'center'
  312. },
  313. {
  314. prop: 'bizNo',
  315. label: '单号',
  316. align: 'center',
  317. slot: 'bizNo',
  318. showOverflowTooltip: true,
  319. width: 150
  320. },
  321. {
  322. prop: 'bizType',
  323. slot: 'bizType',
  324. label: '出入库类型',
  325. align: 'center',
  326. showOverflowTooltip: true,
  327. width: 130
  328. },
  329. {
  330. prop: 'assetType',
  331. slot: 'assetType',
  332. label: '物品类型',
  333. align: 'center',
  334. showOverflowTooltip: true,
  335. width: 130
  336. },
  337. {
  338. prop: 'categoryNames',
  339. label: '物品名称',
  340. align: 'center',
  341. showOverflowTooltip: true,
  342. width: 150
  343. },
  344. {
  345. prop: 'categoryCodes',
  346. label: '物品编码',
  347. align: 'center',
  348. showOverflowTooltip: true,
  349. width: 150
  350. },
  351. {
  352. prop: 'batchNo',
  353. label: '批次号',
  354. align: 'center',
  355. showOverflowTooltip: true,
  356. width: 120
  357. },
  358. {
  359. prop: 'modelType',
  360. label: '型号',
  361. align: 'center',
  362. showOverflowTooltip: true,
  363. width: 120
  364. },
  365. {
  366. prop: 'clientName',
  367. label: '客户',
  368. align: 'center',
  369. showOverflowTooltip: true,
  370. width: 120
  371. },
  372. {
  373. prop: 'totalQuantity',
  374. label: '数量',
  375. align: 'center',
  376. showOverflowTooltip: true,
  377. width: 120
  378. },
  379. {
  380. prop: 'colorKey',
  381. label: '颜色',
  382. align: 'center',
  383. showOverflowTooltip: true,
  384. width: 150
  385. },
  386. {
  387. prop: 'modelKey',
  388. label: '机型',
  389. align: 'center',
  390. showOverflowTooltip: true,
  391. width: 120
  392. },
  393. {
  394. prop: 'sourceBizNo',
  395. label: '来源单据',
  396. align: 'center',
  397. showOverflowTooltip: true,
  398. width: 120
  399. },
  400. {
  401. prop: 'createUserName',
  402. label: '操作人',
  403. align: 'center',
  404. showOverflowTooltip: true,
  405. width: 120
  406. },
  407. {
  408. width: 160,
  409. prop: 'storageTime',
  410. label: '出入库时间',
  411. align: 'center',
  412. showOverflowTooltip: true
  413. },
  414. {
  415. prop: 'verifyName',
  416. label: '审核人',
  417. align: 'center',
  418. showOverflowTooltip: true,
  419. width: 120
  420. }
  421. // {
  422. // prop: 'verifyStatus',
  423. // label: '状态',
  424. // align: 'center',
  425. // slot: 'verifyStatus',
  426. // showOverflowTooltip: true,
  427. // width: 100
  428. // }
  429. ];
  430. // if (!this.isView) {
  431. return arr.filter((item) => item != '');
  432. // }
  433. // if (this.isView) {
  434. // return [
  435. // {
  436. // type: 'index',
  437. // label: '序号',
  438. // width: 50,
  439. // align: 'center'
  440. // },
  441. // {
  442. // prop: 'categoryCode',
  443. // label: '物品编码',
  444. // align: 'center',
  445. // showOverflowTooltip: true,
  446. // width: 150
  447. // },
  448. // {
  449. // prop: 'categoryName',
  450. // label: '物品名称',
  451. // align: 'center',
  452. // showOverflowTooltip: true,
  453. // width: 150
  454. // },
  455. // {
  456. // prop: 'categoryLevelPath',
  457. // label: '物品类型',
  458. // align: 'center',
  459. // showOverflowTooltip: true,
  460. // width: 150
  461. // },
  462. // {
  463. // prop: 'specification',
  464. // label: '规格',
  465. // align: 'center',
  466. // showOverflowTooltip: true,
  467. // width: 150
  468. // },
  469. // {
  470. // width: 160,
  471. // prop: 'inStorageTime',
  472. // label: '出入库时间',
  473. // align: 'center',
  474. // showOverflowTooltip: true
  475. // },
  476. // {
  477. // prop: 'bizNo',
  478. // label: '单号',
  479. // align: 'center',
  480. // slot: 'bizNo',
  481. // showOverflowTooltip: true,
  482. // width: 150
  483. // },
  484. // {
  485. // prop: 'inBizType',
  486. // slot: 'inBizType',
  487. // label: '出入库类型',
  488. // align: 'center',
  489. // showOverflowTooltip: true,
  490. // width: 150,
  491. // formatter: (row) => {
  492. // return (
  493. // sceneState.find((item) => item.code == row.inBizType).label ??
  494. // ''
  495. // );
  496. // }
  497. // },
  498. // {
  499. // prop: 'supplierName',
  500. // label: '往来单位',
  501. // align: 'center',
  502. // showOverflowTooltip: true
  503. // },
  504. // {
  505. // prop: 'warehouseName',
  506. // label: '仓库名称',
  507. // align: 'center',
  508. // showOverflowTooltip: true
  509. // },
  510. // {
  511. // prop: 'remark',
  512. // label: '备注',
  513. // align: 'center',
  514. // showOverflowTooltip: true
  515. // },
  516. // {
  517. // prop: 'inQuantity',
  518. // label: '入库数量',
  519. // align: 'center',
  520. // showOverflowTooltip: true
  521. // },
  522. // {
  523. // prop: 'inUnitPrice',
  524. // label: '入库单价',
  525. // align: 'center',
  526. // showOverflowTooltip: true
  527. // },
  528. // {
  529. // prop: 'inPrice',
  530. // label: '入库成本小计',
  531. // align: 'center',
  532. // showOverflowTooltip: true
  533. // },
  534. // {
  535. // prop: 'outQuantity',
  536. // label: '出库数量',
  537. // align: 'center',
  538. // showOverflowTooltip: true
  539. // },
  540. // {
  541. // prop: 'outUnitPrice',
  542. // label: '出库单价',
  543. // align: 'center',
  544. // showOverflowTooltip: true
  545. // },
  546. // {
  547. // prop: 'outPrice',
  548. // label: '出库成本小计',
  549. // align: 'center',
  550. // showOverflowTooltip: true
  551. // },
  552. // {
  553. // prop: 'totalQuantity',
  554. // label: '结存数量',
  555. // align: 'center',
  556. // showOverflowTooltip: true
  557. // },
  558. // {
  559. // prop: 'totalUnitPrice',
  560. // label: '结存单位成本',
  561. // align: 'center',
  562. // showOverflowTooltip: true
  563. // },
  564. // {
  565. // prop: 'totalPrice',
  566. // label: '结存成本',
  567. // align: 'center',
  568. // showOverflowTooltip: true
  569. // }
  570. // ];
  571. // }
  572. },
  573. clientEnvironmentId() {
  574. return this.$store.state.user.info.clientEnvironmentId;
  575. },
  576. outInStateOption() {
  577. return this.formData.type == 2 ? this.outputSceneState : this.formData.type == 1 ? this.sceneState : []
  578. }
  579. },
  580. created() {
  581. this.getTypeList();
  582. this.getAssetTypeList()
  583. },
  584. methods: {
  585. // 获取物品类型下拉选择树
  586. async getAssetTypeList() {
  587. const { data } = await getTreeByGroup({ type: 2 });
  588. this.codeOption = data.map((item) => {
  589. return { dictCode: item.id, dictValue: item.name };
  590. });
  591. },
  592. handleOutInChange() {
  593. // this.formData.bizType = '';
  594. },
  595. async getTypeList() {
  596. const { data } = await allCategoryLevel();
  597. this.codeList = data.map((item) => {
  598. return { dictCode: item.id, dictValue: item.name };
  599. });
  600. },
  601. handleAssetType(r) {
  602. const code = this.codeList.find((item) => item.dictCode == r);
  603. return code?.dictValue;
  604. },
  605. handleBizType(code, type) {
  606. // console.log(this.sceneState);
  607. // console.log(code, type);
  608. if (type == 1) {
  609. // 入库
  610. for (const key in this.sceneState) {
  611. if (this.sceneState[key].code == code) {
  612. return this.sceneState[key].label;
  613. }
  614. }
  615. } else {
  616. // 出库
  617. for (const key in this.outputSceneState) {
  618. if (this.outputSceneState[key].code == code) {
  619. return this.outputSceneState[key].label;
  620. }
  621. }
  622. }
  623. },
  624. // 获取时间函数
  625. getDate(date) {
  626. console.log(date);
  627. let obj = {
  628. year: date.getFullYear(), //获取完整的年份(4位)
  629. month: date.getMonth() + 1, //获取当前月份(0-11,0代表1月)
  630. strDate: date.getDate() // 获取当前日(1-31)
  631. };
  632. Object.keys(obj).forEach((key) => {
  633. if (obj[key] < 10) obj[key] = `0${obj[key]}`;
  634. });
  635. return `${obj.year}-${obj.month}-${obj.strDate}`;
  636. },
  637. downLoad(type) {
  638. if (!this.formData.name) {
  639. return this.$message.error('请输入名称');
  640. }
  641. if (this.formData.time.length <= 0) {
  642. return this.$message.error('请选择时间');
  643. }
  644. this.loading = true;
  645. const params = Object.assign({}, this.formData);
  646. if (params.time?.length) {
  647. params.startTime = params.time[0];
  648. params.endTime = params.time[1];
  649. }
  650. delete params.time;
  651. const requestApi = type == 'statistics' ? sendReceiveExcel : sendReceiveDetailListExcel;
  652. requestApi(params).then((data) => {
  653. try {
  654. let objectUrl1 = window.URL.createObjectURL(new Blob([data]));
  655. let elink = document.createElement('a');
  656. elink.setAttribute(
  657. 'download',
  658. decodeURI(decodeURI('收发明细表.xlsx'))
  659. );
  660. elink.style.display = 'none';
  661. elink.href = objectUrl1;
  662. document.body.appendChild(elink);
  663. elink.click();
  664. document.body.removeChild(elink);
  665. window.URL.revokeObjectURL(elink.href);
  666. this.loading = false;
  667. this.visible = false;
  668. this.$emit('reload');
  669. } catch (err) {
  670. this.$message.error('导出失败,请联系管理员!');
  671. }
  672. });
  673. },
  674. async getList(row) {
  675. const res = await outintwoPage({
  676. type: 1,
  677. code: row.code,
  678. name: row.name,
  679. startTime: row.startTime,
  680. endTime: row.endTime,
  681. pageNum: 1,
  682. size: -1
  683. });
  684. this.tableList = res.data;
  685. console.log(this.tableList);
  686. },
  687. async open(isView, row, searchParams) {
  688. console.log('open', row, this.$refs.formRef, searchParams);
  689. if(this.$refs.formRef) {
  690. this.$refs.formRef.resetFields()
  691. }
  692. if (isView) {
  693. // await this.getList(row);
  694. // this.tableList = row.info.map((item) => {
  695. // return {
  696. // ...item,
  697. // startTime: this.getDate(new Date(Number(item.startTime)))
  698. // };
  699. // });
  700. // console.log(this.tableList);
  701. this.formData.code = row.code;
  702. this.formData.name = row.name;
  703. this.formData.status = 2;
  704. this.formData.time =
  705. row.startTime && row.endTime ? [row.startTime, row.endTime] : [];
  706. this.formData.keyWord = row.keyWord;
  707. this.formData.type = (row.isType == 0 || !row.isType) ? '' : row.isType;
  708. this.formData.bizType = (row.bizType == 0 || !row.bizType) ? '' : row.bizType;
  709. this.formData.categoryLevelId = (row.categoryLevelId == 0 || !row.categoryLevelId) ? '' : row.categoryLevelId;
  710. } else {
  711. this.tableList = [];
  712. this.formData = Object.assign({}, {
  713. code: await getCode('statistics_log_code'),
  714. name: '',
  715. status: 2,
  716. time: [],
  717. keyWord: '',
  718. type: '',
  719. bizType: '',
  720. categoryLevelId: ''
  721. }, searchParams);
  722. }
  723. this.isView = isView;
  724. this.visible = true;
  725. this.$nextTick(() => {
  726. this.$refs.table.reload();
  727. });
  728. },
  729. /* 表格数据源 */
  730. async datasource({ page, limit, where, order }) {
  731. // if (this.isView) {
  732. // return this.tableList;
  733. // } else {
  734. const params = Object.assign({}, this.formData);
  735. if (params.time?.length) {
  736. params.startTime = params.time[0];
  737. params.endTime = params.time[1];
  738. }
  739. delete params.time;
  740. const data = await storageApi.getInboundGoodsList({
  741. ...params,
  742. ...where,
  743. ...order,
  744. pageNum: page,
  745. size: limit
  746. });
  747. console.log(data);
  748. this.tableList = data;
  749. return data;
  750. // }
  751. },
  752. search() {
  753. this.$refs.table.reload();
  754. },
  755. reset() {
  756. this.formData.time = [];
  757. this.formData.keyWord = '';
  758. this.formData.type = '';
  759. this.formData.bizType = '';
  760. this.formData.categoryLevelId = '';
  761. this.$refs.formRef.resetFields()
  762. this.search();
  763. }
  764. }
  765. };
  766. </script>
  767. <style lang="scss" scoped>
  768. #inventoryBalance {
  769. height: 100%;
  770. width: 100%;
  771. padding: 10px;
  772. box-sizing: border-box;
  773. .ele-form-actions {
  774. display: flex;
  775. justify-content: flex-end;
  776. }
  777. }
  778. :deep(.table) {
  779. height: calc(100% - 100px);
  780. }
  781. </style>