node-param-dialog.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. <template>
  2. <hc-dialog
  3. v-model="isShow"
  4. is-footer-center
  5. title=" 节点参数"
  6. widths="56rem"
  7. :loading="submitLoading"
  8. @close="dialogClose"
  9. @save="saveElementHandle"
  10. >
  11. <hc-card-item>
  12. <template #extra>
  13. <el-button size="small" type="primary" @click="addRowClick">
  14. 新增
  15. </el-button>
  16. <el-button
  17. size="small"
  18. type="warning"
  19. :loading="refreshLoad"
  20. @click="refreshNode"
  21. >
  22. 刷新
  23. </el-button>
  24. <el-button
  25. size="small"
  26. type="success"
  27. @click="setParamNameClick"
  28. >
  29. 设置参数名称
  30. </el-button>
  31. </template>
  32. <hc-table
  33. :column="tableColumn"
  34. :datas="tableData"
  35. :loading="tableLoading"
  36. >
  37. <template #name="{ row, index }">
  38. <el-select
  39. v-model="row.k"
  40. placeholder="请选择"
  41. filterable
  42. block
  43. >
  44. <el-option
  45. v-for="item in nameList"
  46. :key="item.k"
  47. :label="item.name"
  48. :value="item.k"
  49. />
  50. </el-select>
  51. </template>
  52. <template #v="{ row, index }">
  53. <hc-table-input v-model="row.v" />
  54. </template>
  55. <template #remark="{ row, index }">
  56. <hc-table-input v-model="row.remark" />
  57. </template>
  58. <template #action="{ row, index }">
  59. <el-link type="warning" @click="linkElement(row)">
  60. 关联元素
  61. </el-link>
  62. <el-link type="danger" @click="delRowClick(index, row)">
  63. 删除
  64. </el-link>
  65. </template>
  66. </hc-table>
  67. </hc-card-item>
  68. <!-- 设置参数名称 -->
  69. <hc-dialog
  70. v-model="setNameShow"
  71. is-footer-center
  72. title=" 设置参数名称"
  73. widths="56rem"
  74. :loading="setNameLoading"
  75. @close="nameClosedialogClose"
  76. @save="saveNameHandle"
  77. >
  78. <hc-card-item>
  79. <template #extra>
  80. <el-button
  81. size="small"
  82. type="primary"
  83. @click="addNameRowClick"
  84. >
  85. 新增
  86. </el-button>
  87. </template>
  88. <hc-table
  89. :column="nameTableColumn"
  90. :datas="nameTableData"
  91. :loading="nameTableLoading"
  92. >
  93. <template #name="{ row, index }">
  94. <hc-table-input v-model="row.name" />
  95. </template>
  96. <template #k="{ row, index }">
  97. <hc-table-input v-model="row.k" />
  98. </template>
  99. <template #remark="{ row, index }">
  100. <hc-table-input v-model="row.remark" />
  101. </template>
  102. <template #action="{ row, index }">
  103. <el-link type="danger" @click="delNameClick(row, index)">
  104. 删除
  105. </el-link>
  106. </template>
  107. </hc-table>
  108. </hc-card-item>
  109. </hc-dialog>
  110. <!-- 关联元素 -->
  111. <hc-dialog
  112. v-model="linkParamShow"
  113. title=" 节点参数设置-关联元素"
  114. widths="56rem"
  115. :footer="false"
  116. @close="linkParamdialogClose"
  117. >
  118. <hc-card-item>
  119. <hc-table
  120. :column="linkTableColumn"
  121. :datas="linkTableData"
  122. :loading="linkTableLoading"
  123. >
  124. <template #action="{ row, index }">
  125. <el-link
  126. v-if="!row.mappingId"
  127. type="primary"
  128. @click="chooseClick(row, index)"
  129. >
  130. 选择元素
  131. </el-link>
  132. <el-link
  133. v-else
  134. type="danger"
  135. :loading="delLinkLoading"
  136. @click="delLinkClick(row, index)"
  137. >
  138. 删除关联
  139. </el-link>
  140. </template>
  141. </hc-table>
  142. </hc-card-item>
  143. </hc-dialog>
  144. <!-- 选择关联元素 -->
  145. <hc-dialog
  146. v-model="chooseLinkShow"
  147. title=" 选择关联元素"
  148. widths="56rem"
  149. :loading="saveLoading"
  150. @close="linkShowClose"
  151. @save="saveLink"
  152. >
  153. <hc-card-item>
  154. <hc-search-input
  155. v-model="queryValue"
  156. class="mb-4"
  157. @search="searchClick"
  158. @clear="searchClick"
  159. />
  160. <hc-table
  161. :column="chooseLinkTableColumn"
  162. :datas="chooseLinkTableData"
  163. :loading="chooselinkTableLoading"
  164. >
  165. <template #action="{ row, index }">
  166. <el-checkbox
  167. v-model="row.checked"
  168. @change="(value) => linkEleCheck(value, index)"
  169. />
  170. </template>
  171. </hc-table>
  172. </hc-card-item>
  173. </hc-dialog>
  174. </hc-dialog>
  175. </template>
  176. <script setup>
  177. import { ref, watch } from 'vue'
  178. import mainWbsApi from '~api/wbs/wbsforelement'
  179. import mainApi from '~api/wbs/tree'
  180. import { getArrValue } from 'js-fast-way'
  181. import { HcDelMsg } from 'hc-vue3-ui'
  182. const props = defineProps({
  183. nodeId: {
  184. type: String,
  185. default: '',
  186. },
  187. projectId: {
  188. type: String,
  189. default: '',
  190. },
  191. scopeType: {
  192. type: [String, Number],
  193. default: '',
  194. },
  195. nodeInfo: {
  196. type: Object,
  197. default: () => {},
  198. },
  199. })
  200. //事件
  201. const emit = defineEmits(['close'])
  202. //双向绑定
  203. // eslint-disable-next-line no-undef
  204. const isShow = defineModel('modelValue', {
  205. default: false,
  206. })
  207. //监听显示
  208. watch(isShow, (val) => {
  209. if (val) {
  210. getTableData()
  211. getNameList()
  212. } else {
  213. emit('close')
  214. }
  215. })
  216. const nodeId = ref(props.nodeId)
  217. const projectId = ref(props.projectId)
  218. const scopeType = ref(props.scopeType)
  219. const nodeInfo = ref(props.nodeInfo)
  220. const delIds = ref([])
  221. //监听数据
  222. watch(
  223. () => [props.nodeId, props.projectId, props.scopeType, props.nodeInfo],
  224. ([tid, pid, stype, ninfo]) => {
  225. nodeId.value = tid
  226. projectId.value = pid
  227. scopeType.value = stype
  228. nodeInfo.value = ninfo
  229. },
  230. { deep: true },
  231. )
  232. //关闭弹窗
  233. const dialogClose = () => {
  234. isShow.value = false
  235. emit('close')
  236. }
  237. const submitLoading = ref(false)
  238. const saveElementHandle = async () => {
  239. let pid = nodeInfo.value.primaryKeyId
  240. ? nodeInfo.value.primaryKeyId
  241. : nodeInfo.value.pKeyId
  242. let tag = true
  243. tableData.value.forEach((val) => {
  244. if (!val.k | !val.v) {
  245. return (tag = false)
  246. }
  247. for (let i = 0; i < nameList.value.length; i++) {
  248. if (nameList.value[i].k == val.k) {
  249. val.name = nameList.value[i].name
  250. return
  251. }
  252. }
  253. })
  254. if (tag) {
  255. submitLoading.value = true
  256. const { error, code, data } = await mainApi.saveOrUpdateBatch({
  257. scopeType: scopeType.value,
  258. projectId: projectId.value,
  259. nodeId: projectId.value ? pid : nodeId.value,
  260. wps: tableData.value,
  261. type: 1,
  262. delIds: delIds.value,
  263. })
  264. submitLoading.value = false
  265. //判断状态
  266. if (!error && code === 200) {
  267. window.$message.success('设置参数节点成功')
  268. delIds.value = []
  269. getTableData()
  270. }
  271. } else {
  272. window.$message.warning('请填写所有的参数名称和参数值KEY')
  273. }
  274. }
  275. const tableColumn = [
  276. { key: 'name', name: '参数名称', align: 'center' },
  277. { key: 'v', name: '参数值KEY', align: 'center' },
  278. { key: 'remark', name: '描述', align: 'center' },
  279. { key: 'action', name: '操作', align: 'center' },
  280. ]
  281. const tableLoading = ref(false)
  282. const tableData = ref([])
  283. const getTableData = async () => {
  284. let pid = nodeInfo.value.primaryKeyId
  285. ? nodeInfo.value.primaryKeyId
  286. : nodeInfo.value.pKeyId
  287. tableLoading.value = true
  288. const { data } = await mainApi.parameters({
  289. wbsId: projectId.value ? pid : nodeId.value,
  290. })
  291. tableData.value = getArrValue(data)
  292. tableLoading.value = false
  293. }
  294. const nameList = ref([])
  295. const getNameList = async () => {
  296. const { data } = await mainApi.keymap({})
  297. nameList.value = getArrValue(data)
  298. }
  299. const addRowClick = () => {
  300. let pid = nodeInfo.value.primaryKeyId
  301. ? nodeInfo.value.primaryKeyId
  302. : nodeInfo.value.pKeyId
  303. tableData.value.unshift({
  304. k: '',
  305. v: '',
  306. remark: '',
  307. nodeId: projectId.value ? pid : nodeId.value,
  308. type: 1,
  309. })
  310. }
  311. const delRowClick = (index, row) => {
  312. delIds.value.push(row.id)
  313. tableData.value.splice(index, 1)
  314. }
  315. //设置节点参数名称
  316. const setNameShow = ref(false)
  317. const nameTableData = ref([])
  318. const setParamNameClick = async () => {
  319. setNameShow.value = true
  320. await getNameList()
  321. nameTableData.value = [...nameList.value]
  322. }
  323. const nameClosedialogClose = () => {}
  324. const setNameLoading = ref(false)
  325. const saveNameHandle = async () => {
  326. //设置参数名称中的保存按钮
  327. if (nameTableData.value.length) {
  328. let tag = true
  329. nameTableData.value.forEach((val) => {
  330. if (!val.name || !val.k) {
  331. return (tag = false)
  332. }
  333. })
  334. if (tag) {
  335. setNameLoading.value = true
  336. const { error, code, data } = await mainApi.saveOrUpdateBatch({
  337. scopeType: scopeType.value,
  338. nodeId: nodeId.value,
  339. projectId: projectId.value,
  340. wps: nameTableData.value,
  341. type: 0,
  342. delIds: delIds.value,
  343. })
  344. setNameLoading.value = false
  345. //判断状态
  346. if (!error && code === 200) {
  347. window.$message.success('操作成功')
  348. setNameShow.value = false
  349. delIds.value = []
  350. getNameList()
  351. getTableData()
  352. }
  353. } else {
  354. window.$message.warning('请填写所有的参数名称和参数值KEY')
  355. }
  356. } else {
  357. window.$message.warning('请先添加参数')
  358. }
  359. }
  360. const nameTableColumn = [
  361. { key: 'name', name: '参数名称', align: 'center' },
  362. { key: 'k', name: '参数值KEY', align: 'center' },
  363. { key: 'remark', name: '描述', align: 'center' },
  364. { key: 'action', name: '操作', align: 'center' },
  365. ]
  366. const nameTableLoading = ref(false)
  367. const addNameRowClick = () => {
  368. nameTableData.value.unshift({
  369. name: '',
  370. remark: '',
  371. k: '',
  372. type: 0,
  373. nodeId: nodeId.value,
  374. })
  375. }
  376. const delNameClick = (row, index) => {
  377. delIds.value.push(row.id)
  378. nameTableData.value.splice(index, 1)
  379. }
  380. //关联元素
  381. const linkTableColumn = [
  382. { key: 'tableName', name: '元素表名', align: 'center' },
  383. { key: 'elementName', name: '关联元素字段', align: 'center' },
  384. { key: 'action', name: '操作', align: 'center' },
  385. ]
  386. const linkTableData = ref([])
  387. const linkTableLoading = ref(false)
  388. const curParam = ref({})
  389. const linkParamShow = ref(false)
  390. const getLinkTableData = async () => {
  391. const { error, code, data } = await mainApi.getParamElements({
  392. nodeId: nodeId.value,
  393. projectId: projectId.value,
  394. paramId: curParam.value.id,
  395. scopeType: scopeType.value,
  396. })
  397. //判断状态
  398. if (!error && code === 200) {
  399. linkTableData.value = getArrValue(data)
  400. }
  401. }
  402. const linkElement = async (row) => {
  403. if (!row.id) {
  404. window.$message.warning('请先保存数据,再点击关联元素')
  405. } else {
  406. curParam.value = row
  407. linkParamShow.value = true
  408. getLinkTableData(row)
  409. }
  410. }
  411. const linkParamdialogClose = () => {
  412. linkParamShow.value = false
  413. }
  414. //选择元素
  415. const chooseLinkShow = ref(false)
  416. const chooseLinkTableData = ref([])
  417. const chooselinkTableLoading = ref(false)
  418. const getChooseData = async (id) => {
  419. let pid = nodeInfo.value.primaryKeyId
  420. ? nodeInfo.value.primaryKeyId
  421. : nodeInfo.value.pKeyId
  422. chooselinkTableLoading.value = true
  423. const { error, code, data } = await mainApi.selectFormElements({
  424. nodeId: projectId.value ? pid : nodeId.value,
  425. id: id,
  426. type: projectId.value ? 3 : 5,
  427. })
  428. chooselinkTableLoading.value = false
  429. //判断状态
  430. if (!error && code === 200) {
  431. chooseLinkTableData.value = getArrValue(data)
  432. }
  433. }
  434. const chooseId = ref('')
  435. const chooseClick = (row) => {
  436. chooseLinkShow.value = true
  437. chooseId.value = row.id
  438. getChooseData(row.id)
  439. }
  440. const linkShowClose = () => {}
  441. const chooseLinkTableColumn = [
  442. { key: 'eName', name: '元素名', align: 'center' },
  443. { key: 'action', name: '操作', align: 'center' },
  444. ]
  445. const queryValue = ref('')
  446. const searchClick = () => {
  447. if (queryValue.value.length > 0) {
  448. chooseLinkTableData.value = chooseLinkTableData.value.filter((ele) => {
  449. return ele.eName.indexOf(queryValue.value) > -1
  450. })
  451. } else {
  452. getChooseData(chooseId.value)
  453. }
  454. }
  455. const linkEleCheck = (value, index) => {
  456. if (value) {
  457. chooseLinkTableData.value.forEach((ele, i) => {
  458. if (i != index) {
  459. ele.checked = false
  460. }
  461. })
  462. }
  463. }
  464. const saveLoading = ref(false)
  465. const saveLink = async () => {
  466. let target = {}
  467. chooseLinkTableData.value.forEach((ele) => {
  468. if (ele.checked === true) {
  469. target = { elementId: ele.id, paramId: curParam.value.id }
  470. }
  471. })
  472. saveLoading.value = true
  473. const { error, code, data, msg } = await mainApi.specifiedParamElements(
  474. target,
  475. )
  476. saveLoading.value = false
  477. //判断状态
  478. if (!error && code === 200) {
  479. window.$message.success(msg)
  480. chooseLinkShow.value = false
  481. getLinkTableData()
  482. }
  483. }
  484. const delLinkLoading = ref(false)
  485. const delLinkClick = (row) => {
  486. HcDelMsg(async (resolve) => {
  487. //发起请求
  488. delLinkLoading.value = true
  489. const { isRes } = await mainApi.delParamElements(row)
  490. resolve() //关闭弹窗
  491. if (!isRes) return
  492. window.$message.success('删除成功')
  493. getLinkTableData()
  494. })
  495. }
  496. //刷新
  497. const refreshLoad = ref(false)
  498. const refreshNode = async () => {
  499. refreshLoad.value = true
  500. const { error, code, data, msg } = await mainApi.refrehPram({
  501. type: projectId.value ? 1 : 0,
  502. nodeId: nodeId.value,
  503. projectId: projectId.value,
  504. })
  505. refreshLoad.value = false
  506. //判断状态
  507. if (!error && code === 200) {
  508. window.$message.success(msg)
  509. }
  510. }
  511. </script>