query.vue 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366
  1. <template>
  2. <div class="hc-layout-box">
  3. <div
  4. id="wbs-left-tree" :style="`width:${isWbsTreeShow ? leftWidth : 0}px; ${isWbsTreeShow ? '' : 'display: none'}`"
  5. class="hc-layout-left-box bg-white" :class="[isWbsTreeShow ? 'show' : '']"
  6. >
  7. <div class="hc-project-box">
  8. <div class="hc-project-icon-box">
  9. <HcIcon name="stack" />
  10. </div>
  11. <div class="project-name-box ml-2">
  12. <div class="project-alias">{{ projectInfo?.projectName }}</div>
  13. </div>
  14. </div>
  15. <div class="hc-tree-box">
  16. <div class="hc-search-tree-val">
  17. <el-input v-model="searchTreeVal" clearable block placeholder="请输入名称关键词检索" @keyup="searchTreeKeyUp">
  18. <template #suffix>
  19. <HcIcon name="search-2" ui="text-xl iscusor" @click="searchTreeClick" />
  20. </template>
  21. </el-input>
  22. </div>
  23. <div v-if="isShowLeft" id="hc-tree-scrollbar" v-loading="treeLoading" class="hc-tree-scrollbar" element-loading-text="获取数据中...">
  24. <el-scrollbar v-show="isSearchTree" class="scroll-bar-right-16">
  25. <HcDataTree
  26. :datas="searchTreeData"
  27. is-counts
  28. is-type
  29. :auto-expand-keys="treeAutoExpandKeys"
  30. default-expand-all
  31. @node-tap="wbsElTreeClick"
  32. />
  33. </el-scrollbar>
  34. <el-scrollbar v-show="!isSearchTree" class="scroll-bar-right-16">
  35. <HcLazyTree
  36. ref="wbstree"
  37. :auto-expand-keys="treeAutoExpandKeys"
  38. is-counts
  39. is-type
  40. @load="treeLoadNode"
  41. @node-tap="wbsElTreeClick"
  42. />
  43. </el-scrollbar>
  44. </div>
  45. </div>
  46. <div class="hc-tree-foot-tip-box">
  47. <div class="dot-view green">已审批</div>
  48. <div class="dot-view black">未填报</div>
  49. <div class="dot-view orange">已填报-待审批</div>
  50. <div class="dot-view blue">已填报-未上报</div>
  51. <div class="dot-view red">已隐藏</div>
  52. </div>
  53. <!-- 左右拖动 -->
  54. <div class="horizontal-drag-line" @mousedown="onmousedown" />
  55. </div>
  56. <div class="hc-layout-content-box">
  57. <hc-body padding="0px">
  58. <!---展开收缩树 -->
  59. <div class="hc-expansion-contraction-tree" @click="setWbsTreeShow">
  60. <HcIcon v-show="isWbsTreeShow" name="arrow-left-s" />
  61. <HcIcon v-show="!isWbsTreeShow" name="arrow-right-s" />
  62. </div>
  63. <HcNewCard padding>
  64. <template #header>
  65. <HcTooltip keys="query_report">
  66. <el-button :disabled="tableCheckedKeys.length <= 0" :loading="reportLoading" hc-btn color="#FF976A" style="color: white;" @click="reportModalClick">
  67. <HcIcon name="send-plane-2" />
  68. <span>上报</span>
  69. </el-button>
  70. </HcTooltip>
  71. <HcTooltip keys="query_download">
  72. <el-button
  73. :disabled="isCanDown || tableCheckedKeys.length <= 0" :loading="downloadLoading" hc-btn
  74. color="#A16222" @click="batchDownload"
  75. >
  76. <HcIcon name="download" />
  77. <span>下载</span>
  78. </el-button>
  79. </HcTooltip>
  80. <HcTooltip keys="query_print">
  81. <el-button
  82. :disabled="isCanDown || tableCheckedKeys.length <= 0" :loading="printLoading" hc-btn
  83. color="#A16222" @click="batchPrint"
  84. >
  85. <HcIcon name="printer" />
  86. <span>打印</span>
  87. </el-button>
  88. </HcTooltip>
  89. <HcTooltip keys="query_abolish">
  90. <el-button :disabled="tableCheckedKeys.length <= 0" hc-btn color="#567722" @click="batchAbolishClick">
  91. <HcIcon name="delete-bin-3" />
  92. <span>废除</span>
  93. </el-button>
  94. </HcTooltip>
  95. <HcTooltip keys="query_local_attestation">
  96. <el-button
  97. :disabled="tableCheckedKeys.length <= 0" :loading="localLoading" hc-btn
  98. color="#e03997" @click="batchLocal"
  99. >
  100. <HcIcon name="folder-download" />
  101. <span>本地验签</span>
  102. </el-button>
  103. </HcTooltip>
  104. <HcTooltip keys="query_online_attestation">
  105. <el-button
  106. :disabled="tableCheckedKeys.length <= 0" :loading="onlineLoading" hc-btn
  107. color="#e03997" @click="batchOnline"
  108. >
  109. <HcIcon name="cloud" />
  110. <span>在线验签</span>
  111. </el-button>
  112. </HcTooltip>
  113. <el-button :disabled="tableCheckedKeys.length <= 0" :loading="signLoading" hc-btn type="primary" @click="resignClick"> <HcIcon name="repeat" />re-sign</el-button>
  114. <HcTooltip keys="save_agin">
  115. <el-button
  116. :disabled="tableCheckedKeys.length <= 0" :loading="saveAginLoading" hc-btn
  117. color="#e03997" @click="saveAginClick"
  118. >
  119. <HcIcon name="save" />
  120. <span>save-again</span>
  121. </el-button>
  122. </HcTooltip>
  123. <HcTooltip keys="data-query-resign-title">
  124. <el-button
  125. :disabled="tableCheckedKeys.length <= 0"
  126. hc-btn
  127. color="#3F9EFF" style="color: white;" :loading="ruleModalSaveLoad" @click="resignTitleClick"
  128. >
  129. <HcIcon name="restart" />
  130. <span>重置题名</span>
  131. </el-button>
  132. </HcTooltip>
  133. </template>
  134. <template #search>
  135. <div class="flex items-center">
  136. <div class="w-40">
  137. <el-select v-model="searchForm.taskStatus" clearable placeholder="流程状态">
  138. <el-option
  139. v-for="item in processStatusData" :key="item.value"
  140. :label="item.dictValue" :value="item.dictKey"
  141. />
  142. </el-select>
  143. </div>
  144. <div class="ml-2 w-32">
  145. <el-select v-model="searchForm.majorDateType" clearable placeholder="资料类型">
  146. <el-option
  147. v-for="item in majorDataTypeOptions"
  148. :key="item.value"
  149. :label="item.label"
  150. :value="item.value"
  151. />
  152. </el-select>
  153. </div>
  154. <div class="ml-2 w-40">
  155. <el-select v-model="searchForm.fileUserIdAndName" clearable placeholder="填报人">
  156. <el-option
  157. v-for="item in reportingPersonData" :key="item.value" :label="item.label"
  158. :value="item.value"
  159. />
  160. </el-select>
  161. </div>
  162. <div class="ml-2 w-40">
  163. <el-select v-model="searchForm.sourceType" clearable placeholder="文件类型">
  164. <el-option
  165. v-for="item in fileTypeData" :key="item.value" :label="item.dictValue"
  166. :value="item.dictKey"
  167. />
  168. </el-select>
  169. </div>
  170. <div class="ml-2 w-40">
  171. <el-select v-model="searchForm.waitingUserStatus" clearable placeholder="审批人状态">
  172. <el-option :value="1" label="未签字" />
  173. <el-option :value="2" label="已签字" />
  174. <el-option :value="3" label="已废除" />
  175. <el-option :value="999" label="签字异常" />
  176. </el-select>
  177. </div>
  178. <div class="ml-2 w-64">
  179. <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate" />
  180. </div>
  181. <div class="ml-2 w-60">
  182. <el-input
  183. v-model="searchForm.queryValue" clearable placeholder="请输入名称关键词检索"
  184. @keyup="keyUpEvent"
  185. />
  186. </div>
  187. <div class="ml-2">
  188. <el-button type="primary" @click="searchClick">
  189. <HcIcon name="search-2" />
  190. <span>搜索</span>
  191. </el-button>
  192. </div>
  193. </div>
  194. </template>
  195. <template #extra>
  196. <template v-if="contractInfo?.contractType === 2 || contractInfo?.contractType === 3">
  197. <HcNewSwitch :datas="contractTypeTab" :keys="contractTypeTabKey" size="default" @change="contractTypeTabChange" />
  198. </template>
  199. </template>
  200. <HcTable
  201. ref="tableListRef" :column="tableListColumn" :datas="tableListData" :loading="tableLoading"
  202. is-new :index-style="{ width: 60 }" is-check :check-style="{ width: 29 }"
  203. @selection-change="tableSelectionChange"
  204. >
  205. <template #name="{ row }">
  206. <span v-loading="row?.bussPreviewLoading" class="text-link" @click="tableRowName(row)">{{ row?.name }}</span>
  207. </template>
  208. <template #waitingUserList="{ row }">
  209. <template v-for="item in row.waitingUserList">
  210. <el-tag
  211. v-if="item.waitingUserName"
  212. :key="item.waitingUserName"
  213. :type="`${item.status === 2 ? 'success' : item.status === 3 ? 'warning' : item.status === 999 ? 'danger' : 'info'}`"
  214. class="mx-1" effect="dark"
  215. >
  216. {{ item.waitingUserName }}
  217. </el-tag>
  218. </template>
  219. </template>
  220. </HcTable>
  221. <template #action>
  222. <div class="lr-dialog-footer">
  223. <div class="left">
  224. <span class="text-success">任务人员中:</span>
  225. <el-tag class="mx-1" effect="dark" type="info">未签字</el-tag>
  226. <el-tag class="mx-1" effect="dark" type="success">已签字</el-tag>
  227. <el-tag class="mx-1" effect="dark" type="warning">已废除</el-tag>
  228. <el-tag class="mx-1" effect="dark" type="danger">签字异常</el-tag>
  229. </div>
  230. <div class="right">
  231. <HcPages :pages="searchForm" @change="pageChange" />
  232. </div>
  233. </div>
  234. </template>
  235. </HcNewCard>
  236. </hc-body>
  237. </div>
  238. <!-- 批量上报审批 -->
  239. <HcReportModal
  240. :ids="reportIds"
  241. :node-id="primaryKeyId"
  242. :table-owner="contractTypeTabKey"
  243. :classify-type="classType"
  244. :contract-id="contractId"
  245. :flow-contract-id="nodeDataInfo?.contractId"
  246. :datas="reportDatas"
  247. :project-id="projectId"
  248. :show="showReportModal"
  249. :task-name="reportTaskName"
  250. :type-data="reportTypeData"
  251. :report-arr="reportArr"
  252. type="query"
  253. is-datas
  254. title="批量上报审批"
  255. url="informationWriteQuery/batchTask"
  256. @finish="showReportFinish"
  257. @hide="showReportModal = false"
  258. @tag-close="reportTaskTagClose"
  259. />
  260. <!-- 在线验签 -->
  261. <hc-new-drawer v-model="isOnlineVerifyDrawer" modal-class="hc-online-verify-drawer" to-id="app" @close="onlineVerifyDrawerClose">
  262. <hc-new-card>
  263. <template #header>
  264. <div class="online-verify-title">{{ onlineTitle }}</div>
  265. </template>
  266. <template #extra>
  267. <div class="online-verify-icon" @click="onlineVerifyDrawerClose">
  268. <HcIcon name="close-circle" />
  269. <span class="ml-1">关闭</span>
  270. </div>
  271. </template>
  272. <hc-body split padding="0px" :options="onlineVerifyOptions">
  273. <template #left>
  274. <hc-new-card>
  275. <HcPdf :src="onlineVerifyData.pdfUrl" />
  276. </hc-new-card>
  277. </template>
  278. <hc-new-card>
  279. <HcTable :column="cscTableColumn" :datas="cscTableData" is-new :index-style="{ width: 60 }" />
  280. </hc-new-card>
  281. </hc-body>
  282. </hc-new-card>
  283. </hc-new-drawer>
  284. <!-- 一键重签弹窗 -->
  285. <hc-new-dialog v-model="resignModal" title="一键重签" widths="38rem" :loading="signLoading" @close="cancelresign" @save="signClick">
  286. <div>
  287. 是否重新生成pdf:
  288. <el-radio-group v-model="resignModalRadio">
  289. <el-radio :value="0">否</el-radio>
  290. <el-radio :value="1">是</el-radio>
  291. </el-radio-group>
  292. </div>
  293. </hc-new-dialog>
  294. <!-- 重置文件题名弹窗 -->
  295. <hc-new-dialog v-model="resignTitleModal" title="重置题名" widths="38rem" :loading="resignTitleSaveLoad" @save="resignTitleSave">
  296. <div>
  297. 是否更改题名规则:
  298. <el-button type="primary" hc-btn size="small" @click="changeRuleClick">规则更改</el-button>
  299. </div>
  300. </hc-new-dialog>
  301. <!-- 规则修改弹窗 -->
  302. <hc-new-dialog v-model="ruleModal" title="更改重置题名题名规则" widths="88rem" :loading="ruleModalSaveLoad" @close="ruleModalClose" @save="ruleModalSave">
  303. <template #header>
  304. <div class="flex flex-col">
  305. <div class="mb-4 text-18px">
  306. <span>更改重置题名题名规则</span>
  307. </div>
  308. <div class="flex justify-between justify-items-center text-orange">
  309. <p>* 单条修改在表单下拉框选择规则,批量修改在右侧选规则点击【设置】统一更新所有规则</p>
  310. <p>* “修改后”仅为展示,【确认】后才会刷新文件题名</p>
  311. </div>
  312. </div>
  313. </template>
  314. <div class="flex items-center justify-between">
  315. <div>批量设置:</div>
  316. <el-select
  317. v-model="setValue"
  318. placeholder="请选择"
  319. multiple
  320. clearable
  321. class="custom-select flex-1"
  322. :popper-append-to-body="false"
  323. >
  324. <el-option
  325. v-for="item in nodeTypeData"
  326. :key="item.value"
  327. :label="item.label"
  328. :value="item.value"
  329. />
  330. </el-select>
  331. <el-button type="primary" hc-btn size="small" class="ml-2" :disabled="setValue.length === 0" @click="batchSetRule">设置</el-button>
  332. </div>
  333. <div style="position: relative; height: 440px" class="mt-2">
  334. <HcTable v-loading="ruleTableLoading" :column="ruleTableColumn" :datas="ruleTableData" :loading="ruleTableLoading">
  335. <template #rule="{ row }">
  336. <div class="flex items-center">
  337. <span class="text-red">*</span>
  338. <el-select
  339. v-model="row.rule"
  340. :class="{ 'error-border': !row.rule || row.rule.length === 0 }"
  341. placeholder="请选择"
  342. multiple
  343. clearable
  344. class="custom-select"
  345. :popper-append-to-body="false"
  346. @change="ruleChange(row)"
  347. >
  348. <el-option
  349. v-for="item in nodeTypeData"
  350. :key="item.value"
  351. :label="item.label"
  352. :value="item.value"
  353. />
  354. </el-select>
  355. </div>
  356. </template>
  357. </HcTable>
  358. </div>
  359. </hc-new-dialog>
  360. </div>
  361. </template>
  362. <script setup>
  363. import { nextTick, onMounted, ref, watch } from 'vue'
  364. import { useAppStore } from '~src/store'
  365. import { getStoreValue, setStoreValue } from '~src/utils/storage'
  366. import { arrToId, arrToKey, downloadBlob, getArrValue, getObjValue, isString } from 'js-fast-way'
  367. import queryApi from '~api/data-fill/query'
  368. import { eVisaTaskCheckApi } from '~api/other'
  369. import { toPdfPage } from '~uti/btn-auth'
  370. import wbsApi from '~api/data-fill/wbs'
  371. import website from '~src/config'
  372. import { getDictionaryData } from '~uti/tools'
  373. import { getDictionary } from '~api/other'
  374. //变量
  375. const useAppState = useAppStore()
  376. const projectId = ref(useAppState.getProjectId)
  377. const contractId = ref(useAppState.getContractId)
  378. const projectInfo = ref(useAppState.getProjectInfo)
  379. const contractInfo = ref(useAppState.getContractInfo)
  380. const isCollapse = ref(useAppState.getCollapse)
  381. const isLayout = ref(useAppState.isLayout)
  382. const isTemplateType = ref(useAppState.contractInfo?.templateType === 2)
  383. //变量
  384. const wbstree = ref(null)
  385. const wbstreeKey = ref(Math.random())
  386. //树搜索
  387. const isSearchTree = ref(false)
  388. const searchTreeHeight = ref()
  389. const searchTreeVal = ref('')
  390. //监听
  391. watch(() => [useAppState.getCollapse, searchTreeVal.value, useAppState.isLayout], ([Collapse, search, isLay]) => {
  392. isCollapse.value = Collapse
  393. isLayout.value = isLay || ''
  394. if (search.length == 0) {
  395. isSearchTree.value = false
  396. }
  397. })
  398. //是否禁用下载打印按钮
  399. const isCanDown = ref(false)
  400. //自动展开缓存
  401. const treeAutoExpandKeys = ref(getStoreValue('wbsTreeExpandKeys') || [])
  402. //渲染完成
  403. onMounted(() => {
  404. getFileUser()
  405. getReportNumber()
  406. getFirstTaskStatus()
  407. getDictBizClassify()
  408. getMajorDataTypeOptions()
  409. isCanDown.value = !website.localModel
  410. })
  411. //获取
  412. const majorDataTypeOptions = ref([])
  413. const getMajorDataTypeOptions = async () => {
  414. majorDataTypeOptions.value = (await getDictionaryData('major_data_type', false)).filter(item => item.value !== 0)
  415. }
  416. const searchTreeData = ref([])
  417. //回车
  418. const treeLoading = ref(true)
  419. const getSearchTreeData = async () => {
  420. treeLoading.value = true
  421. const { error, code, data } = await queryApi.getTreeNodeByQueryValueAndContractId({
  422. contractId: contractId.value,
  423. queryValue: searchTreeVal.value,
  424. tableOwner:contractTypeTabKey.value,
  425. })
  426. //判断状态
  427. if (!error && code === 200) {
  428. let treedata = getArrValue(data)
  429. searchTreeData.value = treedata
  430. treeLoading.value = false
  431. } else {
  432. treeLoading.value = false
  433. searchTreeData.value = []
  434. }
  435. }
  436. //回车
  437. const searchTreeKeyUp = (e) => {
  438. if (e.key === 'Enter') {
  439. searchTreeClick()
  440. }
  441. }
  442. const searchTreeClick = async () => {
  443. if (searchTreeVal.value) {
  444. searchTreeHeight.value = document.getElementById('hc-tree-scrollbar').offsetHeight
  445. isSearchTree.value = true
  446. //treeLoading.value = true
  447. getSearchTreeData().then()
  448. } else {
  449. isSearchTree.value = false
  450. }
  451. }
  452. //树相关的变量
  453. const primaryKeyId = ref('')
  454. const nodeItemInfo = ref({})
  455. const nodeDataInfo = ref({})
  456. //懒加载的数据
  457. const treeLoadNode = async ({ node, item, level }, resolve) => {
  458. let contractIdRelation = '', parentId = '', primaryKeyId = ''
  459. if (level !== 0) {
  460. const nodeData = getObjValue(item)
  461. contractIdRelation = nodeData?.contractIdRelation || ''
  462. parentId = contractIdRelation ? nodeData?.primaryKeyId : nodeData?.id
  463. primaryKeyId = nodeData?.id || ''
  464. }
  465. //获取数据
  466. const { data } = await queryApi.queryWbsTreeData({
  467. contractId: contractId.value || '',
  468. contractIdRelation,
  469. primaryKeyId,
  470. parentId,
  471. // classifyType: contractTypeTabKey.value,
  472. classifyType: classType.value,
  473. tableOwner:contractTypeTabKey.value,
  474. dataTime:new Date(),
  475. })
  476. resolve(getArrValue(data))
  477. treeLoading.value = false
  478. }
  479. //树被点击
  480. const wbsElTreeClick = ({ node, data, keys }) => {
  481. nodeItemInfo.value = node
  482. nodeDataInfo.value = data
  483. primaryKeyId.value = data['primaryKeyId'] || ''
  484. //缓存自动展开
  485. treeAutoExpandKeys.value = keys
  486. setStoreValue('wbsTreeExpandKeys', keys)
  487. //改变搜索表单数据
  488. searchForm.value.wbsId = data['primaryKeyId']
  489. //只有监理、指挥合同段才传contractIdRelation
  490. if (contractInfo.value?.contractType == 2 || contractInfo.value?.contractType == 3) {
  491. searchForm.value.contractIdRelation = data['contractIdRelation']
  492. } else {
  493. searchForm.value.contractIdRelation = ''
  494. }
  495. searchForm.value.current = 1
  496. getFileUser()
  497. getTableData()
  498. }
  499. //搜索条件
  500. const processStatusData = ref([]) //流程状态
  501. const reportingPersonData = ref([]) //填报人
  502. const fileTypeData = ref([]) //文件类型
  503. const reportBatchData = ref([]) //上报批次
  504. //获取所有填报人
  505. const getFileUser = async () => {
  506. const info = nodeDataInfo.value
  507. if (!info || !info?.contractIdRelation) {
  508. window.$message?.warning('请先点击左侧节点')
  509. return
  510. }
  511. const { error, code, data } = await queryApi.getFileUser({
  512. contractId: contractId.value,
  513. contractIdRelation: contractInfo.value?.contractType === 2 ? info?.contractIdRelation : contractId.value,
  514. })
  515. //判断状态
  516. if (!error && code === 200) {
  517. let res = getArrValue(data), userArr = []
  518. res.forEach(item => {
  519. userArr.push({ label: item['userName'], value: `${item['userId']}-${item['userName']}` })
  520. })
  521. reportingPersonData.value = userArr
  522. } else {
  523. reportingPersonData.value = []
  524. }
  525. }
  526. //获取上报批次
  527. const getReportNumber = async () => {
  528. const { error, code, data } = await queryApi.getReportNumber({
  529. contractId: contractId.value,
  530. projectId: projectId.value,
  531. })
  532. //判断状态
  533. if (!error && code === 200) {
  534. reportBatchData.value = getArrValue(data)
  535. } else {
  536. reportBatchData.value = []
  537. }
  538. }
  539. //获取流程状态
  540. const getFirstTaskStatus = async () => {
  541. const { error, code, data } = await queryApi.getFirstTaskStatus()
  542. //判断状态
  543. if (!error && code === 200) {
  544. processStatusData.value = getArrValue(data)
  545. } else {
  546. processStatusData.value = []
  547. }
  548. }
  549. //获取流程状态分类和文件类型分类
  550. const getDictBizClassify = async () => {
  551. const { error, code, data } = await queryApi.getDictBizClassify({
  552. contractId: contractId.value,
  553. code: 'fileType',
  554. })
  555. //判断状态
  556. if (!error && code === 200) {
  557. fileTypeData.value = getArrValue(data)
  558. } else {
  559. fileTypeData.value = []
  560. }
  561. }
  562. //搜索表单
  563. const searchForm = ref({
  564. taskStatus: null, fileUserIdAndName: null, sourceType: null, reportNumber: null, betweenTime: null,
  565. queryValue: null, contractIdRelation: null, wbsId: null, current: 1, size: 20, total: 0, majorDateType:'',
  566. waitingUserStatus:'',
  567. })
  568. //结构类型tab数据和相关处理
  569. // const contractTypeTabKey = ref('1')
  570. const contractTypeTabKey = ref(contractInfo.value?.contractType === 2 ? '2' : '1')
  571. //加载树需要的classType由合同段获取
  572. const classType = ref(contractInfo.value?.contractType === 2 ? '2' : '1')
  573. const contractTypeTab = ref([
  574. { key: '1', name: '施工数据' },
  575. { key: '2', name: '监理数据' },
  576. ])
  577. //是否显示左边树
  578. const isShowLeft = ref(true)
  579. const contractTypeTabChange = (item) => {
  580. contractTypeTabKey.value = item?.key
  581. //重新加载左边树
  582. isShowLeft.value = false
  583. setTimeout(()=>{
  584. isShowLeft.value = true
  585. }, 500)
  586. searchClick()
  587. }
  588. //获取合同段类型
  589. // const getContractTypeKey = () => {
  590. // const { contractType } = contractInfo.value;
  591. // if (contractType === 2 || contractType === 3) {
  592. // return contractTypeTabKey.value ?? '1'
  593. // } else {
  594. // return null
  595. // }
  596. // }
  597. //日期时间被选择
  598. const betweenTime = ref(null)
  599. const betweenTimeUpdate = ({ arr, query }) => {
  600. betweenTime.value = arr
  601. searchForm.value.betweenTime = query
  602. }
  603. //回车搜索
  604. const keyUpEvent = (e) => {
  605. if (e.key === 'Enter') {
  606. searchForm.value.current = 1
  607. if (searchForm.value?.queryValue) {
  608. searchForm.value.queryValue = searchForm.value.queryValue.trim()
  609. }
  610. getTableData()
  611. }
  612. }
  613. //搜索
  614. const searchClick = () => {
  615. searchForm.value.current = 1
  616. if (searchForm.value?.queryValue) {
  617. searchForm.value.queryValue = searchForm.value.queryValue.trim()
  618. }
  619. wbstreeKey.value = Math.random()
  620. getTableData()
  621. // wbstree.value.resetNode().then((red)=>{
  622. // if(red){
  623. // getTableData()
  624. // }
  625. // })
  626. }
  627. //分页被点击
  628. const pageChange = ({ current, size }) => {
  629. searchForm.value.current = current
  630. searchForm.value.size = size
  631. getTableData()
  632. }
  633. //获取数据
  634. const tableListRef = ref(null)
  635. const tableLoading = ref(false)
  636. const tableListColumn = ref([
  637. { key: 'name', name: '文件名称' },
  638. // { key: 'startTime', name: '开始时间', width: 140, align: 'center' },
  639. { key: 'taskStatusStr', name: '流程状态', width: 100, align: 'center' },
  640. { key: 'reportNumber', name: '上报批次', width: 80, align: 'center' },
  641. { key: 'fileUserIdAndName', name: '填报人', width: 190, align: 'center' },
  642. { key: 'waitingUserList', name: '任务人', align: 'center' },
  643. //{ key: 'evisaFailedInfo', name: '电签失败原因' },
  644. ])
  645. const tableListData = ref([])
  646. const getTableData = async () => {
  647. if (searchForm.value.wbsId) {
  648. tableListRef.value?.clearSelection()
  649. tableCheckedKeys.value = []
  650. tableLoading.value = true
  651. // const classifyType = getContractTypeKey();
  652. const { error, code, data, msg } = await queryApi.getPageData({
  653. projectId: projectId.value,
  654. contractId: contractId.value,
  655. ...searchForm.value,
  656. classifyType: contractTypeTabKey.value,
  657. })
  658. //处理数据
  659. tableLoading.value = false
  660. if (!error && code === 200) {
  661. tableListData.value = getArrValue(data['records'])
  662. searchForm.value.total = data.total || 0
  663. } else {
  664. // window.$message?.error(msg)
  665. tableListData.value = []
  666. searchForm.value.total = 0
  667. }
  668. } else {
  669. window?.$message?.warning('请先选择一个树节点')
  670. }
  671. }
  672. //多选
  673. const tableCheckedKeys = ref([])
  674. const tableSelectionChange = (rows) => {
  675. tableCheckedKeys.value = rows.filter((item) => {
  676. return (item ?? '') !== ''
  677. })
  678. }
  679. //名称被点击
  680. const tableRowName = (row) => {
  681. bussPreview(row)
  682. }
  683. //多表预览
  684. const bussPreview = async (row) => {
  685. const info = nodeDataInfo.value
  686. row.bussPreviewLoading = true
  687. const { error, code, data } = await wbsApi.getBussPdfs({
  688. nodeId: row?.wbsId || '',
  689. classify: contractTypeTabKey.value,
  690. projectId: projectId.value,
  691. // contractId: contractId.value
  692. contractId: contractInfo.value?.contractType == 2 ? info?.contractIdRelation : contractId.value,
  693. })
  694. row.bussPreviewLoading = false
  695. if (!error && code === 200) {
  696. toPdfPage(data)
  697. //window.open(data, '_blank')
  698. } else {
  699. window.$message?.warning('获取PDF失败')
  700. }
  701. }
  702. //上报
  703. const reportIds = ref('')
  704. const reportTaskName = ref('')
  705. const reportDatas = ref([])
  706. const reportTypeData = ref([])
  707. const showReportModal = ref(false)
  708. const reportLoading = ref(false)
  709. const reportArr = ref([])
  710. const reportModalClick = async () => {
  711. const rows = tableCheckedKeys.value
  712. //判断是否满足条件
  713. const result = rows.every(({ status }) => {
  714. return status === 0 || status === 3
  715. })
  716. //处理数据
  717. let newArr = []
  718. for (let i = 0; i < rows.length; i++) {
  719. newArr.push(rows[i]['wbsId'])
  720. }
  721. reportTypeData.value = newArr
  722. let newArr1 = []
  723. for (let i = 0; i < rows.length; i++) {
  724. newArr1.push(rows[i]['id'])
  725. }
  726. reportArr.value = newArr1
  727. //判断状态
  728. if (result) {
  729. reportLoading.value = true
  730. const taskCheck = await eVisaTaskCheckApi({
  731. projectId: projectId.value,
  732. contractId: contractId.value,
  733. })
  734. if (taskCheck) {
  735. //初始ID
  736. const row = getObjValue(rows[0])
  737. reportIds.value = arrToId(rows)
  738. //设置任务数据
  739. let reportDataArr = []
  740. rows.forEach(item => {
  741. reportDataArr.push({
  742. id: item?.id,
  743. name: item?.name,
  744. })
  745. })
  746. reportDatas.value = reportDataArr
  747. //设置任务名称
  748. reportTaskName.value = rows.length > 1 ? `${row.name}等${rows.length}个文件` : row.name
  749. reportLoading.value = false
  750. showReportModal.value = true
  751. } else {
  752. reportLoading.value = false
  753. }
  754. } else {
  755. window.$message?.warning('已上报的文件不能进行再次上报,若要重新上报,要先撤回之前的上报,再重新上报')
  756. }
  757. }
  758. //上报的审批内容移除
  759. const reportTaskTagClose = (index) => {
  760. const row = tableCheckedKeys.value[index]
  761. tableListRef.value?.toggleRowSelection(row, false)
  762. }
  763. //上报完成
  764. const showReportFinish = () => {
  765. showReportModal.value = false
  766. getTableData()
  767. }
  768. //下载
  769. const downloadLoading = ref(false)
  770. const batchDownload = async () => {
  771. const rows = tableCheckedKeys.value
  772. const ids = arrToId(rows)
  773. //批量下载
  774. downloadLoading.value = true
  775. const { error, disposition, res } = await queryApi.batchDownloadFileToZip({ ids: ids })
  776. //处理数据
  777. downloadLoading.value = false
  778. if (!error) {
  779. if (disposition) {
  780. downloadBlob(res, disposition)
  781. } else {
  782. window.$message?.error('数据异常')
  783. }
  784. }
  785. }
  786. //打印
  787. const printLoading = ref(false)
  788. const batchPrint = async () => {
  789. const rows = tableCheckedKeys.value
  790. const ids = arrToId(rows)
  791. //批量下载
  792. printLoading.value = true
  793. const { error, code, data } = await queryApi.batchPrint({ ids: ids })
  794. //处理数据
  795. printLoading.value = false
  796. const res = isString(data) ? data ?? '' : ''
  797. if (!error && code === 200 && res) {
  798. toPdfPage(res)
  799. //window.open(res, '_blank')
  800. }
  801. }
  802. //废除
  803. const batchAbolishClick = () => {
  804. const rows = tableCheckedKeys.value
  805. //判断是否满足条件
  806. const result = rows.every(({ status }) => {
  807. return status !== 0 && status !== 3
  808. })
  809. //判断状态
  810. if (result) {
  811. //拼接ID
  812. const ids = arrToId(rows)
  813. window?.$messageBox?.alert('是否废除勾选的已上报文件?', '废除文件', {
  814. showCancelButton: true,
  815. confirmButtonText: '确定废除',
  816. cancelButtonText: '取消',
  817. callback: (action) => {
  818. if (action === 'confirm') {
  819. batchAbolishSave(ids)
  820. }
  821. },
  822. })
  823. } else {
  824. window.$message?.warning('未上报的文件不能废除')
  825. }
  826. }
  827. //废除勾选的已上报文件
  828. const batchAbolishSave = async (ids) => {
  829. const { error, code } = await queryApi.batchAbolish({ ids: ids, projectId:projectId.value, contractId:contractId.value })
  830. //处理数据
  831. if (!error && code === 200) {
  832. window.$message?.success('批量废除成功')
  833. tableCheckedKeys.value = []
  834. getTableData()
  835. }
  836. }
  837. //本地验签
  838. const localLoading = ref(false)
  839. const batchLocal = async () => {
  840. const rows = tableCheckedKeys.value
  841. //判断是否满足条件
  842. const result = rows.every(({ status }) => {
  843. return status === 2
  844. })
  845. //判断状态
  846. if (result) {
  847. const ids = arrToId(rows)
  848. //请求数据
  849. localLoading.value = true
  850. const { error, code, data, disposition, res } = await queryApi.localVerify({
  851. ids: ids,
  852. })
  853. //处理数据
  854. localLoading.value = false
  855. if (!error && code === 200) {
  856. if (disposition) {
  857. downloadBlob(res, disposition)
  858. } else {
  859. window.$message?.error('数据异常')
  860. }
  861. }
  862. } else {
  863. window.$message?.warning('存在未审批或未上报数据')
  864. }
  865. }
  866. //在线验签
  867. const onlineLoading = ref(false)
  868. const onlineVerifyData = ref({})
  869. const onlineTitle = ref('')
  870. const isOnlineVerifyDrawer = ref(false)
  871. const onlineVerifyOptions = {
  872. sizes: [50, 50],
  873. snapOffset: 0,
  874. minSize: ['10%', '80%'],
  875. }
  876. const batchOnline = async () => {
  877. const rows = tableCheckedKeys.value
  878. if (rows.length > 1) {
  879. window.$message?.warning('在线验签只能勾选一条数据进行验签')
  880. return
  881. }
  882. //判断是否满足条件
  883. const result = rows.every(({ status }) => {
  884. return status === 2
  885. })
  886. //判断状态
  887. if (!result) {
  888. window.$message?.warning('存在未审批或未上报数据')
  889. return
  890. }
  891. //发起请求
  892. onlineTitle.value = rows[0]?.name
  893. const ids = arrToId(rows)
  894. onlineLoading.value = true
  895. const { error, code, msg, data } = await queryApi.onlineVerify({
  896. ids: ids,
  897. })
  898. //处理数据
  899. onlineLoading.value = false
  900. if (!error && code === 200) {
  901. onlineVerifyData.value = getObjValue(data)
  902. cscTableData.value = getArrValue(data['certBeanVOList'])
  903. isOnlineVerifyDrawer.value = true
  904. } else {
  905. onlineVerifyData.value = {}
  906. window.$message?.error(msg ?? '操作失败')
  907. }
  908. }
  909. //签名信息
  910. const cscTableColumn = [
  911. { key:'dn', name: '签名者', width: 300 },
  912. { key:'time', name: '签名时间', width: 200 },
  913. { key:'result', name: '验签结果' },
  914. ]
  915. const cscTableData = ref([])
  916. //在线验签抽屉被关闭
  917. const onlineVerifyDrawerClose = () => {
  918. isOnlineVerifyDrawer.value = false
  919. onlineLoading.value = false
  920. }
  921. //树展开和收起
  922. const isWbsTreeShow = ref(true)
  923. const setWbsTreeShow = () => {
  924. isWbsTreeShow.value = !isWbsTreeShow.value
  925. }
  926. //左右拖动,改变树形结构宽度
  927. const leftWidth = ref(300)
  928. const onmousedown = () => {
  929. let leftNum = 0
  930. if (isLayout.value === 'no') {
  931. leftNum = 0
  932. } else {
  933. leftNum = isCollapse.value ? 142 : 272
  934. }
  935. document.onmousemove = (ve) => {
  936. let diffVal = ve.clientX - leftNum
  937. if (diffVal >= 310 && diffVal <= 900) {
  938. leftWidth.value = diffVal
  939. }
  940. }
  941. document.onmouseup = () => {
  942. document.onmousemove = null
  943. document.onmouseup = null
  944. }
  945. }
  946. const allElementsNotEmpty = (str)=> {
  947. // 使用split将字符串分割成字符数组
  948. // 使用every方法判断每个元素是否不为空字符串
  949. return str.split('').every(char => char !== '')
  950. }
  951. //一键重签
  952. const signLoading = ref(false)
  953. const resignModal = ref(false)
  954. const resignModalRadio = ref(0)
  955. const resignClick = async ()=>{
  956. const rows = tableCheckedKeys.value
  957. if (rows.length <= 0) {
  958. window.$message?.warning('勾选错误!只能操作待审批和已审批数据')
  959. return
  960. }
  961. resignModal.value = true
  962. }
  963. const signClick = async () => {
  964. const rows = tableCheckedKeys.value
  965. //获取任务id
  966. const taskIds = arrToKey(rows, 'taskId')
  967. const idsArr = taskIds.split(',')
  968. let isCan = idsArr.some(ele=>!ele)
  969. if (isCan) {
  970. window.$message?.warning('参数异常,暂不支持该操作')
  971. return
  972. }
  973. //发起请求
  974. signLoading.value = true
  975. const { error, code, msg } = await queryApi.reSigningEVisa({
  976. contractId: contractId.value,
  977. projectId: projectId.value,
  978. taskIds: taskIds,
  979. classifyType: contractTypeTabKey.value,
  980. type:resignModalRadio.value,
  981. })
  982. //处理数据
  983. signLoading.value = false
  984. if (!error && code === 200) {
  985. window.$message?.success(msg ?? '提交成功,请请耐心等待重签,可继续操作其它的功能。')
  986. getTableData().then()
  987. } else {
  988. window.$message?.error(msg ?? '操作失败')
  989. }
  990. resignModal.value = false
  991. }
  992. const cancelresign = ()=>{
  993. resignModalRadio.value = 0
  994. resignModal.value = false
  995. }
  996. //重新验签
  997. const saveAginClick = async ()=>{
  998. const rows = tableCheckedKeys.value
  999. const taskIds = rows.map(row => row.taskId)
  1000. if (taskIds.some(id => id)) {
  1001. window.$message?.warning('勾选错误!只能操作未上报的数据')
  1002. return
  1003. }
  1004. const objArr = rows.map(row => ({
  1005. id: row.id,
  1006. wbsId: row.wbsId,
  1007. projectId: projectId.value,
  1008. contractId: contractId.value,
  1009. }))
  1010. saveAginLoading.value = true
  1011. const { error, code, msg } = await queryApi.reSigningEVisaStatus0(objArr)
  1012. //处理数据
  1013. saveAginLoading.value = false
  1014. if (!error && code === 200) {
  1015. window.$message?.success(msg ?? '提交成功,请请耐心等待重签,可继续操作其它的功能。')
  1016. getTableData().then()
  1017. } else {
  1018. window.$message?.error(msg ?? '操作失败')
  1019. }
  1020. }
  1021. const saveAginLoading = ref(false)
  1022. //重置文件题名
  1023. const resignTitleModal = ref(false)
  1024. const resignTitleClick = async ()=>{
  1025. // resignTitleModal.value = true
  1026. if (isTemplateType.value) {
  1027. resignTitleModal.value = true
  1028. } else {
  1029. resignTitleSave()
  1030. }
  1031. }
  1032. const resignTitleSave = async ()=>{
  1033. const rows = tableCheckedKeys.value
  1034. let arr = []
  1035. rows.forEach(item=>{
  1036. arr.push({
  1037. id:item.id,
  1038. nodeName:'',
  1039. nameRule:'',
  1040. })
  1041. })
  1042. ruleModalSaveLoad.value = true
  1043. const { error, code, msg, data } = await queryApi.flushQueryName({
  1044. type:1,
  1045. list:arr,
  1046. })
  1047. //处理数据
  1048. ruleModalSaveLoad.value = false
  1049. if (!error && code === 200) {
  1050. window.$message?.success(msg)
  1051. resignTitleModal.value = false
  1052. getTableData().then()
  1053. } else {
  1054. window.$message?.error(msg || '操作失败')
  1055. }
  1056. }
  1057. const resignTitleSaveLoad = ref(false)
  1058. //规则更改
  1059. const changeRuleClick = async ()=>{
  1060. await getWbsNodeTypeApi()
  1061. ruleModal.value = true
  1062. ruleTableData.value = []
  1063. let arr = tableCheckedKeys.value.map(item=>{
  1064. return {
  1065. wbsId:item.wbsId,
  1066. projectId:projectId.value,
  1067. }
  1068. })
  1069. let arr1 = await getRuleListData(arr)
  1070. ruleTableData.value = arr1
  1071. for (let i = 0; i < ruleTableData.value.length; i++) {
  1072. const currentItem = ruleTableData.value[i]
  1073. const matchedItem = tableCheckedKeys.value.find(item => item.wbsId === currentItem.wbsId)
  1074. if (matchedItem) {
  1075. currentItem.name = matchedItem.name
  1076. currentItem.id = matchedItem.id
  1077. }
  1078. }
  1079. // ruleTableData.value = arr
  1080. }
  1081. const ruleModal = ref(false)
  1082. const ruleModalSaveLoad = ref(false)
  1083. const ruleModalClose = ()=>{
  1084. ruleModal.value = false
  1085. setValue.value = []
  1086. }
  1087. const ruleModalSave = async ()=>{
  1088. let isCanSave = ruleTableData.value.every(row => row.rule && row.rule.length > 0)
  1089. if (!isCanSave) {
  1090. window.$message.warning('请选择题名规规则')
  1091. return
  1092. }
  1093. let arr = []
  1094. ruleTableData.value.forEach(item=>{
  1095. arr.push({
  1096. id:item.id,
  1097. nodeName:item.newNodeName,
  1098. nameRule:item.rule.join('-'),
  1099. })
  1100. })
  1101. ruleModalSaveLoad.value = true
  1102. const { error, code, msg, data } = await queryApi.flushQueryName({
  1103. type:2,
  1104. list:arr,
  1105. })
  1106. //处理数据
  1107. ruleModalSaveLoad.value = false
  1108. if (!error && code === 200) {
  1109. window.$message?.success(msg)
  1110. getTableData().then()
  1111. ruleModalClose()
  1112. resignTitleModal.value = false
  1113. }
  1114. }
  1115. const setValue = ref('')
  1116. const ruleTableColumn = ref([
  1117. { key: 'name', name: '文件题名' },
  1118. { key: 'newNodeName', name: '修改后' },
  1119. { key: 'rule', name: '题名规则' },
  1120. ])
  1121. const ruleTableData = ref([])
  1122. const batchSetRule = async ()=>{
  1123. if (setValue.value.length === 0) {
  1124. window.$message.warning('请选择题名规则')
  1125. return
  1126. }
  1127. ruleTableData.value.forEach( (ele)=>{
  1128. ele.rule = setValue.value
  1129. })
  1130. let arr = []
  1131. ruleTableData.value.forEach((item)=>{
  1132. arr.push({
  1133. wbsId:item.wbsId,
  1134. nameRule:item.rule.join('-'),
  1135. })
  1136. })
  1137. let afterArr = await getRuleValue(arr)
  1138. for (let i = 0; i < ruleTableData.value.length; i++) {
  1139. const currentItem = ruleTableData.value[i]
  1140. const matchedItem = afterArr.find(item => item.wbsId === currentItem.wbsId)
  1141. if (matchedItem) {
  1142. currentItem.newNodeName = matchedItem.newNodeName
  1143. }
  1144. }
  1145. }
  1146. const ruleChange = async (ele)=>{
  1147. let str = ''
  1148. if (ele.rule.length > 0) {
  1149. str = ele.rule.join('-')
  1150. }
  1151. let arr = [{
  1152. wbsId:ele.wbsId,
  1153. nameRule:str,
  1154. }]
  1155. let afterArr = await getRuleValue(arr)
  1156. ele.newNodeName = afterArr[0].newNodeName
  1157. }
  1158. const getRuleLoad = ref(false)
  1159. const ruleTableLoading = ref(false)
  1160. const getRuleListData = async (arr) => {
  1161. ruleTableLoading.value = true
  1162. const { error, code, msg, data } = await queryApi.getNameRuleList(arr)
  1163. //处理数据
  1164. ruleTableLoading.value = false
  1165. if (!error && code === 200) {
  1166. return data || ''
  1167. } else {
  1168. return ''
  1169. }
  1170. }
  1171. const getRuleValue = async (arr) => {
  1172. // 检查 arr 中每一项的 nameRule 是否有值
  1173. const hasInvalidItem = arr.some(item => !item.nameRule || item.nameRule.length === 0)
  1174. if (hasInvalidItem) {
  1175. window.$message.warning('请选择题名规则')
  1176. return
  1177. }
  1178. getRuleLoad.value = true
  1179. const { error, code, msg, data } = await queryApi.previewNodeName(arr)
  1180. //处理数据
  1181. getRuleLoad.value = false
  1182. if (!error && code === 200) {
  1183. return data || ''
  1184. } else {
  1185. return ''
  1186. }
  1187. }
  1188. //获取节点类型
  1189. const nodeTypeData = ref([])
  1190. const getWbsNodeTypeApi = async () => {
  1191. const { data } = await getDictionary({
  1192. code: 'name_rule',
  1193. })
  1194. //处理数据
  1195. let newArr = []
  1196. const newData = getArrValue(data)
  1197. for (let i = 0; i < newData.length; i++) {
  1198. if (newData[i]['dictKey'] !== 'C0') {
  1199. newArr.push({
  1200. label: newData[i]['dictValue'],
  1201. value:newData[i]['dictKey'],
  1202. })
  1203. }
  1204. }
  1205. nodeTypeData.value = newArr
  1206. }
  1207. </script>
  1208. <style lang="scss" scoped>
  1209. @import "../../styles/data-fill/query.scss";
  1210. .error-border {
  1211. border: 1px solid red;
  1212. }
  1213. .iscusor {
  1214. cursor: pointer;
  1215. }
  1216. .bg-primary-color {
  1217. background-color: var(--el-color-primary) ;
  1218. }
  1219. </style>
  1220. <style lang="scss">
  1221. .hc-online-verify-drawer .el-card.hc-new-card-box {
  1222. .hc-card-header-box {
  1223. .online-verify-title {
  1224. font-size: 20px;
  1225. }
  1226. .online-verify-icon {
  1227. display: flex;
  1228. align-items: center;
  1229. cursor: pointer;
  1230. color: #5a5959;
  1231. i {
  1232. font-size: 18px;
  1233. }
  1234. &:hover {
  1235. color: var(--el-color-primary);
  1236. }
  1237. }
  1238. }
  1239. }
  1240. .custom-select{
  1241. .el-select__wrapper {
  1242. height: 32px;
  1243. overflow-y: hidden;
  1244. }
  1245. .el-select__selection.is-near {
  1246. height: 32px;
  1247. overflow-y: hidden;
  1248. overflow-x: hidden;
  1249. flex-wrap: nowrap;
  1250. }
  1251. }
  1252. </style>