division.vue 96 KB

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