index.vue 55 KB

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