import { G2, measureTextWidth } from "@ant-design/plots"; const G = G2.getEngine("canvas"); //人员流动数据 export const flowingData = [ { type: "当期总人数", value: 27 }, { type: "本月入职", value: 25 }, { type: "本月离职", value: 18 }, { type: "年度累计入职", value: 15 }, { type: "年度累计离职", value: 10 }, { type: "平均年龄", value: 5 } ]; //人员流动配置信息 export const flowingConfig = { appendPadding: 10, data: flowingData, angleField: "value", colorField: "type", radius: 1, // 设置圆弧起始角度 startAngle: Math.PI, endAngle: Math.PI * 1.5, label: { type: "inner", offset: "-2%", content: "{name}", style: { fontSize: 10 } }, interactions: [ { type: "element-active" } ], pieStyle: { lineWidth: 0 } }; //司龄占比数据 export const seniorityData = [ { type: "5年", value: 100 }, { type: "10年", value: 200 }, { type: "15年", value: 300 }, { type: "其他", value: 200 } ]; //性别占比数据 export const genderData = [ { type: "男", value: 20 }, { type: "女", value: 80 } ]; //学历占比数据 export const degreeData = [ { type: "大专", value: 45 }, { type: "大专以下", value: 35 }, { type: "全日制本科", value: 11 }, { type: "硕士", value: 6 }, { type: "研究生", value: 1 }, { type: "中专", value: 1 }, { type: "博士", value: 1 } ]; //条线占比数据 export const linesData = [ { type: "条线1", value: 35 }, { type: "条线2", value: 25 }, { type: "条线3", value: 15 }, { type: "条线4", value: 17 }, { type: "条线5", value: 8 } ]; //实习生占比数据 export const internData = [ { type: "1", value: 17 }, { type: "2", value: 25 }, { type: "3", value: 8 }, { type: "4", value: 35 }, { type: "5", value: 15 } ]; export const seniorityConfig = { appendPadding: 10, data: [], angleField: "value", colorField: "type", radius: 0.75, label: { type: "inner", offset: "-30%", content: ({ percent }) => `${(percent * 100).toFixed(0)}%`, style: { fontSize: 14, textAlign: "center" } }, interactions: [ { type: "element-active" } ] }; //人员流动情况趋势图数据信息 export const flowingTrendData = [ { "name": "入职", "年份": "2022", "年份流动信息": 18.9 }, { "name": "入职", "年份": "2023", "年份流动信息": 28.8 }, { "name": "离职", "年份": "2022", "年份流动信息": 12.4 }, { "name": "离职", "年份": "2023", "年份流动信息": 23.2 }, { "name": "在职", "年份": "2022", "年份流动信息": 12.4 }, { "name": "在职", "年份": "2023", "年份流动信息": 23.2 } ]; //人员流动情况趋势图配置信息 export const flowingTrendconfig = { data: flowingTrendData, isGroup: true, xField: "年份", yField: "年份流动信息", seriesField: "name", // 分组柱状图 组内柱子间的间距 (像素级别) dodgePadding: 2, // 分组柱状图 组间的间距 (像素级别) intervalPadding: 50, label: { // 可手动配置 label 数据标签位置 position: "middle", // 'top', 'middle', 'bottom' // 可配置附加的布局方法 layout: [ // 柱形图数据标签位置自动调整 { type: "interval-adjust-position" }, // 数据标签防遮挡 { type: "interval-hide-overlap" }, // 数据标签文颜色自动调整 { type: "adjust-color" } ] } }; //机构人员排名数数据 export const institutionData = [ { stage: "机构一", number: 253 }, { stage: "机构二", number: 151 }, { stage: "机构三", number: 113 }, { stage: "机构四", number: 87 }, { stage: "机构五", number: 59 } ]; //机构人员排名配置信息 export const institutionConfig = { data: institutionData, xField: "stage", yField: "number", dynamicHeight: true, legend: false }; //人员异动分析数数据 export const personChangeData = [ { type: "全员离职率", value: 253 }, { type: "关键岗位离职率", value: 151 }, { type: "绩优员工离职率", value: 113 } ]; export const personChangeConfig = { appendPadding: 10, data:[], angleField: "value", colorField: "type", radius: 0.75, label: { type: "spider", labelHeight: 28, content: "{name}\n{percentage}" }, interactions: [ { type: "element-active" } ] }; //详细图表柱状图 export const multiplData = [ { "name": "全员离职率", "年份": "2022", "年份流动信息": 18.9 }, { "name": "全员离职率", "年份": "2023", "年份流动信息": 28.8 }, { "name": "主动离职率", "年份": "2022", "年份流动信息": 12.4 }, { "name": "主动离职率", "年份": "2023", "年份流动信息": 23.2 }, { "name": "被动离职率", "年份": "2022", "年份流动信息": 12.4 }, { "name": "被动离职率", "年份": "2023", "年份流动信息": 23.2 }, { "name": "关键岗位离职率", "年份": "2022", "年份流动信息": 12.4 }, { "name": "关键岗位离职率", "年份": "2023", "年份流动信息": 23.2 }, { "name": "绩优员工离职率", "年份": "2022", "年份流动信息": 12.4 }, { "name": "绩优员工离职率", "年份": "2023", "年份流动信息": 23.2 }, { "name": "转正率", "年份": "2022", "年份流动信息": 12.4 }, { "name": "转正率", "年份": "2023", "年份流动信息": 23.2 }, ]; //人员流动情况趋势图配置信息 export const multipleConfig = { isGroup: true, xField: "年份", yField: "年份流动信息", seriesField: "name", // 分组柱状图 组内柱子间的间距 (像素级别) dodgePadding: 2, // 分组柱状图 组间的间距 (像素级别) intervalPadding: 50, label: { // 可手动配置 label 数据标签位置 position: "middle", // 'top', 'middle', 'bottom' // 可配置附加的布局方法 layout: [ // 柱形图数据标签位置自动调整 { type: "interval-adjust-position" }, // 数据标签防遮挡 { type: "interval-hide-overlap" }, // 数据标签文颜色自动调整 { type: "adjust-color" } ] } }; //培训管理分析数据 export const trainingData = [ { type: "人均培训费用", value: 20 }, { type: "人均培训时长", value: 80 } ]; //培训排名 export const rankingData =[ { name: '机构一', month: 'Jan.', grades: 18.9, }, { name: '机构一', month: 'Feb.', grades: 28.8, }, { name: '机构一', month: 'Mar.', grades: 39.3, }, { name: '机构一', month: 'Apr.', grades: 81.4, }, { name: '机构一', month: 'May', grades: 47, }, { name: '机构一', month: 'Jun.', grades: 20.3, }, { name: '机构一', month: 'Jul.', grades: 24, }, { name: '机构一', month: 'Aug.', grades: 35.6, }, { name: '机构二', month: 'Jan.', grades: 12.4, }, { name: '机构二', month: 'Feb.', grades: 23.2, }, { name: '机构二', month: 'Mar.', grades: 34.5, }, { name: '机构二', month: 'Apr.', grades: 99.7, }, { name: '机构二', month: 'May', grades: 52.6, }, { name: '机构二', month: 'Jun.', grades: 35.5, }, { name: '机构二', month: 'Jul.', grades: 37.4, }, { name: '机构二', month: 'Aug.', grades: 42.4, }, ] export const rankingConfig = { isGroup: true, xField: "month", yField: "grades", seriesField: "name", // 分组柱状图 组内柱子间的间距 (像素级别) dodgePadding: 2, // 分组柱状图 组间的间距 (像素级别) intervalPadding: 10, columnStyle: { radius: [20, 20, 0], }, label: { // 可手动配置 label 数据标签位置 position: "middle", // 'top', 'middle', 'bottom' // 可配置附加的布局方法 layout: [ // 柱形图数据标签位置自动调整 { type: "interval-adjust-position" }, // 数据标签防遮挡 { type: "interval-hide-overlap" }, // 数据标签文颜色自动调整 { type: "adjust-color" } ] } }; //人效分析数据 export const humanAnalysisData = [ { "name": "销售投入回报", "company": "公司1", "value": 18.9 }, { "name": "销售投入回报", "company": "公司2", "value": 28.8 }, { "name": "人均利润", "company": "公司1", "value": 12.4 }, { "name": "人均利润", "company": "公司2", "value": 23.2 }, { "name": "人均销售额", "company": "公司1", "value": 12.4 }, { "name": "人均销售额", "company": "公司2", "value": 23.2 } ]; export const humanAnalysisconfig = { data: humanAnalysisData, isGroup: true, xField: "company", yField: "value", seriesField: "name", // 分组柱状图 组内柱子间的间距 (像素级别) dodgePadding: 2, // 分组柱状图 组间的间距 (像素级别) intervalPadding: 50, label: { // 可手动配置 label 数据标签位置 position: "middle", // 'top', 'middle', 'bottom' // 可配置附加的布局方法 layout: [ // 柱形图数据标签位置自动调整 { type: "interval-adjust-position" }, // 数据标签防遮挡 { type: "interval-hide-overlap" }, // 数据标签文颜色自动调整 { type: "adjust-color" } ] } }; //人效排名数据 export const humanEfficiencyRankingData = [ { title: '员工1', description: "公司1", rank:1 }, { title: '员工2', description: "公司2", rank:2 }, { title: '员工3', description: "公司3", rank:3 }, { title: '员工4', description: "公司4", rank:4 }, ]; //销售新客户合同数量排名 export const saleEfficiencyRankingData = [ { title: '员工5', description: "公司1", rank:1 }, { title: '员工6', description: "公司2", rank:2 }, { title: '员工7', description: "公司3", rank:3 }, { title: '员工8', description: "公司4", rank:4 }, ]; //新销售有效合同 export const newSaleEfficiencyRankingData = [ { title: '员工9', description: "公司1", rank:1 }, { title: '员工10', description: "公司2", rank:2 }, { title: '员工11', description: "公司3", rank:3 }, { title: '员工12', description: "公司4", rank:4 }, ]; //人工总成本数据 export const totalLaborCostdata = [ { time: 'Jan.', value: 350, count: 800, }, { time: 'Feb.', value: 900, count: 600, }, { time: 'Mar.', value: 300, count: 400, }, { time: 'Apr.', value: 450, count: 380, }, { time: 'May.', value: 470, count: 220, }, { time: 'Jun.', value: 470, count: 220, }, { time: 'Jul.', value: 470, count: 220, }, { time: 'Aug.', value: 470, count: 220, }, ]; export const totalLaborCostConfig = { data: [totalLaborCostdata, totalLaborCostdata], xField: 'time', yField: ['value', 'count'], yAxis: { // 格式化左坐标轴 value: { min: 0, label: { formatter: (val) => `${val}W`, }, }, // 隐藏右坐标轴 count: false, }, geometryOptions: [ { geometry: 'column', color: '#5B8FF9', columnWidthRatio: 0.4, label: { position: 'middle', }, }, { geometry: 'line', smooth: true, color: '#5AD8A6', }, ], interactions: [ { type: 'element-highlight', }, { type: 'active-region', }, ], annotations: { value: [ { type: 'text', position: ['2019-06', 'max'], content: '柱线混合图', }, ], count: [ { type: 'dataMarker', top: true, position: ['2019-05', 400], line: { length: 20, }, text: { content: '2019-05, 发布新版本', style: { textAlign: 'left', }, }, }, ], }, }; //人均收入配置数据 1、人均固定收入 2、人均浮动收入 export const fixedIncomePerData = [ { type: '销售', value: 27, }, { type: '项目', value: 25, }, { type: '开发', value: 18, }, { type: '客服', value: 15, }, { type: '其他', value: 10, }, { type: '其他', value: 5, }, ]; export const floatingIncomePerData = [ { type: '销售', value: 18, }, { type: '项目', value: 29, }, { type: '开发', value: 23, }, { type: '客服', value: 3, }, { type: '其他', value: 22, }, { type: '其他', value: 5, }, ]; //人均收入配置信息 export const perCapitaIncomeConfig = { appendPadding: 10, data:[], angleField: 'value', colorField: 'type', radius: 1, innerRadius: 0.64, meta: { value: { formatter: (v) => `${v} ¥`, }, }, label: { type: 'inner', offset: '-50%', style: { textAlign: 'center', }, autoRotate: false, content: '{value}', }, statistic: { title: { offsetY: -4, customHtml: (container, view, datum) => { const { width, height } = container.getBoundingClientRect(); const d = Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2)); //总计 const text = datum ? datum.type : ''; return renderStatistic(d, text, { fontSize: 28, }); }, }, content: { offsetY: 4, style: { fontSize: '32px', }, customHtml: (container, view, datum, data) => { const { width } = container.getBoundingClientRect(); const text = datum ? `¥ ${datum.value}` : `¥ ${data.reduce((r, d) => r + d.value, 0)}`; return renderStatistic(width, "", { fontSize: 32, }); }, }, }, // 添加 中心统计文本 交互 interactions: [ ], }; //人均人工成本数据 export const laborCostsPerCapitaData = [ { year: 'Jan.', value: 3, count: 10, }, { year: 'Feb.', value: 4, count: 4, }, { year: 'Mar.', value: 3.5, count: 5, }, { year: 'Apr.', value: 5, count: 5, }, { year: 'May.', value: 4.9, count: 4.9, }, { year: 'Jun.', value: 6, count: 35, }, { year: 'Jul.', value: 7, count: 7, }, { year: 'Aug.', value: 9, count: 1, }, ]; export const laborCostsPerCapitaConfig = { data: [laborCostsPerCapitaData, laborCostsPerCapitaData], xField: 'year', yField: ['value', 'count'], geometryOptions: [ { geometry: 'line', smooth: true, color: '#5B8FF9', label: { formatter: (datum) => { return `${datum.value}w`; }, }, lineStyle: { lineWidth: 3, lineDash: [5, 5], }, }, { geometry: 'line', smooth: true, color: '#5AD8A6', lineStyle: { lineWidth: 4, opacity: 0.5, }, label: { formatter: (datum) => { return `${datum.count}w`; }, }, point: { shape: 'circle', size: 4, style: { opacity: 0.5, stroke: '#5AD8A6', fill: '#fff', }, }, }, ], }; function renderStatistic(containerWidth, text, style) { const { width: textWidth, height: textHeight } = measureTextWidth(text, style); const R = containerWidth / 2; // r^2 = (w / 2)^2 + (h - offsetY)^2 let scale = 1; if (containerWidth < textWidth) { scale = Math.min(Math.sqrt(Math.abs(Math.pow(R, 2) / (Math.pow(textWidth / 2, 2) + Math.pow(textHeight, 2)))), 1); } const textStyleStr = `width:${containerWidth}px;`; return `
${text}
`; }