index.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <template>
  2. <hc-drawer v-model="isShow" ui="hc-element-recognition-drawer" to-id="hc-layout-box" is-close @close="drawerClose">
  3. <hc-page-split :options="{ sizes: [14, 60, 26], minSize: [50, 300, 100] }" class="hc-element-recognition">
  4. <template #left>
  5. <hc-card scrollbar>
  6. <template #header>
  7. <hc-search-input v-model="searchTreeName" placeholder="请输入关键字" @search="searchTreeNameClick" />
  8. </template>
  9. <template v-if="isTreeMode === 1">
  10. <hc-lazy-tree v-if="isShow" :h-props="treeProps" tree-key="id" @load="treeLoadNode" @node-tap="treeNodeTap">
  11. <template #name="{ data }">
  12. <span class="text-16px font-400">{{ data.name }}</span>
  13. </template>
  14. </hc-lazy-tree>
  15. </template>
  16. <template v-if="isTreeMode === 2">
  17. <hc-data-tree ref="treeRef" :h-props="treeProps" tree-key="id" :datas="treeData" @node-tap="treeNodeTap">
  18. <template #name="{ data }">
  19. <span class="text-16px font-400">{{ data.name }}</span>
  20. </template>
  21. </hc-data-tree>
  22. </template>
  23. </hc-card>
  24. </template>
  25. <hc-card :title="`【元素识别】${isNullES(nodeInfo.name) ? '表名称' : nodeInfo.name}`">
  26. <hc-table-form ref="excelRef" :html="excelHtml" @tap="excelClick" />
  27. </hc-card>
  28. <template #right>
  29. <hc-card>
  30. <template #header>
  31. <el-button color="#2550A2" size="small" class="text-white">关联WBS并创建元素</el-button>
  32. <el-button color="#FF986A" size="small" class="text-white">添加到元素库</el-button>
  33. <!-- el-button color="#567722" size="small" class="text-white">元素匹配</el-button>
  34. <el-button color="#67C23B" size="small" class="text-white">调整表单</el-button -->
  35. </template>
  36. <template #extra>
  37. <el-button type="primary" size="small" @click="addColByTab">新增</el-button>
  38. </template>
  39. <hc-table ref="tabRef" :column="tableColumn" :datas="tableData" :index-style="{ width: 60 }" @row-click="tableRowClick">
  40. <template #textInfo="{ row }">
  41. <hc-table-input v-model="row.textInfo" />
  42. </template>
  43. <template #textElementType="{ row }">
  44. <el-select v-model="row.textElementType" filterable block>
  45. <el-option v-for="item in dataType" :key="item.value" :label="item.label" :value="item.value" />
  46. </el-select>
  47. </template>
  48. <template #textDeviation="{ row }">
  49. <hc-table-input v-model="row.textDeviation" />
  50. </template>
  51. <template #action="{ row }">
  52. <el-link type="warning" @click="saveRowClick(row)">保存</el-link>
  53. <el-link type="danger" @click="delRowClick(row)">删除</el-link>
  54. </template>
  55. </hc-table>
  56. </hc-card>
  57. </template>
  58. </hc-page-split>
  59. <!-- 添加新元素字段 -->
  60. <HcAddColTab v-model="addColTabShow" :info="addColTabInfo" @finish="getTableData" />
  61. </hc-drawer>
  62. </template>
  63. <script setup>
  64. import { HcDelMsg } from 'hc-vue3-ui'
  65. import { ref, watch } from 'vue'
  66. import { getArrValue, isNullES, isString } from 'js-fast-way'
  67. import { getDictionaryData } from '~uti/tools'
  68. import HcAddColTab from './add-col-tab.vue'
  69. import mainApi from '~api/exctab/exceltab'
  70. const props = defineProps({
  71. data: {
  72. type: Object,
  73. default: () => ({}),
  74. },
  75. })
  76. //事件
  77. const emit = defineEmits(['close'])
  78. //双向绑定
  79. const isShow = defineModel('modelValue', {
  80. default: false,
  81. })
  82. //监听数据
  83. const dataInfo = ref(props.data)
  84. watch(() => props.data, (data) => {
  85. dataInfo.value = data
  86. }, { immediate: true, deep: true })
  87. //监听显示
  88. watch(isShow, (val) => {
  89. if (val) getDataApi()
  90. })
  91. //处理相关数据
  92. const getDataApi = () => {
  93. console.log(dataInfo.value)
  94. }
  95. //树搜索
  96. const isTreeMode = ref(1) //1懒加载,2全加载
  97. const searchTreeName = ref('')
  98. const searchTreeNameClick = async () => {
  99. if (isNullES(searchTreeName.value)) {
  100. isTreeMode.value = 1
  101. } else {
  102. isTreeMode.value = 2
  103. await getTreeAllData()
  104. treeRef.value?.treeRef?.filter(searchTreeName.value)
  105. }
  106. }
  107. //树配置
  108. const treeRef = ref(null)
  109. const treeProps = {
  110. label: 'name',
  111. children: 'children',
  112. isLeaf: (item) => {
  113. return !item.hasChildren
  114. },
  115. }
  116. //全加载树
  117. const treeData = ref([])
  118. const getTreeAllData = async () => {
  119. const { data } = await mainApi.tabLazyTreeAll({
  120. modeId: dataInfo.value.id,
  121. name: '',
  122. })
  123. treeData.value = getArrValue(data)
  124. }
  125. //懒加载树
  126. const treeLoadNode = async ({ item, level }, resolve) => {
  127. const parentId = level === 0 ? 0 : item.id
  128. const { data } = await mainApi.tabLazyTree({
  129. parentId: parentId,
  130. modeId: dataInfo.value.id,
  131. })
  132. resolve(getArrValue(data))
  133. }
  134. //树节点被点击
  135. const nodeInfo = ref({})
  136. const treeNodeTap = async ({ data }) => {
  137. nodeInfo.value = data
  138. if (data.fileType !== 3) {
  139. return
  140. }
  141. await getExcelHtmlCol(data.id)
  142. getDataType().then()
  143. await getTableData()
  144. }
  145. //获取excel模板
  146. const getExcelHtmlCol = async (id) => {
  147. const { error, code, data } = await mainApi.getExcelHtmlCol({ id })
  148. const resData = isString(data) ? data || '' : ''
  149. if (!error && code === 200 && resData) {
  150. excelHtml.value = resData
  151. } else {
  152. excelHtml.value = ''
  153. }
  154. }
  155. //excel模板
  156. const excelRef = ref(null)
  157. const excelHtml = ref('')
  158. //获取元素类型
  159. const dataType = ref([])
  160. const getDataType = async () => {
  161. dataType.value = await getDictionaryData('data_type')
  162. }
  163. //元素表格
  164. const tabRef = ref(null)
  165. const tableColumn = [
  166. { key: 'textInfo', name: '元素名称' },
  167. { key: 'textElementType', name: '数据类型' },
  168. { key: 'textDeviation', name: '允许偏差值' },
  169. { key: 'action', name: '操作', width: 90, align: 'center' },
  170. ]
  171. const tableData = ref([])
  172. const getTableData = async () => {
  173. const { data } = await mainApi.getColByTabId({
  174. tabId: nodeInfo.value.id,
  175. })
  176. tableData.value = getArrValue(data)
  177. }
  178. //框框被点击
  179. const excelClick = async (item) => {
  180. const arr = tableData.value
  181. let key = item.target.getAttribute('data-index')
  182. for (let i = 0; i < arr.length; i++) {
  183. let xys = isNullES(arr[i].xys) ? [] : arr[i].xys.split(',')
  184. if (xys.indexOf(key) > -1) {
  185. tabRef.value?.tableRef?.setCurrentRow(arr[i])
  186. await tableScrollToRow(i)
  187. break
  188. }
  189. }
  190. }
  191. //滚动到表格某一行
  192. const tableScrollToRow = async (index) => {
  193. const table = tabRef.value?.tableRef.$el
  194. const row = table.querySelectorAll('.el-table__row')[index]
  195. tabRef.value?.tableRef?.setScrollTop(row.offsetTop)
  196. }
  197. //表格的某一行被点击
  198. const tableRowClick = ({ row }) => {
  199. let xys = isNullES(row.xys) ? [] : row.xys.split(',')
  200. excelRef.value?.setSelect(xys)
  201. }
  202. //保存元素表格
  203. const saveRowClick = async (row) => {
  204. if (isNullES(row.textInfo)) {
  205. window?.$message.warning('请填写元素名称')
  206. return
  207. }
  208. const { isRes } = await mainApi.saveColByTabId(row)
  209. if (!isRes) return
  210. window.$message.success('保存成功')
  211. }
  212. //删除元素表格
  213. const delRowClick = (row) => {
  214. HcDelMsg(async (resolve) => {
  215. const { isRes } = await mainApi.delColByTabId(row.id)
  216. resolve() //关闭弹窗的回调
  217. if (!isRes) return
  218. window.$message.success('删除成功')
  219. getTableData().then()
  220. })
  221. }
  222. //添加新元素字段
  223. const addColTabShow = ref(false)
  224. const addColTabInfo = ref({})
  225. const addColByTab = () => {
  226. addColTabInfo.value = nodeInfo.value
  227. addColTabShow.value = true
  228. }
  229. //关闭抽屉
  230. const drawerClose = () => {
  231. isShow.value = false
  232. dataInfo.value = {}
  233. emit('close')
  234. }
  235. </script>
  236. <style scoped lang="scss">
  237. </style>
  238. <style lang="scss">
  239. .el-overlay .el-drawer.hc-element-recognition-drawer {
  240. background-color: #F1F5F8;
  241. .tree-line .el-tree__empty-block {
  242. min-width: unset;
  243. }
  244. }
  245. </style>