|
|
@@ -4,7 +4,7 @@ import { ref, computed } from 'vue';
|
|
|
import { getEnfMineTree } from '/@/api/sys/menu';
|
|
|
import { getUserMinePermissionData } from '/@/components/Form/src/jeecg/components/MineCascader/mineData.api';
|
|
|
import { findNode, findNodeAll, findPath, listToTree, treeToList } from '/@/utils/helper/treeHelper';
|
|
|
-import { isArray } from 'lodash';
|
|
|
+import { isArray, isFunction, isNil } from 'lodash';
|
|
|
|
|
|
export interface MineDepartment {
|
|
|
/** 唯一标识 */
|
|
|
@@ -37,7 +37,7 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
|
|
|
const departTree = ref<MineDepartment[]>([]);
|
|
|
|
|
|
/** 原始组织树(保存原始数据,用于恢复或重新过滤) */
|
|
|
- const rawTree = ref<MineDepartment[]>([]);
|
|
|
+ // const rawTree = ref<MineDepartment[]>([]);
|
|
|
|
|
|
// ==================== Getter 计算属性 ====================
|
|
|
|
|
|
@@ -52,7 +52,7 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
|
|
|
|
|
|
/** 获取当前选中的部门在组织树中的访问路径 */
|
|
|
const getDepartPath = computed(() => {
|
|
|
- return findPath(departTree.value, (item) => item.id === getDepartId.value, DEFAULT_CONFIG) || [];
|
|
|
+ return calcDepartPathById(getDepartId.value, getDepartTree.value);
|
|
|
});
|
|
|
|
|
|
/**
|
|
|
@@ -63,15 +63,7 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
|
|
|
*/
|
|
|
const getMineCode = computed(() => {
|
|
|
const target = getDepartId.value ? [depart.value] : departTree.value;
|
|
|
- const list = treeToList(target, DEFAULT_CONFIG);
|
|
|
-
|
|
|
- if (isArray(list)) {
|
|
|
- return list
|
|
|
- .filter((item) => item.isLeaf && item.fax) // 只取叶子节点(矿井)且fax不为空
|
|
|
- .map((item) => item.fax!) // 提取矿井编码
|
|
|
- .join(','); // 用逗号分隔多个矿井编码
|
|
|
- }
|
|
|
- return '';
|
|
|
+ return calcMineCodeByDepart(target);
|
|
|
});
|
|
|
|
|
|
// ==================== Action 方法 ====================
|
|
|
@@ -80,7 +72,7 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
|
|
|
* 设置当前选中的部门
|
|
|
* @param dep - 部门对象
|
|
|
*/
|
|
|
- function setDepart(dep: MineDepartment) {
|
|
|
+ function setDepart(dep?: MineDepartment) {
|
|
|
// if (isNil(dep) || isEmpty(dep)) return;
|
|
|
depart.value = dep;
|
|
|
}
|
|
|
@@ -90,7 +82,7 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
|
|
|
* @param id - 部门ID,默认为空字符串
|
|
|
*/
|
|
|
function setDepartById(id: string = '') {
|
|
|
- const node = findNode(departTree.value, (item) => item.id === id, DEFAULT_CONFIG);
|
|
|
+ const node = findDepartById(id, departTree.value);
|
|
|
setDepart(node);
|
|
|
}
|
|
|
|
|
|
@@ -120,7 +112,7 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
|
|
|
|
|
|
departTree.value = tree;
|
|
|
// 深拷贝保存原始数据,用于过滤后恢复
|
|
|
- rawTree.value = JSON.parse(JSON.stringify(tree));
|
|
|
+ // rawTree.value = JSON.parse(JSON.stringify(tree));
|
|
|
|
|
|
// 如果需要自动选中第一个叶子节点(矿井),可以取消注释以下代码
|
|
|
/*
|
|
|
@@ -142,30 +134,83 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 过滤组织树
|
|
|
+ * 清除选中的部门
|
|
|
+ */
|
|
|
+ function clearDepart() {
|
|
|
+ depart.value = undefined;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 工具函数,过滤组织树并返回,不改变组织树数据
|
|
|
* @param fn - 过滤函数,返回true表示保留该节点
|
|
|
*/
|
|
|
function filterDepartTree(fn: (node: MineDepartment) => boolean) {
|
|
|
// 只有在有原始数据时才进行过滤
|
|
|
- if (rawTree.value.length > 0) {
|
|
|
- departTree.value = findNodeAll(rawTree.value, fn, DEFAULT_CONFIG);
|
|
|
+ if (departTree.value.length > 0) {
|
|
|
+ return findNodeAll(departTree.value, fn, DEFAULT_CONFIG);
|
|
|
}
|
|
|
+ return [];
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 恢复原始组织树(取消过滤)
|
|
|
+ * 工具函数,获取给出的部门下矿井编号的集合
|
|
|
*/
|
|
|
- function restoreDepartTree() {
|
|
|
- if (rawTree.value.length > 0) {
|
|
|
- departTree.value = JSON.parse(JSON.stringify(rawTree.value));
|
|
|
+ function calcMineCodeByDepart(depart?: MineDepartment): string;
|
|
|
+ function calcMineCodeByDepart(depart?: (MineDepartment | undefined)[]): string;
|
|
|
+ function calcMineCodeByDepart(depart?: MineDepartment | (MineDepartment | undefined)[]): string {
|
|
|
+ if (!depart) return '';
|
|
|
+ if (!isArray(depart)) {
|
|
|
+ depart = [depart];
|
|
|
}
|
|
|
+ const target = depart.filter((e) => !isNil(e));
|
|
|
+ const list = treeToList(target, DEFAULT_CONFIG);
|
|
|
+
|
|
|
+ if (isArray(list)) {
|
|
|
+ return list
|
|
|
+ .filter((item) => item.isLeaf && item.fax) // 只取叶子节点(矿井)且fax不为空
|
|
|
+ .map((item) => item.fax!) // 提取矿井编码
|
|
|
+ .join(','); // 用逗号分隔多个矿井编码
|
|
|
+ }
|
|
|
+ return '';
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 清除选中的部门
|
|
|
+ * 工具函数,获取走到所选部门必要路径
|
|
|
*/
|
|
|
- function clearDepart() {
|
|
|
- depart.value = undefined;
|
|
|
+ function calcDepartPathById<T>(id?: string, depart?: MineDepartment, mapFn?: (node: MineDepartment) => T): T[];
|
|
|
+ function calcDepartPathById<T>(id?: string, depart?: (MineDepartment | undefined)[], mapFn?: (node: MineDepartment) => T): T[];
|
|
|
+ function calcDepartPathById<T>(id?: string, depart?: MineDepartment | (MineDepartment | undefined)[], mapFn?: (node: MineDepartment) => T) {
|
|
|
+ if (!id) return [];
|
|
|
+ if (!depart) return [];
|
|
|
+ if (!isArray(depart)) {
|
|
|
+ depart = [depart];
|
|
|
+ }
|
|
|
+ const target = depart.filter((e) => !isNil(e));
|
|
|
+ const path = findPath(target, (e) => e.id === id, DEFAULT_CONFIG);
|
|
|
+
|
|
|
+ if (!isArray(path)) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ if (isFunction(mapFn)) {
|
|
|
+ return path.map(mapFn);
|
|
|
+ }
|
|
|
+ return path;
|
|
|
+ }
|
|
|
+
|
|
|
+ function findDepartById(id?: string, depart?: MineDepartment): MineDepartment | undefined;
|
|
|
+ function findDepartById(id?: string, depart?: (MineDepartment | undefined)[]): MineDepartment | undefined;
|
|
|
+ function findDepartById(id?: string, depart?: MineDepartment | (MineDepartment | undefined)[]): MineDepartment | undefined {
|
|
|
+ if (!id) return;
|
|
|
+ if (!depart) return;
|
|
|
+ if (!isArray(depart)) {
|
|
|
+ depart = [depart];
|
|
|
+ }
|
|
|
+
|
|
|
+ const target = depart.filter((e) => !isNil(e));
|
|
|
+ const node = findNode(target, (e) => e.id === id, DEFAULT_CONFIG);
|
|
|
+
|
|
|
+ if (isNil(node)) return;
|
|
|
+ return node;
|
|
|
}
|
|
|
|
|
|
// ==================== 暴露的属性和方法 ====================
|
|
|
@@ -174,7 +219,6 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
|
|
|
// --- State(可修改)---
|
|
|
depart,
|
|
|
departTree,
|
|
|
- rawTree,
|
|
|
|
|
|
// --- Getter(只读计算属性)---
|
|
|
getDepart,
|
|
|
@@ -189,7 +233,9 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
|
|
|
// setDepartTree,
|
|
|
fetchDepartTree,
|
|
|
filterDepartTree,
|
|
|
- restoreDepartTree,
|
|
|
clearDepart,
|
|
|
+ calcMineCodeByDepart,
|
|
|
+ calcDepartPathById,
|
|
|
+ findDepartById,
|
|
|
};
|
|
|
});
|