14 changed files with 3090 additions and 94 deletions
			
			
		| @ -0,0 +1,110 @@ | |||
| import request from '@/utils/request' | |||
| 
 | |||
| export function getDirectoryTree(params) { | |||
|   return request({ | |||
|     url: '/default-api/datastd/cata/list', | |||
|     method: 'get', | |||
|     params, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function getDirectory(id) { | |||
|   return request({ | |||
|     url: `/default-api/datastd/cata/${id}`, | |||
|     method: 'get', | |||
|   }) | |||
| } | |||
| 
 | |||
| export function addDirectory(data) { | |||
|   return request({ | |||
|     url: '/default-api/datastd/cata', | |||
|     method: 'post', | |||
|     data, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function updateDirectory(data) { | |||
|   return request({ | |||
|     url: `/default-api/datastd/cata/edit`, | |||
|     method: 'put', | |||
|     data, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function delDirectory(id) { | |||
|   return request({ | |||
|     url: `/default-api/datastd/cata/${id}`, | |||
|     method: 'delete', | |||
|   }) | |||
| } | |||
| 
 | |||
| export function addDirectoryCollection(data) { | |||
|   return request({ | |||
|     url: '/default-api/datastd/cata/bookmark ', | |||
|     method: 'post', | |||
|     data, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function cancelDirectoryCollection(id) { | |||
|   return request({ | |||
|     url: `/default-api/datastd/cata/bookmark/${id}`, | |||
|     method: 'delete', | |||
|   }) | |||
| } | |||
| 
 | |||
| export function delDirectoryCollection(data) { | |||
|   return request({ | |||
|     url: '/default-api/system/delete_data_asset_collection', | |||
|     method: 'delete', | |||
|     data, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function moveDirectory(data) { | |||
|   return request({ | |||
|     url: '/default-api/datastd/cata/moved', | |||
|     method: 'put', | |||
|     data, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function mergeDirectory(data) { | |||
|   return request({ | |||
|     url: '/default-api/datastd/cata/merge', | |||
|     method: 'put', | |||
|     data, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function delDirectoryAsset(data) { | |||
|   return request({ | |||
|     url: '/default-api/datastd/cata/removerel', | |||
|     method: 'put', | |||
|     data, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function moveDirectoryAsset(data) { | |||
|   return request({ | |||
|     url: '/default-api/datastd/cata/moverel', | |||
|     method: 'put', | |||
|     data, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function getDirectoryAsset(params) { | |||
|   return request({ | |||
|     url: '/default-api/datastd/cata/atree', | |||
|     method: 'get', | |||
|     params, | |||
|   }) | |||
| } | |||
| 
 | |||
| export function getHtmlString(params) { | |||
|   return request({ | |||
|     url: '/default-api/datastd/cata/indx/list', | |||
|     method: 'get', | |||
|     params, | |||
|   }) | |||
| } | |||
| @ -0,0 +1,203 @@ | |||
| <template> | |||
|   <el-dialog width="500px" append-to-body :title="isEdit ? '修改数据标准' : '新增数据标准'" v-model="visible" @close="handleClose"> | |||
|     <el-form :model="formData" ref="formRef" label-width="120px" :rules="formRules"> | |||
| 
 | |||
|          | |||
|         <el-form-item label="标准编号" prop="stdNum"> | |||
|         <el-input v-model="formData.stdNum" :disabled="isEdit" placeholder="请输入标准编号" clearable /> | |||
|       </el-form-item> | |||
|       <el-form-item label="标准中文名" prop="stdName"> | |||
|         <el-input v-model="formData.stdName" placeholder="请输入标准中文名" clearable /> | |||
|       </el-form-item> | |||
|       <el-form-item label="标准英文名" prop="stdCode"> | |||
|         <el-input v-model="formData.stdCode" placeholder="请输入标准英文名" clearable /> | |||
|       </el-form-item> | |||
|       <el-form-item label="标准业务定义" prop="stdMenu"> | |||
|         <el-input v-model="formData.stdMenu" placeholder="请输入标准业务定义" clearable /> | |||
|       </el-form-item> | |||
| 
 | |||
|       <el-form-item label="标准类型" prop="stdType"> | |||
|         <el-select v-model="formData.stdType" placeholder="请输入标准类型"> | |||
|           <el-option label="基础数据" value="0" /> | |||
|           <el-option label="指标数据" value="1" /> | |||
|         </el-select>     | |||
|         </el-form-item> | |||
|         <el-form-item label="标准来源" prop="stdSrc"> | |||
|         <el-select v-model="formData.stdSrc" placeholder="请选择标准来源"> | |||
|           <el-option label="行业标准" value="行业标准" /> | |||
|           <el-option label="自建标准" value="自建标准" /> | |||
|         </el-select>     | |||
|         </el-form-item> | |||
|         <el-form-item label="数据类别" prop="dataClas"> | |||
|         <el-select v-model="formData.dataClas" placeholder="请选择数据类别"> | |||
|           <el-option label="日期类" value="日期类" /> | |||
|           <el-option label="文本类" value="文本类" /> | |||
|           <el-option label="数值类" value="数值类" /> | |||
|           <el-option label="金额类" value="金额类" /> | |||
|           <el-option label="编码类" value="编码类" /> | |||
|           <el-option label="标志类" value="标志类" /> | |||
|           <el-option label="码值类" value="码值类" /> | |||
|         </el-select>     | |||
|         </el-form-item> | |||
|       <el-form-item label="代码编号" prop="codeNum"> | |||
|         <el-input v-model="formData.codeNum" placeholder="请输入代码编号" clearable /> | |||
|       </el-form-item> | |||
|       <el-form-item label="业务认责部门" prop="bussDeptId"> | |||
|        <el-tree-select | |||
|                         v-model="formData.bussDeptId" | |||
|                         :data="deptOptions" | |||
|                         :props="{ value: 'id', label: 'label', children: 'children' }" | |||
|                         value-key="id" | |||
|                         placeholder="请选择业务认责部门" | |||
|                         check-strictly /> | |||
|      </el-form-item> | |||
|      <el-form-item label="业务认责人员" prop="bussUser"> | |||
|         <el-select v-model="formData.bussUser" placeholder="请选择业务认责人员"> | |||
|           <el-option | |||
|                 v-for="dict in userList" | |||
|                 :key="dict.id" | |||
|                 :label="dict.userName" | |||
|                 :value="dict.userName" | |||
|               ></el-option> | |||
|         </el-select>     | |||
|         </el-form-item> | |||
|      <el-form-item label="技术认责部门" prop="techDeptId"> | |||
|                      <el-tree-select | |||
|                         v-model="formData.techDeptId" | |||
|                         :data="deptOptions" | |||
|                         :props="{ value: 'id', label: 'label', children: 'children' }" | |||
|                         value-key="id" | |||
|                         placeholder="请选择技术认责部门" | |||
|                         check-strictly /> | |||
|      </el-form-item> | |||
|      <el-form-item label="技术认责人员" prop="techUser"> | |||
|         <el-select v-model="formData.techUser" placeholder="技术认责人员"> | |||
|           <el-option | |||
|                 v-for="dict in userList" | |||
|                 :key="dict.id" | |||
|                 :label="dict.userName" | |||
|                 :value="dict.userName" | |||
|               ></el-option> | |||
|         </el-select>     | |||
|         </el-form-item> | |||
| 
 | |||
|          <!-- 底部按钮区域 --> | |||
|          <el-row justify="center" style="margin-top: 20px;"> | |||
|         <el-col :span="4" style="padding-right: 10px;"> | |||
|           <el-button @click="handleClose" style="width: 100%" plain>取消</el-button> | |||
|         </el-col> | |||
|         <el-col :span="4" style="padding-left: 10px;"> | |||
|           <el-button type="primary" @click="handleSubmit" style="width: 100%">保存</el-button> | |||
|         </el-col> | |||
|       </el-row> | |||
|    | |||
| 
 | |||
|     </el-form> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script setup> | |||
| import { ref, watch } from 'vue'; | |||
| import { updateStdMain, addStdMain } from '@/api/datastd/std'; // 确保接口存在 | |||
| import {  listUser,  deptTreeSelect } from "@/api/system/user"; | |||
| const { proxy } = getCurrentInstance(); | |||
| const { std_code_status,std_code_appr } = proxy.useDict("std_code_status","std_code_appr"); | |||
| 
 | |||
| const props = defineProps({ | |||
|   data: { | |||
|     type: Object, | |||
|     required: false, | |||
|   }, | |||
|   isEdit: { | |||
|     type: Boolean, | |||
|   }, | |||
|   dbResourceOldList: { | |||
|     type: Object, | |||
|   }, | |||
|   visible: { | |||
|     type: Boolean, | |||
|   }, | |||
| }); | |||
| // 定义表单校验规则 | |||
| const formRules = ref({ | |||
|   stdNum: [{ required: true, message: '请输入标准编号', trigger: 'blur' }], | |||
|   stdType: [{ required: true, message: '请选择标准类型', trigger: 'change' }], | |||
|   stdSrc: [{ required: true, message: '请选择标准来源', trigger: 'change' }], | |||
|   dataClas: [{ required: true, message: '请选择数据类别', trigger: 'change' }], | |||
|   bussDeptId: [{ required: true, message: '请选择业务认责部门', trigger: 'blur' }], | |||
|   techDeptId: [{ required: true, message: '请选择技术认责部门', trigger: 'blur' }], | |||
|   bussUser: [{ required: true, message: '请输入业务认责人', trigger: 'blur' }], | |||
|   techUser: [{ required: true, message: '请输入技术认责人', trigger: 'blur' }], | |||
| }); | |||
| const showSys = ref(false); | |||
| const emit = defineEmits(['update:visible', 'refresh']); | |||
| const userList = ref([]); | |||
| const formData = ref({ ...props.data }); | |||
| const visible = ref(props.visible);  // 使用 prop 传入的 visible | |||
| function dataChange(data) { | |||
|   // 从 dbResourceOldList 中查找对应的 name | |||
|   const selectedItem = props.dbResourceOldList.find(item => item.id === data); | |||
|   if (selectedItem) { | |||
|     // 如果找到对应的项,将 name 赋值给 formData.value.dbRName | |||
|     formData.value.sysName = selectedItem.name; | |||
|   } else { | |||
|     // 如果未找到,清空 formData.value.dbRName | |||
|     formData.value.sysName = ''; | |||
|   } | |||
| } | |||
| // 监听 props.visible 的变化,确保同步到 local visible | |||
| watch(() => props.visible, (newVal) => { | |||
|   visible.value = newVal; | |||
|   formData.value = { ...props.data } | |||
| }); | |||
| 
 | |||
| function getList() { | |||
|   listUser({pageSize:1000,pageNum:1}).then(res => { | |||
|     userList.value = res.rows; | |||
|   }); | |||
| }; | |||
| const handleClose = () => { | |||
|   emit('update:visible', false);  // 关闭弹框 | |||
| }; | |||
| const deptOptions = ref(undefined); | |||
| 
 | |||
| function getDeptTree() { | |||
|   deptTreeSelect().then(response => { | |||
|     deptOptions.value = response.data; | |||
|   }); | |||
| }; | |||
| function changeCodeType(data) { | |||
|   if (data != "company") { | |||
|     showSys.value = true; | |||
|     formData.value.sysName = ""; | |||
|     formData.value.sysId = undefined; | |||
|   } else { | |||
|     showSys.value = false; | |||
|     formData.value.sysName = "公司级"; | |||
|     formData.value.sysId = 10000; | |||
|   } | |||
| } | |||
| getDeptTree(); | |||
| getList(); | |||
| const handleSubmit = () => { | |||
|   const formRef = proxy.$refs.formRef; | |||
|   formRef.validate((valid) => { | |||
|     if (valid) { | |||
|       const apiCall = props.isEdit ? updateStdMain(formData.value) : addStdMain(formData.value); | |||
|       apiCall | |||
|         .then((response) => { | |||
|           console.log(response.success,"sssssssss") | |||
|           if (response.success) { | |||
|             emit('refresh'); | |||
|             handleClose(); | |||
|           } else { | |||
|             proxy.$message.error(response.data || '操作失败,请稍后重试'); | |||
|           } | |||
|         }) | |||
|     } else { | |||
|       console.log('表单验证失败'); | |||
|       return false; | |||
|     } | |||
|   }); | |||
| }; | |||
| </script> | |||
| @ -0,0 +1,171 @@ | |||
| <template> | |||
|   <el-dialog width="800px" append-to-body :title="title" v-model="open"> | |||
|     <el-form label-width="100px" ref="formRef" :model="form" :rules="rules"> | |||
|       <el-row :gutter="16"> | |||
|         <el-col :span="11"> | |||
|           <el-form-item label="当前资产" prop="dataAstCnName"> | |||
|             <el-input :disabled="true" v-model="form.dataAstCnName" /> | |||
|           </el-form-item> | |||
|           <el-form-item label="当前资产简介" prop="dataAstDesc"> | |||
|             <el-input | |||
|               placeholder="自动带入" | |||
|               type="textarea" | |||
|               :disabled="true" | |||
|               :rows="8" | |||
|               v-model="form.dataAstDesc" | |||
|             /> | |||
|           </el-form-item> | |||
|         </el-col> | |||
|         <el-col :span="2"> | |||
|           <div class="arrow"> | |||
|             <span>········</span> | |||
|             <el-icon><Right /></el-icon> | |||
|           </div> | |||
|         </el-col> | |||
|         <el-col :span="11"> | |||
|           <el-form-item label="目标分类" prop="contentOnumAfter"> | |||
|             <el-tree-select | |||
|               check-strictly | |||
|               value-key="contentOnum" | |||
|               placeholder="选择目标分类" | |||
|               :default-expand-all="true" | |||
|               :disabled="disabled" | |||
|               :clearable="true" | |||
|               :data="localDirectoryTree" | |||
|               :props="{ | |||
|                 value: 'contentOnum', | |||
|                 label: 'contentName', | |||
|                 children: 'children', | |||
|               }" | |||
|               v-model="form.contentOnumAfter" | |||
|               @node-click="handleTargetCatalogNodeClick" | |||
|             /> | |||
|           </el-form-item> | |||
|           <el-form-item label="目标分类简介" prop="contentIntrAfter"> | |||
|             <el-input | |||
|               placeholder="自动带入" | |||
|               type="textarea" | |||
|               :disabled="true" | |||
|               :rows="8" | |||
|               v-model="form.contentIntrAfter" | |||
|             /> | |||
|           </el-form-item> | |||
|         </el-col> | |||
|       </el-row> | |||
|     </el-form> | |||
|     <template #footer> | |||
|       <div class="dialog-footer"> | |||
|         <el-button @click="cancel">取消</el-button> | |||
|         <el-button type="primary" :disabled="disabled" @click="submitForm" | |||
|           >确定</el-button | |||
|         > | |||
|       </div> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script setup> | |||
| import { nextTick } from 'vue' | |||
| import { moveDirectoryAsset } from '@/api/datastd/directory' | |||
| 
 | |||
| const props = defineProps({ | |||
|   directoryTree: { | |||
|     type: Array, | |||
|     required: true, | |||
|   }, | |||
| }) | |||
| 
 | |||
| const filterTree = (tree, conditionFn) => { | |||
|   return tree | |||
|     .map((node) => { | |||
|       // 递归处理每个节点的子节点 | |||
|       const filteredChildren = node.children | |||
|         ? filterTree(node.children, conditionFn) | |||
|         : [] | |||
|       // 根据条件判断是否保留当前节点 | |||
|       if (conditionFn(node)) { | |||
|         // 返回新的节点结构,保留符合条件的子节点 | |||
|         return { | |||
|           ...node, | |||
|           children: filteredChildren, | |||
|         } | |||
|       } | |||
|       // 如果不符合条件,返回 null,不加入到最终结果中 | |||
|       return null | |||
|     }) | |||
|     .filter(Boolean) // 移除值为 null 的项 | |||
| } | |||
| 
 | |||
| const localDirectoryTree = computed(() => { | |||
|   const tree = props.directoryTree | |||
|   return filterTree(tree, (node) => node.contentOnum && !node.astOnum) // 过滤资产子节点 | |||
| }) | |||
| 
 | |||
| const title = ref('') | |||
| const open = ref(false) | |||
| const disabled = ref(false) | |||
| const { proxy } = getCurrentInstance() | |||
| const form = ref({}) | |||
| const rules = ref({ | |||
|   targetContentOnum: [ | |||
|     { required: true, message: '目标分类不能为空', trigger: 'blur' }, | |||
|   ], | |||
| }) | |||
| 
 | |||
| const formRef = ref(null) | |||
| const openDialog = (row) => { | |||
|   open.value = true | |||
|   form.value = { | |||
|     relaOnum: undefined, | |||
|     contentOnum: undefined, | |||
|     contentOnumAfter: undefined, | |||
|   } | |||
|   if (row.relaOnum) { | |||
|     form.value = { | |||
|       ...form.value, | |||
|       ...row, | |||
|     } | |||
|   } | |||
|   nextTick(() => { | |||
|     formRef.value.clearValidate() | |||
|   }) | |||
| } | |||
| 
 | |||
| const handleTargetCatalogNodeClick = (data) => { | |||
|   form.value = { | |||
|     ...form.value, | |||
|     contentIntrAfter: data.contentIntr, | |||
|   } | |||
| } | |||
| 
 | |||
| const emit = defineEmits(['onSuccess']) | |||
| const submitForm = () => { | |||
|   formRef.value.validate((valid) => { | |||
|     if (valid) { | |||
|       moveDirectoryAsset(form.value).then((response) => { | |||
|         proxy.$modal.msgSuccess('移动成功') | |||
|         open.value = false | |||
|         emit('onSuccess') | |||
|       }) | |||
|     } | |||
|   }) | |||
| } | |||
| 
 | |||
| const cancel = () => { | |||
|   open.value = false | |||
| } | |||
| 
 | |||
| defineExpose({ title, disabled, openDialog }) | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .arrow { | |||
|   display: flex; | |||
|   font-size: 18px; | |||
|   text-align: center; | |||
|   margin: 8px auto; | |||
|   span { | |||
|     line-height: 18px; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,193 @@ | |||
| <template> | |||
|   <el-dialog width="600px" append-to-body :title="title" v-model="open"> | |||
|     <el-form label-width="100px" ref="formRef" :model="form" :rules="rules"> | |||
|       <el-form-item label="分类名称" prop="contentName"> | |||
|         <el-input | |||
|           placeholder="请输入分类名称" | |||
|           :disabled="disabled" | |||
|           v-model="form.contentName" | |||
|         /> | |||
|       </el-form-item> | |||
|       <el-form-item label="上级分类" prop="suprContentOnum"> | |||
|         <el-tree-select | |||
|           check-strictly | |||
|           value-key="contentOnum" | |||
|           placeholder="请选择上级分类" | |||
|           :default-expand-all="true" | |||
|           :disabled="disabled" | |||
|           :clearable="true" | |||
|           :data="localDirectoryTree" | |||
|           :props="{ | |||
|             value: 'contentOnum', | |||
|             label: 'contentName', | |||
|             children: 'children', | |||
|           }" | |||
|           v-model="form.suprContentOnum" | |||
|         > | |||
|         </el-tree-select> | |||
|       </el-form-item> | |||
|       <el-form-item label="负责人" prop="contentPic"> | |||
|         <el-input | |||
|           placeholder="请输入负责人" | |||
|           :disabled="disabled" | |||
|           v-model="form.contentPic" | |||
|         /> | |||
|       </el-form-item> | |||
|       <el-form-item label="分类简介" prop="contentIntr"> | |||
|         <el-input | |||
|           placeholder="请输入分类简介" | |||
|           type="textarea" | |||
|           :disabled="disabled" | |||
|           :rows="8" | |||
|           v-model="form.contentIntr" | |||
|         /> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <template #footer> | |||
|       <div class="dialog-footer"> | |||
|         <el-button @click="cancel">取消</el-button> | |||
|         <el-button type="primary" :disabled="disabled" @click="submitForm" | |||
|           >确定</el-button | |||
|         > | |||
|       </div> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script setup> | |||
| import { computed, nextTick } from 'vue' | |||
| import { | |||
|   getDirectory, | |||
|   addDirectory, | |||
|   updateDirectory, | |||
|   getDirectoryAsset, | |||
| } from '@/api/datastd/directory' | |||
| 
 | |||
| const props = defineProps({ | |||
|   directoryTree: { | |||
|     type: Array, | |||
|     required: true, | |||
|   }, | |||
| }) | |||
| 
 | |||
| const filterTree = (tree, conditionFn) => { | |||
|   return tree | |||
|     .map((node) => { | |||
|       // 递归处理每个节点的子节点 | |||
|       const filteredChildren = node.children | |||
|         ? filterTree(node.children, conditionFn) | |||
|         : [] | |||
|       // 根据条件判断是否保留当前节点 | |||
|       if (conditionFn(node)) { | |||
|         // 返回新的节点结构,保留符合条件的子节点 | |||
|         return { | |||
|           ...node, | |||
|           children: filteredChildren, | |||
|         } | |||
|       } | |||
|       // 如果不符合条件,返回 null,不加入到最终结果中 | |||
|       return null | |||
|     }) | |||
|     .filter(Boolean) // 移除值为 null 的项 | |||
| } | |||
| 
 | |||
| const localDirectoryTree = computed(() => { | |||
|   const tree = props.directoryTree | |||
|   return filterTree(tree, (node) => node.contentOnum && !node.astOnum) // 过滤资产子节点 | |||
| }) | |||
| 
 | |||
| const title = ref('') | |||
| const open = ref(false) | |||
| const disabled = ref(false) | |||
| const { proxy } = getCurrentInstance() | |||
| const form = ref({}) | |||
| const rules = ref({ | |||
|   contentName: [ | |||
|     { required: true, message: '分类名称不能为空', trigger: 'blur' }, | |||
|   ], | |||
|   suprContentOnum: [ | |||
|     { required: true, message: '上级分类不能为空', trigger: 'blur' }, | |||
|   ], | |||
| }) | |||
| 
 | |||
| const formRef = ref(null) | |||
| const openDialog = (row) => { | |||
|   open.value = true | |||
|   form.value = { | |||
|     contentName: undefined, | |||
|     suprContentOnum: undefined, | |||
|     contentPic: undefined, | |||
|     contentStat: '1', // 0-废弃,1-有效,2-停用 | |||
|     contentIntr: undefined, | |||
|     children: [], | |||
|   } | |||
|   if (row.contentOnum || row.suprContentOnum) { | |||
|     form.value = { | |||
|       ...form.value, | |||
|       ...row, | |||
|       assets: | |||
|         row.children && | |||
|         row.children.length && | |||
|         row.children.find((i) => i.astOnum) | |||
|           ? [...row.children].map((i) => i.astOnum) | |||
|           : [], // 新增冗余字段来暂存资产编号 | |||
|     } | |||
|   } | |||
|   nextTick(() => { | |||
|     formRef.value.clearValidate() | |||
|   }) | |||
| } | |||
| 
 | |||
| const addTreeNodeId = (tree) => { | |||
|   return tree.map((node, index) => { | |||
|     return { | |||
|       ...node, | |||
|       id: node.dataAssetCatalogAstno || index, | |||
|       children: | |||
|         node.children && node.children.length | |||
|           ? addTreeNodeId(node.children) | |||
|           : [], | |||
|     } | |||
|   }) | |||
| } | |||
| 
 | |||
| 
 | |||
| 
 | |||
| const emit = defineEmits(['onSuccess']) | |||
| const submitForm = () => { | |||
|   formRef.value.validate((valid) => { | |||
|     if (valid) { | |||
|       const children = form.value.assets.reduce((arr, cur) => { | |||
|         const item = form.value.children.find((i) => i.astOnum === cur) | |||
|         if (!item) { | |||
|           arr.push({ | |||
|             contentOnum: form.value.contentOnum, | |||
|             astOnum: cur, | |||
|           }) | |||
|         } else { | |||
|           arr.push(item) | |||
|         } | |||
|         return arr | |||
|       }, []) | |||
|       form.value = { | |||
|         ...form.value, | |||
|         children, | |||
|       } | |||
|       const request = form.value.contentOnum ? updateDirectory : addDirectory | |||
|       request(form.value).then((response) => { | |||
|         proxy.$modal.msgSuccess( | |||
|           form.value.contentOnum ? '修改成功' : '新增成功' | |||
|         ) | |||
|         open.value = false | |||
|         emit('onSuccess') | |||
|       }) | |||
|     } | |||
|   }) | |||
| } | |||
| 
 | |||
| const cancel = () => { | |||
|   open.value = false | |||
| } | |||
| 
 | |||
| defineExpose({ title, disabled, openDialog }) | |||
| </script> | |||
| @ -0,0 +1,175 @@ | |||
| <template> | |||
|   <el-dialog width="800px" append-to-body :title="title" v-model="open"> | |||
|     <el-form label-width="100px" ref="formRef" :model="form" :rules="rules"> | |||
|       <el-row :gutter="16"> | |||
|         <el-col :span="11"> | |||
|           <el-form-item label="当前目录" prop="contentName"> | |||
|             <el-input :disabled="true" v-model="form.contentName" /> | |||
|           </el-form-item> | |||
|           <el-form-item label="当前目录简介" prop="contentIntr"> | |||
|             <el-input | |||
|               placeholder="自动带入" | |||
|               type="textarea" | |||
|               :disabled="true" | |||
|               :rows="8" | |||
|               v-model="form.contentIntr" | |||
|             /> | |||
|           </el-form-item> | |||
|         </el-col> | |||
|         <el-col :span="2"> | |||
|           <div class="arrow"> | |||
|             <span>········</span> | |||
|             <el-icon><Right /></el-icon> | |||
|           </div> | |||
|         </el-col> | |||
|         <el-col :span="11"> | |||
|           <el-form-item label="目标目录" prop="contentOnumAfter"> | |||
|             <el-tree-select | |||
|               check-strictly | |||
|               value-key="contentOnum" | |||
|               placeholder="选择目标目录" | |||
|               :default-expand-all="true" | |||
|               :disabled="disabled" | |||
|               :clearable="true" | |||
|               :data="localDirectoryTree" | |||
|               :props="{ | |||
|                 value: 'contentOnum', | |||
|                 label: 'contentName', | |||
|                 children: 'children', | |||
|               }" | |||
|               v-model="form.contentOnumAfter" | |||
|               @node-click="handleTargetCatalogNodeClick" | |||
|             /> | |||
|           </el-form-item> | |||
|           <el-form-item label="目标目录简介" prop="contentIntrAfter"> | |||
|             <el-input | |||
|               placeholder="自动带入" | |||
|               type="textarea" | |||
|               :disabled="true" | |||
|               :rows="8" | |||
|               v-model="form.contentIntrAfter" | |||
|             /> | |||
|           </el-form-item> | |||
|         </el-col> | |||
|       </el-row> | |||
|     </el-form> | |||
|     <template #footer> | |||
|       <div class="dialog-footer"> | |||
|         <el-button @click="cancel">取消</el-button> | |||
|         <el-button type="primary" :disabled="disabled" @click="submitForm" | |||
|           >确定</el-button | |||
|         > | |||
|       </div> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script setup> | |||
| import { nextTick } from 'vue' | |||
| import { mergeDirectory } from '@/api/datastd/directory' | |||
| 
 | |||
| const props = defineProps({ | |||
|   directoryTree: { | |||
|     type: Array, | |||
|     required: true, | |||
|   }, | |||
| }) | |||
| 
 | |||
| const filterTree = (tree, conditionFn) => { | |||
|   return tree | |||
|     .map((node) => { | |||
|       // 递归处理每个节点的子节点 | |||
|       const filteredChildren = node.children | |||
|         ? filterTree(node.children, conditionFn) | |||
|         : [] | |||
|       // 根据条件判断是否保留当前节点 | |||
|       if (conditionFn(node)) { | |||
|         // 返回新的节点结构,保留符合条件的子节点 | |||
|         return { | |||
|           ...node, | |||
|           children: filteredChildren, | |||
|         } | |||
|       } | |||
|       // 如果不符合条件,返回 null,不加入到最终结果中 | |||
|       return null | |||
|     }) | |||
|     .filter(Boolean) // 移除值为 null 的项 | |||
| } | |||
| 
 | |||
| const localDirectoryTree = computed(() => { | |||
|   const tree = props.directoryTree | |||
|   return filterTree(tree, (node) => node.contentOnum && !node.astOnum) // 过滤资产子节点 | |||
| }) | |||
| 
 | |||
| const title = ref('') | |||
| const open = ref(false) | |||
| const disabled = ref(false) | |||
| const { proxy } = getCurrentInstance() | |||
| const form = ref({}) | |||
| const rules = ref({ | |||
|   contentOnumAfter: [ | |||
|     { required: true, message: '目标目录不能为空', trigger: 'blur' }, | |||
|   ], | |||
| }) | |||
| 
 | |||
| const formRef = ref(null) | |||
| const openDialog = (row) => { | |||
|   open.value = true | |||
|   form.value = { | |||
|     contentOnum: undefined, | |||
|     suprContentOnum: undefined, | |||
|     contentIntr: undefined, | |||
|     contentOnumAfter: undefined, | |||
|     suprContentOnumAfter: undefined, | |||
|     contentIntrAfter: undefined, | |||
|   } | |||
|   if (row.contentOnum) { | |||
|     form.value = { | |||
|       ...form.value, | |||
|       ...row, | |||
|     } | |||
|   } | |||
|   nextTick(() => { | |||
|     formRef.value.clearValidate() | |||
|   }) | |||
| } | |||
| 
 | |||
| const handleTargetCatalogNodeClick = (data) => { | |||
|   form.value = { | |||
|     ...form.value, | |||
|     suprContentOnumAfter: data.suprContentOnum, | |||
|     contentIntrAfter: data.contentIntr, | |||
|   } | |||
| } | |||
| 
 | |||
| const emit = defineEmits(['onSuccess']) | |||
| const submitForm = () => { | |||
|   formRef.value.validate((valid) => { | |||
|     if (valid) { | |||
|       mergeDirectory(form.value).then((response) => { | |||
|         proxy.$modal.msgSuccess('合并成功') | |||
|         open.value = false | |||
|         emit('onSuccess') | |||
|       }) | |||
|     } | |||
|   }) | |||
| } | |||
| 
 | |||
| const cancel = () => { | |||
|   open.value = false | |||
| } | |||
| 
 | |||
| defineExpose({ title, disabled, openDialog }) | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .arrow { | |||
|   display: flex; | |||
|   font-size: 18px; | |||
|   text-align: center; | |||
|   margin: 8px auto; | |||
|   span { | |||
|     line-height: 18px; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,173 @@ | |||
| <template> | |||
|   <el-dialog width="800px" append-to-body :title="title" v-model="open"> | |||
|     <el-form label-width="100px" ref="formRef" :model="form" :rules="rules"> | |||
|       <el-row :gutter="16"> | |||
|         <el-col :span="11"> | |||
|           <el-form-item label="当前分类" prop="contentName"> | |||
|             <el-input :disabled="true" v-model="form.contentName" /> | |||
|           </el-form-item> | |||
|           <el-form-item label="当前分类简介" prop="contentIntr"> | |||
|             <el-input | |||
|               placeholder="自动带入" | |||
|               type="textarea" | |||
|               :disabled="true" | |||
|               :rows="8" | |||
|               v-model="form.contentIntr" | |||
|             /> | |||
|           </el-form-item> | |||
|         </el-col> | |||
|         <el-col :span="2"> | |||
|           <div class="arrow"> | |||
|             <span>········</span> | |||
|             <el-icon><Right /></el-icon> | |||
|           </div> | |||
|         </el-col> | |||
|         <el-col :span="11"> | |||
|           <el-form-item label="目标分类" prop="suprContentOnumAfter"> | |||
|             <el-tree-select | |||
|               check-strictly | |||
|               value-key="contentOnum" | |||
|               placeholder="选择目标分类" | |||
|               :default-expand-all="true" | |||
|               :disabled="disabled" | |||
|               :clearable="true" | |||
|               :data="localDirectoryTree" | |||
|               :props="{ | |||
|                 value: 'contentOnum', | |||
|                 label: 'contentName', | |||
|                 children: 'children', | |||
|               }" | |||
|               v-model="form.suprContentOnumAfter" | |||
|               @node-click="handleTargetCatalogNodeClick" | |||
|             /> | |||
|           </el-form-item> | |||
|           <el-form-item label="目标分类简介" prop="contentIntrAfter"> | |||
|             <el-input | |||
|               placeholder="自动带入" | |||
|               type="textarea" | |||
|               :disabled="true" | |||
|               :rows="8" | |||
|               v-model="form.contentIntrAfter" | |||
|             /> | |||
|           </el-form-item> | |||
|         </el-col> | |||
|       </el-row> | |||
|     </el-form> | |||
|     <template #footer> | |||
|       <div class="dialog-footer"> | |||
|         <el-button @click="cancel">取消</el-button> | |||
|         <el-button type="primary" :disabled="disabled" @click="submitForm" | |||
|           >确定</el-button | |||
|         > | |||
|       </div> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script setup> | |||
| import { nextTick } from 'vue' | |||
| import { moveDirectory } from '@/api/datastd/directory' | |||
| 
 | |||
| const props = defineProps({ | |||
|   directoryTree: { | |||
|     type: Array, | |||
|     required: true, | |||
|   }, | |||
| }) | |||
| 
 | |||
| const filterTree = (tree, conditionFn) => { | |||
|   return tree | |||
|     .map((node) => { | |||
|       // 递归处理每个节点的子节点 | |||
|       const filteredChildren = node.children | |||
|         ? filterTree(node.children, conditionFn) | |||
|         : [] | |||
|       // 根据条件判断是否保留当前节点 | |||
|       if (conditionFn(node)) { | |||
|         // 返回新的节点结构,保留符合条件的子节点 | |||
|         return { | |||
|           ...node, | |||
|           children: filteredChildren, | |||
|         } | |||
|       } | |||
|       // 如果不符合条件,返回 null,不加入到最终结果中 | |||
|       return null | |||
|     }) | |||
|     .filter(Boolean) // 移除值为 null 的项 | |||
| } | |||
| 
 | |||
| const localDirectoryTree = computed(() => { | |||
|   const tree = props.directoryTree | |||
|   return filterTree(tree, (node) => node.contentOnum && !node.astOnum) // 过滤资产子节点 | |||
| }) | |||
| 
 | |||
| const title = ref('') | |||
| const open = ref(false) | |||
| const disabled = ref(false) | |||
| const { proxy } = getCurrentInstance() | |||
| const form = ref({}) | |||
| const rules = ref({ | |||
|   suprContentOnumAfter: [ | |||
|     { required: true, message: '目标分类不能为空', trigger: 'blur' }, | |||
|   ], | |||
| }) | |||
| 
 | |||
| const formRef = ref(null) | |||
| const openDialog = (row) => { | |||
|   open.value = true | |||
|   form.value = { | |||
|     contentOnum: undefined, | |||
|     contentIntr: undefined, | |||
|     suprContentOnum: undefined, | |||
|     suprContentOnumAfter: undefined, | |||
|     contentIntrAfter: undefined, | |||
|   } | |||
|   if (row.contentOnum) { | |||
|     form.value = { | |||
|       ...form.value, | |||
|       ...row, | |||
|     } | |||
|   } | |||
|   nextTick(() => { | |||
|     formRef.value.clearValidate() | |||
|   }) | |||
| } | |||
| 
 | |||
| const handleTargetCatalogNodeClick = (data) => { | |||
|   form.value = { | |||
|     ...form.value, | |||
|     contentIntrAfter: data.contentIntr, | |||
|   } | |||
| } | |||
| 
 | |||
| const emit = defineEmits(['onSuccess']) | |||
| const submitForm = () => { | |||
|   formRef.value.validate((valid) => { | |||
|     if (valid) { | |||
|       moveDirectory(form.value).then((response) => { | |||
|         proxy.$modal.msgSuccess('移动成功') | |||
|         open.value = false | |||
|         emit('onSuccess') | |||
|       }) | |||
|     } | |||
|   }) | |||
| } | |||
| 
 | |||
| const cancel = () => { | |||
|   open.value = false | |||
| } | |||
| 
 | |||
| defineExpose({ title, disabled, openDialog }) | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .arrow { | |||
|   display: flex; | |||
|   font-size: 18px; | |||
|   text-align: center; | |||
|   margin: 8px auto; | |||
|   span { | |||
|     line-height: 18px; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,651 @@ | |||
| <template> | |||
|   <div class="app-container"> | |||
|     <el-row :gutter="16"> | |||
|       <el-col :span="5"> | |||
|           <el-input | |||
|             v-model="filterText" | |||
|             style="width: 100%" | |||
|             placeholder="搜索分类名称" | |||
|           > | |||
|             <template #prefix> | |||
|               <el-icon><Search /></el-icon> | |||
|             </template> | |||
|           </el-input> | |||
|           <div class="tree-box"> | |||
|             <el-tree | |||
|               class="tree" | |||
|               ref="treeRef" | |||
|               node-key="tempId" | |||
|               :default-expand-all="true" | |||
|               :highlight-current="true" | |||
|               :expand-on-click-node="false" | |||
|               :data="directoryTree" | |||
|               :props="defaultProps" | |||
|               :filter-node-method="filterNode" | |||
|               :current-node-key="currentNode.tempId" | |||
|               @node-click="handleNodeClick" | |||
|             > | |||
|               <template #default="{ data }"> | |||
|                 <div class="custom-tree-node"> | |||
|                   <el-space :size="2"> | |||
|                     <el-icon v-if="!isCollectionDirectory(data)"> | |||
|         <Folder /> | |||
|       </el-icon> | |||
|       <el-icon v-else :style="isCollectionDirectory(data) ? { color: '#E6A23C' } : {}"> | |||
|         <FolderRemove /> | |||
|       </el-icon> | |||
|                     <span :style="isCollectionDirectory(data) ? { color: '#E6A23C' } : {}"> | |||
|         {{ data.contentName || data.dataAstCnName }} | |||
|       </span>                  </el-space> | |||
|                   <div | |||
|                     v-if="!isCollectionDirectory(data)" | |||
|                     class="tree-node__action" | |||
|                   > | |||
|                     <template v-if="isAsset(data)"> | |||
|                       <el-button | |||
|                         v-if="!isCollected(data)" | |||
|                         link | |||
|                         type="warning" | |||
|                         icon="Star" | |||
|                         @click="(e) => handleCollect(data, e)" | |||
|                       ></el-button> | |||
|                       <el-button | |||
|                         v-else | |||
|                         link | |||
|                         type="warning" | |||
|                         style="margin-right: -2px" | |||
|                         @click="(e) => handleCollectionCancel(data, e)" | |||
|                       > | |||
|                         <el-icon slot="icon" size="18" color="#E6A23C"> | |||
|                           <StarFilled /> | |||
|                         </el-icon> | |||
|                       </el-button> | |||
|                     </template> | |||
|                     <el-dropdown | |||
|                       v-if=" | |||
|                         !isCollection(data) && | |||
|                         (isDirectory(data) || isRoot(data)) && | |||
|                         hasPermiOr([ | |||
|                           'dataAsset:directory:add', | |||
|                           'dataAsset:directory:edit', | |||
|                           'dataAsset:directory:remove', | |||
|                           'dataAsset:directory:move', | |||
|                           'dataAsset:directory:merge', | |||
|                         ]) | |||
|                       " | |||
|                       placement="right-start" | |||
|                       @command="(command) => handleCommand(command, data)" | |||
|                     > | |||
|                       <el-button | |||
|                         style="margin-left: 4px" | |||
|                         link | |||
|                         type="primary" | |||
|                         icon="Menu" | |||
|                       ></el-button> | |||
|                       <template #dropdown> | |||
|                         <el-dropdown-menu> | |||
|                           <el-dropdown-item | |||
|                             v-if=" | |||
|                               isRoot(data) && | |||
|                               hasPermiOr(['dataAsset:directory:add']) | |||
|                             " | |||
|                             command="handleAddDialogOpen" | |||
|                           > | |||
|                             新增分类 | |||
|                           </el-dropdown-item> | |||
|                           <template v-if="isDirectory(data)"> | |||
|                             <el-dropdown-item | |||
|                               v-if="hasPermiOr(['dataAsset:directory:add'])" | |||
|                               command="handleAddDialogOpen" | |||
|                             > | |||
|                               新增分类 | |||
|                             </el-dropdown-item> | |||
|                             <el-dropdown-item | |||
|                               v-if="hasPermiOr(['dataAsset:directory:edit'])" | |||
|                               command="handleEditDialogOpen" | |||
|                             > | |||
|                               修改分类 | |||
|                             </el-dropdown-item> | |||
|                             <el-dropdown-item | |||
|                               v-if="hasPermiOr(['dataAsset:directory:remove'])" | |||
|                               command="handleDelete" | |||
|                             > | |||
|                               删除分类 | |||
|                             </el-dropdown-item> | |||
|                             <el-dropdown-item | |||
|                               v-if="hasPermiOr(['dataAsset:directory:move'])" | |||
|                               command="handleMoveDialogOpen" | |||
|                             > | |||
|                               移动分类 | |||
|                             </el-dropdown-item> | |||
|                             <el-dropdown-item | |||
|                               v-if="hasPermiOr(['dataAsset:directory:merge'])" | |||
|                               command="handleMergerDialogOpen" | |||
|                             > | |||
|                               合并分类 | |||
|                             </el-dropdown-item> | |||
|                           </template> | |||
|                         </el-dropdown-menu> | |||
|                       </template> | |||
|                     </el-dropdown> | |||
|                     <el-dropdown | |||
|                       v-if=" | |||
|                         !isCollection(data) && | |||
|                         isAsset(data) && | |||
|                         hasPermiOr([ | |||
|                           'dataAsset:asset:remove', | |||
|                           'dataAsset:asst:move', | |||
|                         ]) | |||
|                       " | |||
|                       placement="right-start" | |||
|                       @command="(command) => handleCommand(command, data)" | |||
|                     > | |||
|                       <el-button | |||
|                         style="margin-left: 4px" | |||
|                         link | |||
|                         type="primary" | |||
|                         icon="Menu" | |||
|                       ></el-button> | |||
|                       <template #dropdown> | |||
|                         <el-dropdown-menu> | |||
|                           <el-dropdown-item | |||
|                             v-if="hasPermiOr(['dataAsset:asset:remove'])" | |||
|                             command="handleAssetDelete" | |||
|                           > | |||
|                             删除资产 | |||
|                           </el-dropdown-item> | |||
|                           <el-dropdown-item | |||
|                             v-if="hasPermiOr(['dataAsset:asst:move'])" | |||
|                             command="handleAssetMoveDialogOpen" | |||
|                           > | |||
|                             移动资产 | |||
|                           </el-dropdown-item> | |||
|                         </el-dropdown-menu> | |||
|                       </template> | |||
|                     </el-dropdown> | |||
|                   </div> | |||
|                 </div> | |||
|               </template> | |||
|             </el-tree> | |||
|           </div> | |||
|       </el-col> | |||
|       <el-col :span="19"> | |||
|         <el-form :model="queryParams" ref="queryRef" :inline="true"> | |||
|           <el-form-item label="标准编号/名称"> | |||
|             <el-input v-model="queryParams.stdNum" placeholder="请输入标准编号" /> | |||
|           </el-form-item> | |||
|           <el-form-item label="业务定义"> | |||
|             <el-input v-model="queryParams.stdMenu" placeholder="请输入业务定义" /> | |||
|           </el-form-item> | |||
|           <el-form-item> | |||
|             <el-button type="primary" @click="handleQuery">搜索</el-button> | |||
|             <el-button icon="Refresh" @click="resetQuery">重置</el-button> | |||
|           </el-form-item> | |||
|         </el-form> | |||
|                <!-- 操作按钮 --> | |||
|                <el-row :gutter="10" class="mb8"> | |||
|           <el-col :span="1.5"> | |||
|             <el-button | |||
|               type="primary" | |||
|               plain | |||
|               icon="Plus" | |||
|               @click="handleAdd" | |||
|               v-hasPermi="['meta:metaSecurityCol:add']" | |||
|               >新增</el-button | |||
|             > | |||
|           </el-col> | |||
|           <el-col :span="1.5"> | |||
|             <el-button | |||
|               type="success" | |||
|               plain | |||
|               icon="Edit" | |||
|               :disabled="single" | |||
|               @click="handleEdit" | |||
|               v-hasPermi="['meta:metaSecurityCol:edit']" | |||
|               >修改</el-button | |||
|             > | |||
|           </el-col> | |||
|           <el-col :span="1.5"> | |||
|             <el-button | |||
|               type="danger" | |||
|               plain | |||
|               icon="Delete" | |||
|               :disabled="multiple" | |||
|               @click="handleRemove" | |||
|               v-hasPermi="['meta:metaSecurityCol:remove']" | |||
|               >删除</el-button | |||
|             > | |||
|           </el-col> | |||
|         </el-row> | |||
|                 <!-- 表格展示 --> | |||
|                 <el-table | |||
|           v-loading="loading" | |||
|           :data="tableData" | |||
|           @selection-change="handleSelectionChange" | |||
|         > | |||
|          <el-table-column type="selection" width="55" align="center" /> | |||
|          <el-table-column label="标准编号" prop="stdNum" width="150"></el-table-column> | |||
| <el-table-column label="标准英文名" prop="stdCode" width="150"></el-table-column> | |||
| <el-table-column label="标准中文名" prop="stdName" width="150"></el-table-column> | |||
| <el-table-column label="标准业务定义" prop="stdMenu" width="150"></el-table-column> | |||
| <el-table-column label="类型" prop="stdType" width="150"></el-table-column> | |||
| <el-table-column label="标准来源" prop="stdSrc" width="150"></el-table-column> | |||
| <el-table-column label="数据类别" prop="dataClas" width="150"></el-table-column> | |||
| <el-table-column label="代码编号" prop="codeNum" width="150"></el-table-column> | |||
| <el-table-column label="业务认责部门" prop="bussDeptId" width="150"></el-table-column> | |||
| <el-table-column label="业务认责人员" prop="bussUser" width="150"></el-table-column> | |||
| <el-table-column label="技术认责部门" prop="techDeptId" width="150"></el-table-column> | |||
| <el-table-column label="技术认责人员" prop="techUser" width="150"></el-table-column> | |||
| <!-- <el-table-column label="分类" prop="contentOnum" width="150"></el-table-column> --> | |||
| <el-table-column label="更新时间" prop="updateTime" width="180"></el-table-column> | |||
|           <el-table-column label="操作" align="center" width="180"> | |||
|             <template #default="scope"> | |||
|               <el-button | |||
|                 @click="handleEdit(scope.row)" | |||
|                 type="text" | |||
|                 icon="Edit" | |||
|               /> | |||
|               <el-button | |||
|                 @click="handleRemove(scope.row)" | |||
|                 type="text" | |||
|                 icon="Delete" | |||
|               /> | |||
|             </template> | |||
|           </el-table-column> | |||
|         </el-table> | |||
| 
 | |||
|         <!-- 分页 --> | |||
|         <pagination | |||
|           v-show="total > 0" | |||
|           :total="total" | |||
|           v-model:page="queryParams.pageNum" | |||
|           v-model:limit="queryParams.pageSize" | |||
|           @pagination="handlePagination" | |||
|         /> | |||
|       </el-col> | |||
|     </el-row> | |||
|     <FormDialog | |||
|       ref="formDialogRef" | |||
|       :directoryTree="directoryTree" | |||
|       @onSuccess="setDirectoryTree" | |||
|     /> | |||
|     <MoveDialog | |||
|       ref="moveDialogRef" | |||
|       :directoryTree="directoryTree" | |||
|       @onSuccess="setDirectoryTree" | |||
|     /> | |||
|     <MergerDialog | |||
|       ref="mergerDialogRef" | |||
|       :directoryTree="directoryTree" | |||
|       @onSuccess="setDirectoryTree" | |||
|     /> | |||
|     <AssetMoveDialog | |||
|       ref="assetMoveDialogRef" | |||
|       :directoryTree="directoryTree" | |||
|       @onSuccess="setDirectoryTree" | |||
|     /> | |||
|     <AddEditForm | |||
|       :data="selectedRow" | |||
|       :isEdit="isEdit" | |||
|       :dbResourceOldList="dbResourceOldList" | |||
|       v-model:visible="dialogVisible" | |||
|       @refresh="getList" | |||
|     /> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script setup name="Directory"> | |||
| import { ElMessage, ElMessageBox } from 'element-plus' | |||
| import { | |||
|   getDirectoryTree, | |||
|   delDirectory, | |||
|   delDirectoryAsset, | |||
|   addDirectoryCollection, | |||
|   cancelDirectoryCollection, | |||
| } from '@/api/datastd/directory' | |||
| import auth from '@/plugins/auth' | |||
| import FormDialog from './components/FormDialog.vue' | |||
| import MoveDialog from './components/MoveDialog.vue' | |||
| import MergerDialog from './components/MergerDialog.vue' | |||
| import AssetMoveDialog from './components/AssetMoveDialog.vue' | |||
| import AddEditForm from "./components/AddEditForm.vue"; | |||
| import { | |||
|   listStdMain, | |||
|   getStdMain, | |||
|   deleteStdMain, | |||
| } from "@/api/datastd/std"; // 更新为新的接口 | |||
| import useUserStore from '@/store/modules/user' | |||
| import { nextTick } from 'vue' | |||
| 
 | |||
| import { datasourcetree } from "@/api/meta/metatask"; | |||
| const { proxy } = getCurrentInstance() | |||
| const { hasPermiOr } = auth | |||
| const userStore = useUserStore() | |||
| 
 | |||
| const defaultProps = { | |||
|   children: 'children', | |||
|   label: 'contentName', | |||
| } | |||
| const directoryTree = ref([]) | |||
| const currentNode = ref({}) | |||
| 
 | |||
| const directoryTableData = ref([]) | |||
| const queryParams = ref({ | |||
|   stdNum: '', | |||
|   stdMenu: '',  | |||
|   pageNum: 1, | |||
|   pageSize: 10, | |||
| }); | |||
| const single = ref(true); | |||
| const multiple = ref(true); | |||
| const dialogVisible = ref(false); | |||
| const selectedRow = ref(null); | |||
| const isEdit = ref(false); | |||
| const tableData = ref([]); | |||
| const total = ref(0); | |||
| const loading = ref(false); | |||
| const ids = ref([]); | |||
| const stdNums = ref([]); | |||
| const handlePagination = (pageNum, pageSize) => { | |||
|   queryParams.value.pageNum = pageNum; | |||
|   queryParams.value.pageSize = pageSize; | |||
|   handleQuery(); | |||
| }; | |||
| 
 | |||
| const resetQuery = () => { | |||
|   queryParams.value = { stdNum: '', stdMenu: '' ,   pageNum: 1, | |||
|   pageSize: 10} | |||
|   handleQuery() | |||
| } | |||
| const handleQuery = () => { | |||
|   queryParams.value.pageNum = 1; | |||
|   getList(); | |||
| }; | |||
| const handleSelectionChange = (selection) => { | |||
|   single.value = selection.length !== 1; | |||
|   multiple.value = !selection.length; | |||
|   ids.value = selection.map((item) => item.id); | |||
|   stdNums.value = selection.map((item) => item.stdNum); | |||
| }; | |||
| const setDirectoryTree = () => { | |||
|   return getDirectoryTree({ | |||
|     pageSize: 999, | |||
|   }).then(({ rows }) => { | |||
|     directoryTree.value = addTreeNodeId(rows) | |||
|   }) | |||
| } | |||
| setDirectoryTree().then(async () => { | |||
|   if (directoryTree.value.length) { | |||
|     currentNode.value = directoryTree.value[0] | |||
|     directoryTableData.value = directoryTree.value[0].children || [] | |||
| 
 | |||
|   } | |||
| }) | |||
| const getList = async () => { | |||
|   loading.value = true; | |||
|   const response = await listStdMain(queryParams.value); | |||
|   tableData.value = response.rows; | |||
|   total.value = response.total; | |||
|   loading.value = false; | |||
| }; | |||
| const handleRemove = (row) => { | |||
|   const idsToDelete = row.id ? [row.id] : ids.value; | |||
|   const codesToDelete = row.stdNum ? [row.stdNum] : stdNums.value; | |||
|   proxy.$modal | |||
|     .confirm( | |||
|       '是否确认删除标准编号为"' + codesToDelete.toString() + '"的数据项?' | |||
|     ) | |||
|     .then(function () { | |||
|       return deleteStdMain(idsToDelete.toString()); | |||
|     }) | |||
|     .then(() => { | |||
|       handleQuery(); | |||
|       proxy.$modal.msgSuccess("删除成功"); | |||
|     }) | |||
|     .catch(() => {}); | |||
| }; | |||
| const dbResourceOldList = ref([]); | |||
| 
 | |||
| const handleAdd = () => { | |||
|   console.log("update:visible", 111); | |||
|   isEdit.value = false; | |||
|   selectedRow.value = { | |||
|     stdType: "", | |||
|     stdNum: "", | |||
|     stdCode: "", | |||
|     stdName: "", | |||
|     stdMenu: "", | |||
|     dataType: "", | |||
|     stdCode: "", | |||
|     bussDeptId: "", | |||
|     bussUser: "", | |||
|     techDeptId: "", | |||
|     techUser: "", | |||
|   }; | |||
| 
 | |||
|   // 清空选中的数据 | |||
|   dialogVisible.value = true; | |||
| }; | |||
| 
 | |||
| const handleEdit = (row) => { | |||
|   const id = row.id ? row.id : ids.value.toString(); | |||
|   getStdMain(id).then((response) => { | |||
|     selectedRow.value = response.data; | |||
|     isEdit.value = true; | |||
|     dialogVisible.value = true; | |||
|   }); | |||
| }; | |||
| /** 增加临时ID作为树节点的唯一键值 */ | |||
| const addTreeNodeId = (tree) => { | |||
|   return tree.map((node) => { | |||
|     return { | |||
|       ...node, | |||
|       tempId: node.astOnum || node.contentOnum, | |||
|       children: | |||
|         node.children && node.children.length | |||
|           ? addTreeNodeId(node.children) | |||
|           : [], | |||
|     } | |||
|   }) | |||
| } | |||
| const filterText = ref(undefined) | |||
| const treeRef = ref(null) | |||
| watch(filterText, (val) => { | |||
|   treeRef.value.filter(val) | |||
| }) | |||
| 
 | |||
| const filterNode = (value, data) => { | |||
|   if (!value) { | |||
|     return true | |||
|   } | |||
|   if (data.contentName) { | |||
|     return data.contentName.includes(value) | |||
|   } | |||
|   if (data.dataAstCnName) { | |||
|     return data.dataAstCnName.includes(value) | |||
|   } | |||
| } | |||
| 
 | |||
| // 是否根分类 | |||
| const isRoot = (data) => { | |||
|   return data.contentOnum === 1 | |||
| } | |||
| 
 | |||
| // 是否我的收藏分类 | |||
| const isCollectionDirectory = (data) => { | |||
|   return data.contentName === '临时' | |||
| } | |||
| 
 | |||
| // 是否收藏的分类 | |||
| const isCollection = (data) => { | |||
|   return false | |||
| } | |||
| 
 | |||
| // 是否已收藏的 | |||
| const isCollected = (data) => { | |||
|   return data.bookmarkFlag === 1 | |||
| } | |||
| 
 | |||
| 
 | |||
| // 是否子分类 | |||
| const isDirectory = (data) => { | |||
|   return data.contentOnum && !isRoot(data) && !data.astOnum | |||
| } | |||
| 
 | |||
| // 是否资产 | |||
| const isAsset = (data) => { | |||
|   return data.astOnum | |||
| } | |||
| 
 | |||
| const activeName = ref('1') | |||
| const handleNodeClick = async (data) => { | |||
|   if (isCollectionDirectory(data)) { | |||
|     return | |||
|   } | |||
| 
 | |||
| } | |||
| 
 | |||
| const handleCollect = (data, e) => { | |||
|   e.stopPropagation() | |||
|   addDirectoryCollection({ | |||
|     dataAstNo: String(data.dataAstNo), | |||
|     userId: String(userStore.id), | |||
|   }).then(() => { | |||
|     proxy.$modal.msgSuccess('收藏成功') | |||
|     setDirectoryTree() | |||
|   }) | |||
| } | |||
| 
 | |||
| const handleCollectionCancel = (data, e) => { | |||
|   e.stopPropagation() | |||
|   cancelDirectoryCollection(data.relaOnum).then(() => { | |||
|     proxy.$modal.msgSuccess('取消成功') | |||
|     setDirectoryTree() | |||
|   }) | |||
| } | |||
| 
 | |||
| const formDialogRef = ref(null) | |||
| const handleAddDialogOpen = (data) => { | |||
|   formDialogRef.value.title = '新增分类' | |||
|   formDialogRef.value.openDialog({ | |||
|     suprContentOnum: data.contentOnum, | |||
|   }) | |||
| } | |||
| 
 | |||
| const handleEditDialogOpen = (data) => { | |||
|   formDialogRef.value.title = '修改分类' | |||
|   formDialogRef.value.openDialog(data) | |||
| } | |||
| 
 | |||
| const handleDelete = (data) => { | |||
|   ElMessageBox.confirm( | |||
|     `确定删除 ${data.contentName} 分类吗?`, | |||
|     '分类删除', | |||
|     { | |||
|       confirmButtonText: '确定', | |||
|       cancelButtonText: '取消', | |||
|       type: 'warning', | |||
|     } | |||
|   ).then(() => { | |||
|     delDirectory(data.contentOnum).then(() => { | |||
|       proxy.$modal.msgSuccess('删除成功') | |||
|       setDirectoryTree() | |||
|     }) | |||
|   }) | |||
| } | |||
| 
 | |||
| const moveDialogRef = ref(null) | |||
| const handleMoveDialogOpen = (data) => { | |||
|   moveDialogRef.value.title = '移动分类' | |||
|   moveDialogRef.value.openDialog(data) | |||
| } | |||
| 
 | |||
| const mergerDialogRef = ref(null) | |||
| const handleMergerDialogOpen = (data) => { | |||
|   mergerDialogRef.value.title = '合并分类' | |||
|   mergerDialogRef.value.openDialog(data) | |||
| } | |||
| 
 | |||
| const handleAssetDelete = (data) => { | |||
|   ElMessageBox.confirm(`确定删除 ${data.dataAstCnName} 资产吗?`, '资产删除', { | |||
|     confirmButtonText: '确定', | |||
|     cancelButtonText: '取消', | |||
|     type: 'warning', | |||
|   }).then(() => { | |||
|     delDirectoryAsset({ | |||
|       ...data, | |||
|       relaStatus: '0', // 0-删除,1-正常 | |||
|     }).then(() => { | |||
|       proxy.$modal.msgSuccess('删除成功') | |||
|       setDirectoryTree() | |||
|     }) | |||
|   }) | |||
| } | |||
| 
 | |||
| const assetMoveDialogRef = ref(null) | |||
| const handleAssetMoveDialogOpen = (data) => { | |||
|   assetMoveDialogRef.value.title = '移动资产' | |||
|   assetMoveDialogRef.value.openDialog(data) | |||
| } | |||
| 
 | |||
| const handleCommand = (command, data) => { | |||
|   const strategy = { | |||
|     handleAddDialogOpen: handleAddDialogOpen, | |||
|     handleEditDialogOpen: handleEditDialogOpen, | |||
|     handleDelete: handleDelete, | |||
|     handleMoveDialogOpen: handleMoveDialogOpen, | |||
|     handleMergerDialogOpen: handleMergerDialogOpen, | |||
|     handleAssetDelete: handleAssetDelete, | |||
|     handleAssetMoveDialogOpen: handleAssetMoveDialogOpen, | |||
|   } | |||
|   strategy[command](data) | |||
| } | |||
| 
 | |||
| onMounted(() => { | |||
|   datasourcetree().then((response) => { | |||
|     dbResourceOldList.value = response.rows; | |||
| 
 | |||
|   }); | |||
|   getList(); | |||
| }); | |||
| 
 | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .tree-box { | |||
|   overflow: auto; | |||
| } | |||
| .tree { | |||
|   margin-top: 10px; | |||
|   min-width: 260px; | |||
| } | |||
| .custom-tree-node { | |||
|   flex: 1; | |||
|   display: flex; | |||
|   align-items: center; | |||
|   justify-content: space-between; | |||
|   .tree-node__action { | |||
|     padding: 0 8px; | |||
|     display: flex; | |||
|     justify-content: flex-end; | |||
|   } | |||
| } | |||
| 
 | |||
| :deep( | |||
|     .el-descriptions__body | |||
|       .el-descriptions__table.is-bordered | |||
|       .el-descriptions__cell | |||
|   ) { | |||
|   width: 80px !important; | |||
| } | |||
| 
 | |||
| .faq { | |||
|   white-space: pre-wrap; | |||
| } | |||
| 
 | |||
| 
 | |||
| 
 | |||
| iframe { | |||
|   border: none; | |||
| } | |||
| </style> | |||
					Loading…
					
					
				
		Reference in new issue