index.vue 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355
  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. @changeModalType="changeType"
  259. />
  260. </HcDialog>
  261. </template>
  262. <script setup>
  263. import {ref, watch, nextTick, onActivated, onDeactivated, onMounted, onUnmounted} from "vue";
  264. import HTableForm from "~src/plugins/HTableForm"
  265. import {useAppStore} from "~src/store";
  266. import wbsApi from "~api/data-fill/wbs"
  267. import HcUpload from "../components/HcUpload.vue"
  268. import TableFormItem from "./table-form-item.vue"
  269. import HcSpecialDiaolg from "./special-diaolg.vue"
  270. import HcTestDiaolg from "./test-diaolg.vue"
  271. import HcTestData from "./test-data.vue"
  272. import HcTestFile from "./test-file.vue"
  273. import HcFormula from "./formula.vue"
  274. import HcCopy from './test-copy.vue'
  275. import HcDragNode from "~com/drag-node/index.vue"
  276. import NoDataSvg from '~src/assets/view/no-data.svg'
  277. import {
  278. getArrValue, getObjValue, getObjVal,
  279. isNullES, deepClone, arrIndex, setPosRange
  280. } from "js-fast-way"
  281. //初始变量
  282. const useAppState = useAppStore()
  283. //参数
  284. const props = defineProps({
  285. datas: {
  286. type: Array,
  287. default: () => ([])
  288. },
  289. classify: {
  290. type: [String, Number],
  291. default: ''
  292. },
  293. status: {
  294. type: [String, Number],
  295. default: ''
  296. },
  297. primaryKeyId: {
  298. type: [String, Number],
  299. default: ''
  300. },
  301. contractId: {
  302. type: [String, Number],
  303. default: ''
  304. },
  305. drawType: {
  306. type: Boolean,
  307. default: false
  308. },
  309. wbsTempId: {
  310. type: [String, Number],
  311. default: ''
  312. },
  313. tenantId: {
  314. type: [String, Number],
  315. default: ''
  316. },
  317. wbsType: {
  318. type: [String, Number],
  319. default: ''
  320. },
  321. TreeAutoExpandKeys:{
  322. type: [Array],
  323. default: ''
  324. },
  325. treenodeDataInfo:{
  326. type: [Object],
  327. default: {}
  328. }
  329. })
  330. //全局变量
  331. const projectId = ref(useAppState.projectId);
  332. const contract_id = ref(props.contractId)
  333. const treeId = ref(props.primaryKeyId)
  334. const classifys = ref(props.classify)
  335. const wbsTemp_id = ref(props.wbsTempId);
  336. const tenant_id = ref(props.tenantId);
  337. const wbs_type = ref(props.wbsType);
  338. const isStatus = ref(parseInt(props.status))
  339. const listDatas = ref([])
  340. const draw_type = ref(props.drawType)
  341. const tree_AutoExpandKeys = ref(props.TreeAutoExpandKeys)
  342. const treenodeDataInfo=ref(props.treenodeDataInfo)
  343. //表单变量
  344. const formDataList = ref([])
  345. const formKeyIds = ref('')
  346. const formparentId = ref('')
  347. //处理ref
  348. const itemRefs = ref([])
  349. const setItemRefs = (el, {pkeyId}) => {
  350. if (el) {
  351. let index = arrIndex(itemRefs.value, 'pkeyId', pkeyId)
  352. if (index !== -1) {
  353. itemRefs.value[index].ref = el
  354. } else {
  355. itemRefs.value.push({
  356. pkeyId: pkeyId,
  357. ref: el
  358. });
  359. }
  360. }
  361. }
  362. //处理表单的ref
  363. const setSpliceItemRefs = async ({pkeyId}) => {
  364. const refs = itemRefs.value
  365. let index = arrIndex(refs, 'pkeyId', pkeyId)
  366. if (index !== -1) {
  367. refs.splice(index, 1)
  368. itemRefs.value = refs
  369. }
  370. }
  371. const closeIconArr = [
  372. {key: 'reduction', icon: 'picture-in-picture-2', name: '还原到面板内,并自动展开面板'}
  373. ]
  374. //事件
  375. const emit = defineEmits(['renew', 'offsetTop'])
  376. //组件参数变量
  377. const apis = ref({
  378. dataInfo: wbsApi.getBussDataInfo,
  379. bussCols: wbsApi.getHtmlBussCols,
  380. excelHtml: wbsApi.getExcelHtml
  381. })
  382. //深度监听数据
  383. watch(() => [
  384. props.datas,
  385. ], ([datas]) => {
  386. setFormDataNum(datas)
  387. }, {deep: true})
  388. //监听变量值
  389. watch(() => [
  390. useAppState.projectId,
  391. props.contractId,
  392. props.wbsTempId,
  393. props.tenantId,
  394. props.wbsType,
  395. props.status,
  396. props.classify,
  397. props.primaryKeyId,
  398. ], ([pid, cid, temp_id, tid, type, status, class_id, tree_id]) => {
  399. projectId.value = pid
  400. contract_id.value = cid
  401. wbsTemp_id.value = temp_id
  402. tenant_id.value = tid
  403. wbs_type.value = type
  404. isStatus.value = parseInt(status)
  405. classifys.value = class_id
  406. treeId.value = tree_id
  407. })
  408. //渲染完成
  409. onMounted(() => {
  410. setFormDataNum(props.datas)
  411. setTableFormMenu(useAppState.projectInfo)
  412. const {offsetHeight} = document.body
  413. DragModalHeight.value = offsetHeight - 200
  414. setMountOnEventKey()
  415. })
  416. //处理变动的数据
  417. const changeFormData = ref({
  418. 'window': [],
  419. 'collapse': [],
  420. })
  421. const changeFormDatas = (pkeyId, type) => {
  422. const changeData = changeFormData.value[type]
  423. const index = arrIndex(changeData, 'pkeyId', pkeyId)
  424. if (index !== -1) {
  425. return changeData[index]
  426. } else {
  427. return {}
  428. }
  429. }
  430. //设置变动的数据
  431. const setChangeFormDatas = async (pkeyId, type) => {
  432. const refs = await getFormRef(pkeyId)
  433. const formData = refs?.getFormData()
  434. const changeData = changeFormData.value[type]
  435. const index = arrIndex(changeData, 'pkeyId', pkeyId)
  436. if (index !== -1) {
  437. changeData[index] = formData
  438. } else {
  439. changeData.push(formData)
  440. }
  441. changeFormData.value[type] = changeData
  442. }
  443. //展开事件
  444. const ActiveKey = ref('')
  445. const CollapseChange = (name) => {
  446. ActiveKey.value = name
  447. let index = getCollapseItemIndex(name)
  448. if (index > -1) {
  449. getOffsetTop(name);
  450. const item = listDatas.value[index]
  451. formKeyIds.value = setToString(item.pkeyId)
  452. formparentId.value = setToString(item.parentId)
  453. nextTick(() => {
  454. if (!item.isTableRender) {
  455. item.isTableRender = true
  456. }
  457. })
  458. } else {
  459. getOffsetTop()
  460. formKeyIds.value = ''
  461. formparentId.value = ''
  462. }
  463. }
  464. //初始设置
  465. const setFormDataNum = (datas) => {
  466. itemRefs.value = []
  467. ActiveKey.value = ''
  468. let newArr = [];
  469. for (let i = 0; i < datas.length; i++) {
  470. newArr.push({isCollapseLoad: false})
  471. }
  472. formDataList.value = newArr
  473. listDatas.value = deepClone(datas)
  474. }
  475. //渲染完成
  476. const tableFormRender = (form, item, index) => {
  477. console.log(form)
  478. formDataList.value[index] = form
  479. formDataList.value[index].isCollapseLoad = form.isRenderForm
  480. item.isTableForm = form.isRenderForm
  481. }
  482. //菜单数据
  483. const contextMenuRef = ref(null)
  484. const tableFormMenu = ref([])
  485. const tableFormItemNode = ref({}) //临时信息
  486. //设置菜单权限数据
  487. const setTableFormMenu = (info) => {
  488. let newArr = [], infos = getObjValue(info)
  489. const isOpen = infos['isOpenRandomNumber'] ?? 0
  490. if (isOpen === 1 && isStatus.value !== 3) {
  491. newArr.push({label: '插入设计值/频率', key: "design"})
  492. }
  493. newArr.push({label: '插入特殊字符', key: "special"})
  494. newArr.push({label: '关联试验数据', key: "test"})
  495. newArr.push({label: '关联试验文件', key: "file"})
  496. newArr.push({label: '公式参数', key: "formula"})
  497. tableFormMenu.value = newArr
  498. }
  499. //鼠标右键事件
  500. const tableFormRightTap = ({event, KeyName, startPos, endPos, pkeyId}, index) => {
  501. //存储临时信息
  502. tableFormItemNode.value = {KeyName, index, startPos, endPos, pkeyId}
  503. contextMenuRef.value?.showMenu(event, false) //展开菜单
  504. }
  505. //鼠标右键菜单被点击
  506. const handleMenuSelect = ({key}) => {
  507. if (key === 'design') {
  508. setInitDesignForm()
  509. designModalLoading.value = false
  510. designModal.value = true
  511. } else if (key === 'special') {
  512. specialModalShow()
  513. } else if (key === 'test') {
  514. testModalLoading.value = false
  515. testModal.value = true
  516. } else if (key === 'file') {
  517. fileModalLoading.value = false
  518. fileModal.value = true;
  519. } else if (key === 'formula') {
  520. formulaModalLoading.value = false
  521. formulaModal.value = true
  522. }
  523. }
  524. //插入设计值
  525. const designModal = ref(false)
  526. const formDesignRef = ref(null)
  527. const formDesignModel = ref()
  528. //初始设计值/频率表单
  529. const setInitDesignForm = () => {
  530. formDesignModel.value = {
  531. type: 1, design: '', size: '',
  532. dev: '', key: '', capacity: '',
  533. pass: '', pkId: ''
  534. }
  535. }
  536. //设计值频率计算
  537. const designModalLoading = ref(false)
  538. const designModalSave = async () => {
  539. const {pkeyId, KeyName} = tableFormItemNode.value
  540. if (pkeyId) {
  541. designModalLoading.value = true
  542. //const {design, size} = formDesignModel.value
  543. const {error, code, data} = await wbsApi.queryFormulaRange({
  544. ...formDesignModel.value,
  545. // dev: (!design && !size) ? '±5': '',
  546. key: KeyName,
  547. pkId: pkeyId,
  548. })
  549. //处理数据
  550. const res = getObjVal(data)
  551. if (!error && code === 200 && res) {
  552. try {
  553. const refs = await getFormRef(pkeyId)
  554. const itemFormData = refs?.getFormData()
  555. Object.keys(data).forEach(key => {
  556. itemFormData[key] = data[key]
  557. })
  558. refs?.setFormData(itemFormData)
  559. } catch {
  560. }
  561. designModalLoading.value = false
  562. designModal.value = false
  563. } else {
  564. designModalLoading.value = false
  565. }
  566. } else {
  567. window?.$message?.warning('pkeyId为空')
  568. }
  569. }
  570. //关闭设计值/频率弹窗
  571. const closeDesignModal = () => {
  572. designModal.value = false
  573. setInitDesignForm()
  574. }
  575. //插入特殊字符
  576. const specialModal = ref(false)
  577. const specialModalLoading = ref(false)
  578. const specialModalShow = () => {
  579. specialFormValue.value = ''
  580. specialModalLoading.value = false
  581. specialModal.value = true
  582. }
  583. //监听特殊符号输入框的内容
  584. const specialFormValue = ref('')
  585. const specialDiaolgChange = (val) => {
  586. specialFormValue.value = val
  587. }
  588. //确认插入
  589. const specialRef = ref(null)
  590. const specialNodeClick = async () => {
  591. specialModalLoading.value = true
  592. const itemNode = tableFormItemNode.value
  593. const {KeyName, pkeyId} = itemNode
  594. try {
  595. const refs = await getFormRef(pkeyId)
  596. const itemFormData = refs?.getFormData()
  597. const {code, val, posVal} = await specialRef.value?.getSpecialNode(itemNode, itemFormData[KeyName])
  598. if (code === 200 && val) {
  599. itemFormData[KeyName] = val
  600. refs?.setFormData(itemFormData)
  601. specialModalLoading.value = false
  602. specialModal.value = false
  603. await nextTick(() => {
  604. setPosRange(KeyName, posVal)
  605. })
  606. } else {
  607. specialModalLoading.value = false
  608. }
  609. } catch (e) {
  610. specialModalLoading.value = false
  611. }
  612. }
  613. //关闭插入特殊字符
  614. const specialModalClose = () => {
  615. specialModalLoading.value = false
  616. specialModal.value = false
  617. }
  618. //关联试验数据
  619. const testModal = ref(false)
  620. const testModalLoading = ref(false)
  621. //关联试验数据被点击
  622. const itinsertTableId = ref('')
  623. const itinsertTreeId = ref('')
  624. const testTableRowName = ({row, treeId}) => {
  625. itinsertTableId.value = row.id
  626. itinsertTreeId.value = treeId
  627. insertDataLoading.value = false
  628. insertDataShow.value = true
  629. }
  630. //关闭弹窗
  631. const testModalClose = () => {
  632. testModal.value = false
  633. testModalLoading.value = false
  634. }
  635. //选择要插入的实验数据
  636. const insertDataShow = ref(false);
  637. const insertDataLoading = ref(false);
  638. //确定关联试验数据数据
  639. const insertDataRef = ref(null)
  640. const submitinsertData = async () => {
  641. insertDataLoading.value = true
  642. const itemNode = tableFormItemNode.value
  643. const {KeyName, pkeyId} = itemNode
  644. try {
  645. const refs = await getFormRef(pkeyId)
  646. const itemFormData = refs?.getFormData()
  647. const {code, val, posVal} = await insertDataRef.value?.submitinsertData(itemNode, itemFormData[KeyName])
  648. if (code === 200 && val) {
  649. itemFormData[KeyName] = val
  650. refs?.setFormData(itemFormData)
  651. insertDataLoading.value = false
  652. insertDataShow.value = false
  653. testModal.value = false
  654. await nextTick(() => {
  655. setPosRange(KeyName, posVal)
  656. })
  657. }
  658. } catch {
  659. insertDataLoading.value = false
  660. }
  661. }
  662. //取消关联数据
  663. const cancelinsertData = async () => {
  664. insertDataShow.value = false
  665. insertDataLoading.value = false
  666. }
  667. //关联试验文件
  668. const fileModal = ref(false)
  669. const testFileRefs = ref(null)
  670. //确认关联文件
  671. const fileModalLoading = ref(false)
  672. const savefileModal = async () => {
  673. fileModalLoading.value = true
  674. await testFileRefs.value?.savefileSubmit()
  675. fileModalLoading.value = false
  676. fileModal.value = false
  677. }
  678. //关闭弹窗
  679. const fileModalClose = () => {
  680. fileModal.value = false
  681. fileModalLoading.value = false
  682. }
  683. //公式参数配置
  684. const formulaModal = ref(false)
  685. const formulaRefs = ref(null)
  686. //保存
  687. const formulaModalLoading = ref(false)
  688. const formulaSaveClick = async () => {
  689. formulaModalLoading.value = true
  690. await formulaRefs.value?.panelSave()
  691. formulaModalLoading.value = false
  692. formulaModal.value = false
  693. }
  694. //关闭
  695. const formulaModalClose = () => {
  696. formulaModal.value = false
  697. formulaModalLoading.value = false
  698. }
  699. //窗口化
  700. const DragModalTableForm = ref([])
  701. const DragModalHeight = ref(600)
  702. const windowClick = async (item, indexs) => {
  703. const list = deepClone(DragModalTableForm.value)
  704. let index = arrIndex(list, 'pkeyId', item.pkeyId)
  705. if (!item.isWindow) {
  706. const formSize = getTableFormSize(item?.pkeyId)
  707. const newTableForm = {
  708. ...setInitDragModalTableForm(item, indexs),
  709. ...formSize
  710. }
  711. await setChangeFormDatas(item?.pkeyId, 'window')
  712. item.isWindow = true
  713. //处理表单的ref
  714. await setSpliceItemRefs(item)
  715. //弹窗表单的排序
  716. if (index === -1) {
  717. list.push(newTableForm)
  718. } else if (index !== list.length - 1) {
  719. //检查是否在最上层,不在则置顶,可以解决多次点击时,频繁更改全局状态的问题
  720. list.splice(index, 1)
  721. list.push(newTableForm)
  722. }
  723. DragModalTableForm.value = list
  724. ActiveKey.value = ''
  725. } else {
  726. await setChangeFormDatas(item?.pkeyId, 'collapse')
  727. //处理表单的ref
  728. await setSpliceItemRefs(item)
  729. if (index !== -1) {
  730. list.splice(index, 1)
  731. DragModalTableForm.value = list
  732. }
  733. item.isWindow = false
  734. }
  735. }
  736. //初始拖动表单的内容
  737. const setInitDragModalTableForm = (item, index) => {
  738. return {
  739. projectId: projectId.value,
  740. contractId: contract_id.value,
  741. wbsTempId: wbsTemp_id.value,
  742. tenantId: tenant_id.value,
  743. wbsType: wbs_type.value,
  744. classify: classifys.value,
  745. treeId: treeId.value,
  746. pkeyId: item.pkeyId,
  747. height: '100%',
  748. width: '100%',
  749. title: item.nodeName,
  750. isShow: true,
  751. index: index,
  752. item: item
  753. }
  754. }
  755. //关闭窗口
  756. const TableFormClose = async ({pkeyId, index}, indexs) => {
  757. const list = deepClone(DragModalTableForm.value)
  758. //取表单的数据
  759. await setChangeFormDatas(pkeyId, 'collapse')
  760. //关闭窗口
  761. list.splice(indexs, 1)
  762. DragModalTableForm.value = list
  763. listDatas.value[index].isWindow = false
  764. }
  765. const dragNodeMoreMenu = [
  766. {key: 'save', icon: 'save-2', name: '保存'},
  767. {key: 'preview', icon: 'eye', name: '预览'},
  768. ]
  769. //还原窗口
  770. const closeIconTap = async (event, item, indexs) => {
  771. const {index, pkeyId} = item
  772. let KeyId = `item-${index}-${pkeyId}`
  773. await TableFormClose(item, indexs)
  774. ActiveKey.value = KeyId
  775. }
  776. //菜单被点击
  777. const dragNodeMoreMenuTap = ({key}, items) => {
  778. const {item} = items
  779. if (key === 'save') {
  780. if (item?.isTableForm) {
  781. tableFormSaveClick(item, items)
  782. } else {
  783. window.$message.warning('此表单暂无数据和文件')
  784. }
  785. } else if (key === 'preview') {
  786. if (item['isBussShow'] === 2 || item['isTabPdf'] === 1 || item['pdfUrl'] === '') {
  787. window.$message.warning('此表单暂无可预览文件')
  788. } else {
  789. previewClick(item, items)
  790. }
  791. }
  792. }
  793. //删除本表
  794. const tableFormDelLoading = ref(false)
  795. const delClick = async ({pkeyId}) => {
  796. if (pkeyId) {
  797. if (isStatus.value !== 3) {
  798. tableFormDelLoading.value = true
  799. const {error, code} = await wbsApi.removeBussTabInfo({
  800. pkeyid: pkeyId,
  801. classify: classifys.value,
  802. })
  803. tableFormDelLoading.value = false
  804. if (!error && code === 200) {
  805. window?.$message?.success('操作成功')
  806. //判断是否存在窗口,如果存在,就删除窗口
  807. delWindowRefs(pkeyId)
  808. renewData()
  809. }
  810. } else {
  811. window?.$message?.warning('已上报的资料,不允许删除')
  812. }
  813. } else {
  814. window?.$message?.warning('pkeyId为空')
  815. }
  816. }
  817. //复制本表相关
  818. const showcopyModal=ref(false)
  819. const copyRefs=ref(null)
  820. const copyModalClose=()=>{
  821. // copyModal.value=false
  822. }
  823. const isOwntype=ref('1')
  824. const changeType=(type)=>{
  825. isOwntype.value=type
  826. console.log( isOwntype.value,' isOwntype.value');
  827. }
  828. const copySaveClick=async()=>{
  829. //本节点复制
  830. if(isOwntype.value==='2'){
  831. const {pkeyId, isTableRender, isTableForm} = copyItems.value
  832. if (pkeyId) {
  833. if (isStatus.value !== 3) {
  834. if (!isTableRender) {
  835. await copeBussTab(pkeyId)
  836. } else if (!isTableForm) {
  837. window?.$message?.warning('暂无表单数据')
  838. } else if (isTableRender) {
  839. copyClickLoading.value = true
  840. const isSave = await saveExcelBussData(items, null, false)
  841. if (isSave) {
  842. await copeBussTab(pkeyId)
  843. } else {
  844. copyClickLoading.value = false
  845. window?.$message?.warning('复制本表操作失败')
  846. }
  847. } else {
  848. window?.$message?.warning(`数据异常了, isRenderTableForm: ${isTableRender}, isTableForm: ${isTableForm}, pkeyIds:${pkeyId}`)
  849. }
  850. } else {
  851. window?.$message?.warning('已上报的资料,不允许复制')
  852. }
  853. } else {
  854. window?.$message?.warning('pkeyId为空')
  855. }
  856. }else{
  857. window?.$message?.warning('暂无相关接口')
  858. }
  859. }
  860. //复制本表
  861. const copyClickModalLoading = ref(false)
  862. const copyClickLoading = ref(false)
  863. const copyClick = async (items) => {
  864. const {pkeyId, isTableRender, isTableForm} = items
  865. if (pkeyId) {
  866. if (isStatus.value !== 3) {
  867. if (!isTableRender) {
  868. await copeBussTab(pkeyId)
  869. } else if (!isTableForm) {
  870. window?.$message?.warning('暂无表单数据')
  871. } else if (isTableRender) {
  872. copyClickLoading.value = true
  873. const isSave = await saveExcelBussData(items, null, false)
  874. if (isSave) {
  875. await copeBussTab(pkeyId)
  876. } else {
  877. copyClickLoading.value = false
  878. window?.$message?.warning('复制本表操作失败')
  879. }
  880. } else {
  881. window?.$message?.warning(`数据异常了, isRenderTableForm: ${isTableRender}, isTableForm: ${isTableForm}, pkeyIds:${pkeyId}`)
  882. }
  883. } else {
  884. window?.$message?.warning('已上报的资料,不允许复制')
  885. }
  886. } else {
  887. window?.$message?.warning('pkeyId为空')
  888. }
  889. }
  890. const copyItems=ref([])
  891. //跨节点复制弹窗
  892. // const copyClick = (items) => {
  893. // showcopyModal.value=true
  894. // copyItems.value=items
  895. // }
  896. //复制表的请求
  897. const copeBussTab = async (pkeyId) => {
  898. copyClickLoading.value = true
  899. const {error, code} = await wbsApi.copeBussTab({
  900. pkeyId: pkeyId
  901. })
  902. copyClickLoading.value = false
  903. if (!error && code === 200) {
  904. window?.$message?.success('操作成功')
  905. renewData()
  906. }
  907. }
  908. //隐藏本表
  909. const tableFormHideLoading = ref(false)
  910. const hideClick = async ({pkeyId, isBussShow}) => {
  911. if (pkeyId) {
  912. if (isStatus.value !== 3) {
  913. tableFormHideLoading.value = true
  914. const bussShow = isBussShow === 2 ? 1 : 2 //状态(1显示 2隐藏)
  915. const {error, code} = await wbsApi.showBussTab({
  916. pkeyId: pkeyId,
  917. status: bussShow
  918. })
  919. tableFormHideLoading.value = false
  920. if (!error && code === 200) {
  921. window?.$message?.success('操作成功')
  922. if (bussShow === 2) {
  923. //判断是否存在窗口,如果存在,就删除窗口
  924. delWindowRefs(pkeyId)
  925. }
  926. renewData()
  927. }
  928. } else {
  929. window?.$message?.warning('已上报的资料,不允许隐藏')
  930. }
  931. } else {
  932. window?.$message?.warning('pkeyId为空')
  933. }
  934. }
  935. //预览本表
  936. const tableFormPreviewLoading = ref(false)
  937. const previewClick = async (item, dragItem = null) => {
  938. tableFormPreviewLoading.value = true
  939. await getBussPdfInfo(item, dragItem)
  940. tableFormPreviewLoading.value = false
  941. }
  942. //上传变量
  943. const uploadModal = ref(false)
  944. const fileListData = ref([]);
  945. const uploadData = ref({})
  946. //上传附件
  947. const uploadClick = (items, index) => {
  948. const {pkeyId, isTableForm, isTableRender} = items
  949. const keyName = `item-${index}-${pkeyId}`
  950. if (pkeyId) {
  951. if (isStatus.value !== 3 && isTableForm) {
  952. uploadModal.value = true
  953. uploadData.value = {
  954. projectId: projectId.value,
  955. contractId: contract_id.value,
  956. classify: classifys.value,
  957. pkeyId: pkeyId,
  958. nodeId: treeId.value
  959. }
  960. //获取文件列表
  961. getBussFileList(pkeyId)
  962. } else if (!isTableRender) {
  963. CollapseChange([keyName])
  964. window?.$message?.warning('请再次点击上传')
  965. } else if (!isTableForm) {
  966. window?.$message?.warning('暂无表单数据')
  967. } else {
  968. window?.$message?.warning('已上报的资料,不允许上传')
  969. }
  970. } else {
  971. window?.$message?.warning('pkeyId为空')
  972. }
  973. }
  974. //获取文件列表
  975. const getBussFileList = async (pkeyId) => {
  976. const {error, code, data} = await wbsApi.getBussFileList({
  977. pkeyid: pkeyId
  978. })
  979. if (!error && code === 200) {
  980. fileListData.value = getArrValue(data)
  981. } else {
  982. fileListData.value = []
  983. }
  984. }
  985. //上传文件
  986. const uploadChange = async ({type}) => {
  987. if (type === 'success') {
  988. uploadModal.value = false
  989. renewData()
  990. } else if (type === 'del') {
  991. renewData()
  992. }
  993. }
  994. //关闭上传附件窗口
  995. const uploadModalClose = () => {
  996. uploadModal.value = false
  997. }
  998. //单个保存
  999. const tableFormSaveLoading = ref(false)
  1000. const tableFormSaveClick = async (item, dragItem = null) => {
  1001. if (isStatus.value !== 3) {
  1002. tableFormSaveLoading.value = true
  1003. const isSave = await saveExcelBussData(item, dragItem)
  1004. if (isSave) {
  1005. await getBussPdfInfo(item, dragItem)
  1006. tableFormSaveLoading.value = false
  1007. renewData()
  1008. } else {
  1009. tableFormSaveLoading.value = false
  1010. }
  1011. } else {
  1012. window?.$message?.warning('已上报的资料,不允许保存。')
  1013. }
  1014. }
  1015. //保存表单数据
  1016. const saveExcelBussData = async ({pkeyId}, dragItem = null, showTip = true) => {
  1017. setDragModalLoading(dragItem, '保存中...', true)
  1018. const refs = await getFormRef(pkeyId)
  1019. const isRegExp = await refs?.isFormRegExp()
  1020. if (isRegExp) {
  1021. const formData = refs?.getFormData()
  1022. const {error, code} = await wbsApi.saveExcelBussData(formData)
  1023. setDragModalLoading(dragItem)
  1024. if (!error && code === 200) {
  1025. if (showTip) {
  1026. window?.$message?.success('保存成功')
  1027. }
  1028. return true
  1029. } else {
  1030. return false
  1031. }
  1032. } else {
  1033. setDragModalLoading(dragItem)
  1034. return false
  1035. }
  1036. }
  1037. //预览PDF
  1038. const getBussPdfInfo = async ({pkeyId}, dragItem = null, showTip = true) => {
  1039. setDragModalLoading(dragItem, '获取pdf中...', true)
  1040. const {error, code, data} = await wbsApi.getBussPdfInfo({
  1041. pkeyId: pkeyId
  1042. }, false)
  1043. setDragModalLoading(dragItem)
  1044. if (!error && code === 200) {
  1045. if (data) {
  1046. window.open(data, '_blank')
  1047. } else if (showTip) {
  1048. window?.$message?.warning('PDF错误')
  1049. }
  1050. } else {
  1051. if (showTip) {
  1052. window?.$message?.warning(data.msg || '获取PDF失败')
  1053. }
  1054. }
  1055. }
  1056. //通知数据更新
  1057. const renewData = () => {
  1058. emit('renew')
  1059. ActiveKey.value = ''
  1060. }
  1061. //设置表单的加载状态
  1062. const setDragModalLoading = (dragItem, text = '保存中...', show = false) => {
  1063. if (dragItem && show) {
  1064. dragItem.loading = true
  1065. dragItem.loadingText = text
  1066. }
  1067. if (dragItem && !show) {
  1068. dragItem.loading = false
  1069. }
  1070. }
  1071. //获取表单的ref
  1072. const getFormRef = async (pkeyId) => {
  1073. const itemRef = itemRefs.value
  1074. const index = arrIndex(itemRef, 'pkeyId', pkeyId)
  1075. return itemRef[index].ref
  1076. }
  1077. //删除打开的窗口
  1078. const delWindowRefs = (pkeyId) => {
  1079. //判断是否存在窗口,如果存在,就删除窗口
  1080. const list = DragModalTableForm.value
  1081. const index = arrIndex(list, 'pkeyId', pkeyId)
  1082. if (index !== -1) {
  1083. list.splice(index, 1)
  1084. DragModalTableForm.value = list
  1085. }
  1086. }
  1087. //计算展开高度和滚动位置
  1088. const getOffsetTop = (key = '') => {
  1089. if (key) {
  1090. const dom = document.getElementById(key)
  1091. if (!draw_type.value) {
  1092. if (dom?.offsetTop >= 583 && key) {
  1093. emit('offsetTop', dom?.offsetTop - 583)
  1094. } else {
  1095. emit('offsetTop', dom?.offsetTop)
  1096. }
  1097. } else {
  1098. if (dom.offsetTop >= 424 && key) {
  1099. emit('offsetTop', dom?.offsetTop - 424)
  1100. } else {
  1101. emit('offsetTop', dom?.offsetTop)
  1102. }
  1103. }
  1104. } else {
  1105. emit('offsetTop', 0)
  1106. }
  1107. ActiveKey.value = key
  1108. }
  1109. //获取折叠面板的索引
  1110. const getCollapseItemIndex = (name) => {
  1111. const keys = name.split('-')
  1112. if (keys.length > 0) {
  1113. return keys[1]
  1114. } else {
  1115. return -1
  1116. }
  1117. }
  1118. //获取表单的大小
  1119. const getTableFormSize = (pkeyId) => {
  1120. let formId = `table-form-${pkeyId}`
  1121. try {
  1122. const {clientWidth, clientHeight} = document.getElementById(formId).children[0]
  1123. return {
  1124. width: (clientWidth + 40) + 'px',
  1125. height: (clientHeight + 80) + 'px'
  1126. }
  1127. } catch {
  1128. return {
  1129. width: '100%',
  1130. height: '100%'
  1131. }
  1132. }
  1133. }
  1134. //转字符串
  1135. const setToString = (val) => {
  1136. return val ? val + '' : ''
  1137. }
  1138. //表单被点击
  1139. const presentId = ref('')
  1140. const excelTableFormClick = (key) => {
  1141. presentId.value = key
  1142. }
  1143. //缓存被激活时
  1144. onActivated(() => {
  1145. setMountOnEventKey()
  1146. })
  1147. //缓存时被移除
  1148. onDeactivated(() => {
  1149. HTableForm.unmountEventKey()
  1150. })
  1151. //页面被卸载
  1152. onUnmounted(() => {
  1153. HTableForm.unmountEventKey()
  1154. })
  1155. const setMountOnEventKey = () => {
  1156. HTableForm.setOnEventKey({
  1157. //按下ctrl键 或 control 键
  1158. onCtrlDown: async () => {
  1159. //window.$HcLog('全局按键', '按下ctrl键 或 control 键')
  1160. const refs = await setOnFuncFormRef()
  1161. refs?.setIsCtrlKey(true)
  1162. },
  1163. //按下复制快捷键
  1164. onCtrlDownC: async (event) => {
  1165. //window.$HcLog('全局按键', '按下复制快捷键')
  1166. const refs = await setOnFuncFormRef()
  1167. refs?.setCopyKeyList(event)
  1168. },
  1169. //按下粘贴快捷键
  1170. onCtrlDownV: async (event) => {
  1171. //window.$HcLog('全局按键', '按下粘贴快捷键')
  1172. const refs = await setOnFuncFormRef()
  1173. await refs?.setPasteKeyList(event)
  1174. },
  1175. //放开ctrl键 或 control 键
  1176. onCtrlUp: async () => {
  1177. //window.$HcLog('全局按键', '放开ctrl键 或 control 键')
  1178. const refs = await setOnFuncFormRef()
  1179. refs?.setIsCtrlKey(false)
  1180. },
  1181. })
  1182. }
  1183. //获取表单的ref
  1184. const setOnFuncFormRef = async () => {
  1185. const pkeyId = presentId.value
  1186. if (!isNullES(pkeyId)) {
  1187. return await getFormRef(pkeyId)
  1188. } else {
  1189. return;
  1190. }
  1191. }
  1192. //获取已渲染的表单
  1193. const getFilterFormData = async () => {
  1194. const formArr = formDataList.value;
  1195. return formArr.filter((item) => {
  1196. return (item.pkeyId ?? '') !== '' && item.isCollapseLoad;
  1197. })
  1198. }
  1199. //获取表单数据
  1200. const getFormData = async () => {
  1201. const formArr = await getFilterFormData();
  1202. //获取表单数据
  1203. let newArr = [];
  1204. for (let i = 0; i < formArr.length; i++) {
  1205. const pkeyId = formArr[i].pkeyId
  1206. const refs = await getFormRef(pkeyId)
  1207. const form = refs?.getFormData()
  1208. newArr.push({...form})
  1209. }
  1210. console.log('表单数据', newArr)
  1211. return newArr
  1212. }
  1213. //获取表单效验数据
  1214. const getFormRegExpJson = async () => {
  1215. const formArr = await getFilterFormData();
  1216. const list = listDatas.value
  1217. //获取表单数据
  1218. let formRegExpJson = {};
  1219. for (let i = 0; i < formArr.length; i++) {
  1220. const pkeyId = formArr[i].pkeyId
  1221. const refs = await getFormRef(pkeyId)
  1222. const regExp = refs?.getRegExpJson()
  1223. const nodeName = refs?.getNodeName()
  1224. if (getObjVal(regExp)) {
  1225. const index = arrIndex(list, 'pkeyId', pkeyId)
  1226. formRegExpJson[pkeyId] = {
  1227. ...regExp,
  1228. itemId: `item-${index}-${pkeyId}`,
  1229. nodeName: nodeName
  1230. }
  1231. }
  1232. }
  1233. return formRegExpJson
  1234. }
  1235. //获取当前展开项
  1236. const getActiveKey = () => {
  1237. return ActiveKey.value;
  1238. }
  1239. //设置当前展开项
  1240. const setActiveKey = (key) => {
  1241. return ActiveKey.value = key;
  1242. }
  1243. // 暴露出去
  1244. defineExpose({
  1245. getFormData,
  1246. getFormRegExpJson,
  1247. getActiveKey,
  1248. setActiveKey
  1249. })
  1250. </script>
  1251. <style lang="scss" scoped>
  1252. @import "./index.scss";
  1253. </style>
  1254. <style lang="scss">
  1255. @import "./style.scss";
  1256. </style>