division.vue 87 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464
  1. <template>
  2. <div class="hc-page-layout-box">
  3. <div
  4. :style="`width:${leftWidth}px;`"
  5. class="hc-layout-left-box bg-white"
  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-name">
  13. {{ projectInfo.projectName }}
  14. </div>
  15. </div>
  16. </div>
  17. <div
  18. v-loading="treeLoading"
  19. class="hc-tree-box"
  20. element-loading-text="加载中..."
  21. >
  22. <el-scrollbar>
  23. <HcLazyTree
  24. :auto-expand-keys="treeAutoExpandKeys"
  25. is-counts
  26. is-type
  27. :menus="ElTreeMenu"
  28. ui="page-division-tree"
  29. is-load-menu
  30. @load="treeLoadNode"
  31. @menu-tap="ElTreeMenuClick"
  32. @node-loading="treeNodeLoading"
  33. @node-tap="wbsElTreeClick"
  34. @load-menu="loadMenu"
  35. />
  36. </el-scrollbar>
  37. </div>
  38. <!-- 左右拖动 -->
  39. <div class="horizontal-drag-line" @mousedown="onmousedown" />
  40. </div>
  41. <div class="hc-page-content-box hc-division-page">
  42. <div class="basic-info">
  43. <HcNewCard title="当前节点基础信息">
  44. <template #extra>
  45. <el-checkbox
  46. v-model="treeItemInfo.isConcealedWorksNode"
  47. :false-value="0"
  48. :true-value="1"
  49. label="标记为隐蔽工程节点"
  50. size="large"
  51. @change="concealedChange"
  52. />
  53. </template>
  54. <HcTable
  55. :column="tableBasicColumn"
  56. :datas="tableBasicData"
  57. :is-index="false"
  58. is-new
  59. >
  60. <template #type="{ row }">
  61. {{ getRowType(row.type) }}
  62. </template>
  63. <template #majorDataType="{ row }">
  64. {{ getRowMajorType(row.majorDataType) }}
  65. </template>
  66. </HcTable>
  67. </HcNewCard>
  68. </div>
  69. <div class="project-info">
  70. <hc-new-card title="当前节点工程用表信息">
  71. <template #extra>
  72. <el-button
  73. hc-btn
  74. type="primary"
  75. @click="addingFormClick"
  76. >
  77. <HcIcon name="add" />
  78. <span>引用元素表</span>
  79. </el-button>
  80. </template>
  81. <HcTable
  82. :column="tableProjectColumn"
  83. :datas="tableProjectData"
  84. :is-index="false"
  85. is-new
  86. >
  87. <template #tableType="{ row }">
  88. {{ getRowTableType(row.tableType) }}
  89. </template>
  90. <template #tableOwner="{ row }">
  91. {{ getRowTableOwnerType(row.tableOwner) }}
  92. </template>
  93. <template #action="{ row }">
  94. <HcTooltip keys="wbs_views_delexcel">
  95. <el-button
  96. plain
  97. size="small"
  98. type="primary"
  99. @click="deltableexcel(row)"
  100. >
  101. <HcIcon name="delete-bin" />
  102. <span>删除</span>
  103. </el-button>
  104. </HcTooltip>
  105. </template>
  106. </HcTable>
  107. </hc-new-card>
  108. </div>
  109. <div class="footer-box bg-white">
  110. <!-- el-button hc-btn color="#A16222" @click="downloadXlsx">
  111. <HcIcon name="download-2" />
  112. <span>下载导入划分模板</span>
  113. </el-button>
  114. <el-button :disabled="!treePrimaryKeyId" hc-btn type="primary" @click="toImportTempClick">
  115. <HcIcon name="folder-upload" />
  116. <span>导入划分模板</span>
  117. </el-button -->
  118. <el-button hc-btn color="#e03997" @click="toBackClick">
  119. <HcIcon name="arrow-go-back" />
  120. <span>进入资料填报</span>
  121. </el-button>
  122. </div>
  123. </div>
  124. <!-- 编辑节点 -->
  125. <hc-new-dialog
  126. v-model="editNodeModal"
  127. :loading="editNodeLoading"
  128. title="编辑节点"
  129. widths="600px"
  130. @save="editNodeClick"
  131. >
  132. <el-form
  133. ref="formEditNodeRef"
  134. :model="formEditNodeModel"
  135. :rules="formEditNodeRules"
  136. label-width="auto"
  137. size="large"
  138. >
  139. <el-form-item label="节点名称" prop="title">
  140. <el-input
  141. v-model="formEditNodeModel.title"
  142. placeholder="请输入节点名称"
  143. />
  144. </el-form-item>
  145. <el-form-item label="上级节点">
  146. <el-input
  147. v-model="formEditNodeModel.parent.title"
  148. disabled
  149. />
  150. </el-form-item>
  151. <el-form-item label="节点类型">
  152. <el-select
  153. v-model="formEditNodeModel.nodeType"
  154. disabled
  155. block
  156. >
  157. <el-option
  158. v-for="item in nodeTypeData"
  159. :label="item.label"
  160. :value="item.value"
  161. />
  162. </el-select>
  163. </el-form-item>
  164. <el-form-item label="时间" prop="digitizeTime">
  165. <el-date-picker
  166. v-model="formEditNodeModel.digitizeTime"
  167. class="block"
  168. format="YYYY-MM-DD"
  169. placeholder="请选择"
  170. type="date"
  171. value-format="YYYY-MM-DD"
  172. />
  173. </el-form-item>
  174. <el-form-item
  175. label="标准分类"
  176. prop="className"
  177. v-if="formEditNodeModel.notExsitChild"
  178. >
  179. <el-select
  180. v-model="formEditNodeModel.className"
  181. block
  182. @change="changeStandType"
  183. >
  184. <el-option
  185. v-for="item in standardTypeOptions"
  186. :key="item.value"
  187. :label="item.label"
  188. :value="item.value"
  189. />
  190. </el-select>
  191. </el-form-item>
  192. <el-form-item
  193. label="单元名称"
  194. prop="unitName"
  195. v-if="formEditNodeModel.notExsitChild"
  196. >
  197. <el-select v-model="formEditNodeModel.unitName" block>
  198. <el-option
  199. v-for="item in unitNameOptions"
  200. :key="item.value"
  201. :label="item.dictValue"
  202. :value="item.dictKey"
  203. />
  204. </el-select>
  205. </el-form-item>
  206. <el-row :gutter="24" v-if="formEditNodeModel.nodeClass === 2">
  207. <el-col :span="12">
  208. <el-form-item prop="unitNum" label="单元个数">
  209. <el-input-number
  210. v-model="formEditNodeModel.unitNum"
  211. placeholder="请输入单元个数"
  212. :controls="false"
  213. :min="0"
  214. :precision="0"
  215. class="w-100"
  216. />
  217. </el-form-item>
  218. </el-col>
  219. <el-col :span="12">
  220. <el-form-item prop="excellentNum" label="优良个数">
  221. <el-input-number
  222. v-model="formEditNodeModel.excellentNum"
  223. placeholder="请输入优良个数"
  224. :controls="false"
  225. :min="0"
  226. :precision="0"
  227. class="w-100"
  228. />
  229. </el-form-item>
  230. </el-col>
  231. </el-row>
  232. <el-tooltip
  233. v-if="formEditNodeModel?.isReferenceNumber === 0"
  234. class="item"
  235. effect="light"
  236. content="当前合同段未开启引用标号功能,表格无法获取,请联系维护人员处理"
  237. placement="top"
  238. >
  239. <el-form-item label="划分编号">
  240. <el-input
  241. v-model="formEditNodeModel.partitionCode"
  242. placeholder="请输入划分编号"
  243. />
  244. </el-form-item>
  245. </el-tooltip>
  246. <el-form-item label="划分编号" v-else>
  247. <el-input
  248. v-model="formEditNodeModel.partitionCode"
  249. placeholder="请输入划分编号"
  250. />
  251. </el-form-item>
  252. </el-form>
  253. </hc-new-dialog>
  254. <!-- 复制节点 -->
  255. <hc-new-dialog
  256. v-model="copyNodeModal"
  257. :loading="copyNodeLoading"
  258. :widths="copyNodeTabKey === '1' ? '600px' : '1200px'"
  259. loading-text="复制节点中,请耐心等待..."
  260. title="复制节点"
  261. >
  262. <div class="header-new-switch">
  263. <el-form
  264. ref="formCopyNodeModelRef"
  265. :model="formCopyNodeModel"
  266. label-position="left"
  267. :rules="formCopyNodeModelRules"
  268. label-width="auto"
  269. size="large"
  270. >
  271. <el-form-item
  272. label="是否复制数据"
  273. prop="isCopyData"
  274. style="margin-bottom: 0"
  275. >
  276. <!-- <el-input v-model="formCopyNodeModel.classify" placeholder="请输入节点名称"/> -->
  277. <el-radio-group v-model="isCopyData">
  278. <el-radio :value="1">是</el-radio>
  279. <el-radio :value="0">否</el-radio>
  280. </el-radio-group>
  281. </el-form-item>
  282. <el-form-item
  283. v-if="isCopyData === 1"
  284. label="所属方"
  285. prop="classify"
  286. style="margin-bottom: 0"
  287. >
  288. <!-- <el-input v-model="formCopyNodeModel.classify" placeholder="请输入节点名称"/> -->
  289. <el-checkbox-group v-model="classifyList">
  290. <el-checkbox value="施工">施工</el-checkbox>
  291. <el-checkbox value="监理">监理</el-checkbox>
  292. </el-checkbox-group>
  293. </el-form-item>
  294. </el-form>
  295. <!-- HcNewSwitch :datas="authBtnTabdata" :keys="classifyType" :round="false" size="default"
  296. @change="classifyTypeTabClick"/ -->
  297. </div>
  298. <div v-if="copyNodeTabKey === '1'" class="copy-node-form-box">
  299. <el-form
  300. ref="formCopyNodeModelRef"
  301. :model="formCopyNodeModel"
  302. :rules="formCopyNodeModelRules"
  303. label-width="auto"
  304. size="large"
  305. >
  306. <el-form-item
  307. v-if="copyNodeTabKey === '1'"
  308. label="节点名称"
  309. prop="title"
  310. style="margin-bottom: 0"
  311. >
  312. <el-input
  313. v-model="formCopyNodeModel.title"
  314. placeholder="请输入节点名称"
  315. />
  316. </el-form-item>
  317. <el-form-item
  318. v-if="copyNodeTabKey === '1'"
  319. label="划分编号"
  320. prop="partitionCode"
  321. style="margin-top: 10px"
  322. >
  323. <el-input
  324. v-model="formCopyNodeModel.partitionCode"
  325. placeholder="请输入划分编号"
  326. />
  327. </el-form-item>
  328. </el-form>
  329. </div>
  330. <div v-if="copyNodeTabKey === '3'" class="copy-node-form-box">
  331. <el-form
  332. ref="formCopyNodeModelRef"
  333. :model="formCopyNodeModel"
  334. :rules="formCopyNodeModelRules"
  335. label-width="auto"
  336. size="large"
  337. >
  338. <el-form-item
  339. label="所属方"
  340. prop="classify"
  341. style="margin-bottom: 0"
  342. >
  343. <!-- <el-input v-model="formCopyNodeModel.classify" placeholder="请输入节点名称"/> -->
  344. <el-checkbox-group v-model="classifyList">
  345. <el-checkbox value="施工">施工</el-checkbox>
  346. <el-checkbox value="监理">监理</el-checkbox>
  347. </el-checkbox-group>
  348. </el-form-item>
  349. </el-form>
  350. </div>
  351. <div v-if="copyNodeTabKey !== '1'" class="copy-node-many-box">
  352. <div class="copy-node-many-tree">
  353. <el-scrollbar>
  354. <HcLazyTree
  355. :auto-expand-keys="TreeAutoExpandKeys"
  356. is-type
  357. @load="treeLoadNode"
  358. @node-tap="copyNodeElTreeClick"
  359. />
  360. </el-scrollbar>
  361. </div>
  362. <div class="copy-node-many-table">
  363. <el-scrollbar>
  364. <el-table :data="copyNodeTable" border>
  365. <el-table-column
  366. label="复制到的位置"
  367. prop="title"
  368. />
  369. <el-table-column
  370. v-if="copyNodeTabKey === '2'"
  371. label="节点名称"
  372. prop="nodeName"
  373. >
  374. <template #default="{ row }">
  375. <el-form
  376. ref="copyNodeTableRef"
  377. :model="row"
  378. :rules="copyNodeTableRules"
  379. label-width="0"
  380. size="large"
  381. >
  382. <el-form-item
  383. prop="nodeName"
  384. style="margin-bottom: 0"
  385. >
  386. <el-input
  387. v-model="row.nodeName"
  388. placeholder="请输入节点名称"
  389. />
  390. </el-form-item>
  391. </el-form>
  392. </template>
  393. </el-table-column>
  394. <el-table-column
  395. v-if="copyNodeTabKey === '2'"
  396. label="划分编号"
  397. prop="partitionCode"
  398. >
  399. <template #default="{ row }">
  400. <el-form
  401. ref="copyNodeTableRef"
  402. :model="row"
  403. :rules="copyNodeTableRules"
  404. label-width="0"
  405. size="large"
  406. >
  407. <el-form-item
  408. prop="partitionCode"
  409. style="margin-bottom: 0"
  410. >
  411. <el-input
  412. v-model="row.partitionCode"
  413. placeholder="请输入划分编号"
  414. />
  415. </el-form-item>
  416. </el-form>
  417. </template>
  418. </el-table-column>
  419. <el-table-column
  420. align="center"
  421. label="操作"
  422. prop="action"
  423. width="120"
  424. >
  425. <template #default="{ _, $index }">
  426. <el-button
  427. plain
  428. type="danger"
  429. @click="copyNodeTableDel($index)"
  430. >删除</el-button
  431. >
  432. </template>
  433. </el-table-column>
  434. </el-table>
  435. </el-scrollbar>
  436. </div>
  437. </div>
  438. <template #footer>
  439. <div class="lr-dialog-footer">
  440. <div class="left">
  441. <template
  442. v-for="(item, index) in copyNodeTab"
  443. :key="index"
  444. >
  445. <el-button
  446. v-if="item?.key === copyNodeTabKey"
  447. plain
  448. size="large"
  449. type="primary"
  450. @click="copyNodeTabChange(item?.key)"
  451. >
  452. {{ item.name }}
  453. </el-button>
  454. <el-button
  455. v-else
  456. bg
  457. size="large"
  458. text
  459. @click="copyNodeTabChange(item?.key)"
  460. >
  461. {{ item.name }}
  462. </el-button>
  463. </template>
  464. </div>
  465. <div class="right">
  466. <el-button
  467. :disabled="copyNodeLoading"
  468. size="large"
  469. @click="copyNodeModal = false"
  470. >取消</el-button
  471. >
  472. <el-button
  473. :loading="copyNodeLoading"
  474. hc-btn
  475. type="primary"
  476. @click="copyNodeClick"
  477. >提交</el-button
  478. >
  479. </div>
  480. </div>
  481. </template>
  482. </hc-new-dialog>
  483. <!-- 新增子节点 -->
  484. <hc-new-dialog
  485. v-model="addNodeModal"
  486. :loading="addNodeLoading"
  487. loading-text="新增节点中,请耐心等待..."
  488. title="新增子节点"
  489. widths="720px"
  490. is-table
  491. >
  492. <el-alert
  493. :closable="false"
  494. title="双击节点,可编辑节点名称,编辑完成后,请按回车或输入框消失后,再点提交"
  495. type="warning"
  496. />
  497. <HcTreeNode
  498. v-if="addTreeNodeType === '1'"
  499. :node-id="addTreeNodeId"
  500. :old-id="addTreeNodeOldId"
  501. :contract-id="contractId"
  502. :project-id="projectId"
  503. :is-custom="isCustom"
  504. @check-change="addTreeNodeCheckChange"
  505. />
  506. <HcTreeNode
  507. v-if="addTreeNodeType === '2'"
  508. :node-id="addTreeNodeId"
  509. :old-id="addTreeNodeOldId"
  510. :contract-id="contractId"
  511. :project-id="projectId"
  512. strictly
  513. :is-custom="isCustom"
  514. @check-change="addTreeNodeCheckChange"
  515. />
  516. <template #footer>
  517. <div class="lr-dialog-footer">
  518. <div class="left flex items-center">
  519. <div class="mr-4">选中方式:</div>
  520. <el-radio-group v-model="addTreeNodeType">
  521. <el-radio value="1">当前及子节点</el-radio>
  522. <el-radio class="ml-4" value="2"
  523. >仅当前节点</el-radio
  524. >
  525. </el-radio-group>
  526. </div>
  527. <div class="right">
  528. <el-button size="large" @click="addNodeModal = false"
  529. >取消</el-button
  530. >
  531. <el-button
  532. :loading="addNodeLoading"
  533. hc-btn
  534. type="primary"
  535. @click="addNodeClick"
  536. >提交</el-button
  537. >
  538. </div>
  539. </div>
  540. </template>
  541. </hc-new-dialog>
  542. <!-- 新增自定义节点 -->
  543. <hc-new-dialog
  544. v-model="addNodeModalCus"
  545. :loading="addNodeLoadingCus"
  546. loading-text="新增节点中,请耐心等待..."
  547. title="新增自定义节点(水利工程)"
  548. widths="720px"
  549. @save="addNodeClickCur"
  550. >
  551. <!-- <div>节点名称:</div>
  552. <el-input
  553. v-model="nodeNameinput"
  554. placeholder="请输入节点名称"
  555. size="large"
  556. style="margin-top: 15px"
  557. /> -->
  558. <el-form
  559. ref="formWaterNodeRef"
  560. :model="formWaterNodeModel"
  561. :rules="formWaterNodeRules"
  562. label-width="auto"
  563. size="large"
  564. label-position="left"
  565. >
  566. <el-form-item label="节点名称" prop="nodeName">
  567. <el-input
  568. v-model="formWaterNodeModel.nodeName"
  569. placeholder="请输入节点名称"
  570. />
  571. </el-form-item>
  572. <el-form-item label="节点类型" prop="nodeType">
  573. <el-select v-model="formWaterNodeModel.nodeType" block>
  574. <el-option
  575. v-for="item in nodeTypeData"
  576. :key="item.value"
  577. :label="item.label"
  578. :value="item.value"
  579. />
  580. </el-select>
  581. </el-form-item>
  582. </el-form>
  583. </hc-new-dialog>
  584. <!-- 新增自定义节点-数字化文件 -->
  585. <hc-new-dialog
  586. v-model="addNodeModalData"
  587. :loading="addNodeLoadingData"
  588. loading-text="新增节点中,请耐心等待..."
  589. title="新增自定义节点(数字化文件)"
  590. widths="720px"
  591. @save="addNodeClickData"
  592. >
  593. <el-form
  594. ref="formDataNodeRef"
  595. :model="formDataNodeModel"
  596. :rules="formDataNodeRules"
  597. label-width="auto"
  598. size="large"
  599. label-position="left"
  600. >
  601. <el-form-item label="节点名称" prop="nodeName">
  602. <el-input
  603. v-model="formDataNodeModel.nodeName"
  604. placeholder="请输入节点名称"
  605. />
  606. </el-form-item>
  607. <el-form-item label="节点类型" prop="nodeType">
  608. <el-select v-model="formDataNodeModel.nodeType" block>
  609. <el-option
  610. v-for="item in nodeTypeData"
  611. :key="item.value"
  612. :label="item.label"
  613. :value="item.value"
  614. />
  615. </el-select>
  616. </el-form-item>
  617. <el-form-item label="是否含单元评定" prop="isClassifition">
  618. <el-radio-group v-model="formDataNodeModel.isClassifition">
  619. <el-radio :value="1">是</el-radio>
  620. <el-radio :value="0">否</el-radio>
  621. </el-radio-group>
  622. </el-form-item>
  623. <el-form-item label="时间" prop="digitizeTime">
  624. <el-date-picker
  625. v-model="formDataNodeModel.digitizeTime"
  626. class="block"
  627. format="YYYY-MM-DD"
  628. placeholder="请选择"
  629. type="date"
  630. value-format="YYYY-MM-DD"
  631. />
  632. </el-form-item>
  633. <el-row :gutter="24">
  634. <el-col :span="12">
  635. <el-form-item
  636. label="标准分类"
  637. prop="className"
  638. v-if="formDataNodeModel.isClassifition === 1"
  639. >
  640. <el-select
  641. v-model="formDataNodeModel.className"
  642. block
  643. @change="changeStandType"
  644. >
  645. <el-option
  646. v-for="item in standardTypeOptions"
  647. :key="item.value"
  648. :label="item.label"
  649. :value="item.value"
  650. />
  651. </el-select>
  652. </el-form-item>
  653. </el-col>
  654. <el-col :span="12">
  655. <el-form-item
  656. label="单元名称"
  657. prop="unitName"
  658. v-if="formDataNodeModel.isClassifition === 1"
  659. >
  660. <el-select
  661. v-model="formDataNodeModel.unitName"
  662. block
  663. >
  664. <el-option
  665. v-for="item in unitNameOptions"
  666. :key="item.value"
  667. :label="item.dictValue"
  668. :value="item.dictKey"
  669. />
  670. </el-select>
  671. </el-form-item>
  672. </el-col>
  673. </el-row>
  674. <el-row :gutter="24">
  675. <el-col :span="12">
  676. <el-form-item
  677. prop="unitNum"
  678. label="单元个数"
  679. v-if="formDataNodeModel.isClassifition === 1"
  680. >
  681. <el-input-number
  682. v-model="formDataNodeModel.unitNum"
  683. placeholder="请输入单元个数"
  684. :controls="false"
  685. :min="0"
  686. :precision="0"
  687. class="w-100"
  688. />
  689. </el-form-item>
  690. </el-col>
  691. <el-col :span="12">
  692. <el-form-item
  693. prop="excellentNum"
  694. label="优良个数"
  695. v-if="formDataNodeModel.isClassifition === 1"
  696. >
  697. <el-input-number
  698. v-model="formDataNodeModel.excellentNum"
  699. placeholder="请输入优良个数"
  700. :controls="false"
  701. :min="0"
  702. :precision="0"
  703. class="w-100"
  704. />
  705. </el-form-item>
  706. </el-col>
  707. </el-row>
  708. </el-form>
  709. </hc-new-dialog>
  710. <!-- 调整排序 -->
  711. <hc-new-dialog
  712. v-model="sortNodeModal"
  713. :loading="sortNodeLoading"
  714. title="调整排序"
  715. widths="700px"
  716. @save="sortNodeClick"
  717. >
  718. <el-alert
  719. :closable="false"
  720. title="可拖动排序,也可在后面点击图标,切换排序"
  721. type="warning"
  722. />
  723. <div class="sort-node-body-box list-group header">
  724. <div class="list-group-item">
  725. <div class="index-box">序号</div>
  726. <div class="title-box">节点名称</div>
  727. <div class="icon-box">排序</div>
  728. </div>
  729. </div>
  730. <Draggable
  731. :list="sortNodeData"
  732. class="sort-node-body-box list-group"
  733. ghost-class="ghost"
  734. item-key="id"
  735. @end="sortNodeDrag = false"
  736. @start="sortNodeDrag = true"
  737. >
  738. <template #item="{ element, index }">
  739. <div class="list-group-item">
  740. <div class="index-box">{{ index + 1 }}</div>
  741. <div class="title-box">{{ element.title }}</div>
  742. <div class="icon-box">
  743. <span class="icon" @click="downSortClick(index)">
  744. <HcIcon name="arrow-down" ui="text-lg" />
  745. </span>
  746. <span class="icon" @click="upSortClick(index)">
  747. <HcIcon name="arrow-up" ui="text-lg" />
  748. </span>
  749. </div>
  750. </div>
  751. </template>
  752. </Draggable>
  753. </hc-new-dialog>
  754. <!-- 导入划分模板 -->
  755. <hc-new-dialog
  756. v-model="importTempModal"
  757. title="导入划分模板"
  758. ui="hc-modal-table"
  759. widths="84%"
  760. >
  761. <div class="hc-import-temp-box">
  762. <!-- div class="hc-choose-type-box">
  763. <div class="text-title text-orange">请选择需要导入的工程类别:</div>
  764. <div class="hc-type-box">
  765. <el-radio-group v-model="importRadio" size="large">
  766. <el-radio v-for="item in importRadioData" :label="item.key">{{item.name}}</el-radio>
  767. </el-radio-group>
  768. </div>
  769. </div -->
  770. <div
  771. v-loading="uploadLoading"
  772. class="hc-import-node-tree-box"
  773. element-loading-text="Loading..."
  774. >
  775. <div class="import-node-tree-box">
  776. <div class="hc-tree-title-box">导入并识别成功</div>
  777. <div class="hc-tree-bar-box">
  778. <el-scrollbar>
  779. <HcTreeData :datas="matchedData" />
  780. </el-scrollbar>
  781. </div>
  782. </div>
  783. <div class="import-node-tree-box">
  784. <div class="hc-tree-title-box">
  785. 未被系统识别:手动关联
  786. </div>
  787. <div class="hc-tree-bar-box">
  788. <el-scrollbar>
  789. <HcTreeData1
  790. :datas="unmatchedData"
  791. @relation-tap="unmatchedTreeTap"
  792. />
  793. </el-scrollbar>
  794. </div>
  795. </div>
  796. </div>
  797. </div>
  798. <template #footer>
  799. <div class="lr-dialog-footer">
  800. <div class="left">
  801. <HcUpload
  802. ref="uploadRef"
  803. :contract-id="contractId"
  804. :is-splicing-number="isSplicingNumber"
  805. :primary-key-id="treePrimaryKeyId"
  806. :type="importRadio"
  807. @change="uploadChange"
  808. @finished="uploadFinished"
  809. @progress="uploadprogress"
  810. />
  811. </div>
  812. <div class="right flex">
  813. <div class="mr-6">
  814. <span class="text-grey">是否拼接划分编号:</span>
  815. <el-switch
  816. v-model="isSplicingNumber"
  817. :active-value="1"
  818. :inactive-value="0"
  819. active-text="是"
  820. inactive-text="否"
  821. inline-prompt
  822. size="large"
  823. />
  824. </div>
  825. <el-button size="large" @click="importTempModalClose">
  826. <HcIcon name="close" />
  827. <span>取消</span>
  828. </el-button>
  829. <el-button
  830. :disabled="uploadLoading"
  831. :loading="uploadLoading"
  832. hc-btn
  833. type="primary"
  834. @click="importTempFolder"
  835. >
  836. <HcIcon name="folder-upload" />
  837. <span>导入模板</span>
  838. </el-button>
  839. </div>
  840. </div>
  841. </template>
  842. </hc-new-dialog>
  843. <!-- 替换并关联节点 -->
  844. <hc-new-dialog
  845. v-model="relationModal"
  846. :loading="relationLoading"
  847. save-text="确认关联"
  848. title="替换并关联节点"
  849. ui="hc-modal-table"
  850. widths="47rem"
  851. @save="relationSaveClick"
  852. >
  853. <el-scrollbar>
  854. <DivisionTree
  855. :datas="unmatchedTreeData"
  856. @node-tap="divisionTreeClick"
  857. />
  858. </el-scrollbar>
  859. </hc-new-dialog>
  860. <!-- 添加独立表单 -->
  861. <hc-new-dialog
  862. v-model="addingFormModal"
  863. :loading="addingFormLoading"
  864. :padding="false"
  865. is-table
  866. title="引用元素表"
  867. widths="84%"
  868. @close="addingFormClose"
  869. @save="addingFormSave"
  870. >
  871. <div class="adding-form-dialog-box">
  872. <div class="dialog-tree-box">
  873. <el-scrollbar>
  874. <ElTree
  875. ref="addingFormTreeRef"
  876. :load="addingFormTreeLoadNode"
  877. :props="addingFormTreeProps"
  878. accordion
  879. class="hc-tree-node"
  880. highlight-current
  881. lazy
  882. @node-click="addingFormTreeClick"
  883. />
  884. </el-scrollbar>
  885. </div>
  886. <div class="dialog-table-box">
  887. <div class="dialog-search">
  888. <el-autocomplete
  889. v-model="searchTreeTitle"
  890. :fetch-suggestions="querySearchTree"
  891. class="block"
  892. clearable
  893. node-key="primaryKeyId"
  894. placeholder="请输入关键词检索"
  895. value-key="title"
  896. @select="searchTreeSelect"
  897. />
  898. </div>
  899. <div class="dialog-table">
  900. <HcTable
  901. ref="dialogTableRef"
  902. :column="dialogTableColumn"
  903. :datas="dialogTableData"
  904. :loading="dialogTableLoading"
  905. is-new
  906. :index-style="{ width: 60 }"
  907. is-check
  908. :check-style="{ width: 29 }"
  909. @select="dialogTableSelect"
  910. @select-all="dialogTableSelectAll"
  911. />
  912. </div>
  913. <div class="dialog-pages">
  914. <HcPages
  915. :pages="searchFormPage"
  916. @change="searchFormPageChange"
  917. />
  918. </div>
  919. </div>
  920. </div>
  921. </hc-new-dialog>
  922. </div>
  923. </template>
  924. <script setup>
  925. import { nextTick, onActivated, onMounted, ref, watch } from "vue";
  926. import { useAppStore } from "~src/store";
  927. import { useRoute, useRouter } from "vue-router";
  928. import HcUpload from "./components/division/HcUpload.vue";
  929. import HcTreeData from "./components/division/HcTreeData.vue";
  930. import HcTreeData1 from "./components/division/HcTreeData1.vue";
  931. import DivisionTree from "./components/division/DivisionTree.vue";
  932. import HcTreeNode from "./components/HcTreeNode.vue";
  933. import {
  934. arrDelKey,
  935. arrIndex,
  936. arrToId,
  937. deepClone,
  938. formValidate,
  939. getArrValue,
  940. getObjValue,
  941. } from "js-fast-way";
  942. import { getStoreValue, setStoreValue } from "~src/utils/storage";
  943. import { getDictionary } from "~api/other";
  944. import wbsApi from "~api/data-fill/wbs";
  945. import queryApi from "~api/data-fill/query";
  946. import divisionApi from "~api/data-fill/division";
  947. import Draggable from "vuedraggable";
  948. import { HcDelMsg } from "hc-vue3-ui";
  949. import { getChildList } from "~api/other";
  950. import { getDictionaryData } from "~uti/tools";
  951. //初始变量
  952. const router = useRouter();
  953. const useRoutes = useRoute();
  954. const useAppState = useAppStore();
  955. //全局变量
  956. const projectId = ref(useAppState.getProjectId);
  957. const contractId = ref(useAppState.getContractId);
  958. const projectInfo = ref(useAppState.getProjectInfo);
  959. const isCollapse = ref(useAppState.getCollapse);
  960. const contractInfo = ref(useAppState.getContractInfo);
  961. const { contractType } = contractInfo.value;
  962. const classifyType = ref(contractType === 2 ? "2" : "1");
  963. //监听
  964. watch(
  965. () => [useAppState.getCollapse],
  966. ([Collapse]) => {
  967. isCollapse.value = Collapse;
  968. }
  969. );
  970. //自动展开缓存
  971. const treeAutoExpandKeys = ref(getStoreValue("wbsTreeExpandKeys") || []);
  972. //自动展开缓存
  973. const TreeAutoExpandKeys = ref(getStoreValue("wbsTreeExpandKeys") || []);
  974. //渲染完成
  975. onMounted(() => {
  976. //setElTreeMenu()
  977. getWbsNodeTypeApi();
  978. getMajorDataTypeApi();
  979. getWbsNodeTableTypeApi();
  980. getTableOwnerTypeApi();
  981. getStandardTypeOptions();
  982. });
  983. //缓存被激活时
  984. onActivated(() => {
  985. searchNodeAllTableApi(treeItemInfo.value["primaryKeyId"]); //重新获取引用表格数据
  986. });
  987. const treeLoading = ref(true);
  988. const treeNodeLoading = () => {
  989. treeLoading.value = false;
  990. };
  991. //获取节点类型
  992. const nodeTypeData = ref([]);
  993. const getWbsNodeTypeApi = async () => {
  994. const { data } = await getDictionary({
  995. code: "wbs_node_type",
  996. });
  997. //处理数据
  998. let newArr = [];
  999. const newData = getArrValue(data);
  1000. for (let i = 0; i < newData.length; i++) {
  1001. newArr.push({
  1002. label: newData[i]["dictValue"],
  1003. value: Number(newData[i]["dictKey"]),
  1004. });
  1005. }
  1006. nodeTypeData.value = newArr;
  1007. };
  1008. //获取类型名称
  1009. const getRowType = (type) => {
  1010. const nodeData = nodeTypeData.value;
  1011. const index = arrIndex(nodeData, "value", type);
  1012. return nodeData[index]?.label ?? type;
  1013. };
  1014. //获取资料类型
  1015. const majorDataTypeData = ref([]);
  1016. const getMajorDataTypeApi = async () => {
  1017. const { data } = await getDictionary({
  1018. code: "major_data_type",
  1019. });
  1020. //处理数据
  1021. majorDataTypeData.value = getArrValue(data);
  1022. };
  1023. //获取资料类型名称
  1024. const getRowMajorType = (type) => {
  1025. if (type) {
  1026. const nodeData = majorDataTypeData.value;
  1027. const index = arrIndex(nodeData, "dictKey", type);
  1028. return nodeData[index]?.dictValue ?? type;
  1029. }
  1030. };
  1031. //获取表类型数据
  1032. const nodeTableTypeData = ref([]);
  1033. const getWbsNodeTableTypeApi = async () => {
  1034. const { data } = await getDictionary({
  1035. code: "table_type",
  1036. });
  1037. nodeTableTypeData.value = getArrValue(data);
  1038. };
  1039. //获取表类型
  1040. const getRowTableType = (type) => {
  1041. if (type > 0) {
  1042. const nodeData = nodeTableTypeData.value;
  1043. const index = arrIndex(nodeData, "dictKey", type);
  1044. return nodeData[index]?.dictValue ?? type;
  1045. } else {
  1046. return "";
  1047. }
  1048. };
  1049. //获取表类型数据
  1050. const tableOwnerTypeData = ref([]);
  1051. const getTableOwnerTypeApi = async () => {
  1052. const { data } = await getDictionary({
  1053. code: "owner_type",
  1054. });
  1055. tableOwnerTypeData.value = getArrValue(data);
  1056. };
  1057. //获取表类型
  1058. const getRowTableOwnerType = (type) => {
  1059. if (type > 0) {
  1060. const nodeData = tableOwnerTypeData.value;
  1061. const index = arrIndex(nodeData, "dictKey", type);
  1062. return nodeData[index]?.dictValue ?? type;
  1063. } else {
  1064. return "";
  1065. }
  1066. };
  1067. //懒加载的数据
  1068. const treeLoadNode = async ({ node, item, level }, resolve) => {
  1069. let contractIdRelation = "",
  1070. parentId = "",
  1071. primaryKeyId = "";
  1072. if (level !== 0) {
  1073. const nodeData = getObjValue(item);
  1074. contractIdRelation = nodeData?.contractIdRelation || "";
  1075. parentId = contractIdRelation ? nodeData?.primaryKeyId : nodeData?.id;
  1076. primaryKeyId = nodeData?.id || "";
  1077. }
  1078. //获取数据
  1079. const { data } = await queryApi.queryWbsTreeData({
  1080. contractId: contractId.value || "",
  1081. contractIdRelation,
  1082. primaryKeyId,
  1083. parentId,
  1084. classifyType: classifyType.value,
  1085. tableOwner: classifyType.value,
  1086. });
  1087. resolve(getArrValue(data));
  1088. treeLoading.value = false;
  1089. };
  1090. //树被点击
  1091. const treeNodeInfo = ref({});
  1092. const treeItemInfo = ref({});
  1093. const treePrimaryKeyId = ref("");
  1094. const wbsElTreeClick = ({ node, data, keys }) => {
  1095. treeNodeInfo.value = node;
  1096. treeItemInfo.value = data;
  1097. tableBasicData.value = [data];
  1098. const { notExsitChild } = data;
  1099. setStoreValue("wbsTreeExpandKeys", keys);
  1100. treeAutoExpandKeys.value = keys || [];
  1101. if (node.level === 3) {
  1102. treePrimaryKeyId.value = data["primaryKeyId"];
  1103. } else {
  1104. treePrimaryKeyId.value = "";
  1105. }
  1106. if (node.level > 1) {
  1107. if (notExsitChild) {
  1108. searchNodeAllTableApi(data["primaryKeyId"]);
  1109. } else {
  1110. tableProjectData.value = [];
  1111. }
  1112. }
  1113. };
  1114. //当前节点基础信息
  1115. const tableBasicColumn = ref([
  1116. { key: "title", name: "节点名称" },
  1117. { key: "partitionCode", name: "划分编号" },
  1118. { key: "type", name: "节点类型" },
  1119. { key: "majorDataType", name: "资料类型" },
  1120. ]);
  1121. const tableBasicData = ref([]);
  1122. //标记为隐蔽工程节点
  1123. const concealedChange = async () => {
  1124. const { primaryKeyId, isConcealedWorksNode } = treeItemInfo.value;
  1125. if (primaryKeyId) {
  1126. const { error, code, msg } = await divisionApi.concealedWorksNnode(
  1127. {
  1128. pKeyId: primaryKeyId,
  1129. type: isConcealedWorksNode,
  1130. },
  1131. false
  1132. );
  1133. if (!error && code === 200) {
  1134. window?.$message?.success(msg);
  1135. } else {
  1136. window?.$message?.error(msg || "操作失败");
  1137. }
  1138. } else {
  1139. window?.$message?.warning("请先在左侧选择节点");
  1140. }
  1141. };
  1142. //当前节点工程用表信息
  1143. const tableProjectColumn = ref([
  1144. { key: "nodeName", name: "工程用表名称" },
  1145. { key: "tableType", name: "用表类型" },
  1146. { key: "tableOwner", name: "用表单位" },
  1147. { key: "fillRate", name: "填报完整率" },
  1148. { key: "action", name: "操作", width: 100 },
  1149. ]);
  1150. const tableProjectData = ref([]);
  1151. //获取数据
  1152. const searchNodeAllTableApi = async (pid) => {
  1153. const { error, code, data } = await wbsApi.searchNodeAllTable({
  1154. projectId: projectId.value,
  1155. contractId: contractId.value,
  1156. primaryKeyId: pid,
  1157. });
  1158. if (!error && code === 200) {
  1159. tableProjectData.value = getArrValue(data);
  1160. } else {
  1161. tableProjectData.value = [];
  1162. }
  1163. };
  1164. //树菜单配置
  1165. const ElTreeMenu = ref([
  1166. { icon: "add-circle", label: "新增节点", key: "add" },
  1167. { icon: "file-copy-2", label: "复制节点", key: "copy" },
  1168. { icon: "draft", label: "修改节点", key: "edit" },
  1169. { icon: "sort-asc", label: "调整排序", key: "sort" },
  1170. { icon: "delete-bin", label: "删除节点", key: "del" },
  1171. ]);
  1172. const orString = ref("");
  1173. //树菜单被点击
  1174. const ElTreeMenuClick = async ({ key, node, data, keys }) => {
  1175. treeNodeInfo.value = node;
  1176. treeItemInfo.value = data;
  1177. setStoreValue("wbsTreeExpandKeys", keys);
  1178. TreeAutoExpandKeys.value = keys || [];
  1179. if (key === "add") {
  1180. isCustom.value = data?.isCustom;
  1181. addTreeNodeId.value = data?.primaryKeyId;
  1182. addTreeNodeOldId.value = data?.oldId;
  1183. addNodeLoading.value = false;
  1184. // addNodeModal.value = true;
  1185. if (data?.isClassifition === 1) {
  1186. window.$message.warning("该节点下不能创建子节点");
  1187. addNodeModal.value = false;
  1188. return;
  1189. } else {
  1190. addNodeModal.value = true;
  1191. }
  1192. } else if (key === "add1") {
  1193. addTreeNodeId.value = data?.primaryKeyId;
  1194. addTreeNodeOldId.value = data?.oldId;
  1195. addNodeLoadingCus.value = false;
  1196. formWaterNodeModel.value = {
  1197. nodeName: "",
  1198. nodeType: null,
  1199. };
  1200. if (data?.isClassifition === 1) {
  1201. window.$message.warning("该节点下不能创建子节点");
  1202. addNodeModalCus.value = false;
  1203. return;
  1204. } else {
  1205. addNodeModalCus.value = true;
  1206. }
  1207. } else if (key === "add2") {
  1208. addTreeNodeId.value = data?.primaryKeyId;
  1209. addTreeNodeOldId.value = data?.oldId;
  1210. addNodeLoadingCus.value = false;
  1211. addNodeModalData.value = true;
  1212. formDataNodeModel.value = {
  1213. nodeName: "",
  1214. nodeType: null,
  1215. isClassifition: 0,
  1216. className: "",
  1217. unitName: "",
  1218. unitNum: 1,
  1219. excellentNum: 1,
  1220. digitizeTime: "",
  1221. };
  1222. if (data?.isClassifition === 1) {
  1223. window.$message.warning("该节点下不能创建子节点");
  1224. addNodeModalData.value = false;
  1225. } else {
  1226. addNodeModalData.value = true;
  1227. }
  1228. } else if (key === "copy") {
  1229. const parent = deepClone(node?.parent?.data || {});
  1230. formCopyNodeModel.value = { ...deepClone(data), parent: parent };
  1231. copyNodeTabKey.value = "1";
  1232. copyNodeTable.value = [];
  1233. copyNodeLoading.value = false;
  1234. copyNodeModal.value = true;
  1235. } else if (key === "edit") {
  1236. const parent = deepClone(node?.parent?.data || {});
  1237. formEditNodeModel.value = { ...deepClone(data), parent: parent };
  1238. orString.value = formEditNodeModel.value?.className;
  1239. changeStandType(formEditNodeModel.value?.className);
  1240. editNodeModal.value = true;
  1241. } else if (key === "sort") {
  1242. let nodes = [],
  1243. childNodes = [];
  1244. childNodes = node?.parent?.childNodes || [];
  1245. for (let i = 0; i < childNodes.length; i++) {
  1246. const res = childNodes[i]?.data;
  1247. nodes.push({
  1248. id: res?.primaryKeyId,
  1249. title: res?.title,
  1250. });
  1251. }
  1252. sortNodeData.value = nodes;
  1253. sortNodeModal.value = true;
  1254. } else if (key === "del") {
  1255. // delModalClick()
  1256. if (
  1257. data["colorStatus"] === 1 ||
  1258. data["colorStatus"] === 2 ||
  1259. data["colorStatus"] === null ||
  1260. data["colorStatus"] === -1
  1261. ) {
  1262. delModalClick();
  1263. } else {
  1264. window?.$message?.warning("该节点已存在上报数据,不允许删除");
  1265. }
  1266. }
  1267. };
  1268. const loadMenu = ({ node, item, level }, resolve) => {
  1269. ElTreeMenu.value = [
  1270. { icon: "add-circle", label: "新增节点", key: "add" },
  1271. { icon: "add-circle", label: "自定义节点(水利工程)", key: "add1" },
  1272. { icon: "add-circle", label: "自定义节点(数字化文件)", key: "add2" },
  1273. { icon: "file-copy-2", label: "复制节点", key: "copy" },
  1274. { icon: "draft", label: "修改节点", key: "edit" },
  1275. { icon: "sort-asc", label: "调整排序", key: "sort" },
  1276. { icon: "delete-bin", label: "删除节点", key: "del" },
  1277. ];
  1278. let menusArr = ElTreeMenu.value;
  1279. const { isCustomChild, notExsitChild } = item; //isCustomChild===1//代表子级是自定义节点
  1280. // const { isCustom } = item
  1281. // if (isCustom === 1 && isCustomChild === 0 && notExsitChild) {//无子级,显示两个按钮
  1282. // menusArr.unshift( { icon: 'add-circle', label: '新增自定义节点', key: 'add1' })
  1283. // resolve(menusArr)
  1284. // } else if (isCustom === 1 && isCustomChild === 1) {//自定义节点类型下如果有自定义节点,就不允许新增节点
  1285. // menusArr.unshift( { icon: 'add-circle', label: '新增自定义节点', key: 'add1' })
  1286. // let menusArr1 = arrDelKey(menusArr, 'label', '新增节点') // [{id:1}]
  1287. // resolve(menusArr1)
  1288. // } else if (isCustom === 1 && isCustomChild === 0 && !notExsitChild) { //自定义节点类型下如果有划分节点,就不允许新增自定义节点
  1289. // resolve(menusArr)
  1290. // } else if (level === 1) {
  1291. // menusArr = [ { icon: 'add-circle', label: '新增自定义节点', key: 'add1' }]
  1292. // resolve(menusArr)
  1293. // } else {
  1294. // resolve(menusArr)
  1295. // }
  1296. if (level === 1) {
  1297. menusArr = [
  1298. {
  1299. icon: "add-circle",
  1300. label: "自定义节点(水利工程)",
  1301. key: "add1",
  1302. },
  1303. {
  1304. icon: "add-circle",
  1305. label: "自定义节点(数字化文件)",
  1306. key: "add2",
  1307. },
  1308. ];
  1309. resolve(menusArr);
  1310. } else {
  1311. resolve(menusArr);
  1312. }
  1313. };
  1314. //编辑节点
  1315. const editNodeModal = ref(false);
  1316. const formEditNodeRef = ref(null);
  1317. const formEditNodeModel = ref({});
  1318. const formEditNodeRules = {
  1319. title: {
  1320. required: true,
  1321. trigger: "blur",
  1322. message: "请输入节点名称",
  1323. },
  1324. };
  1325. const editNodeLoading = ref(false);
  1326. //保存编辑节点数据
  1327. const editNodeClick = async () => {
  1328. const validate = await formValidate(formEditNodeRef.value);
  1329. if (validate) {
  1330. //发起请求
  1331. editNodeLoading.value = true;
  1332. const {
  1333. primaryKeyId,
  1334. title,
  1335. partitionCode,
  1336. className,
  1337. unitName,
  1338. excellentNum,
  1339. unitNum,
  1340. digitizeTime
  1341. } = formEditNodeModel.value;
  1342. const { error, code, msg } = await wbsApi.wbsTreeUpdateNode({
  1343. nodeName: title || "",
  1344. pKeyId: primaryKeyId || "",
  1345. partitionCode: partitionCode || "",
  1346. className,
  1347. unitName,
  1348. unitNum,
  1349. excellentNum,
  1350. digitizeTime
  1351. });
  1352. //处理数据
  1353. editNodeLoading.value = false;
  1354. if (!error && code === 200) {
  1355. window?.$message?.success("修改成功");
  1356. treeItemInfo.value["title"] = title || "";
  1357. treeItemInfo.value["partitionCode"] = partitionCode || "";
  1358. editNodeModal.value = false;
  1359. window?.location?.reload(); //刷新页面
  1360. } else {
  1361. window?.$message?.error(msg || "操作失败");
  1362. }
  1363. }
  1364. };
  1365. //复制节点
  1366. const copyNodeModal = ref(false);
  1367. //复制节点类型tab数据和相关处理
  1368. const copyNodeTabKey = ref("1");
  1369. const copyNodeTab = ref([
  1370. { key: "1", name: "单份复制" },
  1371. { key: "2", name: "多份复制" },
  1372. // {key: '3', name: '复制数据'}
  1373. ]);
  1374. const copyNodeTabChange = (key) => {
  1375. if (key !== copyNodeTabKey.value) {
  1376. copyNodeTabKey.value = key;
  1377. copyNodeTable.value = [];
  1378. copyNodeLoading.value = false;
  1379. }
  1380. };
  1381. //复制节点变量
  1382. const copyNodeLoading = ref(false);
  1383. const formCopyNodeModel = ref({});
  1384. const copyNodeTable = ref([]);
  1385. const classifyList = ref([]);
  1386. const isCopyData = ref(0);
  1387. //复制树被点击
  1388. //复制树被点击
  1389. const copyNodeElTreeClick = ({ data, node }) => {
  1390. const TabKey = copyNodeTabKey.value;
  1391. const { title, type, partitionCode } = formCopyNodeModel.value;
  1392. if (TabKey === "2") {
  1393. // setCopyNodeTable(data, title, partitionCode)
  1394. //1 单位工程,2 分部工程,3 子分部工程,4 分项工程, 5 子分项工程,6 工序
  1395. // //不能复制到本身节点下
  1396. // //只能往上一级点击,不能跨层级点击
  1397. // //已上报的工序节点不能点击选择
  1398. // //如果选择的是父级节点,那不能复制到子级节点
  1399. const { hasChildren } = data;
  1400. if (hasChildren === 0) {
  1401. if (
  1402. data["colorStatus"] === 2 ||
  1403. data["colorStatus"] == 1 ||
  1404. data["colorStatus"] === null ||
  1405. data["colorStatus"] === -1
  1406. ) {
  1407. //已上报的工序不能点击
  1408. if (data["id"] !== formCopyNodeModel.value.id) {
  1409. //不能复制到本身节点下
  1410. //只能往上一级点击,不能跨层级点击
  1411. //如果选择的是父级节点,那不能复制到子级节点
  1412. if (
  1413. type === 6 &&
  1414. (data["type"] === 4 ||
  1415. data["type"] === 5 ||
  1416. data["type"] == 6)
  1417. ) {
  1418. setCopyNodeTable(data, title);
  1419. }
  1420. if (type === 5 && data["type"] === 4) {
  1421. setCopyNodeTable(data, title, partitionCode);
  1422. }
  1423. if (
  1424. type === 4 &&
  1425. (data["type"] === 2 || data["type"] === 3)
  1426. ) {
  1427. setCopyNodeTable(data, title, partitionCode);
  1428. }
  1429. if (type === 3 && data["type"] === 2) {
  1430. setCopyNodeTable(data, title, partitionCode);
  1431. }
  1432. if (type === 2 && data["type"] === 1) {
  1433. setCopyNodeTable(data, title, partitionCode);
  1434. }
  1435. if (type === 1 && data["type"] === 1) {
  1436. setCopyNodeTable(data, title, partitionCode);
  1437. }
  1438. }
  1439. } else {
  1440. window?.$message?.warning("该节点已存在上报数据,不允许复制");
  1441. }
  1442. } else {
  1443. if (data["id"] !== formCopyNodeModel.value.id) {
  1444. //不能复制到本身节点下
  1445. //只能往上一级点击,不能跨层级点击
  1446. //如果选择的是父级节点,那不能复制到子级节点
  1447. if (
  1448. type === 6 &&
  1449. (data["type"] === 4 ||
  1450. data["type"] === 5 ||
  1451. data["type"] == 6)
  1452. ) {
  1453. setCopyNodeTable(data, title);
  1454. }
  1455. if (type === 5 && data["type"] === 4) {
  1456. setCopyNodeTable(data, title, partitionCode);
  1457. }
  1458. if (type === 4 && (data["type"] === 2 || data["type"] === 3)) {
  1459. setCopyNodeTable(data, title, partitionCode);
  1460. }
  1461. if (type === 3 && data["type"] === 2) {
  1462. setCopyNodeTable(data, title, partitionCode);
  1463. }
  1464. if (type === 2 && data["type"] === 1) {
  1465. setCopyNodeTable(data, title, partitionCode);
  1466. }
  1467. if (type === 1 && data["type"] === 1) {
  1468. setCopyNodeTable(data, title, partitionCode);
  1469. }
  1470. }
  1471. }
  1472. } else if (TabKey === "3") {
  1473. console.log(1111111);
  1474. setCopyNodeTable(data, data?.title);
  1475. }
  1476. };
  1477. const setCopyNodeTable = (data, title) => {
  1478. copyNodeTable.value.push({
  1479. title: data?.title || "",
  1480. nodeName: title || "",
  1481. primaryKeyId: data?.primaryKeyId || "",
  1482. parentId: data?.parentId || "",
  1483. id: data?.id || "",
  1484. });
  1485. };
  1486. //节点表单
  1487. const formCopyNodeModelRef = ref(null);
  1488. const formCopyNodeModelRules = {
  1489. title: {
  1490. required: true,
  1491. trigger: "blur",
  1492. message: "请输入节点名称",
  1493. },
  1494. };
  1495. //表格节点表单
  1496. const copyNodeTableRef = ref(null);
  1497. const copyNodeTableRules = {
  1498. nodeName: {
  1499. required: true,
  1500. trigger: "blur",
  1501. message: "请输入节点名称",
  1502. },
  1503. };
  1504. //删除选中的节点
  1505. const copyNodeTableDel = (index) => {
  1506. copyNodeTable.value.splice(index, 1);
  1507. };
  1508. //复制节点
  1509. //复制节点
  1510. const copyNodeClick = async () => {
  1511. const type = copyNodeTabKey.value;
  1512. const form = formCopyNodeModel.value;
  1513. const table = copyNodeTable.value;
  1514. let classify = "";
  1515. let arr = [];
  1516. if (classifyList.value.length > 0) {
  1517. classifyList.value.forEach((item) => {
  1518. if (item === "施工") {
  1519. arr.push(1);
  1520. } else if (item === "监理") {
  1521. arr.push(2);
  1522. }
  1523. });
  1524. classify = arr.join(",");
  1525. }
  1526. //isSameNode 是否同节点 1=同节点,0=跨节点
  1527. if (table.length > 0) {
  1528. table.forEach((ele) => {
  1529. if (
  1530. ele.parentId === formCopyNodeModel.value.parentId ||
  1531. ele.id === formCopyNodeModel.value.parentId
  1532. ) {
  1533. ele.isSameNode = 1;
  1534. } else {
  1535. ele.isSameNode = 0;
  1536. }
  1537. });
  1538. }
  1539. if (isCopyData.value === 1) {
  1540. if (classify) {
  1541. //效验数据
  1542. if (type === "1") {
  1543. const validate = await formValidate(formCopyNodeModelRef.value);
  1544. if (validate)
  1545. await copyContractTreeNode(type, form, [], classify);
  1546. } else if (type === "2") {
  1547. if (table.length > 0) {
  1548. const validate = await formValidate(copyNodeTableRef.value);
  1549. if (validate)
  1550. await copyContractTreeNode(type, form, table, classify);
  1551. } else {
  1552. window?.$message?.warning("请先在左侧选择要复制到的节点");
  1553. }
  1554. }
  1555. } else {
  1556. window?.$message?.warning("请选择所属方");
  1557. }
  1558. } else {
  1559. if (type === "1") {
  1560. const validate = await formValidate(formCopyNodeModelRef.value);
  1561. if (validate) await copyContractTreeNode(type, form, [], classify);
  1562. } else if (type === "2") {
  1563. if (table.length > 0) {
  1564. const validate = await formValidate(copyNodeTableRef.value);
  1565. if (validate)
  1566. await copyContractTreeNode(type, form, table, classify);
  1567. } else {
  1568. window?.$message?.warning("请先在左侧选择要复制到的节点");
  1569. }
  1570. }
  1571. }
  1572. };
  1573. const copyContractTreeNode = async (type, form, table, classify) => {
  1574. copyNodeLoading.value = true;
  1575. if (type === "1") {
  1576. const { error, code, msg } = await wbsApi.copyContractTreeNode({
  1577. copyType: type,
  1578. needCopyNodeName: form?.title || "",
  1579. partitionCode: form?.partitionCode || "",
  1580. needCopyPrimaryKeyId: form?.primaryKeyId || "",
  1581. parentPrimaryKeyId: form?.parent?.primaryKeyId || "",
  1582. copyBatchToPaths: table,
  1583. classifyType: classify,
  1584. isCopyData: isCopyData.value,
  1585. });
  1586. //判断状态
  1587. copyNodeLoading.value = false;
  1588. if (!error && code === 200) {
  1589. window?.$message?.success("复制成功");
  1590. copyNodeModal.value = false;
  1591. window?.location?.reload(); //刷新页面
  1592. } else {
  1593. window?.$message?.error(msg || "操作失败");
  1594. }
  1595. } else {
  1596. const { error, code, msg } = await wbsApi.copyContractTreeNode({
  1597. copyType: type,
  1598. needCopyNodeName: form?.title || "",
  1599. needCopyPrimaryKeyId: form?.primaryKeyId || "",
  1600. parentPrimaryKeyId: form?.parent?.primaryKeyId || "",
  1601. copyBatchToPaths: table,
  1602. classifyType: classify,
  1603. isCopyData: isCopyData.value,
  1604. });
  1605. //判断状态
  1606. copyNodeLoading.value = false;
  1607. if (!error && code === 200) {
  1608. window?.$message?.success("复制成功");
  1609. copyNodeModal.value = false;
  1610. window?.location?.reload(); //刷新页面
  1611. } else {
  1612. window?.$message?.error(msg || "操作失败");
  1613. }
  1614. }
  1615. };
  1616. //复制数据
  1617. const copyContractNodeSubmitBusinessData = async (form, table, classify) => {
  1618. copyNodeLoading.value = true;
  1619. const { error, code, msg } =
  1620. await wbsApi.copyContractNodeSubmitBusinessData({
  1621. needCopyPrimaryKeyId: form?.primaryKeyId || "",
  1622. copyBatchToPaths: table,
  1623. classify: classify,
  1624. });
  1625. //判断状态
  1626. copyNodeLoading.value = false;
  1627. if (!error && code === 200) {
  1628. window?.$message?.success("复制成功");
  1629. copyNodeModal.value = false;
  1630. window?.location?.reload(); //刷新页面
  1631. } else {
  1632. window?.$message?.error(msg || "操作失败");
  1633. }
  1634. };
  1635. //新增节点
  1636. const addNodeModal = ref(false);
  1637. const addTreeNodeId = ref("");
  1638. const addTreeNodeOldId = ref("");
  1639. const addTreeNodeType = ref("1");
  1640. const isCustom = ref(null);
  1641. //新增自定义节点
  1642. const addNodeModalCus = ref(false);
  1643. const addNodeLoadingCus = ref(false);
  1644. const nodeNameinput = ref("");
  1645. const formWaterNodeRef = ref(null);
  1646. const formWaterNodeModel = ref({
  1647. nodeName: "",
  1648. nodeType: null,
  1649. });
  1650. const formWaterNodeRules = {
  1651. nodeName: {
  1652. required: true,
  1653. trigger: "blur",
  1654. message: "请输入节点名称",
  1655. },
  1656. nodeType: {
  1657. required: true,
  1658. trigger: "blur",
  1659. message: "请选择节点类型",
  1660. },
  1661. };
  1662. //选中的节点
  1663. const allSelectedList = ref([]);
  1664. const halfSelectedList = ref([]);
  1665. const addTreeNodeCheckChange = (nodes) => {
  1666. let NodesArr = [],
  1667. halfArr = [];
  1668. //全选数据
  1669. const keys = nodes.checkedNodes || [];
  1670. for (let i = 0; i < keys.length; i++) {
  1671. NodesArr.push({
  1672. nodeName: keys[i].nodeName,
  1673. primaryKeyId: keys[i].pKeyId,
  1674. isPeer: keys[i].isPeer || 2,
  1675. });
  1676. }
  1677. allSelectedList.value = NodesArr;
  1678. //半选数据
  1679. const halfNodes = nodes.halfCheckedNodes || [];
  1680. for (let i = 0; i < halfNodes.length; i++) {
  1681. halfArr.push({
  1682. nodeName: halfNodes[i].nodeName,
  1683. primaryKeyId: halfNodes[i].pKeyId,
  1684. isPeer: halfNodes[i].isPeer || 2,
  1685. });
  1686. }
  1687. halfSelectedList.value = halfArr;
  1688. };
  1689. //新增节点
  1690. const addNodeLoading = ref(false);
  1691. const addNodeClick = async () => {
  1692. const keys = allSelectedList.value || [];
  1693. if (keys.length <= 0) {
  1694. window?.$message?.warning("请先选择节点");
  1695. } else {
  1696. //发起请求
  1697. addNodeLoading.value = true;
  1698. const primaryKeyId = treeItemInfo.value?.primaryKeyId || "";
  1699. const { error, code, msg } = await wbsApi.saveContractTreeNode({
  1700. projectId: projectId.value,
  1701. contractId: contractId.value,
  1702. saveType: addTreeNodeType.value,
  1703. allSelectedList: allSelectedList.value,
  1704. halfSelectedList: halfSelectedList.value,
  1705. currentNodePrimaryKeyId: primaryKeyId,
  1706. });
  1707. //判断状态
  1708. addNodeLoading.value = false;
  1709. if (!error && code === 200) {
  1710. window?.$message?.success("新增成功");
  1711. addNodeModal.value = false;
  1712. window?.location?.reload(); //刷新页面
  1713. } else {
  1714. window?.$message?.error(msg || "操作失败");
  1715. }
  1716. }
  1717. };
  1718. const addNodeClickCur = async () => {
  1719. const validate = await formValidate(formWaterNodeRef.value);
  1720. if (!validate) return;
  1721. //发起请求
  1722. addNodeLoadingCus.value = true;
  1723. const { error, code, msg } = await wbsApi.saveCustomAddContractNode({
  1724. nodeName: formWaterNodeModel.value.nodeName,
  1725. nodeType: formWaterNodeModel.value?.nodeType || "",
  1726. partitionCode: treeItemInfo.value?.partitionCode || "",
  1727. primaryKeyId: treeItemInfo.value?.primaryKeyId || "",
  1728. nodeClass: 1, //1水利化工程,2数字化文件
  1729. });
  1730. //判断状态
  1731. addNodeLoadingCus.value = false;
  1732. if (!error && code === 200) {
  1733. window?.$message?.success("新增成功");
  1734. addNodeModalCus.value = false;
  1735. window?.location?.reload(); //刷新页面
  1736. } else {
  1737. window?.$message?.error(msg || "操作失败");
  1738. }
  1739. };
  1740. //新增自定义节点-数字化文件
  1741. const addNodeModalData = ref(false);
  1742. const addNodeLoadingData = ref(false);
  1743. const formDataNodeRef = ref(null);
  1744. const formDataNodeModel = ref({
  1745. nodeName: "",
  1746. nodeType: null,
  1747. isClassifition: 0,
  1748. className: "",
  1749. unitName: "",
  1750. unitNum: 1,
  1751. excellentNum: 1,
  1752. digitizeTime: "",
  1753. });
  1754. const standardTypeOptions = ref([]);
  1755. const getStandardTypeOptions = async () => {
  1756. const { data } = await getDictionary({
  1757. code: "classification",
  1758. });
  1759. standardTypeOptions.value = await getDictionaryData(
  1760. "classification",
  1761. false
  1762. );
  1763. standardTypeOptions.value.forEach((element) => {
  1764. // element.parentId=
  1765. data.forEach((ele) => {
  1766. if (ele.dictKey == element.value) {
  1767. element.id = ele.id;
  1768. }
  1769. });
  1770. });
  1771. // 定义要过滤的 dictKey 值
  1772. const targetKeys = [1, 2, 3, 4, 5];
  1773. // 过滤数组
  1774. standardTypeOptions.value = standardTypeOptions.value.filter((item) =>
  1775. targetKeys.includes(item.value)
  1776. );
  1777. };
  1778. const unitNameOptions = ref([]);
  1779. const changeStandType = async (val) => {
  1780. if (val !== orString.value) {
  1781. formEditNodeModel.value.unitName = "";
  1782. }
  1783. formDataNodeModel.value.unitName = "";
  1784. let parentId = "";
  1785. standardTypeOptions.value.forEach((item) => {
  1786. if (item.value == val) {
  1787. parentId = item.id;
  1788. }
  1789. });
  1790. const { data } = await getChildList({ current: 1, size: 10000, parentId });
  1791. unitNameOptions.value = data;
  1792. unitNameOptions.value = unitNameOptions.value.filter(
  1793. (item) => item.dictKey != -1
  1794. );
  1795. unitNameOptions.value.forEach((ele) => {
  1796. ele.dictKey = Number(ele.dictKey);
  1797. });
  1798. };
  1799. const formDataNodeRules = {
  1800. nodeName: {
  1801. required: true,
  1802. trigger: "blur",
  1803. message: "请输入节点名称",
  1804. },
  1805. nodeType: {
  1806. required: true,
  1807. trigger: "blur",
  1808. message: "请选择节点类型",
  1809. },
  1810. isClassifition: {
  1811. required: true,
  1812. trigger: "blur",
  1813. message: "请选择是否含单元评定",
  1814. },
  1815. className: {
  1816. required: true,
  1817. trigger: "blur",
  1818. message: "请选择标准分类",
  1819. },
  1820. unitName: {
  1821. required: true,
  1822. trigger: "blur",
  1823. message: "请选择单位名称",
  1824. },
  1825. excellentNum: {
  1826. required: true,
  1827. trigger: "blur",
  1828. message: "请输入优良个数",
  1829. },
  1830. unitNum: {
  1831. required: true,
  1832. trigger: "blur",
  1833. message: "请输入单元个数",
  1834. },
  1835. digitizeTime: {
  1836. required: true,
  1837. trigger: "blur",
  1838. message: "请选择时间",
  1839. },
  1840. };
  1841. const addNodeClickData = async () => {
  1842. const validate = await formValidate(formDataNodeRef.value);
  1843. if (!validate) return;
  1844. //发起请求
  1845. addNodeLoadingData.value = true;
  1846. const { error, code, msg } = await wbsApi.saveCustomAddContractNode({
  1847. nodeName: formDataNodeModel.value.nodeName,
  1848. nodeType: formDataNodeModel.value?.nodeType || "",
  1849. partitionCode: treeItemInfo.value?.partitionCode || "",
  1850. primaryKeyId: treeItemInfo.value?.primaryKeyId || "",
  1851. nodeClass: 2, //数字化文件
  1852. isClassifition: formDataNodeModel.value?.isClassifition || 0,
  1853. className: formDataNodeModel.value?.className || "",
  1854. unitName: Number(formDataNodeModel.value?.unitName) || "",
  1855. excellentNum: formDataNodeModel.value?.excellentNum || 0,
  1856. unitNum: formDataNodeModel.value?.unitNum || 0,
  1857. digitizeTime: formDataNodeModel.value?.digitizeTime || 0,
  1858. });
  1859. //判断状态
  1860. addNodeLoadingData.value = false;
  1861. if (!error && code === 200) {
  1862. window?.$message?.success("新增成功");
  1863. addNodeModalData.value = false;
  1864. window?.location?.reload(); //刷新页面
  1865. } else {
  1866. window?.$message?.error(msg);
  1867. }
  1868. };
  1869. //删除节点
  1870. const delModalClick = () => {
  1871. HcDelMsg(async (resolve) => {
  1872. await removeContractTreeNode();
  1873. resolve(); //关闭弹窗的回调
  1874. });
  1875. };
  1876. const removeContractTreeNode = async () => {
  1877. const loadingInstance = window.$loading.service({
  1878. fullscreen: true,
  1879. text: "删除节点中,请耐心等待...",
  1880. background: "rgba(0, 0, 0, 0.7)",
  1881. });
  1882. const { error, code, msg } = await wbsApi.removeContractTreeNode({
  1883. ids: treeItemInfo.value?.primaryKeyId || "",
  1884. });
  1885. loadingInstance.close();
  1886. if (!error && code === 200) {
  1887. window?.$message?.success("删除成功");
  1888. window?.location?.reload(); //刷新页面
  1889. } else {
  1890. window?.$message?.error(msg || "操作失败");
  1891. }
  1892. };
  1893. //调整排序
  1894. const sortNodeModal = ref(false);
  1895. const sortNodeLoading = ref(false);
  1896. const sortNodeData = ref([]);
  1897. const sortNodeDrag = ref(false);
  1898. //向下
  1899. const downSortClick = (index) => {
  1900. const indexs = index + 1;
  1901. const data = sortNodeData.value || [];
  1902. if (indexs !== data.length) {
  1903. const tmp = data.splice(indexs, 1);
  1904. sortNodeData.value.splice(index, 0, tmp[0]);
  1905. } else {
  1906. window?.$message?.warning("已经处于置底,无法下移");
  1907. }
  1908. };
  1909. //向上
  1910. const upSortClick = (index) => {
  1911. const data = sortNodeData.value || [];
  1912. if (index !== 0) {
  1913. const tmp = data.splice(index - 1, 1);
  1914. sortNodeData.value.splice(index, 0, tmp[0]);
  1915. } else {
  1916. window?.$message?.warning("已经处于置顶,无法上移");
  1917. }
  1918. };
  1919. //确认排序
  1920. const sortNodeClick = async () => {
  1921. const sortList = [];
  1922. const nodes = sortNodeData.value || [];
  1923. nodes.forEach((item) => {
  1924. sortList.push(item?.id);
  1925. });
  1926. //发起请求
  1927. sortNodeLoading.value = true;
  1928. const { error, code, msg } = await wbsApi.diySortTreeNode({ sortList });
  1929. sortNodeLoading.value = false;
  1930. //判断状态
  1931. if (!error && code === 200) {
  1932. window?.$message?.success("保存成功");
  1933. sortNodeModal.value = false;
  1934. window?.location?.reload(); //刷新页面
  1935. } else {
  1936. window?.$message?.error(msg || "操作失败");
  1937. }
  1938. };
  1939. //导入模板
  1940. const uploadRef = ref(null);
  1941. const importTempModal = ref(false);
  1942. const toImportTempClick = () => {
  1943. importTempModal.value = true;
  1944. getContractInfoTreeApi();
  1945. };
  1946. //导入类型
  1947. const importRadio = ref(1);
  1948. const importRadioData = ref([
  1949. { key: 1, name: "路基工程" },
  1950. { key: 2, name: "路面工程" },
  1951. { key: 3, name: "桥梁工程" },
  1952. { key: 4, name: "机电工程" },
  1953. { key: 5, name: "绿化工程" },
  1954. { key: 6, name: "隧道工程" },
  1955. { key: 7, name: "声屏障工程" },
  1956. { key: 8, name: "交通与安全工程" },
  1957. { key: 9, name: "特大斜拉桥、特大悬索桥" },
  1958. ]);
  1959. const isSplicingNumber = ref(0);
  1960. //上传文件被改变
  1961. const uploadFile = ref(null);
  1962. const uploadChange = (file) => {
  1963. uploadFile.value = file;
  1964. };
  1965. //上传中
  1966. const uploadLoading = ref(false);
  1967. const uploadprogress = (state) => {
  1968. console.log(state);
  1969. uploadLoading.value = state;
  1970. };
  1971. //上传完成
  1972. const matchedData = ref([]);
  1973. const unmatchedData = ref([]);
  1974. const uploadFinished = ({ type, data }) => {
  1975. uploadRef.value?.clearFiles();
  1976. if (type === "success") {
  1977. uploadFile.value = null;
  1978. window?.$message?.success("导入成功");
  1979. matchedData.value = getArrValue(data["matchedData"]);
  1980. unmatchedData.value = getArrValue(data["unmatchedData"]);
  1981. } else {
  1982. uploadFile.value = null;
  1983. matchedData.value = [];
  1984. unmatchedData.value = [];
  1985. }
  1986. };
  1987. //关闭导入弹窗
  1988. const importTempModalClose = () => {
  1989. uploadFile.value = null;
  1990. importTempModal.value = false;
  1991. };
  1992. //确认导入
  1993. const importTempFolder = () => {
  1994. if (uploadFile.value) {
  1995. uploadRef.value?.submit();
  1996. } else {
  1997. window?.$message?.warning("请先选择文件");
  1998. }
  1999. };
  2000. //关联被点击
  2001. const relationModal = ref(false);
  2002. const relationItemInfo = ref({});
  2003. const unmatchedTreeTap = ({ data }) => {
  2004. relationItemInfo.value = data;
  2005. relationModal.value = true;
  2006. };
  2007. //获取导入树
  2008. const unmatchedTreeData = ref([]);
  2009. const getContractInfoTreeApi = async () => {
  2010. const { error, code, data } = await divisionApi.getContractInfoTree({
  2011. projectId: projectId.value,
  2012. contractId: contractId.value,
  2013. wbsId: "",
  2014. });
  2015. //判断状态
  2016. if (!error && code === 200) {
  2017. unmatchedTreeData.value = getArrValue(data);
  2018. } else {
  2019. unmatchedTreeData.value = [];
  2020. }
  2021. };
  2022. //关联树
  2023. const divisionTreeItemInfo = ref({});
  2024. const divisionTreeClick = ({ data }) => {
  2025. divisionTreeItemInfo.value = data;
  2026. };
  2027. //确认关联
  2028. const relationLoading = ref(false);
  2029. const relationSaveClick = () => {
  2030. const item = relationItemInfo.value;
  2031. const info = divisionTreeItemInfo.value;
  2032. const primaryKeyId = info?.primaryKeyId ?? "";
  2033. if (!primaryKeyId) {
  2034. window?.$message?.warning("请先选择一个树节点");
  2035. } else {
  2036. setImportRelationApi({
  2037. pKeyIdOld: info?.primaryKeyId,
  2038. wbsTreeContractVO: {
  2039. ...item,
  2040. id: "",
  2041. },
  2042. });
  2043. }
  2044. };
  2045. const setImportRelationApi = async (form) => {
  2046. relationLoading.value = true;
  2047. const { error, code } = await divisionApi.setImportRelation(form);
  2048. relationLoading.value = false;
  2049. if (!error && code === 200) {
  2050. window.$message?.success("关联成功");
  2051. relationModal.value = false;
  2052. }
  2053. };
  2054. //下载模板
  2055. const downloadXlsx = () => {
  2056. window.open(
  2057. "https://blade-oss-chongqing.oss-cn-shenzhen.aliyuncs.com/upload/20221017/854463fdfdf90843e6783fbcb4d7d00c.xlsx",
  2058. "_blank"
  2059. );
  2060. };
  2061. //返回上页
  2062. const toBackClick = () => {
  2063. router.push({ path: "/data-fill/wbs" });
  2064. };
  2065. //添加独立表单
  2066. const addingFormModal = ref(false);
  2067. const addingFormClick = () => {
  2068. const { isLeaf } = treeNodeInfo.value;
  2069. if (isLeaf) {
  2070. addingFormLoading.value = false;
  2071. addingFormModal.value = true;
  2072. dialogTableData.value = [];
  2073. dialogTableRef.value?.clearSelection();
  2074. selectItems.value = [];
  2075. } else {
  2076. window?.$message?.warning("请先选择一个最子级的节点");
  2077. }
  2078. };
  2079. //删除当前节点用表
  2080. const deltableexcel = async (row) => {
  2081. console.log(row, "row");
  2082. if (row["isEle"] === 1) {
  2083. if (row["pdfUrl"]) {
  2084. window?.$messageBox?.alert(
  2085. "该表已填写数据" + ",请谨慎考虑后,确认是否需要删除?",
  2086. "删除",
  2087. {
  2088. showCancelButton: true,
  2089. confirmButtonText: "确认删除",
  2090. cancelButtonText: "取消",
  2091. callback: async (action) => {
  2092. if (action === "confirm") {
  2093. const { error, code, msg } =
  2094. await divisionApi.removeWbsTreeContract({
  2095. id: row.pkeyId,
  2096. stats: 0,
  2097. });
  2098. if (!error && code === 200) {
  2099. window?.$message?.success("删除成功");
  2100. // window?.location?.reload() //刷新页面
  2101. searchNodeAllTableApi(
  2102. treeItemInfo.value["primaryKeyId"]
  2103. );
  2104. } else {
  2105. window?.$message?.error(msg || "操作失败");
  2106. }
  2107. }
  2108. },
  2109. }
  2110. );
  2111. } else {
  2112. const { error, code, msg } =
  2113. await divisionApi.removeWbsTreeContract({
  2114. id: row.pkeyId,
  2115. stats: 0,
  2116. });
  2117. if (!error && code === 200) {
  2118. window?.$message?.success("删除成功");
  2119. searchNodeAllTableApi(treeItemInfo.value["primaryKeyId"]);
  2120. // window?.location?.reload() //刷新页面
  2121. } else {
  2122. window?.$message?.error(msg || "操作失败");
  2123. }
  2124. }
  2125. } else {
  2126. window?.$message?.warning("该表不允许删除");
  2127. }
  2128. };
  2129. //树配置
  2130. const addingFormTreeRef = ref(null);
  2131. const addingFormTreeProps = {
  2132. label: "title",
  2133. children: "children",
  2134. isLeaf: "isLeaf",
  2135. };
  2136. //树加载
  2137. const addingFormTreeLoadNode = async (node, resolve) => {
  2138. if (node.level === 0) {
  2139. const resData = await tabTypeLazyTree();
  2140. resolve(resData?.data);
  2141. } else {
  2142. const resData = await tabTypeLazyTree(
  2143. node?.data?.primaryKeyId,
  2144. "",
  2145. false,
  2146. {
  2147. current: 1,
  2148. size: 2000,
  2149. }
  2150. );
  2151. resolve(resData?.data);
  2152. }
  2153. };
  2154. //树被点击
  2155. const addingFormTreeItem = ref({});
  2156. const selectItems = ref([]);
  2157. const selectItem = ref({});
  2158. const selectIds = ref([]);
  2159. const addingFormTreeClick = async (data, node) => {
  2160. searchTreeTitle.value = "";
  2161. addingFormTreeItem.value = data;
  2162. dialogTableData.value = [];
  2163. searchFormPage.value.current = 1;
  2164. console.log(
  2165. addingFormTreeItem.value.primaryKeyId,
  2166. "addingFormTreeItem.value"
  2167. );
  2168. if (node?.level === 1) {
  2169. getDialogTableData().then();
  2170. } else if (node?.level === 2) {
  2171. searchFormPage.value.total = 1;
  2172. dialogTableData.value = [data];
  2173. nextTick(() => {
  2174. dialogTableRef.value?.toggleRowSelection(data, true);
  2175. });
  2176. selectItems.value.push(data);
  2177. }
  2178. };
  2179. //搜索
  2180. const searchTreeTitle = ref("");
  2181. const querySearchTree = async (key, resolve) => {
  2182. if (key) {
  2183. const primaryKeyId = addingFormTreeItem.value?.primaryKeyId ?? "";
  2184. const size = 100000;
  2185. const { data } = await divisionApi.tabTypeLazyTree({
  2186. projectId: projectId.value,
  2187. contractId: contractId.value,
  2188. titleName: key,
  2189. current: 1,
  2190. size: 10000,
  2191. });
  2192. resolve(data?.records);
  2193. } else {
  2194. resolve([]);
  2195. }
  2196. };
  2197. const searchTreeSelect = (item) => {
  2198. console.log("searchTreeSelect");
  2199. dialogTableRef.value?.clearSelection();
  2200. dialogTableKeys.value = [];
  2201. dialogTableData.value = [item];
  2202. selectItems.value = [item];
  2203. nextTick(() => {
  2204. dialogTableRef.value?.toggleRowSelection(item, true);
  2205. });
  2206. searchFormPage.value.current = 1;
  2207. searchFormPage.value.total = 0;
  2208. };
  2209. //分页
  2210. const searchFormPage = ref({ current: 1, size: 20, total: 0 });
  2211. const searchFormPageChange = ({ current, size }) => {
  2212. searchFormPage.value.current = current;
  2213. searchFormPage.value.size = size;
  2214. getDialogTableData();
  2215. };
  2216. //表格数据
  2217. const dialogTableRef = ref(null);
  2218. const dialogTableColumn = ref([
  2219. { key: "title", name: "表单名称" },
  2220. { key: "tabType", name: "元素表类型" },
  2221. { key: "elementTotal", name: "元素总量" },
  2222. { key: "tabOwner", name: "所属方" },
  2223. { key: "fillRate", name: "填报率" },
  2224. ]);
  2225. const dialogTableData = ref([]);
  2226. const dialogTableLoading = ref(false);
  2227. const getDialogTableData = async () => {
  2228. //处理初始数据
  2229. dialogTableLoading.value = true;
  2230. dialogTableRef.value?.clearSelection();
  2231. dialogTableKeys.value = [];
  2232. const primaryKeyId = addingFormTreeItem.value?.primaryKeyId ?? "";
  2233. const searchTitle = searchTreeTitle.value ?? "";
  2234. //获取数据
  2235. const resData = await tabTypeLazyTree(
  2236. primaryKeyId,
  2237. searchTitle,
  2238. true,
  2239. true
  2240. );
  2241. const records = getArrValue(resData?.data);
  2242. //处理返回的数据
  2243. dialogTableData.value = records;
  2244. dialogTableLoading.value = false;
  2245. if (records.length > 0) {
  2246. searchFormPage.value.total = resData.total || 0;
  2247. //表格勾选回显
  2248. selectItems.value.forEach((item) => {
  2249. dialogTableData.value.forEach((item1) => {
  2250. if (item.id === item1.id) {
  2251. nextTick(() => {
  2252. dialogTableRef.value?.toggleRowSelection(item1, true);
  2253. });
  2254. }
  2255. });
  2256. });
  2257. } else {
  2258. searchFormPage.value.total = 0;
  2259. }
  2260. };
  2261. //多选
  2262. const dialogTableKeys = ref([]);
  2263. // 全选
  2264. const dialogTableSelectAll = (rows) => {
  2265. if (rows.length) {
  2266. /* 全选 */
  2267. if (selectItems.value.length <= 0) {
  2268. rows.forEach((row) => {
  2269. selectItems.value.push(row);
  2270. });
  2271. } else {
  2272. rows.forEach((row) => {
  2273. const flag = selectItems.value.filter((e) => e.id === row.id);
  2274. if (flag.length <= 0) {
  2275. selectItems.value.push(row);
  2276. }
  2277. });
  2278. }
  2279. } else {
  2280. /* 反选-清空当前列表数据 */
  2281. dialogTableData.value.forEach((row) => {
  2282. // 取消选中时过滤
  2283. selectItems.value = selectItems.value.filter(
  2284. (e) => e.id !== row.id
  2285. );
  2286. });
  2287. }
  2288. };
  2289. const dialogTableSelect = ({ selection, row }) => {
  2290. dialogTableKeys.value = selection;
  2291. const flag = selectItems.value.filter((e) => e.id === row.id);
  2292. if (flag.length <= 0) {
  2293. /* 不存在表示是选中,勾选时添加 */
  2294. selectItems.value.push(row);
  2295. } else {
  2296. // 取消选中时过滤
  2297. selectItems.value = selectItems.value.filter((e) => e.id !== row.id);
  2298. }
  2299. console.log(selectItems.value, "dialogTableSelect selectItems");
  2300. };
  2301. //获取数据
  2302. const tabTypeLazyTree = async (
  2303. parentId = "12345678910",
  2304. titleName = "",
  2305. search = false,
  2306. form = {},
  2307. size
  2308. ) => {
  2309. let obj = {},
  2310. searchObj = {};
  2311. if (parentId) obj.parentId = parentId;
  2312. if (titleName) obj.titleName = titleName;
  2313. if (search) searchObj = searchFormPage.value;
  2314. //发起请求
  2315. const { data } = await divisionApi.tabTypeLazyTree({
  2316. projectId: projectId.value,
  2317. contractId: contractId.value,
  2318. ...obj,
  2319. ...searchObj,
  2320. ...form,
  2321. });
  2322. const records = getArrValue(data?.records);
  2323. records.forEach((item) => {
  2324. item.isLeaf = !item.hasChildren;
  2325. });
  2326. return { data: records, total: data?.total };
  2327. };
  2328. //保存
  2329. const addingFormLoading = ref(false);
  2330. const addingFormSave = async () => {
  2331. // const rows = dialogTableKeys.value
  2332. console.log(dialogTableKeys.value, "addingFormSave");
  2333. const rows = selectItems.value;
  2334. console.log(rows, "rows");
  2335. if (rows.length > 0) {
  2336. addingFormLoading.value = true;
  2337. const { primaryKeyId } = treeItemInfo.value;
  2338. const ids = arrToId(rows, "primaryKeyId");
  2339. const arrids = ids.split(",");
  2340. let newStr = [...new Set(arrids)].join(",");
  2341. // console.log(newStr,'ids');
  2342. //发起请求
  2343. const { error, code } = await divisionApi.addWbsContractInfo({
  2344. projectId: projectId.value,
  2345. contractId: contractId.value,
  2346. nodeId: primaryKeyId,
  2347. primaryKeyIds: newStr,
  2348. // primaryKeyIds: ids
  2349. });
  2350. //处理结果
  2351. addingFormLoading.value = false;
  2352. if (!error && code === 200) {
  2353. window.$message?.success("操作成功");
  2354. addingFormModal.value = false;
  2355. // window?.location?.reload() //刷新页面
  2356. searchNodeAllTableApi(treeItemInfo.value["primaryKeyId"]);
  2357. }
  2358. } else {
  2359. window.$message?.warning("请先勾选数据");
  2360. }
  2361. };
  2362. //关闭
  2363. const addingFormClose = () => {
  2364. addingFormModal.value = false;
  2365. dialogTableKeys.value = [];
  2366. };
  2367. //左右拖动,改变树形结构宽度
  2368. const leftWidth = ref(382);
  2369. const onmousedown = () => {
  2370. const leftNum = isCollapse.value ? 142 : 272;
  2371. document.onmousemove = (ve) => {
  2372. let diffVal = ve.clientX - leftNum;
  2373. if (diffVal >= 310 && diffVal <= 900) {
  2374. leftWidth.value = diffVal;
  2375. }
  2376. };
  2377. document.onmouseup = () => {
  2378. document.onmousemove = null;
  2379. document.onmouseup = null;
  2380. };
  2381. };
  2382. </script>
  2383. <style lang="scss" scoped>
  2384. @import "../../styles/data-fill/division.scss";
  2385. </style>