Compare commits

..

No commits in common. "c212f628c5045339458e34d5cbaa014799dc35f9" and "63b3adfa2cdb34c818933f533ec9cd2f2da7632d" have entirely different histories.

2 changed files with 48 additions and 116 deletions

View File

@ -50,7 +50,7 @@ router.beforeEach(async (to, from, next) => {
if (!userState.token && storageToken) restoreToken(storageToken); if (!userState.token && storageToken) restoreToken(storageToken);
// 4. Vuex 有 token但还没有动态路由获取用户资源, 生成动态路由 // 4. Vuex 有 token但还没有动态路由获取用户资源, 生成动态路由
if (userState.token && dynamicRoutes.length === 0) loadRoutes(userState, next); if (userState.token && dynamicRoutes.length === 0) loadRoutes(userState.isAdmin, next);
// 5. 放行 // 5. 放行
next(); next();
@ -88,13 +88,13 @@ function restoreToken(token) {
} }
/** 生成并加载动态路由 */ /** 生成并加载动态路由 */
async function loadRoutes(userState, next) { async function loadRoutes(isAdmin, next) {
try { try {
await store.dispatch('user/getUserInfo')
const routesResource = await store.dispatch("user/getRoutesResource"); const routesResource = await store.dispatch("user/getRoutesResource");
dynamicRoutes = generateIndexRouter(routesResource); dynamicRoutes = generateIndexRouter(routesResource);
router.addRoutes(dynamicRoutes); router.addRoutes(dynamicRoutes);
if (userState.isAdmin) {
if (isAdmin) {
router.addRoutes([systemSettings]); router.addRoutes([systemSettings]);
} }
} catch (err) { } catch (err) {

View File

@ -166,10 +166,7 @@ export default {
workHourStatistics: {} workHourStatistics: {}
}, },
quarterData: {}, quarterData: {},
teamTreeData: {
options: [],
idChildrenMap: {} idChildrenMap: {}
}
}; };
}, },
computed:{ computed:{
@ -193,8 +190,10 @@ export default {
// return res // return res
return moment(this.quarterStartTime).subtract(1, 'quarters').valueOf(); return moment(this.quarterStartTime).subtract(1, 'quarters').valueOf();
}, },
options() { options(){
return this.teamTreeData.options; const idChildrenMap = {};
const options = this.listToTreeData(this.teamList,{id:0},'parentTeamId',idChildrenMap);
return options;
} }
}, },
watch:{ watch:{
@ -203,11 +202,8 @@ export default {
// this.getTeamList(); // this.getTeamList();
this.getTeamOverview(); this.getTeamOverview();
}, },
teamList: { teamList(){
immediate: true, this.idChildrenMap = {}
handler(newTeamList) {
this.updateTeamTree(newTeamList);
}
} }
}, },
created(){ created(){
@ -220,80 +216,32 @@ export default {
...mapActions({ ...mapActions({
getTeamList: 'teamResource/getTeamList', getTeamList: 'teamResource/getTeamList',
}), }),
/** listToTreeData(list, parent, pid, map) {
* 将扁平的团队列表转换为树形结构 const res = []
* @param {Array} list - 原始团队列表数据 map[parent.id]=[]
*/ parent.visible = false
updateTeamTree(list) { if(parent.teamType===0){
// parent.visible = true
// key: IDvalue: map[parent.id].push({id: parent.id, teamName:parent.teamName })
const parentChildMap = {}; }else{
// key: IDvalue:
const idChildrenMap = {};
//
list.forEach(item => { list.forEach(item => {
// ID0 if (item[pid] === parent.id) {
const pid = item.parentTeamId || 0; // ,
// // item.id pid
if (!parentChildMap[pid]) { const children = this.listToTreeData(list, item, pid, map)
parentChildMap[pid] = []; // ,
if (children.length > 0) {
item.children = children
} }
// if(item.visible){
parentChildMap[pid].push(item); parent.visible = true
}); res.push(item)
map[parent.id].push({id: item.id, teamName:item.teamName })
/**
* 递归构建树形结构
* @param {number} parentId - 父团队ID
* @returns {Array} - 返回构建好的树形结构数组
*/
const buildTree = (parentId = 0) => {
//
const children = parentChildMap[parentId] || [];
//
idChildrenMap[parentId] = [];
// 使reduceacc
return children.reduce((acc, node) => {
// 0
if (node.teamType === 0) {
//
idChildrenMap[parentId].push({
id: node.id,
teamName: node.teamName
});
//
acc.push(node);
return acc;
} }
//
//
const subTree = buildTree(node.id);
//
if (subTree.length > 0) {
//
node.children = subTree;
//
acc.push(node);
//
idChildrenMap[parentId].push({
id: node.id,
teamName: node.teamName
});
} }
return acc; })
}, []); }
}; return res
//
// options:
// idChildrenMap:
this.teamTreeData = {
options: buildTree(),
idChildrenMap
};
}, },
async getQuarterStatistics(){ async getQuarterStatistics(){
const { data } = await getQuarterStatistics({ const { data } = await getQuarterStatistics({
@ -304,28 +252,17 @@ export default {
this.quarterData = data; this.quarterData = data;
} }
}, },
async getTeamOverview(teamId) { async getTeamOverview(teamId){
const { data } = await getTeamOverview({ // const { quarterStartTime, quarterEndTime } = quarter2Timestamp(this.quarter);
lastQuarterStartTime: this.lastQuarterStartTime, // const lastQuarterStartTime = moment(quarterStartTime).subtract(1, 'quarters').valueOf();
quarterStartTime: this.quarterStartTime, // const aQuarterAgo = moment(quarterStartTime).subtract(1, 'quarters').valueOf();
teamId // const { quarterStartTime:lastQuarterStartTime, quarterEndTime:lastQuarterEndTime } = quarter2Timestamp(timestamp2Quarter(aQuarterAgo));
}); const { data } = await getTeamOverview({ lastQuarterStartTime: this.lastQuarterStartTime, quarterStartTime: this.quarterStartTime, teamId });
if(data){
if(data) { // this.teamProfiles = data;
// ID使0 const ids = data.map(team=>team.teamId);
const currentTeamId = teamId ?? 0; const needFillChildren = this.idChildrenMap[teamId??0].filter(child=>!ids.includes(child.id));
const filledChildren = needFillChildren.map(child=>({
// idChildrenMap
const teamChildren = this.teamTreeData.idChildrenMap[currentTeamId] || [];
// ID
const ids = data.map(team => team.teamId);
//
const needFillChildren = teamChildren.filter(child => !ids.includes(child.id));
//
const filledChildren = needFillChildren.map(child => ({
teamType: 0, teamType: 0,
disabled: true, disabled: true,
teamId: child.id, teamId: child.id,
@ -341,12 +278,7 @@ export default {
deliveredStoryCompareLast: null, deliveredStoryCompareLast: null,
projectCurrentQuarter: [] projectCurrentQuarter: []
})); }));
this.teamProfiles = [ ...data, ...filledChildren ];
//
this.teamProfiles = [...data, ...filledChildren];
} else {
//
this.teamProfiles = [];
} }
}, },
async getYearStatistics(){ async getYearStatistics(){