index.vue 57 KB

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