开源度量-修改层级关系

This commit is contained in:
caishi 2024-11-07 16:06:04 +08:00
commit 7fbaf07b5b
11 changed files with 54 additions and 42 deletions

View File

@ -1,5 +1,5 @@
import React , { useEffect, useState } from 'react';
import { getSpecialProjectDetail, getSpecialProjectList, getSpecialProjectTypeList } from '../../../api';
import { getSpecialProjectDetail, getSpecialProjectList, getSpecialProjectTypeList, getImage } from '../../../api';
import { Col, Divider, Row, Tag } from 'antd';
import Nodata from '../../../../Nodata';
import '../index.scss';
@ -128,7 +128,7 @@ function SpecialProjects({data, subTitle}) {
>
<span className={`font-bd font-22 s_p_d_order align s_p_d_order${index+1}`}>{index+1}</span>
<div className='font-bd font-17 task-hide-2 mb5'>{item.name}</div>
<div className='task-hide-2 color6B7'>摘要{item.description}</div>
{ item.responsibleCompany && <div className='task-hide-2 color6B7 breadk-all'>承担单位{item.responsibleCompany}</div> }
<p style={{color: '#75798A'}} className='mt6'><i className='iconfont icon-chengyuan2 font-15 mr5'></i>{item.projectLeader}</p>
</div>
);
@ -142,7 +142,7 @@ function SpecialProjects({data, subTitle}) {
if (currentRow.some(item => item.key === selectedItem?.toString())) {
const {detail, PAPER=[], PATENT=[], PROJECT=[]} = projectDetail;
const {name, projectLeader, awards, description} = detail || {};
const {name, projectLeader, awards, introductionImageIdentifier} = detail || {};
rendered.push(
<div key={`details-${selectedItem}`} className="item-details">
<div className="details-content">
@ -150,7 +150,7 @@ function SpecialProjects({data, subTitle}) {
<Tag color='#466AFF' style={{padding: '0 2px'}}>项目</Tag><span className='font-20 font-bd'>{name}</span>
<p className='mt10 font-15 pb5'>项目负责人<span className='color212'>{projectLeader}</span></p>
{ awards && <p className='font-15 pb5'>奖项<span className='color-blue'>{awards}</span></p> }
<p className='font-15 pb5'>摘要<span className='color212'>{description}</span></p>
{ introductionImageIdentifier &&<p className='font-15 pb5 intro imageLayerParent'>简介<img className="intro-img pointer" src={ getImage(introductionImageIdentifier) } alt="" /></p>}
</div>
<div style={{padding: '22px 33px'}}>
{list("论文", "论文标题", "作者", "单位", PAPER)}

View File

@ -399,6 +399,9 @@
margin-bottom: 35px;
cursor: pointer;
transition: all 0.3s ease;
.breadk-all {
word-break: break-all;
}
.s_p_d_order{
width: 36px;
height: 30px;
@ -461,6 +464,12 @@
background: #FFFFFF;
box-shadow: 0px 0px 10px 1px rgba(88,116,255,0.18);
border-radius: 4px;
.intro {
display: flex;
}
.intro-img {
width: 200px;
}
}
.leftBox{
position: relative;

View File

@ -1,5 +1,9 @@
import fetch from './fetch';
import fetch, { httpUrl } from './fetch';
export function getImage(identifier) {
return `${ httpUrl }/file/open/downloadByIdentifier/${ identifier }`
}
/**入口页接口***/
export function getMainInfos(deptId, params) {

View File

@ -9,10 +9,10 @@ function DataStack({ data }){
const [ userDrop , setUserDrop ] = useState([]);
const [ userValue , setUserValue ] = useState([]);
useEffect(()=>{
if(data){
let drop = Object.keys(data);
console.log("---",drop);
setUserDrop(drop);
setUserValue(drop[0]);
}
@ -45,7 +45,7 @@ function DataStack({ data }){
</Select>
</div>
}
<StackImg x={keys} values={values}/>
<StackImg x={keys} values={[{name:"", type: 'line',stack: 'Total',data:values}]} id={"companyNum"}/>
</div>
)
}

View File

@ -30,7 +30,7 @@ function Indicator({owner , projectsId , data , subCardIndex}){
dataIndex: "InitialScore",
align:"center",
render:(v)=>{
return `${parseInt(v)}`
return `${Math.round(v)}`
}
},
{
@ -38,7 +38,7 @@ function Indicator({owner , projectsId , data , subCardIndex}){
align:"center",
dataIndex: "Weight",
render:(v)=>{
return `${parseFloat(v*100).toFixed(1)}%`
return `${v ? parseFloat(v*100).toFixed(1) : 0}%`
}
},
]

View File

@ -40,7 +40,7 @@ function Stack({name,data , type}){
if(list && list.length > 0){
let values = [];
const monthList = list.map(obj => obj.month);
values = list.map(obj => obj[type] || obj["count"] || obj['commits_number'] || 0);
values = list.map(obj => Math.round(obj[type] || obj["count"] || obj['commits_number'] || 0));
Init(monthList,values);
}
},[list])

View File

@ -3,12 +3,12 @@ import * as echarts from 'echarts';
function StackImg({x,values,title,id}){
useEffect(()=>{
if(x && values && x.length>0 && values.length>0){
if(x && values && x.length>0 && values.length>0 && id){
Init(x,values)
}
},[x,values])
},[x,values,id])
function Init(){
function Init(xData,data){
var huan_val = document.getElementById(id);
var myEcharts = echarts.init(huan_val);
let option = {
@ -42,12 +42,12 @@ function StackImg({x,values,title,id}){
xAxis: {
type: 'category',
boundaryGap: false,
data: x
data: xData
},
yAxis: {
type: 'value'
},
series: values
series: data
};
myEcharts.setOption(option);
}

View File

@ -17,9 +17,9 @@ export const subField={
项目影响:"influence"
}
export const thirdData = {
developmentEfficiency:["PRNum","PRTime","commitNum","issueTime"],
developmentEfficiency:["PRNum","PRTime","commitNum","issueTime","individualHistory"],
developmentQuality:["commitMessageQuality","issueNum"],
individual:["individualHistory","individualLoss","individualNum","longTermIndividualNum"],
individual:["individualLoss","individualNum","longTermIndividualNum"],
company:["companyLead","companyLoss","companyNum","longTermCompanyNum"],
influence:["branchNum","browseNum","forkNum","praiseNum","storeNum"]
}
@ -30,10 +30,10 @@ export const fieldData = {
issueTime:"Issue处理间隔",
commitMessageQuality:"Commit message质量",
issueNum:"Issue数量",
individualHistory:"所有个体开发者贡献历史",
individualLoss:"个体贡献者流失预测",
individualNum:"个体贡献者数量",
longTermIndividualNum:"长期个体贡献者数量",
individualHistory:"项目活跃度",
individualLoss:"长期贡献者稳定性",
individualNum:"活跃开发者占比",
longTermIndividualNum:"长期贡献者占比",
companyLead:"公司主导",
companyLoss:"公司贡献者流失预测",
companyNum:"公司贡献者数量",
@ -51,12 +51,12 @@ export const detailByName={
Issue数量:{desc:"通过分析项目每月提交的Issue数量对Issue数量指标进行度量"},
Commit数量:{desc:"通过分析项目每月提交的三种Commit数量对Commit数量指标进行度量"},
PR数量:{desc:"通过分析项目每月提交的PR数量对PR数量指标进行度量"},
PR处理间隔:{desc:"通过分析每个月新增PR的平均处理间隔对PR处理间隔指标进行度量"},
Issue处理间隔:{desc:"通过分析每个月新增Issue的平均处理间隔对Issue处理间隔指标进行度量"},
个体贡献者数量:{desc:"通过分析每个月活跃的个体贡献者数量对个体贡献者数量指标进行度量"},
所有个体开发者贡献历史:{desc:"不同类型的贡献者每月/周给master分支的贡献次数",month:true,user_login:true},
长期个体贡献者数量:{desc:"通过分析每个月活跃的长期个体贡献者数量对长期个体贡献者数量指标进行度量"},
个体贡献者流失预测:{desc:"通过分析具体的即将流失的长期贡献者流失概率对个体贡献者流失预测指标进行度量",bar:true},
PR处理间隔:{desc:"通过分析每个月新增PR的平均处理间隔对PR处理间隔(小时)指标进行度量"},
Issue处理间隔:{desc:"通过分析每个月新增Issue的平均处理间隔对Issue处理间隔(小时)指标进行度量"},
活跃开发者占比:{desc:"通过分析每个月活跃的活跃开发者占比数量对活跃开发者指标进行度量"},
项目活跃度:{desc:"不同类型的贡献者每月/周给master分支的贡献次数",month:true,user_login:true},
长期贡献者占比:{desc:"通过分析每个月活跃的长期个体贡献者数量对长期个体贡献者数量指标进行度量"},
长期贡献者稳定性:{desc:"通过分析具体的即将流失的长期贡献者流失概率对个体贡献者稳定性指标进行度量",bar:true},
公司贡献者数量:{desc:"通过分析每月做出了贡献的公司贡献者数量对公司贡献者数量指标进行度量"},
长期公司贡献者数量:{desc:"通过分析每月的长期对项目做出贡献的公司贡献者数量对长期公司贡献者数量指标进行度量"},
公司主导:{desc:"从每月公司贡献占比、每月公司总贡献、每月公司贡献最高模块中总贡献、公司总提交数四个方面对公司主导指标进行度量",radar:true},

View File

@ -11,10 +11,10 @@ import Nodata from '../../Nodata';
const dimensionData = {
开发质量: ['Commit message质量', 'Issue数量'],
开发效率: ['PR数量', 'PR处理间隔', 'Issue处理间隔', 'Commit数量'],
个体开发者:['个体贡献者数量','所有个体开发者贡献历史','长期个体贡献者数量','个体贡献者流失预测'],
商业公司:['公司贡献者数量','长期公司贡献者数量','公司主导','公司贡献者流失预测'],
项目影响:['浏览次数','点赞次数','关注数量','分支数量','Fork次数']
开发效率: ['PR数量', 'PR处理间隔', 'Commit数量', 'Issue处理间隔','项目活跃度'],
个体开发者:['活跃开发者占比','长期贡献者占比','长期贡献者稳定性'],
商业公司:['公司主导','公司贡献者流失预测','公司贡献者数量','长期公司贡献者数量'],
项目影响:['分支数量','浏览次数','Fork次数','点赞次数','关注数量']
};
function Dimension(props){

View File

@ -118,10 +118,12 @@ function Index(props){
for(var i =0;i<list.length;i++){
let l = value[list[i]] || value;
let d = thirdData[list[i]];
let items = d.map(j=>{
return {name:j,...l[j]};
})
listData = listData.concat(items);
if(d){
let items = d.map(j=>{
return {name:j,...l[j],InitialScore:l[j] ? Math.round(l[j].InitialScore) : 0};
})
listData = listData.concat(items);
}
}
setFieldDatas(listData);
}
@ -138,7 +140,7 @@ function Index(props){
let sn = d.reduce((sum, item) => Math.round(sum + Math.round(item.WeightedScore)), 0);
setScoreNum(sn);
}
console.log(subDatas);
return(
@ -218,8 +220,8 @@ function Index(props){
subDatas &&
<div className="typeContent">
<p className="typeValue fw500">
{cardIndex}总分{scoreComp(subDatas.InitialScore)}
{cardIndex}加权得分{scoreComp(subDatas.WeightedScore)}
{cardIndex}总分{scoreComp(subDatas.InitialScore)}<span className="mr40 faYou">/100</span>
{cardIndex}加权得分{scoreComp(subDatas.WeightedScore)}<span className="mr40 faYou">/{subDatas.Weight*100}</span>
</p>
<div className="typeEchart">
<ul className="echartCate">
@ -231,7 +233,7 @@ function Index(props){
<li className={`${subCardIndex === i ?"active":""}`} onClick={()=>setSubCardIndex(i)}>
<div className="echartNum">
<span className="fw500 font-16">{i}</span>
<span><span className="font-17">效率总分</span>{scoreComp(detail ? detail.InitialScore : subDatas.InitialScore)}</span>
<span><span className="font-17">{i}总分</span>{scoreComp(detail ? detail.InitialScore : subDatas.InitialScore)}</span>
<span><span className="font-17">健康度权重比</span><span className="faYou">{(detail ? detail.Weight : subDatas.Weight) *100}%</span></span>
</div>
<img src={team} width={76} alt="" />

View File

@ -178,9 +178,6 @@
span{
font-weight: 400;
font-size: 26px;
&:first-child{
margin-right: 40px;
}
}
}
.typeEchart{