123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- <template>
- <hc-drawer v-model="isShow" ui="hc-element-recognition-drawer" to-id="hc-layout-box" is-close @close="drawerClose">
- <hc-page-split :options="{ sizes: [14, 60, 26], minSize: [50, 300, 100] }" class="hc-element-recognition">
- <template #left>
- <hc-card scrollbar>
- <template #header>
- <hc-search-input v-model="searchTreeName" placeholder="请输入关键字" @search="searchTreeNameClick" />
- </template>
- <template v-if="isTreeMode === 1">
- <hc-lazy-tree v-if="isShow" :h-props="treeProps" tree-key="id" @load="treeLoadNode" @node-tap="treeNodeTap">
- <template #name="{ data }">
- <span class="text-16px font-400">{{ data.name }}</span>
- </template>
- </hc-lazy-tree>
- </template>
- <template v-if="isTreeMode === 2">
- <hc-data-tree ref="treeRef" :h-props="treeProps" tree-key="id" :datas="treeData" @node-tap="treeNodeTap">
- <template #name="{ data }">
- <span class="text-16px font-400">{{ data.name }}</span>
- </template>
- </hc-data-tree>
- </template>
- </hc-card>
- </template>
- <hc-card :title="`【元素识别】${isNullES(nodeInfo.name) ? '表名称' : nodeInfo.name}`">
- <hc-table-form ref="excelRef" :html="excelHtml" @tap="excelClick" />
- </hc-card>
- <template #right>
- <hc-card>
- <template #header>
- <el-button color="#2550A2" size="small" class="text-white">关联WBS并创建元素</el-button>
- <el-button color="#FF986A" size="small" class="text-white">添加到元素库</el-button>
- <!-- el-button color="#567722" size="small" class="text-white">元素匹配</el-button>
- <el-button color="#67C23B" size="small" class="text-white">调整表单</el-button -->
- </template>
- <template #extra>
- <el-button type="primary" size="small" @click="addColByTab">新增</el-button>
- </template>
- <hc-table ref="tabRef" :column="tableColumn" :datas="tableData" :index-style="{ width: 60 }" @row-click="tableRowClick">
- <template #textInfo="{ row }">
- <hc-table-input v-model="row.textInfo" />
- </template>
- <template #textElementType="{ row }">
- <el-select v-model="row.textElementType" filterable block>
- <el-option v-for="item in dataType" :key="item.value" :label="item.label" :value="item.value" />
- </el-select>
- </template>
- <template #textDeviation="{ row }">
- <hc-table-input v-model="row.textDeviation" />
- </template>
- <template #action="{ row }">
- <el-link type="warning" @click="saveRowClick(row)">保存</el-link>
- <el-link type="danger" @click="delRowClick(row)">删除</el-link>
- </template>
- </hc-table>
- </hc-card>
- </template>
- </hc-page-split>
- <!-- 添加新元素字段 -->
- <HcAddColTab v-model="addColTabShow" :info="addColTabInfo" @finish="getTableData" />
- </hc-drawer>
- </template>
- <script setup>
- import { HcDelMsg } from 'hc-vue3-ui'
- import { ref, watch } from 'vue'
- import { getArrValue, isNullES, isString } from 'js-fast-way'
- import { getDictionaryData } from '~uti/tools'
- import HcAddColTab from './add-col-tab.vue'
- import mainApi from '~api/exctab/exceltab'
- const props = defineProps({
- data: {
- type: Object,
- default: () => ({}),
- },
- })
- //事件
- const emit = defineEmits(['close'])
- //双向绑定
- const isShow = defineModel('modelValue', {
- default: false,
- })
- //监听数据
- const dataInfo = ref(props.data)
- watch(() => props.data, (data) => {
- dataInfo.value = data
- }, { immediate: true, deep: true })
- //监听显示
- watch(isShow, (val) => {
- if (val) getDataApi()
- })
- //处理相关数据
- const getDataApi = () => {
- console.log(dataInfo.value)
- }
- //树搜索
- const isTreeMode = ref(1) //1懒加载,2全加载
- const searchTreeName = ref('')
- const searchTreeNameClick = async () => {
- if (isNullES(searchTreeName.value)) {
- isTreeMode.value = 1
- } else {
- isTreeMode.value = 2
- await getTreeAllData()
- treeRef.value?.treeRef?.filter(searchTreeName.value)
- }
- }
- //树配置
- const treeRef = ref(null)
- const treeProps = {
- label: 'name',
- children: 'children',
- isLeaf: (item) => {
- return !item.hasChildren
- },
- }
- //全加载树
- const treeData = ref([])
- const getTreeAllData = async () => {
- const { data } = await mainApi.tabLazyTreeAll({
- modeId: dataInfo.value.id,
- name: '',
- })
- treeData.value = getArrValue(data)
- }
- //懒加载树
- const treeLoadNode = async ({ item, level }, resolve) => {
- const parentId = level === 0 ? 0 : item.id
- const { data } = await mainApi.tabLazyTree({
- parentId: parentId,
- modeId: dataInfo.value.id,
- })
- resolve(getArrValue(data))
- }
- //树节点被点击
- const nodeInfo = ref({})
- const treeNodeTap = async ({ data }) => {
- nodeInfo.value = data
- if (data.fileType !== 3) {
- return
- }
- await getExcelHtmlCol(data.id)
- getDataType().then()
- await getTableData()
- }
- //获取excel模板
- const getExcelHtmlCol = async (id) => {
- const { error, code, data } = await mainApi.getExcelHtmlCol({ id })
- const resData = isString(data) ? data || '' : ''
- if (!error && code === 200 && resData) {
- excelHtml.value = resData
- } else {
- excelHtml.value = ''
- }
- }
- //excel模板
- const excelRef = ref(null)
- const excelHtml = ref('')
- //获取元素类型
- const dataType = ref([])
- const getDataType = async () => {
- dataType.value = await getDictionaryData('data_type')
- }
- //元素表格
- const tabRef = ref(null)
- const tableColumn = [
- { key: 'textInfo', name: '元素名称' },
- { key: 'textElementType', name: '数据类型' },
- { key: 'textDeviation', name: '允许偏差值' },
- { key: 'action', name: '操作', width: 90, align: 'center' },
- ]
- const tableData = ref([])
- const getTableData = async () => {
- const { data } = await mainApi.getColByTabId({
- tabId: nodeInfo.value.id,
- })
- tableData.value = getArrValue(data)
- }
- //框框被点击
- const excelClick = async (item) => {
- const arr = tableData.value
- let key = item.target.getAttribute('data-index')
- for (let i = 0; i < arr.length; i++) {
- let xys = isNullES(arr[i].xys) ? [] : arr[i].xys.split(',')
- if (xys.indexOf(key) > -1) {
- tabRef.value?.tableRef?.setCurrentRow(arr[i])
- await tableScrollToRow(i)
- break
- }
- }
- }
- //滚动到表格某一行
- const tableScrollToRow = async (index) => {
- const table = tabRef.value?.tableRef.$el
- const row = table.querySelectorAll('.el-table__row')[index]
- tabRef.value?.tableRef?.setScrollTop(row.offsetTop)
- }
- //表格的某一行被点击
- const tableRowClick = ({ row }) => {
- let xys = isNullES(row.xys) ? [] : row.xys.split(',')
- excelRef.value?.setSelect(xys)
- }
- //保存元素表格
- const saveRowClick = async (row) => {
- if (isNullES(row.textInfo)) {
- window?.$message.warning('请填写元素名称')
- return
- }
- const { isRes } = await mainApi.saveColByTabId(row)
- if (!isRes) return
- window.$message.success('保存成功')
- }
- //删除元素表格
- const delRowClick = (row) => {
- HcDelMsg(async (resolve) => {
- const { isRes } = await mainApi.delColByTabId(row.id)
- resolve() //关闭弹窗的回调
- if (!isRes) return
- window.$message.success('删除成功')
- getTableData().then()
- })
- }
- //添加新元素字段
- const addColTabShow = ref(false)
- const addColTabInfo = ref({})
- const addColByTab = () => {
- addColTabInfo.value = nodeInfo.value
- addColTabShow.value = true
- }
- //关闭抽屉
- const drawerClose = () => {
- isShow.value = false
- dataInfo.value = {}
- emit('close')
- }
- </script>
- <style scoped lang="scss">
- </style>
- <style lang="scss">
- .el-overlay .el-drawer.hc-element-recognition-drawer {
- background-color: #F1F5F8;
- .tree-line .el-tree__empty-block {
- min-width: unset;
- }
- }
- </style>
|