index.vue 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367
  1. <template>
  2. <div class="data-fill-list-box">
  3. <el-collapse v-model="ActiveKey" accordion @change="CollapseChange">
  4. <el-collapse-item v-for="(item,index) in listDatas" :id="`item-${index}-${item?.pkeyId}`"
  5. :key="item?.pkeyId" :disabled="item['isBussShow'] === 2"
  6. :name="`item-${index}-${item?.pkeyId}`">
  7. <template #title>
  8. <div class="hc-collapse-item-header">
  9. <div class="text-lg truncate item-title"> {{ item.nodeName }}</div>
  10. <div class="hc-extra-text-box">
  11. <HcTooltip v-if="item['isCopeTab'] === 2 || item['isCopeTab'] === 3" keys="wbs_del_table">
  12. <el-button :disabled="item['isBussShow'] === 2" :loading="tableFormDelLoading" plain
  13. type="danger"
  14. @click.stop="delClick(item)">删除本表
  15. </el-button>
  16. </HcTooltip>
  17. <HcTooltip keys="wbs_copy_table">
  18. <el-button
  19. v-if="item['isLinkTable'] === 1"
  20. disabled plain
  21. type="info">
  22. 复制本表
  23. </el-button>
  24. <el-button v-else :loading="copyClickLoading" plain type="primary"
  25. @click.stop="copyClick(item,index)">复制本表
  26. </el-button>
  27. </HcTooltip>
  28. <HcTooltip keys="wbs_hide_table">
  29. <el-button :loading="tableFormHideLoading" plain type="primary"
  30. @click.stop="hideClick(item,index)">
  31. <template v-if="item['isBussShow'] === 1">隐藏本表</template>
  32. <template v-else>显示本表</template>
  33. </el-button>
  34. </HcTooltip>
  35. <HcTooltip v-if="isStatus !== 3" keys="wbs_preview_table">
  36. <el-button
  37. v-if="item['isBussShow'] === 2 || item['isTabPdf'] === 1|| item['pdfUrl'] === ''"
  38. disabled plain
  39. type="info">
  40. 预览
  41. </el-button>
  42. <el-button v-else :loading="tableFormPreviewLoading" plain type="primary"
  43. @click.stop="previewClick(item)">预览
  44. </el-button>
  45. </HcTooltip>
  46. <HcTooltip keys="wbs_upload_table">
  47. <el-button :disabled="item['isBussShow'] === 2"
  48. :type="item['tabFileType'] === 2?'success':'primary'"
  49. plain
  50. @click.stop="uploadClick(item,index)">
  51. <template v-if="item['tabFileType'] === 2">已上传</template>
  52. <template v-else>上传</template>
  53. </el-button>
  54. </HcTooltip>
  55. </div>
  56. </div>
  57. </template>
  58. <div :style="`height: calc(100vh - ${draw_type ? '555px' : '360px'});`"
  59. class="data-fill-list-item-content">
  60. <div v-if="item?.isWindow" class="data-fill-table-form-box is-window">
  61. <div class="hc-window-tip">
  62. <div class="table-form-no">
  63. <img :src="NoDataSvg" alt=""/>
  64. <div class="desc">当前表单处于窗口模式,关闭相关窗口后恢复</div>
  65. </div>
  66. </div>
  67. </div>
  68. <div v-else class="data-fill-table-form-box">
  69. <TableFormItem v-if="item.isTableRender"
  70. :ref="(el) => setItemRefs(el, item)"
  71. :classify="classifys"
  72. :datas="changeFormDatas(item?.pkeyId, 'collapse')"
  73. :kid="item?.pkeyId"
  74. :nodeName="item.nodeName"
  75. :pid="`table-form-${item?.pkeyId}`"
  76. :tid="treeId"
  77. @excelBodyTap="excelTableFormClick($event)"
  78. @render="tableFormRender($event, item, index)"
  79. @rightTap="tableFormRightTap($event, index)"/>
  80. </div>
  81. <div class="hc-window-switch-box">
  82. <el-tooltip :content="item.isWindow?'关闭窗口并恢复':'当前表单窗口化'" :hide-after="0"
  83. placement="top">
  84. <div class="icon-btn-view" @click.stop="windowClick(item, index)">
  85. <template v-if="item.isWindow">
  86. <HcIcon class="icon" name="picture-in-picture-2"/>
  87. <span class="ml-1">关闭窗口化</span>
  88. </template>
  89. <template v-else>
  90. <HcIcon class="icon" name="picture-in-picture-exit"/>
  91. <span class="ml-1">表单窗口化</span>
  92. </template>
  93. </div>
  94. </el-tooltip>
  95. </div>
  96. <div class="data-fill-table-tip-box">
  97. <el-scrollbar>
  98. <div class="text-orange tip-title">
  99. <HcIcon fill name="information" ui="text-2xl"/>
  100. <span class="ml-1">提示</span>
  101. </div>
  102. <div class="text-gray-400 tip-item">
  103. 1、灰色框代表可通过系统识别计算,公式自动引用,可通过公式计算少量数据,(表头数据及简单),也可只填写白色框数据
  104. </div>
  105. <div class="text-gray-400 tip-item">2、系统支持键盘中,shift +
  106. tab键向上一个填报框切换,tab向下一个填报框切换。Shift + 上 ( ↑ )、下 ( ↓ )、左 ( ← )、右 ( →
  107. )键,切换填报输入框焦点。
  108. </div>
  109. <div class="text-gray-400 tip-item">3、先点击一下表单任一区域,再键盘按住 ⌘/ctrl +
  110. 点击,选择输入框,变为绿色边框,选中成功。选择完毕后,键盘按 ⌘/ctrl + c 复制所选中的数据,
  111. 再其它表内,或同一张表内,再次按住 ⌘/ctrl + 点击,选择输入框。键盘按 ⌘/ctrl + v
  112. 依次粘贴所选的数据。(目前仅支持输入框和文本框的操作)
  113. </div>
  114. <div class="text-orange-500 tip-item">4、完善资料填写后记得一定要保存哦</div>
  115. </el-scrollbar>
  116. <div class="table-tip-foot">
  117. <div class="tip-left-btn">
  118. <HcTooltip keys="wbs_import_table">
  119. <div class="text-gray-400 dow-text">
  120. <HcIcon name="publish" ui="text-lg"/>
  121. <span class="ml-1">导入列表数据</span>
  122. </div>
  123. </HcTooltip>
  124. <HcTooltip keys="wbs_download_table">
  125. <div class="text-main dow-text">
  126. <HcIcon name="file_download" ui="text-lg"/>
  127. <span class="ml-1">下载导入模板</span>
  128. </div>
  129. </HcTooltip>
  130. </div>
  131. <div class="tip-right-btn">
  132. <HcTooltip keys="wbs_save_table">
  133. <el-button :disabled="!item?.isTableForm"
  134. :loading="tableFormSaveLoading" hc-btn
  135. type="primary"
  136. @click="tableFormSaveClick(item)">
  137. <HcIcon name="save"/>
  138. <span>保存</span>
  139. </el-button>
  140. </HcTooltip>
  141. </div>
  142. </div>
  143. </div>
  144. </div>
  145. </el-collapse-item>
  146. </el-collapse>
  147. </div>
  148. <!--右键菜单-->
  149. <HcContextMenu ref="contextMenuRef" :datas="tableFormMenu" @item-click="handleMenuSelect"/>
  150. <!--上传文件-->
  151. <HcDialog :footer="false" :show="uploadModal" title="上传文件" widths="38rem" @close="uploadModalClose">
  152. <HcUpload :datas="uploadData" :fileList="fileListData" @change='uploadChange'/>
  153. </HcDialog>
  154. <!--插入设计值/频率-->
  155. <HcDialog :loading="designModalLoading" :show="designModal" isToBody saveText="确认插入"
  156. title="插入设计值/频率" widths="600px"
  157. @close="closeDesignModal" @save="designModalSave">
  158. <el-alert :closable="false" title="填写完设计值和频率,系统自动计算实测值" type="warning"/>
  159. <el-form ref="formDesignRef" :model="formDesignModel" label-width="auto" size="large">
  160. <div class="form-item-div text-center mb-3">
  161. <el-radio-group v-model="formDesignModel.type" size="large">
  162. <el-radio :label="1">公路工程</el-radio>
  163. <el-radio :label="2" class="ml-4">水利水电</el-radio>
  164. </el-radio-group>
  165. </div>
  166. <el-form-item label="设计值">
  167. <!-- onkeyup="value = value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g,'$1')" -->
  168. <el-input v-model="formDesignModel.design" placeholder="如果设计值存在两个,则使用 '/' 连接,例如12/23"/>
  169. </el-form-item>
  170. <el-form-item v-if="formDesignModel.type === 1" label="频率">
  171. <!-- onkeyup="value = value.replace(/^(0+)|[^\d]+/g,'')" -->
  172. <el-input v-model="formDesignModel.size"
  173. placeholder="如果设计值使用 '/' 连接,则频率也是用 '/' 连接,例如5/10"/>
  174. </el-form-item>
  175. <el-form-item v-if="formDesignModel.type === 2" label="容量">
  176. <!-- onkeyup="value = value.replace(/^(0+)|[^\d]+/g,'')" -->
  177. <el-input v-model="formDesignModel.capacity"
  178. placeholder="如果容量存在两个,则使用 '*',或者 '/' 连接例如2*4,5/7"/>
  179. </el-form-item>
  180. <el-form-item label="合格点数">
  181. <el-input v-model="formDesignModel.pass"
  182. placeholder="如果设计值使用 '/' 连接,则合格点数也是用 '/' 连接,例如2/5"/>
  183. </el-form-item>
  184. <el-form-item label="偏差范围">
  185. <el-input v-model="formDesignModel.dev"
  186. placeholder="如果设计值使用 '/' 连接,则偏差范围也是用 '/' 连接,例如±2/±3"/>
  187. </el-form-item>
  188. </el-form>
  189. </HcDialog>
  190. <!--插入特殊字符-->
  191. <HcDialog :loading="specialModalLoading" :show="specialModal" isToBody saveText="确认插入" title="插入特殊字符"
  192. widths="600px" @close="specialModalClose" @save="specialNodeClick">
  193. <HcSpecialDiaolg v-if="specialModal" ref="specialRef" @change="specialDiaolgChange"/>
  194. </HcDialog>
  195. <!--关联试验数据-->
  196. <HcDialog :footer="false" :loading="testModalLoading" :show="testModal" isTable isToBody title="关联试验数据"
  197. widths="84%" @close="testModalClose">
  198. <HcTestDiaolg v-if="testModal" :contractId="contract_id" :projectId="projectId" :tenantId="tenant_id"
  199. :wbsId="wbsTemp_id"
  200. :wbsType="wbs_type" @change="testTableRowName"/>
  201. </HcDialog>
  202. <!-- 选择要插入的数据 -->
  203. <HcDialog :loading="insertDataLoading" :show="insertDataShow" isTable isToBody saveText="保存"
  204. title="选择需要插入的数据" widths="84%" @close="cancelinsertData"
  205. @save="submitinsertData">
  206. <HcTestData v-if="insertDataShow" ref="insertDataRef" :contractId="contract_id" :projectId="projectId"
  207. :tableId="itinsertTableId"
  208. :treeId="itinsertTreeId"/>
  209. </HcDialog>
  210. <!--关联试验文件-->
  211. <HcDialog :loading="fileModalLoading" :show="fileModal" isTable isToBody saveText="保存" title="关联试验文件"
  212. widths="84%" @close="fileModalClose"
  213. @save="savefileModal">
  214. <HcTestFile v-if="fileModal" ref="testFileRefs" :contractId="contract_id" :projectId="projectId"
  215. :tenantId="tenant_id"
  216. :treeId="treeId" :wbsId="wbsTemp_id"
  217. :wbsType="wbs_type"/>
  218. </HcDialog>
  219. <!-- 公式参数配置 -->
  220. <HcDialog :loading="formulaModalLoading" :show="formulaModal" isToBody saveText="保存" title="公式参数配置"
  221. widths="84%" @close="formulaModalClose"
  222. @save="formulaSaveClick">
  223. <HcFormula v-if="formulaModal" ref="formulaRefs" :KeyName="tableFormItemNode.KeyName" :contractId="contract_id"
  224. :formparentId="formparentId"
  225. :pkeyId="tableFormItemNode.pkeyId" :projectId="projectId"/>
  226. </HcDialog>
  227. <!--查看表单-->
  228. <template v-for="(item,index) in DragModalTableForm">
  229. <HcDragModal :closeIconArr="closeIconArr" :eid="item.pkeyId" :height="DragModalHeight" :isShow="item.isShow"
  230. :loading="item.loading" :loadingText="item.loadingText" :title="item.title"
  231. isSortTop
  232. @close="TableFormClose(item, index)" @closeIconTap="closeIconTap($event, item, index)">
  233. <HcDragNode :more-menu="dragNodeMoreMenu" @menuTap="dragNodeMoreMenuTap($event, item)">
  234. <TableFormItem :ref="(el) => setItemRefs(el, item)"
  235. :classify="item.classify"
  236. :datas="changeFormDatas(item?.pkeyId, 'window')"
  237. :height="item.height"
  238. :kid="item.pkeyId"
  239. :nodeName="item.title"
  240. :pid="`table-form-${item?.pkeyId}`"
  241. :scroll="false"
  242. :tid="item.treeId"
  243. :width="item.width"
  244. @excelBodyTap="excelTableFormClick($event)"
  245. @render="tableFormRender($event, item['item'], item['index'])"
  246. @rightTap="tableFormRightTap($event, item['index'])"/>
  247. </HcDragNode>
  248. </HcDragModal>
  249. </template>
  250. <!-- 复制本表 -->
  251. <HcDialog :loading="copyClickModalLoading" :show="showcopyModal" isToBody saveText="确认复制" title="复制本表"
  252. widths="84%" @close="copyModalClose"
  253. @save="copySaveClick">
  254. <HcCopy v-if="showcopyModal" ref="copyRefs" :contractId="contract_id" :projectId="projectId" :classify="classifys"
  255. :tree_AutoExpandKeys="tree_AutoExpandKeys"
  256. :treenodeDataInfo="treenodeDataInfo"
  257. :copyItems="copyItems"
  258. :CopyModalType="CopyModalType"
  259. />
  260. <template #footer>
  261. <div class="lr-dialog-footer">
  262. <div class="left flex items-center">
  263. <div class="mr-4">复制方式:</div>
  264. <el-radio-group v-model="CopyModalType">
  265. <el-radio label="1">跨节点复制</el-radio>
  266. <el-radio class="ml-4" label="2">本节点复制</el-radio>
  267. </el-radio-group>
  268. </div>
  269. <div class="right">
  270. <el-button size="large" @click="showcopyModal = false">取消</el-button>
  271. <el-button :loading="copyClickModalLoading" hc-btn type="primary" @click="copySaveClick">确认复制
  272. </el-button>
  273. </div>
  274. </div>
  275. </template>
  276. </HcDialog>
  277. </template>
  278. <script setup>
  279. import {ref, watch, nextTick, onActivated, onDeactivated, onMounted, onUnmounted} from "vue";
  280. import HTableForm from "~src/plugins/HTableForm"
  281. import {useAppStore} from "~src/store";
  282. import wbsApi from "~api/data-fill/wbs"
  283. import HcUpload from "../components/HcUpload.vue"
  284. import TableFormItem from "./table-form-item.vue"
  285. import HcSpecialDiaolg from "./special-diaolg.vue"
  286. import HcTestDiaolg from "./test-diaolg.vue"
  287. import HcTestData from "./test-data.vue"
  288. import HcTestFile from "./test-file.vue"
  289. import HcFormula from "./formula.vue"
  290. import HcCopy from './test-copy.vue'
  291. import HcDragNode from "~com/drag-node/index.vue"
  292. import NoDataSvg from '~src/assets/view/no-data.svg'
  293. import {
  294. getArrValue, getObjValue, getObjVal,
  295. isNullES, deepClone, arrIndex, setPosRange
  296. } from "js-fast-way"
  297. //初始变量
  298. const useAppState = useAppStore()
  299. //参数
  300. const props = defineProps({
  301. datas: {
  302. type: Array,
  303. default: () => ([])
  304. },
  305. classify: {
  306. type: [String, Number],
  307. default: ''
  308. },
  309. status: {
  310. type: [String, Number],
  311. default: ''
  312. },
  313. primaryKeyId: {
  314. type: [String, Number],
  315. default: ''
  316. },
  317. contractId: {
  318. type: [String, Number],
  319. default: ''
  320. },
  321. drawType: {
  322. type: Boolean,
  323. default: false
  324. },
  325. wbsTempId: {
  326. type: [String, Number],
  327. default: ''
  328. },
  329. tenantId: {
  330. type: [String, Number],
  331. default: ''
  332. },
  333. wbsType: {
  334. type: [String, Number],
  335. default: ''
  336. },
  337. TreeAutoExpandKeys:{
  338. type: [Array],
  339. default: ''
  340. },
  341. treenodeDataInfo:{
  342. type: [Object],
  343. default: {}
  344. }
  345. })
  346. //全局变量
  347. const projectId = ref(useAppState.projectId);
  348. const contract_id = ref(props.contractId)
  349. const treeId = ref(props.primaryKeyId)
  350. const classifys = ref(props.classify)
  351. const wbsTemp_id = ref(props.wbsTempId);
  352. const tenant_id = ref(props.tenantId);
  353. const wbs_type = ref(props.wbsType);
  354. const isStatus = ref(parseInt(props.status))
  355. const listDatas = ref([])
  356. const draw_type = ref(props.drawType)
  357. const tree_AutoExpandKeys = ref(props.TreeAutoExpandKeys)
  358. const treenodeDataInfo=ref(props.treenodeDataInfo)
  359. //表单变量
  360. const formDataList = ref([])
  361. const formKeyIds = ref('')
  362. const formparentId = ref('')
  363. //处理ref
  364. const itemRefs = ref([])
  365. const setItemRefs = (el, {pkeyId}) => {
  366. if (el) {
  367. let index = arrIndex(itemRefs.value, 'pkeyId', pkeyId)
  368. if (index !== -1) {
  369. itemRefs.value[index].ref = el
  370. } else {
  371. itemRefs.value.push({
  372. pkeyId: pkeyId,
  373. ref: el
  374. });
  375. }
  376. }
  377. }
  378. //处理表单的ref
  379. const setSpliceItemRefs = async ({pkeyId}) => {
  380. const refs = itemRefs.value
  381. let index = arrIndex(refs, 'pkeyId', pkeyId)
  382. if (index !== -1) {
  383. refs.splice(index, 1)
  384. itemRefs.value = refs
  385. }
  386. }
  387. const closeIconArr = [
  388. {key: 'reduction', icon: 'picture-in-picture-2', name: '还原到面板内,并自动展开面板'}
  389. ]
  390. //事件
  391. const emit = defineEmits(['renew', 'offsetTop'])
  392. //组件参数变量
  393. const apis = ref({
  394. dataInfo: wbsApi.getBussDataInfo,
  395. bussCols: wbsApi.getHtmlBussCols,
  396. excelHtml: wbsApi.getExcelHtml
  397. })
  398. //深度监听数据
  399. watch(() => [
  400. props.datas,
  401. ], ([datas]) => {
  402. setFormDataNum(datas)
  403. }, {deep: true})
  404. //监听变量值
  405. watch(() => [
  406. useAppState.projectId,
  407. props.contractId,
  408. props.wbsTempId,
  409. props.tenantId,
  410. props.wbsType,
  411. props.status,
  412. props.classify,
  413. props.primaryKeyId,
  414. ], ([pid, cid, temp_id, tid, type, status, class_id, tree_id]) => {
  415. projectId.value = pid
  416. contract_id.value = cid
  417. wbsTemp_id.value = temp_id
  418. tenant_id.value = tid
  419. wbs_type.value = type
  420. isStatus.value = parseInt(status)
  421. classifys.value = class_id
  422. treeId.value = tree_id
  423. })
  424. //渲染完成
  425. onMounted(() => {
  426. setFormDataNum(props.datas)
  427. setTableFormMenu(useAppState.projectInfo)
  428. const {offsetHeight} = document.body
  429. DragModalHeight.value = offsetHeight - 200
  430. setMountOnEventKey()
  431. })
  432. //处理变动的数据
  433. const changeFormData = ref({
  434. 'window': [],
  435. 'collapse': [],
  436. })
  437. const changeFormDatas = (pkeyId, type) => {
  438. const changeData = changeFormData.value[type]
  439. const index = arrIndex(changeData, 'pkeyId', pkeyId)
  440. if (index !== -1) {
  441. return changeData[index]
  442. } else {
  443. return {}
  444. }
  445. }
  446. //设置变动的数据
  447. const setChangeFormDatas = async (pkeyId, type) => {
  448. const refs = await getFormRef(pkeyId)
  449. const formData = refs?.getFormData()
  450. const changeData = changeFormData.value[type]
  451. const index = arrIndex(changeData, 'pkeyId', pkeyId)
  452. if (index !== -1) {
  453. changeData[index] = formData
  454. } else {
  455. changeData.push(formData)
  456. }
  457. changeFormData.value[type] = changeData
  458. }
  459. //展开事件
  460. const ActiveKey = ref('')
  461. const CollapseChange = (name) => {
  462. ActiveKey.value = name
  463. let index = getCollapseItemIndex(name)
  464. if (index > -1) {
  465. getOffsetTop(name);
  466. const item = listDatas.value[index]
  467. formKeyIds.value = setToString(item.pkeyId)
  468. formparentId.value = setToString(item.parentId)
  469. nextTick(() => {
  470. if (!item.isTableRender) {
  471. item.isTableRender = true
  472. }
  473. })
  474. } else {
  475. getOffsetTop()
  476. formKeyIds.value = ''
  477. formparentId.value = ''
  478. }
  479. }
  480. //初始设置
  481. const setFormDataNum = (datas) => {
  482. itemRefs.value = []
  483. ActiveKey.value = ''
  484. let newArr = [];
  485. for (let i = 0; i < datas.length; i++) {
  486. newArr.push({isCollapseLoad: false})
  487. }
  488. formDataList.value = newArr
  489. listDatas.value = deepClone(datas)
  490. }
  491. //渲染完成
  492. const tableFormRender = (form, item, index) => {
  493. console.log(form)
  494. formDataList.value[index] = form
  495. formDataList.value[index].isCollapseLoad = form.isRenderForm
  496. item.isTableForm = form.isRenderForm
  497. }
  498. //菜单数据
  499. const contextMenuRef = ref(null)
  500. const tableFormMenu = ref([])
  501. const tableFormItemNode = ref({}) //临时信息
  502. //设置菜单权限数据
  503. const setTableFormMenu = (info) => {
  504. let newArr = [], infos = getObjValue(info)
  505. const isOpen = infos['isOpenRandomNumber'] ?? 0
  506. if (isOpen === 1 && isStatus.value !== 3) {
  507. newArr.push({label: '插入设计值/频率', key: "design"})
  508. }
  509. newArr.push({label: '插入特殊字符', key: "special"})
  510. newArr.push({label: '关联试验数据', key: "test"})
  511. newArr.push({label: '关联试验文件', key: "file"})
  512. newArr.push({label: '公式参数', key: "formula"})
  513. tableFormMenu.value = newArr
  514. }
  515. //鼠标右键事件
  516. const tableFormRightTap = ({event, KeyName, startPos, endPos, pkeyId}, index) => {
  517. //存储临时信息
  518. tableFormItemNode.value = {KeyName, index, startPos, endPos, pkeyId}
  519. contextMenuRef.value?.showMenu(event, false) //展开菜单
  520. }
  521. //鼠标右键菜单被点击
  522. const handleMenuSelect = ({key}) => {
  523. if (key === 'design') {
  524. setInitDesignForm()
  525. designModalLoading.value = false
  526. designModal.value = true
  527. } else if (key === 'special') {
  528. specialModalShow()
  529. } else if (key === 'test') {
  530. testModalLoading.value = false
  531. testModal.value = true
  532. } else if (key === 'file') {
  533. fileModalLoading.value = false
  534. fileModal.value = true;
  535. } else if (key === 'formula') {
  536. formulaModalLoading.value = false
  537. formulaModal.value = true
  538. }
  539. }
  540. //插入设计值
  541. const designModal = ref(false)
  542. const formDesignRef = ref(null)
  543. const formDesignModel = ref()
  544. //初始设计值/频率表单
  545. const setInitDesignForm = () => {
  546. formDesignModel.value = {
  547. type: 1, design: '', size: '',
  548. dev: '', key: '', capacity: '',
  549. pass: '', pkId: ''
  550. }
  551. }
  552. //设计值频率计算
  553. const designModalLoading = ref(false)
  554. const designModalSave = async () => {
  555. const {pkeyId, KeyName} = tableFormItemNode.value
  556. if (pkeyId) {
  557. designModalLoading.value = true
  558. //const {design, size} = formDesignModel.value
  559. const {error, code, data} = await wbsApi.queryFormulaRange({
  560. ...formDesignModel.value,
  561. // dev: (!design && !size) ? '±5': '',
  562. key: KeyName,
  563. pkId: pkeyId,
  564. })
  565. //处理数据
  566. const res = getObjVal(data)
  567. if (!error && code === 200 && res) {
  568. try {
  569. const refs = await getFormRef(pkeyId)
  570. const itemFormData = refs?.getFormData()
  571. Object.keys(data).forEach(key => {
  572. itemFormData[key] = data[key]
  573. })
  574. refs?.setFormData(itemFormData)
  575. } catch {
  576. }
  577. designModalLoading.value = false
  578. designModal.value = false
  579. } else {
  580. designModalLoading.value = false
  581. }
  582. } else {
  583. window?.$message?.warning('pkeyId为空')
  584. }
  585. }
  586. //关闭设计值/频率弹窗
  587. const closeDesignModal = () => {
  588. designModal.value = false
  589. setInitDesignForm()
  590. }
  591. //插入特殊字符
  592. const specialModal = ref(false)
  593. const specialModalLoading = ref(false)
  594. const specialModalShow = () => {
  595. specialFormValue.value = ''
  596. specialModalLoading.value = false
  597. specialModal.value = true
  598. }
  599. //监听特殊符号输入框的内容
  600. const specialFormValue = ref('')
  601. const specialDiaolgChange = (val) => {
  602. specialFormValue.value = val
  603. }
  604. //确认插入
  605. const specialRef = ref(null)
  606. const specialNodeClick = async () => {
  607. specialModalLoading.value = true
  608. const itemNode = tableFormItemNode.value
  609. const {KeyName, pkeyId} = itemNode
  610. try {
  611. const refs = await getFormRef(pkeyId)
  612. const itemFormData = refs?.getFormData()
  613. const {code, val, posVal} = await specialRef.value?.getSpecialNode(itemNode, itemFormData[KeyName])
  614. if (code === 200 && val) {
  615. itemFormData[KeyName] = val
  616. refs?.setFormData(itemFormData)
  617. specialModalLoading.value = false
  618. specialModal.value = false
  619. await nextTick(() => {
  620. setPosRange(KeyName, posVal)
  621. })
  622. } else {
  623. specialModalLoading.value = false
  624. }
  625. } catch (e) {
  626. specialModalLoading.value = false
  627. }
  628. }
  629. //关闭插入特殊字符
  630. const specialModalClose = () => {
  631. specialModalLoading.value = false
  632. specialModal.value = false
  633. }
  634. //关联试验数据
  635. const testModal = ref(false)
  636. const testModalLoading = ref(false)
  637. //关联试验数据被点击
  638. const itinsertTableId = ref('')
  639. const itinsertTreeId = ref('')
  640. const testTableRowName = ({row, treeId}) => {
  641. itinsertTableId.value = row.id
  642. itinsertTreeId.value = treeId
  643. insertDataLoading.value = false
  644. insertDataShow.value = true
  645. }
  646. //关闭弹窗
  647. const testModalClose = () => {
  648. testModal.value = false
  649. testModalLoading.value = false
  650. }
  651. //选择要插入的实验数据
  652. const insertDataShow = ref(false);
  653. const insertDataLoading = ref(false);
  654. //确定关联试验数据数据
  655. const insertDataRef = ref(null)
  656. const submitinsertData = async () => {
  657. insertDataLoading.value = true
  658. const itemNode = tableFormItemNode.value
  659. const {KeyName, pkeyId} = itemNode
  660. try {
  661. const refs = await getFormRef(pkeyId)
  662. const itemFormData = refs?.getFormData()
  663. const {code, val, posVal} = await insertDataRef.value?.submitinsertData(itemNode, itemFormData[KeyName])
  664. if (code === 200 && val) {
  665. itemFormData[KeyName] = val
  666. refs?.setFormData(itemFormData)
  667. insertDataLoading.value = false
  668. insertDataShow.value = false
  669. testModal.value = false
  670. await nextTick(() => {
  671. setPosRange(KeyName, posVal)
  672. })
  673. }
  674. } catch {
  675. insertDataLoading.value = false
  676. }
  677. }
  678. //取消关联数据
  679. const cancelinsertData = async () => {
  680. insertDataShow.value = false
  681. insertDataLoading.value = false
  682. }
  683. //关联试验文件
  684. const fileModal = ref(false)
  685. const testFileRefs = ref(null)
  686. //确认关联文件
  687. const fileModalLoading = ref(false)
  688. const savefileModal = async () => {
  689. fileModalLoading.value = true
  690. await testFileRefs.value?.savefileSubmit()
  691. fileModalLoading.value = false
  692. fileModal.value = false
  693. }
  694. //关闭弹窗
  695. const fileModalClose = () => {
  696. fileModal.value = false
  697. fileModalLoading.value = false
  698. }
  699. //公式参数配置
  700. const formulaModal = ref(false)
  701. const formulaRefs = ref(null)
  702. //保存
  703. const formulaModalLoading = ref(false)
  704. const formulaSaveClick = async () => {
  705. formulaModalLoading.value = true
  706. await formulaRefs.value?.panelSave()
  707. formulaModalLoading.value = false
  708. formulaModal.value = false
  709. }
  710. //关闭
  711. const formulaModalClose = () => {
  712. formulaModal.value = false
  713. formulaModalLoading.value = false
  714. }
  715. //窗口化
  716. const DragModalTableForm = ref([])
  717. const DragModalHeight = ref(600)
  718. const windowClick = async (item, indexs) => {
  719. const list = deepClone(DragModalTableForm.value)
  720. let index = arrIndex(list, 'pkeyId', item.pkeyId)
  721. if (!item.isWindow) {
  722. const formSize = getTableFormSize(item?.pkeyId)
  723. const newTableForm = {
  724. ...setInitDragModalTableForm(item, indexs),
  725. ...formSize
  726. }
  727. await setChangeFormDatas(item?.pkeyId, 'window')
  728. item.isWindow = true
  729. //处理表单的ref
  730. await setSpliceItemRefs(item)
  731. //弹窗表单的排序
  732. if (index === -1) {
  733. list.push(newTableForm)
  734. } else if (index !== list.length - 1) {
  735. //检查是否在最上层,不在则置顶,可以解决多次点击时,频繁更改全局状态的问题
  736. list.splice(index, 1)
  737. list.push(newTableForm)
  738. }
  739. DragModalTableForm.value = list
  740. ActiveKey.value = ''
  741. } else {
  742. await setChangeFormDatas(item?.pkeyId, 'collapse')
  743. //处理表单的ref
  744. await setSpliceItemRefs(item)
  745. if (index !== -1) {
  746. list.splice(index, 1)
  747. DragModalTableForm.value = list
  748. }
  749. item.isWindow = false
  750. }
  751. }
  752. //初始拖动表单的内容
  753. const setInitDragModalTableForm = (item, index) => {
  754. return {
  755. projectId: projectId.value,
  756. contractId: contract_id.value,
  757. wbsTempId: wbsTemp_id.value,
  758. tenantId: tenant_id.value,
  759. wbsType: wbs_type.value,
  760. classify: classifys.value,
  761. treeId: treeId.value,
  762. pkeyId: item.pkeyId,
  763. height: '100%',
  764. width: '100%',
  765. title: item.nodeName,
  766. isShow: true,
  767. index: index,
  768. item: item
  769. }
  770. }
  771. //关闭窗口
  772. const TableFormClose = async ({pkeyId, index}, indexs) => {
  773. const list = deepClone(DragModalTableForm.value)
  774. //取表单的数据
  775. await setChangeFormDatas(pkeyId, 'collapse')
  776. //关闭窗口
  777. list.splice(indexs, 1)
  778. DragModalTableForm.value = list
  779. listDatas.value[index].isWindow = false
  780. }
  781. const dragNodeMoreMenu = [
  782. {key: 'save', icon: 'save-2', name: '保存'},
  783. {key: 'preview', icon: 'eye', name: '预览'},
  784. ]
  785. //还原窗口
  786. const closeIconTap = async (event, item, indexs) => {
  787. const {index, pkeyId} = item
  788. let KeyId = `item-${index}-${pkeyId}`
  789. await TableFormClose(item, indexs)
  790. ActiveKey.value = KeyId
  791. }
  792. //菜单被点击
  793. const dragNodeMoreMenuTap = ({key}, items) => {
  794. const {item} = items
  795. if (key === 'save') {
  796. if (item?.isTableForm) {
  797. tableFormSaveClick(item, items)
  798. } else {
  799. window.$message.warning('此表单暂无数据和文件')
  800. }
  801. } else if (key === 'preview') {
  802. if (item['isBussShow'] === 2 || item['isTabPdf'] === 1 || item['pdfUrl'] === '') {
  803. window.$message.warning('此表单暂无可预览文件')
  804. } else {
  805. previewClick(item, items)
  806. }
  807. }
  808. }
  809. //删除本表
  810. const tableFormDelLoading = ref(false)
  811. const delClick = async ({pkeyId}) => {
  812. if (pkeyId) {
  813. if (isStatus.value !== 3) {
  814. tableFormDelLoading.value = true
  815. const {error, code} = await wbsApi.removeBussTabInfo({
  816. pkeyid: pkeyId,
  817. classify: classifys.value,
  818. })
  819. tableFormDelLoading.value = false
  820. if (!error && code === 200) {
  821. window?.$message?.success('操作成功')
  822. //判断是否存在窗口,如果存在,就删除窗口
  823. delWindowRefs(pkeyId)
  824. renewData()
  825. }
  826. } else {
  827. window?.$message?.warning('已上报的资料,不允许删除')
  828. }
  829. } else {
  830. window?.$message?.warning('pkeyId为空')
  831. }
  832. }
  833. //复制本表相关
  834. const showcopyModal=ref(false)
  835. const copyRefs=ref(null)
  836. const copyModalClose=()=>{
  837. // copyModal.value=false
  838. }
  839. const CopyModalType=ref('1')
  840. const copySaveClick=async()=>{
  841. //本节点复制
  842. if(CopyModalType.value==='2'){
  843. const {pkeyId, isTableRender, isTableForm} = copyItems.value
  844. if (pkeyId) {
  845. if (isStatus.value !== 3) {
  846. if (!isTableRender) {
  847. await copeBussTab(pkeyId)
  848. } else if (!isTableForm) {
  849. window?.$message?.warning('暂无表单数据')
  850. } else if (isTableRender) {
  851. copyClickLoading.value = true
  852. const isSave = await saveExcelBussData(items, null, false)
  853. if (isSave) {
  854. await copeBussTab(pkeyId)
  855. } else {
  856. copyClickLoading.value = false
  857. window?.$message?.warning('复制本表操作失败')
  858. }
  859. } else {
  860. window?.$message?.warning(`数据异常了, isRenderTableForm: ${isTableRender}, isTableForm: ${isTableForm}, pkeyIds:${pkeyId}`)
  861. }
  862. } else {
  863. window?.$message?.warning('已上报的资料,不允许复制')
  864. }
  865. } else {
  866. window?.$message?.warning('pkeyId为空')
  867. }
  868. }else{
  869. window?.$message?.warning('暂无相关接口')
  870. }
  871. }
  872. //复制本表
  873. const copyClickModalLoading = ref(false)
  874. const copyClickLoading = ref(false)
  875. const copyClick = async (items) => {
  876. const {pkeyId, isTableRender, isTableForm} = items
  877. if (pkeyId) {
  878. if (isStatus.value !== 3) {
  879. if (!isTableRender) {
  880. await copeBussTab(pkeyId)
  881. } else if (!isTableForm) {
  882. window?.$message?.warning('暂无表单数据')
  883. } else if (isTableRender) {
  884. copyClickLoading.value = true
  885. const isSave = await saveExcelBussData(items, null, false)
  886. if (isSave) {
  887. await copeBussTab(pkeyId)
  888. } else {
  889. copyClickLoading.value = false
  890. window?.$message?.warning('复制本表操作失败')
  891. }
  892. } else {
  893. window?.$message?.warning(`数据异常了, isRenderTableForm: ${isTableRender}, isTableForm: ${isTableForm}, pkeyIds:${pkeyId}`)
  894. }
  895. } else {
  896. window?.$message?.warning('已上报的资料,不允许复制')
  897. }
  898. } else {
  899. window?.$message?.warning('pkeyId为空')
  900. }
  901. }
  902. const copyItems=ref([])
  903. //跨节点复制弹窗
  904. // const copyClick = (items) => {
  905. // showcopyModal.value=true
  906. // copyItems.value=items
  907. // }
  908. //复制表的请求
  909. const copeBussTab = async (pkeyId) => {
  910. copyClickLoading.value = true
  911. const {error, code} = await wbsApi.copeBussTab({
  912. pkeyId: pkeyId
  913. })
  914. copyClickLoading.value = false
  915. if (!error && code === 200) {
  916. window?.$message?.success('操作成功')
  917. renewData()
  918. }
  919. }
  920. //隐藏本表
  921. const tableFormHideLoading = ref(false)
  922. const hideClick = async ({pkeyId, isBussShow}) => {
  923. if (pkeyId) {
  924. if (isStatus.value !== 3) {
  925. tableFormHideLoading.value = true
  926. const bussShow = isBussShow === 2 ? 1 : 2 //状态(1显示 2隐藏)
  927. const {error, code} = await wbsApi.showBussTab({
  928. pkeyId: pkeyId,
  929. status: bussShow
  930. })
  931. tableFormHideLoading.value = false
  932. if (!error && code === 200) {
  933. window?.$message?.success('操作成功')
  934. if (bussShow === 2) {
  935. //判断是否存在窗口,如果存在,就删除窗口
  936. delWindowRefs(pkeyId)
  937. }
  938. renewData()
  939. }
  940. } else {
  941. window?.$message?.warning('已上报的资料,不允许隐藏')
  942. }
  943. } else {
  944. window?.$message?.warning('pkeyId为空')
  945. }
  946. }
  947. //预览本表
  948. const tableFormPreviewLoading = ref(false)
  949. const previewClick = async (item, dragItem = null) => {
  950. tableFormPreviewLoading.value = true
  951. await getBussPdfInfo(item, dragItem)
  952. tableFormPreviewLoading.value = false
  953. }
  954. //上传变量
  955. const uploadModal = ref(false)
  956. const fileListData = ref([]);
  957. const uploadData = ref({})
  958. //上传附件
  959. const uploadClick = (items, index) => {
  960. const {pkeyId, isTableForm, isTableRender} = items
  961. const keyName = `item-${index}-${pkeyId}`
  962. if (pkeyId) {
  963. if (isStatus.value !== 3 && isTableForm) {
  964. uploadModal.value = true
  965. uploadData.value = {
  966. projectId: projectId.value,
  967. contractId: contract_id.value,
  968. classify: classifys.value,
  969. pkeyId: pkeyId,
  970. nodeId: treeId.value
  971. }
  972. //获取文件列表
  973. getBussFileList(pkeyId)
  974. } else if (!isTableRender) {
  975. CollapseChange(keyName)
  976. window?.$message?.warning('请再次点击上传')
  977. } else if (!isTableForm) {
  978. window?.$message?.warning('暂无表单数据')
  979. } else {
  980. window?.$message?.warning('已上报的资料,不允许上传')
  981. }
  982. } else {
  983. window?.$message?.warning('pkeyId为空')
  984. }
  985. }
  986. //获取文件列表
  987. const getBussFileList = async (pkeyId) => {
  988. const {error, code, data} = await wbsApi.getBussFileList({
  989. pkeyid: pkeyId
  990. })
  991. if (!error && code === 200) {
  992. fileListData.value = getArrValue(data)
  993. } else {
  994. fileListData.value = []
  995. }
  996. }
  997. //上传文件
  998. const uploadChange = async ({type}) => {
  999. if (type === 'success') {
  1000. uploadModal.value = false
  1001. renewData()
  1002. } else if (type === 'del') {
  1003. renewData()
  1004. }
  1005. }
  1006. //关闭上传附件窗口
  1007. const uploadModalClose = () => {
  1008. uploadModal.value = false
  1009. }
  1010. //单个保存
  1011. const tableFormSaveLoading = ref(false)
  1012. const tableFormSaveClick = async (item, dragItem = null) => {
  1013. if (isStatus.value !== 3) {
  1014. tableFormSaveLoading.value = true
  1015. const isSave = await saveExcelBussData(item, dragItem)
  1016. if (isSave) {
  1017. await getBussPdfInfo(item, dragItem)
  1018. tableFormSaveLoading.value = false
  1019. renewData()
  1020. } else {
  1021. tableFormSaveLoading.value = false
  1022. }
  1023. } else {
  1024. window?.$message?.warning('已上报的资料,不允许保存。')
  1025. }
  1026. }
  1027. //保存表单数据
  1028. const saveExcelBussData = async ({pkeyId}, dragItem = null, showTip = true) => {
  1029. setDragModalLoading(dragItem, '保存中...', true)
  1030. const refs = await getFormRef(pkeyId)
  1031. const isRegExp = await refs?.isFormRegExp()
  1032. if (isRegExp) {
  1033. const formData = refs?.getFormData()
  1034. const {error, code} = await wbsApi.saveExcelBussData(formData)
  1035. setDragModalLoading(dragItem)
  1036. if (!error && code === 200) {
  1037. if (showTip) {
  1038. window?.$message?.success('保存成功')
  1039. }
  1040. return true
  1041. } else {
  1042. return false
  1043. }
  1044. } else {
  1045. setDragModalLoading(dragItem)
  1046. return false
  1047. }
  1048. }
  1049. //预览PDF
  1050. const getBussPdfInfo = async ({pkeyId}, dragItem = null, showTip = true) => {
  1051. setDragModalLoading(dragItem, '获取pdf中...', true)
  1052. const {error, code, data} = await wbsApi.getBussPdfInfo({
  1053. pkeyId: pkeyId
  1054. }, false)
  1055. setDragModalLoading(dragItem)
  1056. if (!error && code === 200) {
  1057. if (data) {
  1058. window.open(data, '_blank')
  1059. } else if (showTip) {
  1060. window?.$message?.warning('PDF错误')
  1061. }
  1062. } else {
  1063. if (showTip) {
  1064. window?.$message?.warning(data.msg || '获取PDF失败')
  1065. }
  1066. }
  1067. }
  1068. //通知数据更新
  1069. const renewData = () => {
  1070. emit('renew')
  1071. ActiveKey.value = ''
  1072. }
  1073. //设置表单的加载状态
  1074. const setDragModalLoading = (dragItem, text = '保存中...', show = false) => {
  1075. if (dragItem && show) {
  1076. dragItem.loading = true
  1077. dragItem.loadingText = text
  1078. }
  1079. if (dragItem && !show) {
  1080. dragItem.loading = false
  1081. }
  1082. }
  1083. //获取表单的ref
  1084. const getFormRef = async (pkeyId) => {
  1085. const itemRef = itemRefs.value
  1086. const index = arrIndex(itemRef, 'pkeyId', pkeyId)
  1087. return itemRef[index].ref
  1088. }
  1089. //删除打开的窗口
  1090. const delWindowRefs = (pkeyId) => {
  1091. //判断是否存在窗口,如果存在,就删除窗口
  1092. const list = DragModalTableForm.value
  1093. const index = arrIndex(list, 'pkeyId', pkeyId)
  1094. if (index !== -1) {
  1095. list.splice(index, 1)
  1096. DragModalTableForm.value = list
  1097. }
  1098. }
  1099. //计算展开高度和滚动位置
  1100. const getOffsetTop = (key = '') => {
  1101. if (key) {
  1102. const dom = document.getElementById(key)
  1103. if (!draw_type.value) {
  1104. if (dom?.offsetTop >= 583 && key) {
  1105. emit('offsetTop', dom?.offsetTop - 583)
  1106. } else {
  1107. emit('offsetTop', dom?.offsetTop)
  1108. }
  1109. } else {
  1110. if (dom.offsetTop >= 424 && key) {
  1111. emit('offsetTop', dom?.offsetTop - 424)
  1112. } else {
  1113. emit('offsetTop', dom?.offsetTop)
  1114. }
  1115. }
  1116. } else {
  1117. emit('offsetTop', 0)
  1118. }
  1119. ActiveKey.value = key
  1120. }
  1121. //获取折叠面板的索引
  1122. const getCollapseItemIndex = (name) => {
  1123. const keys = name.split('-')
  1124. if (keys.length > 0) {
  1125. return keys[1]
  1126. } else {
  1127. return -1
  1128. }
  1129. }
  1130. //获取表单的大小
  1131. const getTableFormSize = (pkeyId) => {
  1132. let formId = `table-form-${pkeyId}`
  1133. try {
  1134. const {clientWidth, clientHeight} = document.getElementById(formId).children[0]
  1135. return {
  1136. width: (clientWidth + 40) + 'px',
  1137. height: (clientHeight + 80) + 'px'
  1138. }
  1139. } catch {
  1140. return {
  1141. width: '100%',
  1142. height: '100%'
  1143. }
  1144. }
  1145. }
  1146. //转字符串
  1147. const setToString = (val) => {
  1148. return val ? val + '' : ''
  1149. }
  1150. //表单被点击
  1151. const presentId = ref('')
  1152. const excelTableFormClick = (key) => {
  1153. presentId.value = key
  1154. }
  1155. //缓存被激活时
  1156. onActivated(() => {
  1157. setMountOnEventKey()
  1158. })
  1159. //缓存时被移除
  1160. onDeactivated(() => {
  1161. HTableForm.unmountEventKey()
  1162. })
  1163. //页面被卸载
  1164. onUnmounted(() => {
  1165. HTableForm.unmountEventKey()
  1166. })
  1167. const setMountOnEventKey = () => {
  1168. HTableForm.setOnEventKey({
  1169. //按下ctrl键 或 control 键
  1170. onCtrlDown: async () => {
  1171. //window.$HcLog('全局按键', '按下ctrl键 或 control 键')
  1172. const refs = await setOnFuncFormRef()
  1173. refs?.setIsCtrlKey(true)
  1174. },
  1175. //按下复制快捷键
  1176. onCtrlDownC: async (event) => {
  1177. //window.$HcLog('全局按键', '按下复制快捷键')
  1178. const refs = await setOnFuncFormRef()
  1179. refs?.setCopyKeyList(event)
  1180. },
  1181. //按下粘贴快捷键
  1182. onCtrlDownV: async (event) => {
  1183. //window.$HcLog('全局按键', '按下粘贴快捷键')
  1184. const refs = await setOnFuncFormRef()
  1185. await refs?.setPasteKeyList(event)
  1186. },
  1187. //放开ctrl键 或 control 键
  1188. onCtrlUp: async () => {
  1189. //window.$HcLog('全局按键', '放开ctrl键 或 control 键')
  1190. const refs = await setOnFuncFormRef()
  1191. refs?.setIsCtrlKey(false)
  1192. },
  1193. })
  1194. }
  1195. //获取表单的ref
  1196. const setOnFuncFormRef = async () => {
  1197. const pkeyId = presentId.value
  1198. if (!isNullES(pkeyId)) {
  1199. return await getFormRef(pkeyId)
  1200. } else {
  1201. return;
  1202. }
  1203. }
  1204. //获取已渲染的表单
  1205. const getFilterFormData = async () => {
  1206. const formArr = formDataList.value;
  1207. return formArr.filter((item) => {
  1208. return (item.pkeyId ?? '') !== '' && item.isCollapseLoad;
  1209. })
  1210. }
  1211. //获取表单数据
  1212. const getFormData = async () => {
  1213. const formArr = await getFilterFormData();
  1214. //获取表单数据
  1215. let newArr = [];
  1216. for (let i = 0; i < formArr.length; i++) {
  1217. const pkeyId = formArr[i].pkeyId
  1218. const refs = await getFormRef(pkeyId)
  1219. const form = refs?.getFormData()
  1220. newArr.push({...form})
  1221. }
  1222. console.log('表单数据', newArr)
  1223. return newArr
  1224. }
  1225. //获取表单效验数据
  1226. const getFormRegExpJson = async () => {
  1227. const formArr = await getFilterFormData();
  1228. const list = listDatas.value
  1229. //获取表单数据
  1230. let formRegExpJson = {};
  1231. for (let i = 0; i < formArr.length; i++) {
  1232. const pkeyId = formArr[i].pkeyId
  1233. const refs = await getFormRef(pkeyId)
  1234. const regExp = refs?.getRegExpJson()
  1235. const nodeName = refs?.getNodeName()
  1236. if (getObjVal(regExp)) {
  1237. const index = arrIndex(list, 'pkeyId', pkeyId)
  1238. formRegExpJson[pkeyId] = {
  1239. ...regExp,
  1240. itemId: `item-${index}-${pkeyId}`,
  1241. nodeName: nodeName
  1242. }
  1243. }
  1244. }
  1245. return formRegExpJson
  1246. }
  1247. //获取当前展开项
  1248. const getActiveKey = () => {
  1249. return ActiveKey.value;
  1250. }
  1251. //设置当前展开项
  1252. const setActiveKey = (key) => {
  1253. return ActiveKey.value = key;
  1254. }
  1255. // 暴露出去
  1256. defineExpose({
  1257. getFormData,
  1258. getFormRegExpJson,
  1259. getActiveKey,
  1260. setActiveKey
  1261. })
  1262. </script>
  1263. <style lang="scss" scoped>
  1264. @import "./index.scss";
  1265. </style>
  1266. <style lang="scss">
  1267. @import "./style.scss";
  1268. </style>