first-item.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. <template>
  2. <div class="hc-layout-box" id="first-item-node-layout-target">
  3. <div class="hc-layout-left-box" :style="'width:' + leftWidth + 'px;'" v-show="!isFirstReportDrawer">
  4. <div class="hc-project-box">
  5. <div class="hc-project-icon-box">
  6. <HcIcon name="stack"/>
  7. </div>
  8. <div class="ml-2 project-name-box">
  9. <span class="text-xl text-cut project-alias">{{projectInfo['projectAlias']}}</span>
  10. <div class="text-xs text-cut project-name">{{projectInfo['name']}}</div>
  11. </div>
  12. </div>
  13. <div class="hc-tree-box">
  14. <el-scrollbar>
  15. <WbsTree :autoExpandKeys="TreeAutoExpandKeys" :projectId="projectId" :contractId="contractId" @nodeTap="nodeWbsElTreeClick"/>
  16. </el-scrollbar>
  17. </div>
  18. <!--左右拖动-->
  19. <div class="horizontal-drag-line" @mousedown="onmousedown"/>
  20. </div>
  21. <div class="hc-layout-content-box first-item" v-show="!isFirstReportDrawer">
  22. <HcCard :scrollbar="false" actionSize="lg">
  23. <template #header>
  24. <HcTooltip keys="other-first-item-report" v-if="tabTypeKey === 'mark'">
  25. <el-button type="primary" hc-btn :disabled="tableSelectionKeys.length <= 0" @click="firstReportClick">
  26. <HcIcon name="send-plane-2"/>
  27. <span>上报首件</span>
  28. </el-button>
  29. </HcTooltip>
  30. <HcTooltip keys="other-first-item-report-approval" v-if="tabTypeKey === 'query'">
  31. <el-button type="primary" hc-btn :disabled="tableSelectionKeys.length <= 0" @click="reportModalClick">
  32. <HcIcon name="send-plane-2"/>
  33. <span>上报审批</span>
  34. </el-button>
  35. </HcTooltip>
  36. <HcTooltip keys="other-first-item-repeal">
  37. <el-button hc-btn :disabled="tableSelectionKeys.length <= 0">
  38. <HcIcon name="delete-bin-3"/>
  39. <span>批量废除</span>
  40. </el-button>
  41. </HcTooltip>
  42. <HcTooltip keys="other-first-item-down-print">
  43. <el-button hc-btn :disabled="tableSelectionKeys.length <= 0">
  44. <HcIcon name="printer"/>
  45. <span>预览/打印</span>
  46. </el-button>
  47. </HcTooltip>
  48. </template>
  49. <template #extra>
  50. <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" @change="tabTypeChange"/>
  51. </template>
  52. <template #search>
  53. <div class="w-32">
  54. <el-select v-model="searchForm.status" placeholder="流程状态" clearable>
  55. <el-option v-for="item in processStatus" :label="item['dictValue']" :value="item['dictKey']"/>
  56. </el-select>
  57. </div>
  58. <div class="w-32 ml-3">
  59. <el-select v-model="searchForm.reportNumber" placeholder="上报批次" clearable>
  60. <el-option v-for="item in reportBatch" :label="item" :value="item"/>
  61. </el-select>
  62. </div>
  63. <div class="w-64 ml-3">
  64. <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate"/>
  65. </div>
  66. <div class="w-64 ml-3">
  67. <el-input v-model="searchForm.queryValue" placeholder="请输入名称关键词检索" clearable @keyup="keyUpEvent"/>
  68. </div>
  69. <div class="ml-2">
  70. <el-button type="primary" @click="searchClick">
  71. <HcIcon name="search-2"/>
  72. <span>搜索</span>
  73. </el-button>
  74. </div>
  75. </template>
  76. <HcTable ref="tableListRef" :column="tableListColumn" :datas="tableListData" :loading="tableLoading" isCheck @selection-change="tableSelectionChange">
  77. <template #name="{row}">
  78. <span class="text-link" @click="tableRowName(row)">{{row?.name}}</span>
  79. </template>
  80. <template #waitingUserList="{row}">
  81. <template v-for="item in row['waitingUserList']">
  82. <el-tag :type="`${item.status === 2 ? 'success' : item.status === 3 ? 'warning' : item.status === 999 ? 'danger' : 'info'}`"
  83. class="mx-1" effect="dark" v-if="item['waitingUserName']">{{item['waitingUserName']}}</el-tag>
  84. </template>
  85. </template>
  86. <template #taskStatusStr="{row}">
  87. <el-tag :type="`${row.status === 2 ? 'success' : row.status === 0 ? 'warning' : row.status === 1 ? 'danger' : 'info'}`"
  88. class="mx-1" effect="dark" v-if="row['taskStatusStr']">{{row['taskStatusStr']}}</el-tag>
  89. </template>
  90. </HcTable>
  91. <template #action>
  92. <div class="lr-dialog-footer">
  93. <div class="left">
  94. <span class="text-success">任务人中:</span>
  95. <el-tag type="success" class="mx-1" effect="dark">已签字</el-tag>
  96. <el-tag type="warning" class="mx-1" effect="dark">已废除</el-tag>
  97. <el-tag type="danger" class="mx-1" effect="dark">签字异常</el-tag>
  98. </div>
  99. <div class="right">
  100. <HcPages :pages="searchForm" @change="pageChange"/>
  101. </div>
  102. </div>
  103. </template>
  104. </HcCard>
  105. </div>
  106. <!--上报首件-->
  107. <HcDrawer :show="isFirstReportDrawer" :isCard="false" uis="hc-first-item-node-layout" to-id="first-item-node-layout-target" @close="FirstReportDrawerClose">
  108. <div class="node-content">
  109. <div class="node-form">
  110. <el-scrollbar v-if="contractId && isTableForm">
  111. <div class="hc-excel-table-form-view" :id="`table-form-${contractId}`"></div>
  112. </el-scrollbar>
  113. <HcStatus :desc="statusDesc" v-else/>
  114. </div>
  115. <div class="node-file">
  116. <div class="title">上传总结报告</div>
  117. <div class="node-upload-box" v-if="contractId && isTableForm">
  118. <HcUpload :fileList="fileListData" :pkeyId="pkeyIds" @finish='uploadChange'/>
  119. </div>
  120. <div class="node-upload-box" v-else>
  121. <el-alert title="表单异常,暂时无法使用上传" type="warning" show-icon :closable="false"/>
  122. </div>
  123. <el-divider border-style="dashed" />
  124. <div class="title">文件附件</div>
  125. <div class="hc-table-node-file-box">
  126. <HcTable :column="tableFileColumn" :datas="tableFileData" :isIndex="false">
  127. <template #action="{row,index}">
  128. <el-button type="danger" plain size="small" @click="tableDelButton(index)">删除</el-button>
  129. </template>
  130. </HcTable>
  131. </div>
  132. </div>
  133. </div>
  134. <div class="node-action">
  135. <el-button type="primary" hc-btn :disabled="!contractId || !isTableForm" :loading="tableFormSaveLoading" @click="saveBussData">
  136. <HcIcon name="save"/>
  137. <span>保存</span>
  138. </el-button>
  139. <el-button hc-btn :disabled="!contractId || !isTableForm" @click="bussPdfInfo">
  140. <HcIcon name="eye"/>
  141. <span>预览</span>
  142. </el-button>
  143. <el-button hc-btn :disabled="!contractId || !isTableForm" :loading="reportLoading" @click="reportModalClick">
  144. <HcIcon name="send-plane-2"/>
  145. <span>上报</span>
  146. </el-button>
  147. <el-button hc-btn @click="FirstReportDrawerClose">
  148. <HcIcon name="close"/>
  149. <span>返回</span>
  150. </el-button>
  151. </div>
  152. </HcDrawer>
  153. <!--上报审批-->
  154. <HcReportModal title="上报审批" url="informationWriteQuery/taskOne" :show="showReportModal" :projectId="projectId" :contractId="contractId" type="first" :typeData="reportTypeData"
  155. :taskName="reportTaskName" :ids="reportIds" @hide="showReportModal = false" @finish="showReportFinish"/>
  156. </div>
  157. </template>
  158. <script setup>
  159. import {useAppStore} from "~src/store";
  160. import {nextTick, onMounted, ref, watch} from 'vue'
  161. import {useRouter, useRoute} from 'vue-router'
  162. import WbsTree from "./components/WbsTree.vue"
  163. import HcUpload from "./components/HcUpload.vue"
  164. import HTableForm from "~src/plugins/HTableForm"
  165. import {getReportNumber,eVisaTaskCheckApi} from "~api/other";
  166. import firstApi from '~api/other/first-item';
  167. import tasksApi from '~api/tasks/data';
  168. import {getStoreData, setStoreData} from '~src/utils/storage'
  169. import {getArrValue, isString, getObjValue, getObjNullValue,deepClone} from "vue-utils-plus"
  170. //变量
  171. const router = useRouter()
  172. const useRoutes = useRoute()
  173. const useAppState = useAppStore()
  174. const projectId = ref(useAppState.getProjectId);
  175. const contractId = ref(useAppState.getContractId);
  176. const projectInfo = ref(useAppState.getProjectInfo);
  177. const isCollapse = ref(useAppState.getCollapse)
  178. //路由参数
  179. const routerQuery = useRoutes?.query;
  180. const typeName = routerQuery?.type || 'mark'
  181. //监听
  182. watch(() => [
  183. useAppState.getCollapse
  184. ], ([Collapse]) => {
  185. isCollapse.value = Collapse
  186. })
  187. //自动展开缓存
  188. const TreeAutoExpandKeys = ref(getStoreData('firstItemTreeKeys') || [])
  189. //类型tab数据和相关处理
  190. const tabTypeKey = ref(typeName)
  191. const tabTypeTab = ref([
  192. {key:'mark', name: '已标记为首件'},
  193. {key:'query', name: '首件查询'}
  194. ]);
  195. const tabTypeChange = (item) => {
  196. tabTypeKey.value = item?.key
  197. if (searchForm.value.wbsId) {
  198. searchForm.value.current = 1;
  199. getTableData()
  200. }
  201. //路由跳转
  202. router.push({
  203. path: useRoutes.path,
  204. query: {type: item?.key}
  205. })
  206. }
  207. //渲染完成
  208. onMounted(() => {
  209. firstTaskStatus()
  210. })
  211. //项目树被点击
  212. const treeItem = ref({})
  213. const nodeWbsElTreeClick = ({data, keys}) => {
  214. treeItem.value = data
  215. searchForm.value.contractIdRelation = data['contractIdRelation']
  216. searchForm.value.wbsId = data['primaryKeyId']
  217. //缓存自动展开
  218. TreeAutoExpandKeys.value = keys
  219. setStoreData('firstItemTreeKeys', keys)
  220. //获取相关数据
  221. getReportNumberByContractId(data['contractIdRelation'])
  222. searchClick()
  223. }
  224. //获取流程状态
  225. const processStatus = ref([])
  226. const firstTaskStatus = async () => {
  227. const { data } = await tasksApi.queryTaskTypeStatus({
  228. typeOrStatus: 'first_task_status'
  229. })
  230. //处理数据
  231. processStatus.value = getArrValue(data)
  232. }
  233. //获取上报批次
  234. const reportBatch = ref([])
  235. const getReportNumberByContractId = async (cid) => {
  236. const { data } = await getReportNumber({
  237. contractId: contractId.value,
  238. contractIdRelation: cid ?? ''
  239. })
  240. //处理数据
  241. reportBatch.value = getArrValue(data)
  242. }
  243. //搜索表单
  244. const searchForm = ref({
  245. wbsId: '', status: null, reportNumber: null, queryValue: '', betweenTime: '',
  246. contractIdRelation: '', current: 1, size: 20, total: 0
  247. })
  248. //日期时间被选择
  249. const betweenTime = ref(null)
  250. const betweenTimeUpdate = ({query,arr}) => {
  251. betweenTime.value = arr
  252. searchForm.value.betweenTime = query
  253. }
  254. //回车搜索
  255. const keyUpEvent = (e) => {
  256. if (e.key === "Enter") {
  257. searchClick()
  258. }
  259. }
  260. //搜索
  261. const searchClick = () => {
  262. if (searchForm.value.wbsId) {
  263. searchForm.value.current = 1;
  264. getTableData()
  265. } else {
  266. window?.$message?.warning('请先在左边选择一个树节点')
  267. }
  268. }
  269. //分页被点击
  270. const pageChange = ({current, size}) => {
  271. searchForm.value.current = current
  272. searchForm.value.size = size
  273. getTableData()
  274. }
  275. //表格表头
  276. const tableListColumn = ref([
  277. {key:'name', name: '文件名称'},
  278. {key:'waitingUserList', name: '任务人'},
  279. {key:'startTime', name: '开始时间', width: 180},
  280. {key:'taskStatusStr', name: '流程状态', width: 140},
  281. {key:'reportNumber', name: '上报批次', width: 120},
  282. ])
  283. //获取表格数据
  284. const tableLoading = ref(false)
  285. const tableListData = ref([])
  286. const getTableData = async () => {
  287. const searchInfo = searchForm.value
  288. const tabKey = tabTypeKey.value
  289. if (!!searchInfo.wbsId) {
  290. //初始处理
  291. tableLoading.value = true
  292. tableListRef.value?.clearSelection()
  293. tableSelectionKeys.value = []
  294. tableListData.value = []
  295. //获取相关数据
  296. let addFormData = {
  297. projectId: projectId.value,
  298. contractId: contractId.value,
  299. isFirst: 1,
  300. }
  301. const treeInfo = treeItem.value
  302. //已标记的首件
  303. if (tabKey === 'mark' && addFormData['firstTitle']) {
  304. delete addFormData.firstTitle
  305. }
  306. //查询数据
  307. if (tabKey === 'query') {
  308. addFormData['firstTitle'] = 1
  309. }
  310. addFormData['wbsId'] = treeInfo['contractIdRelation'] ? treeInfo['id'] : treeInfo['primaryKeyId']
  311. //处理数据
  312. const { error, code, data } = await firstApi.getQueryPageData({
  313. ...addFormData,
  314. ...searchInfo,
  315. })
  316. tableLoading.value = false
  317. if (!error && code === 200) {
  318. tableListData.value = getArrValue(data['records'])
  319. searchForm.value.total = data.total || 0
  320. } else {
  321. tableListData.value = []
  322. searchForm.value.total = 0
  323. }
  324. } else {
  325. window?.$message?.warning('请先选择一个树节点')
  326. }
  327. }
  328. //多选
  329. const tableListRef = ref(null)
  330. const tableSelectionKeys = ref([]);
  331. const tableSelectionChange = (rows) => {
  332. tableSelectionKeys.value = rows.filter((item) => {
  333. return (item??'') !== '';
  334. })
  335. }
  336. //文件名称被点击
  337. const tableRowName = (row) => {
  338. //如果 evisaPdfUrl 不为空,使用evisaPdfUrl,反之使用pdfUrl
  339. if (row['evisaPdfUrl']) {
  340. window.open(row['evisaPdfUrl'],'_blank')
  341. } else if (row['pdfUrl']) {
  342. window.open(row['pdfUrl'],'_blank')
  343. } else {
  344. window.$message?.warning('文件不存在')
  345. }
  346. }
  347. //上报首件
  348. const isFirstReportDrawer = ref(false)
  349. const firstReportClick = () => {
  350. isFirstReportDrawer.value = true
  351. tableFileData.value = deepClone(tableSelectionKeys.value)
  352. getFirstExcelHtml()
  353. }
  354. const FirstReportDrawerClose = () => {
  355. isFirstReportDrawer.value = false
  356. }
  357. //获取表单
  358. const statusDesc = ref('')
  359. const isTableForm = ref(false)
  360. const pkeyIds = ref('')
  361. const getFirstExcelHtml = async () => {
  362. const cid = contractId.value;
  363. const { error, code, data } = await firstApi.getFirstExcelHtml({
  364. contractId: contractId.value || ''
  365. }, false)
  366. //处理数据
  367. const temp = isString(data?.data) ? data?.data || '' : ''
  368. if (!error && code === 200 && temp) {
  369. let pkeyId = data?.id || ''
  370. pkeyIds.value = pkeyId
  371. setHTableForm(temp, cid, tableFormData.value)
  372. getFirstBussDataInfo(pkeyId)
  373. } else {
  374. isTableForm.value = false
  375. statusDesc.value = '暂无表单'
  376. window?.$message?.warning('暂无表单')
  377. }
  378. }
  379. //渲染表单
  380. const tableFormApp = ref(null)
  381. const setHTableForm = (resData, cid, info) => {
  382. //先卸载
  383. if (tableFormApp.value) {
  384. tableFormApp.value?.unmount()
  385. }
  386. if (resData) {
  387. isTableForm.value = true
  388. nextTick(() => {
  389. tableFormApp.value = HTableForm.createForm({
  390. template: resData,
  391. tableForm: info,
  392. appId: `#table-form-${cid}`
  393. })
  394. })
  395. } else {
  396. isTableForm.value = false
  397. statusDesc.value = '暂无表单'
  398. window?.$message?.warning('暂无表单')
  399. }
  400. }
  401. //获取回显数据
  402. const tableFormData = ref({})
  403. const getFirstBussDataInfo = async (pkeyId) => {
  404. if (pkeyId) {
  405. const { data } = await firstApi.getFirstBussDataInfo({
  406. contractId: contractId.value || '',
  407. firstId: pkeyId + ''
  408. }, false)
  409. const info = getObjValue(data)
  410. if (getObjNullValue(info)) {
  411. HTableForm.setPickerKey(info)
  412. tableFormData.value = info
  413. } else {
  414. tableFormData.value = {}
  415. }
  416. } else {
  417. tableFormData.value = {}
  418. }
  419. }
  420. //上传变量
  421. const fileListData = ref([]);
  422. const finishFile = ref({
  423. sourceUrl: '', pdfUrl: '', firstFileName: ''
  424. })
  425. //上传文件
  426. const uploadChange = async ({type, res}) => {
  427. if (type === 'success') {
  428. const {code, data, msg} = res
  429. if (code === 200) {
  430. finishFile.value = {
  431. sourceUrl: data?.sourceUrl,
  432. pdfUrl: data?.pdfUrl,
  433. firstFileName: data?.fileName,
  434. }
  435. window.$message?.success(msg);
  436. } else {
  437. window.$message?.error(msg || '上传失败');
  438. }
  439. }
  440. }
  441. //文件附件列表
  442. const tableFileColumn = ref([
  443. {key:'name', name: '文件名称'},
  444. {key:'action', name: '操作', width: 80, align: 'center'}
  445. ]);
  446. const tableFileData = ref([]);
  447. const tableDelButton = (index) => {
  448. window?.$messageBox?.alert('确定删除该文件吗?', '删除提醒', {
  449. type: 'warning',
  450. showCancelButton: true,
  451. confirmButtonText: '确定删除',
  452. cancelButtonText: '取消',
  453. callback: (action) => {
  454. if (action === 'confirm') {
  455. tableFileData.value.splice(index, 1)
  456. }
  457. }
  458. })
  459. }
  460. //填报数据保存
  461. const saveBussData = async () => {
  462. const { id } = treeItem.value
  463. const res = await saveExcelBussData(id + '')
  464. if (res) {
  465. await getBussPdfInfo(res)
  466. }
  467. }
  468. //保存请求
  469. const tableFormSaveLoading = ref(false)
  470. const saveExcelBussData = async (pkeyId) => {
  471. const { primaryKeyId } = treeItem.value
  472. tableFormSaveLoading.value = true
  473. const linkIds = rowsToArr(tableFileData.value);
  474. const { error, code, data } = await firstApi.saveBussData({
  475. ...tableFormData.value,
  476. projectId: projectId.value,
  477. contractId: contractId.value,
  478. firstNodeId: primaryKeyId,
  479. pkeyId: pkeyId,
  480. classify: '1',
  481. isFirst: 1,
  482. linkProcessList: linkIds,
  483. ...finishFile.value
  484. }, false)
  485. //判断状态
  486. tableFormSaveLoading.value = false
  487. if (!error && code === 200 && isString(data)) {
  488. window.$message?.success('保存成功')
  489. return data
  490. } else {
  491. window.$message?.error('保存失败')
  492. return ''
  493. }
  494. }
  495. //pdf预览
  496. const bussPdfInfo = () => {
  497. const { id } = treeItem.value
  498. getBussPdfInfo(id + '')
  499. }
  500. //预览PDF请求
  501. const getBussPdfInfo = async (pkeyId) => {
  502. const liunkIds = rowsToId(tableFileData.value)
  503. const { error, code, data } = await firstApi.getFirstBussPdfInfo({
  504. pkeyId: pkeyId,
  505. liunkIds: liunkIds
  506. })
  507. //判断状态
  508. const res = isString(data)? data ?? '': ''
  509. if (!error && code === 200 && res) {
  510. window.open(res,'_blank')
  511. }
  512. }
  513. //上报审批
  514. const reportIds = ref('')
  515. const showReportModal = ref(false)
  516. const reportTaskName = ref('')
  517. const reportAddition = ref({})
  518. const reportLoading = ref(false)
  519. const reportTypeData = ref('')
  520. const reportModalClick = async () => {
  521. const { primaryKeyId, contractIdRelation } = treeItem.value
  522. const rows = tableFileData.value
  523. if (rows.length > 0) {
  524. reportLoading.value = true
  525. const taskCheck = await eVisaTaskCheckApi({
  526. projectId: projectId.value,
  527. contractId: contractId.value
  528. })
  529. reportTypeData.value = rows[0]['id']
  530. reportLoading.value = false
  531. if (taskCheck) {
  532. reportIds.value = rowsToId(rows)
  533. reportTaskName.value = rows.length > 1?`${rows[0].name}等${rows.length}个文件`:rows[0].name
  534. reportAddition.value = {
  535. classify: 1,
  536. isFirst: 1,
  537. primaryKeyId: primaryKeyId,
  538. contractIdRelation: contractIdRelation ?? contractId.value,
  539. }
  540. showReportModal.value = true
  541. }
  542. } else {
  543. window.$message?.warning('暂无相关数据')
  544. }
  545. }
  546. //上报完成
  547. const showReportFinish = () => {
  548. showReportModal.value = false
  549. }
  550. //拼接ID
  551. const rowsToId = (rows) => {
  552. return rows.map((obj) => {
  553. return obj.id;
  554. }).join(",")
  555. }
  556. //处理数据
  557. const rowsToArr = (rows) => {
  558. let newArr = [];
  559. for (let i = 0; i < rows.length; i++) {
  560. newArr.push({
  561. id: rows[i]?.id,
  562. name: rows[i]?.name
  563. })
  564. }
  565. return newArr
  566. }
  567. //左右拖动,改变树形结构宽度
  568. const leftWidth = ref(382)
  569. const onmousedown = () => {
  570. const leftNum = isCollapse.value ? 142 : 272
  571. document.onmousemove = (ve) => {
  572. const diffVal = ve.clientX - leftNum;
  573. if(diffVal >= 310 && diffVal <= 900) {
  574. leftWidth.value = diffVal;
  575. }
  576. }
  577. document.onmouseup = () => {
  578. document.onmousemove = null;
  579. document.onmouseup = null;
  580. }
  581. }
  582. </script>
  583. <style lang="scss" scoped>
  584. @import "../../styles/other/first-item.scss";
  585. </style>
  586. <style lang="scss">
  587. .hc-first-item-node-layout.el-overlay {
  588. position: absolute;
  589. background-color: transparent;
  590. margin: -24px;
  591. height: revert;
  592. .hc-drawer-box.el-drawer {
  593. --el-drawer-bg-color: transparent;
  594. .el-drawer__body {
  595. padding: 24px;
  596. display: flex;
  597. flex-direction: column;
  598. overflow: hidden;
  599. }
  600. }
  601. }
  602. </style>