partitioning.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <template>
  2. <hc-dialog v-model="isShow" widths="500px" is-footer-center is-table title="关联试验划分树" @close="dialogClose">
  3. <el-alert :closable="false" title="勾选试验划分节点,被勾选的节点数据将会汇总到当前台账分类中" type="warning" />
  4. <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" label-width="auto" class="mt-14px">
  5. <el-form-item label="项目名称:" prop="pid">
  6. <el-select v-model="formModel.pid" filterable block placeholder="请选择项目" @change="formNameChange">
  7. <el-option v-for="item in projectData" :key="item.id" :label="item.projectName" :value="item.id" />
  8. </el-select>
  9. </el-form-item>
  10. <el-form-item label="树搜索关键词:">
  11. <hc-search-input v-model="filterText" placeholder="输入关键字搜索" />
  12. </el-form-item>
  13. <el-form-item label="树数据:">
  14. <hc-data-tree ref="treeRef" :h-props="treeProps" show-checkbox :datas="treeData" :search-val="filterText" :default-checked-keys="defaultCheckedKeys">
  15. <template #name="{ data }">
  16. <span class="text-16px font-400">{{ data.title }}</span>
  17. </template>
  18. </hc-data-tree>
  19. </el-form-item>
  20. </el-form>
  21. <template #footer>
  22. <el-button hc-btn @click="dialogClose">取消</el-button>
  23. <el-button hc-btn type="primary" :loading="submitLoading" @click="dialogSubmit">提交</el-button>
  24. </template>
  25. </hc-dialog>
  26. </template>
  27. <script setup>
  28. import { ref, watch } from 'vue'
  29. import { formValidate, getArrValue, isNullES } from 'js-fast-way'
  30. import projectApi from '~api/project/project'
  31. import mainApi from '~api/desk/test-collect'
  32. const props = defineProps({
  33. data: {
  34. type: Object,
  35. default: () => ({}),
  36. },
  37. })
  38. //事件
  39. const emit = defineEmits(['close', 'finish'])
  40. //双向绑定
  41. // eslint-disable-next-line no-undef
  42. const isShow = defineModel('modelValue', {
  43. default: false,
  44. })
  45. const defaultCheckedKeys = ref([])
  46. //监听可否编辑
  47. const dataInfo = ref(props.data)
  48. watch(() => props.data, (data) => {
  49. dataInfo.value = data
  50. console.log( dataInfo.value, ' dataInfo.value')
  51. }, { immediate: true, deep: true })
  52. //监听显示
  53. watch(isShow, () =>{
  54. getDataApi()
  55. const { trialTreeIds } = dataInfo.value
  56. if (isShow.value && trialTreeIds) {
  57. defaultCheckedKeys.value = trialTreeIds.split(',')
  58. }
  59. })
  60. const getDataApi = () => {
  61. console.log(dataInfo.value)
  62. getProjectData()
  63. }
  64. //项目列表
  65. const projectData = ref([])
  66. const getProjectData = async () => {
  67. const { data } = await projectApi.page({
  68. current: 1, size: 9999,
  69. })
  70. projectData.value = getArrValue(data?.records)
  71. }
  72. //项目列表被选择
  73. const formNameChange = () => {
  74. const item = projectData.value.find(item=>item.id === formModel.value?.pid)
  75. const pid = !isNullES(item) ? item.referenceWbsTemplateIdTrial : null
  76. getTreeData(formModel.value?.pid, pid)
  77. }
  78. //表单
  79. const formRef = ref(null)
  80. const formModel = ref({})
  81. const formRules = {
  82. pid: { required: true, trigger: 'blur', message: '请选择项目' },
  83. }
  84. //获取树数据
  85. const treeData = ref([])
  86. const getTreeData = async (id, pid) => {
  87. const { data } = await projectApi.findProjectTree({ projectId: id, wbsId: pid })
  88. treeData.value = getArrValue(data)
  89. }
  90. //树配置
  91. const treeRef = ref(null)
  92. const filterText = ref('')
  93. const treeProps = {
  94. label: 'title',
  95. children: 'children',
  96. isLeaf: (item) => {
  97. let tag = false
  98. if (!item.hasChildren) {
  99. tag = true
  100. }
  101. if (Number(item.isExistForm) === 1) {
  102. tag = true
  103. }
  104. return tag
  105. },
  106. }
  107. //提交表单
  108. const submitLoading = ref(false)
  109. const dialogSubmit = async () => {
  110. const isForm = await formValidate(formRef.value)
  111. if (!isForm) return
  112. const checkIds = treeRef.value?.treeRef?.getCheckedKeys()
  113. if (checkIds.length <= 0) {
  114. window.$message.warning('请先勾选关联的树节点')
  115. return
  116. }
  117. submitLoading.value = true
  118. let ids = checkIds.join(',')
  119. const { isRes } = await mainApi.matching({
  120. classId: dataInfo.value.id,
  121. ids: ids,
  122. })
  123. submitLoading.value = false
  124. if (!isRes) return
  125. window.$message.success('操作成功')
  126. dialogClose()
  127. emit('finish')
  128. }
  129. //关闭弹窗
  130. const dialogClose = () => {
  131. isShow.value = false
  132. submitLoading.value = false
  133. formModel.value.pid = ''
  134. projectData.value = []
  135. defaultCheckedKeys.value = []
  136. emit('close')
  137. }
  138. </script>