ListItem.vue 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331
  1. <template>
  2. <div class="data-fill-list-box">
  3. <el-collapse v-model="ActiveKey" accordion @change="CollapseChange">
  4. <template v-for="(item,index) in listDatas" :key="item?.pKeyId">
  5. <el-collapse-item :name="`item-${index}-${item?.pKeyId}`" :disabled="item['isBussShow'] === 2" :id="`item-${index}-${item?.pKeyId}`">
  6. <template #title>
  7. <div class="hc-collapse-item-header">
  8. <div class="text-lg truncate item-title">{{item.nodeName}}</div>
  9. <div class="hc-extra-text-box">
  10. <HcTooltip keys="wbs_del_table" v-if="item['isCopeTab'] === 2">
  11. <el-button type="danger" plain :disabled="item['isBussShow'] === 2" @click.stop="delClick(item,index)">删除本表</el-button>
  12. </HcTooltip>
  13. <HcTooltip keys="wbs_copy_table">
  14. <el-button type="primary" plain :disabled="item['isBussShow'] === 2" @click.stop="copyClick(item,index)">复制本表</el-button>
  15. </HcTooltip>
  16. <HcTooltip keys="wbs_hide_table">
  17. <el-button type="primary" plain @click.stop="hideClick(item,index)">
  18. <template v-if="item['isBussShow'] === 1">隐藏本表</template>
  19. <template v-else>显示本表</template>
  20. </el-button>
  21. </HcTooltip>
  22. <HcTooltip keys="wbs_preview_table">
  23. <el-button type="info" plain disabled v-if="item['isBussShow'] === 2 || item['isTabPdf'] === 1">预览</el-button>
  24. <el-button type="primary" plain @click.stop="previewClick(item,index)" v-else>预览</el-button>
  25. </HcTooltip>
  26. <HcTooltip keys="wbs_upload_table">
  27. <el-button :type="item['tabFileType'] === 2?'success':'primary'" plain :disabled="item['isBussShow'] === 2" @click.stop="uploadClick(item,index)">
  28. <template v-if="item['tabFileType'] === 2">已上传</template>
  29. <template v-else>上传</template>
  30. </el-button>
  31. </HcTooltip>
  32. </div>
  33. </div>
  34. </template>
  35. <div class="data-fill-list-item-content">
  36. <div class="data-fill-table-form-box">
  37. <div class="hc-excel-table-form-view" :id="`table-form-${item?.pKeyId}`"/>
  38. <div class="hc-no-table-form" v-if="item?.isTableForm === false">
  39. <div class="table-form-no">
  40. <img :src="notableform" alt=""/>
  41. <div class="desc">暂无表单数据</div>
  42. </div>
  43. </div>
  44. </div>
  45. <div class="data-fill-table-tip-box">
  46. <div class="text-orange tip-title">
  47. <HcIcon name="error" fill ui="text-2xl"/>
  48. <span class="ml-1">提示</span>
  49. </div>
  50. <div class="text-gray-400 tip-item">1、灰色框代表可通过系统识别计算,公式自动引用,可通过公式计算少量数据,(表头数据及简单),也可只填写白色框数据</div>
  51. <div class="text-gray-400 tip-item">2、系统支持键盘中,shift + tab键向上一个填报框切换,tab向下一个填报框切换。暂不支持上下按键切换输入框</div>
  52. <div class="table-tip-foot">
  53. <div class="tip-left-btn">
  54. <HcTooltip keys="wbs_import_table">
  55. <div class="text-gray-400 dow-text">
  56. <HcIcon name="publish" ui="text-lg"/>
  57. <span class="ml-1">导入列表数据</span>
  58. </div>
  59. </HcTooltip>
  60. <HcTooltip keys="wbs_download_table">
  61. <div class="text-main dow-text">
  62. <HcIcon name="file_download" ui="text-lg"/>
  63. <span class="ml-1">下载导入模板</span>
  64. </div>
  65. </HcTooltip>
  66. </div>
  67. <div class="tip-right-btn">
  68. <HcTooltip keys="wbs_save_table">
  69. <el-button type="primary" hc-btn :disabled="item?.isTableForm === false" :loading="tableFormSaveLoading" @click="tableFormSaveClick(item,index)">
  70. <HcIcon name="save"/>
  71. <span>保存</span>
  72. </el-button>
  73. </HcTooltip>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. </el-collapse-item>
  79. </template>
  80. </el-collapse>
  81. </div>
  82. <!--右键菜单-->
  83. <HcContextMenu ref="contextMenuRef" :datas="tableFormMenu" @item-click="handleMenuSelect"/>
  84. <!--上传文件-->
  85. <HcDialog :show="uploadModal" title="上传文件" widths="38rem" :footer="false" @close="uploadModal = false">
  86. <HcUpload :fileList="fileListData" :datas="uploadData" @change='uploadChange' :tableTypeValue="tableTypeValue" :contractId="contractId" :baseData="baseData"/>
  87. </HcDialog>
  88. <!--插入特殊字符-->
  89. <HcDialog :show="specialModal" title="插入特殊字符" widths="600px" saveText="确认插入" @close="specialModal = false" @save="specialNodeClick">
  90. <el-form ref="specialFormRef" :model="specialFormModel" :rules="specialFormRules" label-width="0px" size="large" class="mb-6">
  91. <el-form-item prop="val" class="special-form-item">
  92. <el-input v-model="specialFormModel.val" ref="specialRef" id="specialId" placeholder="请选择特殊字符代码" clearable @blur="specialInputBlur"/>
  93. </el-form-item>
  94. </el-form>
  95. <el-row :gutter="20" style="margin: -10px;">
  96. <el-col :span="3" style="padding: 10px;" v-for="item in specialCharacters">
  97. <div class="special-box" @click="specialClick">
  98. <span class="font-EUDC" :title="`字符代码(C):${item !== 'K̅'?item.slice(2,7):'K̅'}`" v-html="item"/>
  99. </div>
  100. </el-col>
  101. </el-row>
  102. </HcDialog>
  103. <!--引用容器参数-->
  104. <HcDialog :show="vesselModal" title="引用容器参数" widths="84%" saveText="确认引用" isTable @close="vesselModalClose" @save="vesselModalSave">
  105. <div class="adding-form-dialog-box">
  106. <div class="dialog-tree-box">
  107. <el-scrollbar>
  108. <HcMenuSimple :datas="menus" :props="menuProps" :keys="menuKey" @change="menuChange"/>
  109. </el-scrollbar>
  110. </div>
  111. <div class="dialog-table-box">
  112. <div class="dialog-table">
  113. <HcTable ref="vesselTableRef" :column="vesselTableColumn" :datas="vesselTableData" :loading="vesselTableLoading" isCheck @selection-change="vesselTableSelection"/>
  114. </div>
  115. <div class="dialog-pages">
  116. <HcPages :pages="vesselTablePage" @change="vesselTablePageChange"/>
  117. </div>
  118. </div>
  119. </div>
  120. </HcDialog>
  121. <!--引用设备仪器-->
  122. <HcDialog :show="deviceModal" title="引用设备仪器" widths="84%" saveText="确认引用" isTable @close="deviceModalClose" @save="deviceModalSave">
  123. <!-- <HcTable ref="deviceTableRef" :column="deviceTableColumn" :datas="deviceTableData" :loading="deviceTableLoading" isCheck @selection-change="deviceTableSelection"/> -->
  124. <div class="adding-form-dialog-box">
  125. <div class="dialog-tree-box">
  126. <el-scrollbar>
  127. <HcMenuSimple :datas="equipmentmenus" :props="equipmentmenuProps" :keys="equipmentmenuKey" @change="equipmentmenuChange"/>
  128. </el-scrollbar>
  129. </div>
  130. <div class="dialog-table-box">
  131. <div class="dialog-table">
  132. <HcTable ref="deviceTableRef" :column="deviceTableColumn" :datas="deviceTableData" :loading="deviceTableLoading" isCheck @selection-change="deviceTableSelection"/>
  133. </div>
  134. <div class="dialog-pages">
  135. <HcPages :pages="equipmentPage" @change="equipmentTablePageChange"/>
  136. </div>
  137. </div>
  138. </div>
  139. </HcDialog>
  140. </template>
  141. <script setup>
  142. import {ref,watch,nextTick} from "vue";
  143. import {useAppStore} from "~src/store";
  144. import {useRouter, useRoute} from 'vue-router'
  145. import wbsApi from "~api/data-fill/wbs"
  146. import HcUpload from "./HcUpload.vue"
  147. import HTableForm from "~src/plugins/HTableForm"
  148. import dataApi from "~api/tentative/detect/test";
  149. import dataApi1 from "~api/tentative/parameter/container"
  150. import dataApi2 from "~api/tentative/device/approach"
  151. import {getClassList} from "~api/tentative";
  152. import notableform from '~src/assets/view/notableform.svg';
  153. import {utilsText, isType, formValidate, deepClone} from "vue-utils-plus"
  154. const router = useRouter()
  155. const useRoutes = useRoute()
  156. //路由参数
  157. const routerQuery = useRoutes?.query;
  158. const isaddType = routerQuery?.isaddType || false;
  159. //初始
  160. const props = defineProps({
  161. datas: {
  162. type: Array,
  163. default: () => ([])
  164. },
  165. status: {
  166. type: [String,Number],
  167. default: ''
  168. },
  169. baseData: {
  170. type: Object,
  171. default: () => ({})
  172. },
  173. deviceUseIds:{
  174. type: String,
  175. default: () => ('')
  176. },
  177. authBtnTabKey:{
  178. type: String,
  179. default: () => ('')
  180. },
  181. checkTableId:{
  182. type: String,
  183. default: () => ('')
  184. },
  185. tabTypeKey:{
  186. type: String,
  187. default: () => ('')
  188. },
  189. nodeIdvalue:{
  190. type: String,
  191. default: () => ('')
  192. },
  193. alllistData:{
  194. type: Array,
  195. default: () => ([])
  196. }
  197. })
  198. const {isString, getObjNullValue, getArrValue} = isType()
  199. const {setPosInsert, setPosRange} = utilsText()
  200. const listDatas = ref(props.datas)
  201. const isStatus = ref(props.status)
  202. const baseData = ref(props.baseData)
  203. const authBtnTabKeyType = ref(props.authBtnTabKey)//所属方
  204. const useAppState = useAppStore()
  205. const projectId = ref(useAppState.getProjectId);
  206. const contractId = ref(useAppState.getContractId);
  207. const tabTypeKeyInfo=ref(props.tabTypeKey)
  208. const nodeIdvaluedata=ref(props.nodeIdvalue)
  209. const alllistDataval=ref(props.alllistData)
  210. //监听
  211. watch(() => [
  212. props.datas,
  213. props.tabTypeKey,
  214. props.alllistData
  215. ], ([datas,TabTypeKey,AlllistData]) => {
  216. listDatas.value = datas
  217. tabTypeKeyInfo.value=TabTypeKey
  218. alllistDataval.value=AlllistData
  219. setFormDataNum(datas)
  220. })
  221. //监听
  222. watch(() => [
  223. props.status,
  224. props.baseData,
  225. props.nodeIdvalue
  226. ], ([val, base,NodeIdvalue]) => {
  227. //1 未填报,2待上报,3已上报
  228. isStatus.value = val
  229. baseData.value = base
  230. nodeIdvaluedata.value=NodeIdvalue
  231. })
  232. //渲染完成
  233. nextTick(() => {
  234. setFormDataNum(props.datas)
  235. })
  236. //获取pKeyId
  237. const getValString = (val) => {
  238. return val ? val + '' : ''
  239. }
  240. //获取表单初始数据
  241. const getFormDataInit = ({projectId, cid, pKeyId}) => {
  242. const { nodeId, contractId } = baseData.value
  243. return {
  244. projectId: projectId,
  245. contractId: cid || contractId,
  246. pkeyId: getValString(pKeyId),
  247. nodeId: nodeId
  248. }
  249. }
  250. //设置表单对象的数量
  251. const formData = ref([])
  252. const setFormDataNum = (datas) => {
  253. ActiveKey.value = ''
  254. let newArr = [];
  255. for (let i = 0; i < datas.length; i++) {
  256. newArr.push({
  257. ...getFormDataInit(datas[i]),
  258. isCollapseLoad: false,
  259. })
  260. }
  261. formData.value = newArr
  262. }
  263. //展开事件
  264. const ActiveKey = ref('')
  265. const formKeyIds = ref('')
  266. const CollapseChange = async (name) => {
  267. ActiveKey.value = name
  268. const names = name ? name.split('-') : []
  269. formData.value.forEach((changeitem)=>{
  270. if(changeitem.pkeyId===names[2]){
  271. changeitem.isCollapseLoad=true
  272. }
  273. })
  274. if (names.length > 0) {
  275. getOffsetTop(name)
  276. const index = names[1]
  277. let item = listDatas.value[index]
  278. emit('upcheckTableId', item.id)
  279. formKeyIds.value = getValString(item.pKeyId)
  280. console.log(alllistDataval.value,'alllistDataval');
  281. alllistDataval.value.forEach((item1)=>{
  282. if (item1.pkeyId==item.pKeyId) {
  283. if(item1.oper){
  284. item.isTableFormRender=true;
  285. item=item1
  286. item.pKeyId=item1.pkeyId
  287. }
  288. }
  289. console.log(item,'item');
  290. })
  291. if (!item.isTableFormRender) {
  292. await getBussDataInfo(item, index)
  293. }else{
  294. await getBussDataInfo1(item, index)
  295. }
  296. //渲染表单
  297. await getExcelHtml(item,index)
  298. } else {
  299. // await getExcelHtml(item,index)
  300. getOffsetTop()
  301. formKeyIds.value = ''
  302. }
  303. }
  304. //获取模板标签数据
  305. const formRegExpJson = ref({})
  306. const getExcelHtml = async (item,index) => {
  307. console.log('获取模板数据');
  308. const pkeyIds = getValString(item.pKeyId)
  309. if (pkeyIds) {
  310. const { id } = baseData.value
  311. console.log(nodeIdvaluedata.value,'nodeIdvaluedata.value');
  312. const {error, code, data} = await dataApi.getExcelHtml({
  313. id: id||nodeIdvaluedata.value,
  314. primaryKeyId: pkeyIds
  315. }, false)
  316. const resData = isString(data) ? data || '' : ''
  317. if (!error && code === 200 && resData) {
  318. item.isTableForm = true
  319. //渲染表单
  320. HTableForm.createForm({
  321. template: resData,
  322. tableForm: formData.value[index],
  323. appId: `#table-form-${pkeyIds}`,
  324. onRight: (event, KeyName) => {
  325. onRightClick(event, KeyName, index)
  326. },
  327. //表单正则效验
  328. onBlur: (event, key, reg, val, msg) => {
  329. setTableFormBlurReg(pkeyIds, event, key, reg, val, msg, item, index)
  330. }
  331. })
  332. item.isTableFormRender = true
  333. item.isRenderTableForm = true
  334. } else {
  335. item.isTableForm = false
  336. item.isRenderTableForm = true
  337. window?.$message?.warning('暂无表单')
  338. }
  339. } else {
  340. item.isTableForm = false
  341. item.isRenderTableForm = false
  342. window?.$message?.warning('pkeyId为空')
  343. }
  344. }
  345. //正则效验
  346. const setTableFormBlurReg = (pkeyId, event, key, reg, val, msg, item, index) => {
  347. const dom = document.getElementById(key)?.parentElement ?? ''
  348. if (dom) {
  349. if (val && reg) {
  350. let regx = new RegExp(reg);
  351. let state = regx.test(val);
  352. if (state) {
  353. delete formRegExpJson.value[pkeyId]
  354. dom.style = ''
  355. } else {
  356. formRegExpJson.value[pkeyId] = {key, reg, val, msg, state, nodeName: item.nodeName, itemId: `item-${index}-${item?.pKeyId}`}
  357. dom.style = '--el-input-border-color: #fe0000; box-shadow: 0 0 0 2px #fe0000 inset;'
  358. window?.$message?.warning(msg)
  359. }
  360. } else {
  361. delete formRegExpJson.value[pkeyId]
  362. dom.style = ''
  363. }
  364. }
  365. }
  366. //获取已填写的数据
  367. const getBussDataInfo = async (item, index) => {
  368. const pkeyIds = getValString(item.pKeyId)
  369. if (pkeyIds) {
  370. const { id } = baseData.value
  371. const {error, code, data} = await dataApi.getBussDataInfo({
  372. id: id||nodeIdvaluedata.value,
  373. pkeyId: pkeyIds
  374. }, false)
  375. console.log(item,'item2222');
  376. if(item.oper){
  377. console.log(11111111);
  378. HTableForm.setPickerKey([item])
  379. formData.value[index] = {
  380. ...item,
  381. isCollapseLoad: true
  382. }
  383. }else{
  384. console.log(2222222222);
  385. data.forEach((item1)=>{
  386. const resData = getObjNullValue(item1)
  387. if (!error && code === 200 && resData) {
  388. HTableForm.setPickerKey(resData)
  389. const InitObj = getFormDataInit(item) //有数据,关联数据
  390. formData.value[index] = {
  391. ...resData, ...InitObj,
  392. isCollapseLoad: true
  393. }
  394. }else {
  395. formData.value[index] = {
  396. ...getFormDataInit(item),
  397. isCollapseLoad: true
  398. }
  399. }
  400. })
  401. }
  402. // data.forEach((item1)=>{
  403. // const resData = getObjNullValue(item1)
  404. // if (!error && code === 200 && resData) {
  405. // HTableForm.setPickerKey(resData)
  406. // const InitObj = getFormDataInit(item) //有数据,关联数据
  407. // formData.value[index] = {
  408. // ...resData, ...InitObj,
  409. // isCollapseLoad: true
  410. // }
  411. // }else {
  412. // formData.value[index] = {
  413. // ...getFormDataInit(item),
  414. // isCollapseLoad: true
  415. // }
  416. // }
  417. // })
  418. // if (!error && code === 200 && resData) {
  419. // HTableForm.setPickerKey(resData)
  420. // const InitObj = getFormDataInit(item) //有数据,关联数据
  421. // formData.value[index] = {
  422. // ...resData, ...InitObj,
  423. // isCollapseLoad: true
  424. // }
  425. // } else {
  426. // formData.value[index] = {
  427. // ...getFormDataInit(item),
  428. // isCollapseLoad: true
  429. // }
  430. // }
  431. } else {
  432. window?.$message?.warning('pkeyId为空')
  433. }
  434. }
  435. const getBussDataInfo1 = async (item, index) => {
  436. const pkeyIds = getValString(item.pKeyId)
  437. if (pkeyIds) {
  438. const { id } = baseData.value
  439. const {error, code, data} = await dataApi.getBussDataInfo({
  440. id: id||nodeIdvaluedata.value,
  441. pkeyId: pkeyIds
  442. }, false)
  443. if(item.oper){
  444. HTableForm.setPickerKey([item])
  445. formData.value[index] = {
  446. ...item,
  447. isCollapseLoad: true
  448. }
  449. }
  450. // data.forEach((item1)=>{
  451. // const resData = getObjNullValue(item1)
  452. // if (!error && code === 200 && resData) {
  453. // HTableForm.setPickerKey(resData)
  454. // const InitObj = getFormDataInit(item) //有数据,关联数据
  455. // formData.value[index] = {
  456. // ...resData, ...InitObj,
  457. // isCollapseLoad: true
  458. // }
  459. // }else {
  460. // formData.value[index] = {
  461. // ...getFormDataInit(item),
  462. // isCollapseLoad: true
  463. // }
  464. // }
  465. // })
  466. // if (!error && code === 200 && resData) {
  467. // HTableForm.setPickerKey(resData)
  468. // const InitObj = getFormDataInit(item) //有数据,关联数据
  469. // formData.value[index] = {
  470. // ...resData, ...InitObj,
  471. // isCollapseLoad: true
  472. // }
  473. // } else {
  474. // formData.value[index] = {
  475. // ...getFormDataInit(item),
  476. // isCollapseLoad: true
  477. // }
  478. // }
  479. } else {
  480. window?.$message?.warning('pkeyId为空')
  481. }
  482. }
  483. const toBackClick = () => {
  484. router.push({
  485. path: '/tentative/detect/test',
  486. query: {}
  487. })
  488. setTimeout(() => {
  489. window?.location?.reload() //刷新页面
  490. }, 1000);
  491. }
  492. //单个保存
  493. const tableFormSaveLoading = ref(false)
  494. const tableFormSaveClick = async (item,index) => {
  495. if (isStatus.value !== '3') {
  496. if(tabTypeKeyInfo.value==='2'&&baseData.value['detectionResult']===''){
  497. window.$message?.warning('请选择是否合格')
  498. }else{
  499. const res = await saveExcelBussData(item,index)
  500. if (res) {
  501. if(!isaddType){
  502. await getBussPdfInfo(item)
  503. }else{
  504. //返回
  505. toBackClick()
  506. }
  507. renewData()
  508. }
  509. }
  510. } else {
  511. window?.$message?.warning('已上报的资料,不允许保存。')
  512. }
  513. }
  514. //保存表单数据
  515. const saveExcelBussData = async (item, index, showTip = true) => {
  516. if (!getObjNullValue(formRegExpJson.value)) {
  517. tableFormSaveLoading.value = true
  518. const InitObj = getFormDataInit(item)
  519. baseData.value.tableType= tabTypeKeyInfo.value
  520. console.log( baseData.value.tableType,' baseData.value.tableType');
  521. const {error, code} = await dataApi.saveExcelBussData({
  522. ...baseData.value,
  523. isBatchSave:0,
  524. dataInfo: {
  525. orderList: [{...formData.value[index], ...InitObj}]
  526. }
  527. })
  528. //处理数据
  529. tableFormSaveLoading.value = false
  530. if (!error && code === 200) {
  531. if(showTip) window?.$message?.success('保存成功')
  532. return true
  533. } else {
  534. return false
  535. }
  536. } else {
  537. window?.$message?.warning('请先修改完红色输入框的数据')
  538. return false
  539. }
  540. }
  541. //预览PDF
  542. const getBussPdfInfo = async ({pKeyId}, showTip = true) => {
  543. const pkeyIds = getValString(pKeyId)
  544. if (pkeyIds) {
  545. const { id } = baseData.value
  546. const {error, code, data} = await dataApi.getBussPdf({
  547. id: id,
  548. pKeyId: pkeyIds
  549. },false)
  550. if (!error && code === 200) {
  551. if (data) {
  552. window.open(data, '_blank')
  553. } else if(showTip) {
  554. window?.$message?.warning('PDF错误')
  555. }
  556. } else {
  557. if(showTip) {
  558. window?.$message?.warning(data.msg || '获取PDF失败')
  559. }
  560. }
  561. } else {
  562. window?.$message?.warning('pkeyId为空')
  563. }
  564. }
  565. //删除本表
  566. const delClick = async ({pKeyId}) => {
  567. const pkeyIds = getValString(pKeyId)
  568. if (pkeyIds) {
  569. const { id } = baseData.value
  570. const {error, code} = await dataApi.removeBussTabInfo({
  571. id: id,
  572. pKeyId: pkeyIds
  573. })
  574. if (!error && code === 200) {
  575. window?.$message?.success('操作成功')
  576. renewData()
  577. }
  578. } else {
  579. window?.$message?.warning('pkeyId为空')
  580. }
  581. }
  582. //复制本表
  583. const copyClick = async (item,index) => {
  584. const pkeyIds = getValString(item.pKeyId)
  585. if (pkeyIds) {
  586. if (isStatus.value !== '3') {
  587. if (!item.isRenderTableForm) {
  588. await copeBussTab(pkeyIds)
  589. } else if (!item.isTableForm) {
  590. window?.$message?.warning('暂无表单数据')
  591. } else if (item.isRenderTableForm) {
  592. const res = await saveExcelBussData(item,index,false)
  593. if (res) {
  594. await copeBussTab(pkeyIds)
  595. } else {
  596. window?.$message?.warning('复制本表操作失败')
  597. }
  598. } else {
  599. window?.$message?.warning(`数据异常了, isRenderTableForm: ${item.isRenderTableForm}, isTableForm: ${item.isTableForm}, pKeyId:${pkeyIds}`)
  600. }
  601. } else {
  602. window?.$message?.warning('已上报的资料,不允许复制')
  603. }
  604. } else {
  605. window?.$message?.warning('pkeyId为空')
  606. }
  607. }
  608. const copeBussTab = async (pkeyIds) => {
  609. const { id } = baseData.value
  610. const {error, code} = await dataApi.copyBussTab({
  611. id: id,
  612. pKeyId: pkeyIds
  613. })
  614. if (!error && code === 200) {
  615. window?.$message?.success('操作成功')
  616. renewData()
  617. }
  618. }
  619. //隐藏本表
  620. const hideClick = async ({pKeyId, isBussShow}) => {
  621. const pkeyIds = getValString(pKeyId)
  622. if (pkeyIds) {
  623. if (isStatus.value !== '3') {
  624. const { id } = baseData.value
  625. const isBussShows = isBussShow === 2 ? 1 : 2 //状态(1显示 2隐藏)
  626. const {error, code} = await dataApi.showBussTab({
  627. id: id,
  628. pKeyId: pkeyIds,
  629. status: isBussShows
  630. })
  631. if (!error && code === 200) {
  632. window?.$message?.success('操作成功')
  633. renewData()
  634. }
  635. } else {
  636. window?.$message?.warning('已上报的资料,不允许隐藏')
  637. }
  638. } else {
  639. window?.$message?.warning('pkeyId为空')
  640. }
  641. }
  642. //预览
  643. const previewClick = async (item,index) => {
  644. await getBussPdfInfo(item)
  645. }
  646. //上传变量
  647. const uploadModal = ref(false)
  648. const fileListData = ref([]);
  649. const uploadData = ref({})
  650. const tableTypeValue=ref('')
  651. //上传被点击
  652. const uploadClick = (item,index) => {
  653. const pkeyIds = item.pKeyId ? item.pKeyId + '' : ''
  654. const { id } = baseData.value
  655. const tableType = item.tableType ? item.tableType : ''
  656. tableTypeValue.value= item.tableType ? item.tableType : ''
  657. const classify = authBtnTabKeyType.value
  658. const keyName = `item-${index}-${pkeyIds}`
  659. if (pkeyIds) {
  660. if (isStatus.value !== '3' && item.isTableForm) {
  661. uploadModal.value = true
  662. uploadData.value = getFormDataInit(item,pkeyIds)
  663. uploadData.value.tableType =tableType
  664. uploadData.value.classify =classify
  665. uploadData.value.id =id
  666. console.log( uploadData.value,' uploadData.value');
  667. //获取文件列表
  668. getBussFileList(pkeyIds)
  669. } else if (!item.isRenderTableForm) {
  670. CollapseChange(keyName)
  671. window?.$message?.warning('请再次点击上传')
  672. } else if (!item.isTableForm) {
  673. window?.$message?.warning('暂无表单数据')
  674. } else {
  675. window?.$message?.warning('已上报的资料,不允许上传')
  676. }
  677. } else {
  678. window?.$message?.warning('pkeyId为空')
  679. }
  680. }
  681. //获取文件列表
  682. const getBussFileList = async (pkeyId) => {
  683. const { id } = baseData.value
  684. const {error, code, data} = await wbsApi.getBussFileList1({
  685. pkeyid: pkeyId,
  686. id:id
  687. })
  688. if (!error && code === 200) {
  689. fileListData.value = getArrValue(data)
  690. } else {
  691. fileListData.value = []
  692. }
  693. }
  694. //上传文件
  695. const uploadChange = async ({type}) => {
  696. if(type === 'success') {
  697. uploadModal.value = false
  698. renewData()
  699. } else if (type === 'del') {
  700. renewData()
  701. }
  702. }
  703. //相关变量
  704. const tableFormItemNode = ref({})
  705. //菜单数据
  706. const tableFormMenu = ref([
  707. {label: '容器参数', key: "vessel"},
  708. {label: '引用设备仪器', key: "device"},
  709. {label: '插入特殊字符', key: "special"},
  710. ])
  711. //鼠标右键事件
  712. const contextMenuRef = ref(null)
  713. const onRightClick = (event, KeyName, index) => {
  714. //取光标位置
  715. const specialDom = document.getElementById(KeyName + "")
  716. const startPos = specialDom?.selectionStart || 0
  717. const endPos = specialDom?.selectionEnd || 0
  718. //存储临时信息
  719. tableFormItemNode.value = {KeyName, index, startPos, endPos, pkeyId: formKeyIds.value}
  720. contextMenuRef.value?.showMenu(event) //展开菜单
  721. }
  722. //鼠标右键菜单被点击
  723. const handleMenuSelect = ({key}) => {
  724. if (key === 'vessel') {
  725. vesselModal.value = true
  726. getMenusData()
  727. } else if (key === 'special') {
  728. specialModalShow()
  729. } else if (key === 'device') {
  730. deviceModal.value = true
  731. getequipmentMenusData()
  732. }
  733. }
  734. //引用容器参数
  735. const vesselModal = ref(false)
  736. const vesselTableRef = ref(null)
  737. //引用容器参数菜单数据
  738. const menuProps = {
  739. key: 'id',
  740. label: 'containerName',
  741. }
  742. //引用容器参数菜单数据
  743. const equipmentmenuProps = {
  744. key: 'id',
  745. label: 'className',
  746. }
  747. const menus = ref([]);
  748. const getMenusData = async () => {
  749. const { data } = await dataApi1.queryClassification({
  750. projectId: projectId.value,
  751. contractId: contractId.value
  752. })
  753. const arr = getArrValue(data)
  754. menus.value = arr
  755. if (arr.length > 0) {
  756. const item = arr[0]
  757. menuItem.value = item
  758. menuKey.value = item?.id
  759. vesselTableColumn.value=[]
  760. if(item?.fieldList&&item?.fieldList.length>0){
  761. item?.fieldList.forEach((item1)=>{
  762. vesselTableColumn.value.push(({
  763. key:item1?.fieldKey,
  764. name:item1?.fieldName
  765. }))
  766. })
  767. }
  768. getVesselTableData()
  769. }
  770. }
  771. //菜单被点击
  772. const menuKey = ref()
  773. const menuItem = ref({})
  774. const menuChange = (item) => {
  775. menuItem.value = item
  776. menuKey.value = item?.id
  777. vesselTableColumn.value=[]
  778. item?.fieldList.forEach((item1)=>{
  779. vesselTableColumn.value.push(({
  780. key:item1?.fieldKey,
  781. name:item1?.fieldName
  782. }))
  783. })
  784. getVesselTableData()
  785. }
  786. //表格数据
  787. const vesselTableColumn = ref([
  788. // {key:'key_1', name: '容器编号'},
  789. ])
  790. const vesselTableData = ref([])
  791. const vesselTablePage = ref({current: 1, size: 20, total: 0})
  792. const vesselTablePageChange = ({current, size}) => {
  793. vesselTablePage.value.current = current
  794. vesselTablePage.value.size = size
  795. getVesselTableData()
  796. }
  797. //获取表格数据
  798. const vesselTableLoading = ref(false)
  799. const getVesselTableData = async () => {
  800. const {id, fieldList} = menuItem.value
  801. const fieldLists = getArrValue(fieldList)
  802. if (fieldLists.length > 0) {
  803. vesselTableLoading.value = true
  804. const { error, code, data } = await dataApi1.queryPage({
  805. projectId: projectId.value,
  806. contractId: contractId.value,
  807. containerId: menuKey.value,
  808. fieldKey:fieldList[0].fieldKey,
  809. size:vesselTablePage.value.size,
  810. current:vesselTablePage.value.current,
  811. })
  812. //处理数据
  813. vesselTableLoading.value = false
  814. if (!error && code === 200) {
  815. vesselTableData.value = getArrValue(data['records'])
  816. vesselTablePage.value.total = data.total || 0
  817. } else {
  818. vesselTableData.value = []
  819. vesselTablePage.value.total = 0
  820. }
  821. }
  822. }
  823. //多选
  824. const vesselTableKeys = ref([]);
  825. const vesselTableSelection = (rows) => {
  826. vesselTableKeys.value = rows
  827. }
  828. //确认引用
  829. const vesselModalSave = () => {
  830. if (vesselTableKeys.value.length>0) {
  831. const item = tableFormItemNode.value
  832. const form = formData.value[item.index]
  833. const val =[]
  834. vesselTableKeys.value.forEach((item)=>{
  835. val.push(item.key_2)
  836. })
  837. const newval=val.join('、')
  838. formData.value[item.index][item.KeyName] = setPosInsert(item.startPos, item.endPos, form[item.KeyName], newval)
  839. vesselModal.value = false
  840. let posVal = item.startPos + newval.length;
  841. nextTick(() => {
  842. setPosRange(item.KeyName, posVal)
  843. })
  844. }else{
  845. window?.$message?.warning('请先选择引用容器参数')
  846. }
  847. }
  848. //关闭
  849. const vesselModalClose = () => {
  850. vesselModal.value = false
  851. }
  852. const equipmentmenus = ref([]);
  853. const getequipmentMenusData = async () => {
  854. const { data } = await getClassList({
  855. projectId: projectId.value,
  856. contractId: contractId.value
  857. })
  858. const arr = getArrValue(data)
  859. equipmentmenus.value = arr
  860. if (arr.length > 0) {
  861. const item = arr[0]
  862. equipmentmenuItem.value = item
  863. equipmentmenuKey.value = item?.id
  864. getDeviceTableData()
  865. }
  866. }
  867. //菜单被点击
  868. const equipmentmenuKey = ref()
  869. const equipmentmenuItem = ref({})
  870. const equipmentmenuChange = (item) => {
  871. equipmentmenuItem.value = item
  872. equipmentmenuKey.value = item?.id
  873. getDeviceTableData()
  874. }
  875. //引用设备仪器
  876. const deviceModal = ref(false)
  877. const deviceTableRef = ref(null)
  878. //表格数据
  879. const deviceTableColumn = ref([
  880. {key:'deviceNumber', name: '设备编号'},
  881. {key:'deviceName', name: '设备仪器名称'},
  882. ])
  883. const deviceTableData = ref([])
  884. const equipmentPage = ref({current: 1, size: 20, total: 0})
  885. const equipmentTablePageChange = ({current, size}) => {
  886. equipmentPage.value.current = current
  887. equipmentPage.value.size = size
  888. getDeviceTableData()
  889. }
  890. //获取表格数据
  891. const deviceTableLoading = ref(false)
  892. const getDeviceTableData =async () => {
  893. deviceTableLoading.value = true
  894. const { error, code, data } = await dataApi2.queryPage({
  895. projectId: projectId.value,
  896. contractId: contractId.value,
  897. deviceClassId: equipmentmenuKey.value,
  898. size:equipmentPage.value.size,
  899. current:equipmentPage.value.current,
  900. })
  901. //处理数据
  902. deviceTableLoading.value = false
  903. if (!error && code === 200) {
  904. deviceTableData.value = getArrValue(data['records'])
  905. vesselTablePage.value.total = data.total || 0
  906. } else {
  907. deviceTableData.value = []
  908. equipmentPage.value.total = 0
  909. }
  910. }
  911. //多选
  912. const deviceTableKeys = ref([]);
  913. const deviceTableSelection = (rows) => {
  914. deviceTableKeys.value = rows
  915. }
  916. //确认引用
  917. const deviceModalSave = () => {
  918. if (deviceTableKeys.value.length>0) {
  919. const item = tableFormItemNode.value
  920. const form = formData.value[item.index]
  921. const val =[]
  922. const idarr=[]
  923. const listr=[]
  924. deviceTableKeys.value.forEach((item)=>{
  925. val.push(item.deviceNumber)
  926. idarr.push(item.id)
  927. listr.push(item.deviceNumber+"_"+item.deviceName)
  928. })
  929. const newval=listr.join('、');
  930. const idval=idarr.join(',')
  931. formData.value[item.index][item.KeyName] = setPosInsert(item.startPos, item.endPos, form[item.KeyName], newval)
  932. vesselModal.value = false
  933. let posVal = item.startPos + newval.length;
  934. nextTick(() => {
  935. setPosRange(item.KeyName, posVal)
  936. })
  937. deviceModal.value = false;
  938. emit('updeviceUseIds', idval)
  939. }else{
  940. window?.$message?.warning('请先选择引用容器设备')
  941. }
  942. }
  943. //关闭
  944. const deviceModalClose = () => {
  945. deviceModal.value = false
  946. }
  947. //插入特殊字符
  948. const specialModal = ref(false)
  949. const specialCharacters = ref([
  950. '&#57344;', "&#57345;", "&#57346;", "&#57347;", '&#8804;', '&#8805;', '&#8451;',
  951. '&#9312;', '&#9313;', '&#9314;', '&#9315;', '&#9316;', '&#9317;', '&#9318;', '&#9319;', '&#9320;', '&#9321;', '&#9322;', '&#9323;',
  952. '&#9324;', '&#9325;', '&#9326;', '&#9327;', '&#9328;', '&#9329;', '&#9330;', '&#9331;',
  953. "&#8544;", "&#8545;", "&#8546;", "&#8547;", "&#8548;", "&#8549;", "&#8550;", "&#8551;", "&#8552;", "&#8553;", "&#8554;", "&#8555;","K̅"
  954. ])
  955. //输入框验证
  956. const specialFormRef = ref(null)
  957. const specialFormModel = ref({val: ''})
  958. const specialFormRules = {
  959. val: {
  960. required: true,
  961. trigger: "blur",
  962. message: "请选择特殊字符代码"
  963. }
  964. }
  965. //显示插入特殊字符
  966. const specialRef = ref(null)
  967. const specialModalShow = () => {
  968. specialFormModel.value.val = ''
  969. specialModal.value = true
  970. nextTick(() => {
  971. specialRef.value?.focus();
  972. })
  973. }
  974. //失去焦点
  975. const specialPos = ref({start: 0, end: 0})
  976. const specialInputBlur = (e) => {
  977. specialPos.value = {
  978. start: e?.target?.selectionStart || 0,
  979. end: e?.target?.selectionEnd || 0
  980. }
  981. }
  982. //点击符号
  983. const specialClick = (event) => {
  984. const text = event?.target?.innerText ?? ''
  985. const start = specialPos.value.start
  986. const end = specialPos.value.end
  987. const form = specialFormModel.value.val
  988. specialFormModel.value.val = setPosInsert(start, end, form, text)
  989. specialRef.value?.focus();
  990. let posVal = start + text.length;
  991. nextTick(() => {
  992. setPosRange('specialId', posVal)
  993. })
  994. }
  995. //确认插入
  996. const specialNodeClick = async () => {
  997. const res = await formValidate(specialFormRef.value)
  998. if (res) {
  999. const item = tableFormItemNode.value
  1000. const form = formData.value[item.index]
  1001. const val = specialFormModel.value.val ?? ''
  1002. formData.value[item.index][item.KeyName] = setPosInsert(item.startPos, item.endPos, form[item.KeyName], val)
  1003. specialModal.value = false
  1004. specialRef.value?.focus();
  1005. let posVal = item.startPos + val.length;
  1006. nextTick(() => {
  1007. setPosRange(item.KeyName, posVal)
  1008. })
  1009. }
  1010. }
  1011. //事件
  1012. const emit = defineEmits(['renew','offsetTop','updeviceUseIds','upcheckTableId'])
  1013. //被点击
  1014. const getOffsetTop = (key = '') => {
  1015. if (key) {
  1016. const dom = document.getElementById(key)
  1017. emit('offsetTop', dom.offsetTop)
  1018. } else {
  1019. emit('offsetTop', 0)
  1020. }
  1021. }
  1022. //通知数据更新
  1023. const renewData = () => {
  1024. emit('renew')
  1025. ActiveKey.value = ''
  1026. }
  1027. //获取表单数据
  1028. const getFormData = () => {
  1029. const formArr = formData.value;
  1030. console.log( formData.value,' formData.value');
  1031. // return formArr.filter(({pkeyId, isCollapseLoad}) => {
  1032. // return (pkeyId ?? '') !== '' && isCollapseLoad;
  1033. // })
  1034. return formArr.filter((item) => {
  1035. // return (pkeyId ?? '') !== '' && isCollapseLoad;
  1036. return item
  1037. })
  1038. }
  1039. //获取表单效验数据
  1040. const getFormRegExpJson = () => {
  1041. return deepClone(formRegExpJson.value);
  1042. }
  1043. //获取当前展开项
  1044. const getActiveKey = () => {
  1045. return ActiveKey.value;
  1046. }
  1047. //设置当前展开项
  1048. const setActiveKey = (key) => {
  1049. return ActiveKey.value = key;
  1050. }
  1051. // 暴露出去
  1052. defineExpose({
  1053. getFormData,
  1054. getFormRegExpJson,
  1055. getActiveKey,
  1056. setActiveKey
  1057. })
  1058. </script>
  1059. <style lang="scss" scoped>
  1060. .data-fill-list-box {
  1061. position: relative;
  1062. //margin-bottom: 25%;
  1063. .hc-collapse-item-header {
  1064. flex: 1;
  1065. position: relative;
  1066. margin-left: 46px;
  1067. display: flex;
  1068. align-items: center;
  1069. .item-title {
  1070. flex: 1;
  1071. position: relative;
  1072. user-select: none;
  1073. color: #50545E;
  1074. font-size: 16px;
  1075. font-weight: 400;
  1076. cursor: pointer;
  1077. }
  1078. .hc-extra-text-box {
  1079. position: relative;
  1080. padding-right: 24px;
  1081. }
  1082. }
  1083. .data-fill-list-item-content {
  1084. position: relative;
  1085. display: flex;
  1086. height: calc(100vh - 428px);
  1087. .data-fill-table-form-box {
  1088. position: relative;
  1089. padding: 24px 20px;
  1090. height: 100%;
  1091. overflow: auto;
  1092. flex: 1;
  1093. .hc-no-table-form {
  1094. position: relative;
  1095. height: 100%;
  1096. display: flex;
  1097. justify-content: center;
  1098. align-items: center;
  1099. .table-form-no {
  1100. position: relative;
  1101. img {
  1102. width: 350px;
  1103. }
  1104. .desc {
  1105. text-align: center;
  1106. font-size: 20px;
  1107. color: #aaa;
  1108. }
  1109. }
  1110. }
  1111. }
  1112. .data-fill-table-tip-box {
  1113. width: 240px;
  1114. position: relative;
  1115. border-left: 1px solid #E9E9E9;
  1116. padding: 20px 15px 80px;
  1117. .tip-title {
  1118. font-size: 16px;
  1119. margin-bottom: 10px;
  1120. display: flex;
  1121. align-items: center;
  1122. }
  1123. .tip-item {
  1124. margin-bottom: 20px;
  1125. }
  1126. .table-tip-foot {
  1127. position: absolute;
  1128. bottom: 15px;
  1129. right: 0;
  1130. left: 0;
  1131. display: flex;
  1132. align-items: center;
  1133. padding: 0 15px;
  1134. .tip-left-btn {
  1135. flex: 1;
  1136. .dow-text {
  1137. cursor: pointer;
  1138. display: flex;
  1139. align-items: center;
  1140. }
  1141. }
  1142. }
  1143. }
  1144. }
  1145. }
  1146. .special-box {
  1147. position: relative;
  1148. display: flex;
  1149. justify-content: center;
  1150. align-items: center;
  1151. border: 1px solid #eee;
  1152. border-radius: 3px;
  1153. height: 52px;
  1154. width: 52px;
  1155. cursor: pointer;
  1156. user-select: none;
  1157. transition: color .3s, background-color .3s;
  1158. &:hover {
  1159. color: var(--el-color-primary);
  1160. background-color: var(--el-color-primary-light-8);
  1161. }
  1162. .font-EUDC {
  1163. font-size: 22px;
  1164. }
  1165. }
  1166. </style>
  1167. <style lang="scss">
  1168. .data-fill-list-box {
  1169. .el-collapse {
  1170. --el-collapse-header-height: 60px;
  1171. border: 0;
  1172. .el-collapse-item {
  1173. margin: 0 0 16px;
  1174. background-color: #f1f5f8;
  1175. border: 1px solid #E9E9E9;
  1176. border-radius: 4px;
  1177. }
  1178. .el-collapse-item__header {
  1179. background-color: transparent;
  1180. font-weight: 400;
  1181. border-bottom: 0;
  1182. cursor: default;
  1183. font-size: 14px;
  1184. .el-collapse-item__arrow {
  1185. position: absolute;
  1186. color: #50545E;
  1187. cursor: pointer;
  1188. left: 20px;
  1189. margin: 0;
  1190. }
  1191. }
  1192. .el-collapse-item.is-active .el-collapse-item__header.is-active {
  1193. background-color: #E7EEF4;
  1194. }
  1195. .el-collapse-item__wrap {
  1196. background-color: transparent;
  1197. border-bottom: 0;
  1198. .el-collapse-item__content {
  1199. position: relative;
  1200. padding-bottom: 0;
  1201. font-size: 14px;
  1202. color: #50545E;
  1203. line-height: initial;
  1204. }
  1205. }
  1206. }
  1207. }
  1208. //插入特殊字符弹窗的输入框
  1209. .data-fill-list-box .data-fill-table-form-box td,
  1210. .data-fill-list-box .data-fill-table-form-box td .el-input .el-input__wrapper .el-input__inner,
  1211. .el-form-item.special-form-item .el-form-item__content .el-input .el-input__wrapper .el-input__inner {
  1212. font-family: "EUDC", 宋体, v-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
  1213. }
  1214. //引用容器参数弹窗
  1215. //关联试验数据
  1216. .adding-form-dialog-box {
  1217. position: relative;
  1218. height: 100%;
  1219. display: flex;
  1220. .dialog-tree-box {
  1221. position: relative;
  1222. border-right: 1px solid #EEEEEE;
  1223. width: 500px;
  1224. height: 100%
  1225. }
  1226. .dialog-table-box {
  1227. position: relative;
  1228. flex: 1;
  1229. height: 100%;
  1230. padding: 18px;
  1231. .dialog-search {
  1232. position: relative;
  1233. display: flex;
  1234. }
  1235. .dialog-table {
  1236. position: relative;
  1237. height: calc(100% - 68px);
  1238. padding: 18px 0;
  1239. }
  1240. .dialog-pages {
  1241. position: relative;
  1242. }
  1243. }
  1244. }
  1245. </style>