You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
13 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import React, { PureComponent } from 'react';
import { Card, Input, Button, Select, Row, Col, Avatar, Rate, message } from 'antd';
import { SearchOutlined, ReloadOutlined, SaveOutlined, RollbackOutlined, UserOutlined } from '@ant-design/icons';
import { history } from 'umi';
import styles from './PerformanceAssess.less';
const { TextArea } = Input;
const { Option } = Select;
class PerformanceAssess extends PureComponent {
constructor(props) {
super(props);
this.state = {
// 筛选条件
searchForm: {
name: '',
phone: '',
idCard: '',
performancePlan: '2025年度'
},
// 员工信息
employeeInfo: {
gender: '男',
age: 32,
department: '技术研发中心',
position: '高级软件工程师',
planName: '2025年度技术岗绩效计划'
},
// 绩效数据
performanceData: {
totalScore: 92,
status: '已确认',
objective: {
codeLines: '15,672',
docWords: '28,500',
trainings: '8',
projectAmount: '¥1,250,000',
projectRatio: '35%',
workHours: '1,850'
},
subjective: {
execution: {
score: 4.0,
comment: '该员工能够高效执行分配的任务,在项目开发过程中表现出色,能够按时保质完成工作。在团队协作中主动承担责任,遇到问题能够积极寻求解决方案。'
},
loyalty: {
score: 4.5,
comment: '该员工高度认同公司文化和价值观,积极参与公司组织的各项活动。在日常工作中能够主动传播正能量,对新员工起到良好的示范作用。对公司发展战略有深刻理解并积极支持。'
}
}
}
};
}
// 处理搜索表单变化
handleSearchFormChange = (field, value) => {
this.setState(prevState => ({
searchForm: {
...prevState.searchForm,
[field]: value
}
}));
};
// 处理主观评价变化
handleSubjectiveChange = (type, field, value) => {
this.setState(prevState => ({
performanceData: {
...prevState.performanceData,
subjective: {
...prevState.performanceData.subjective,
[type]: {
...prevState.performanceData.subjective[type],
[field]: value
}
}
}
}));
};
// 查询按钮处理
handleSearch = () => {
message.success('查询成功');
};
// 重置按钮处理
handleReset = () => {
this.setState({
searchForm: {
name: '',
phone: '',
idCard: '',
performancePlan: '2025年度'
}
});
message.info('已重置查询条件');
};
// 保存评价
handleSave = () => {
message.success('评价已保存');
};
// 返回列表
handleBack = () => {
history.push('/topnavbar00/performancemanage/performancelist');
};
render() {
const { searchForm, employeeInfo, performanceData } = this.state;
return (
<div className={styles['performance-assess-page']}>
{/* 筛选区 */}
<Card className={styles['search-section']}>
<Row gutter={16}>
<Col xs={24} sm={12} md={6}>
<div className={styles['form-item']}>
<label className={styles['form-label']}>姓名</label>
<Input
placeholder="请输入姓名"
value={searchForm.name}
onChange={(e) => this.handleSearchFormChange('name', e.target.value)}
/>
</div>
</Col>
<Col xs={24} sm={12} md={6}>
<div className={styles['form-item']}>
<label className={styles['form-label']}>电话</label>
<Input
placeholder="请输入电话"
value={searchForm.phone}
onChange={(e) => this.handleSearchFormChange('phone', e.target.value)}
/>
</div>
</Col>
<Col xs={24} sm={12} md={6}>
<div className={styles['form-item']}>
<label className={styles['form-label']}>身份证</label>
<Input
placeholder="请输入身份证号"
value={searchForm.idCard}
onChange={(e) => this.handleSearchFormChange('idCard', e.target.value)}
/>
</div>
</Col>
<Col xs={24} sm={12} md={6}>
<div className={styles['form-item']}>
<label className={styles['form-label']}>绩效计划</label>
<Select
style={{ width: '100%' }}
value={searchForm.performancePlan}
onChange={(value) => this.handleSearchFormChange('performancePlan', value)}
>
<Option value="2025年度">2025年度</Option>
<Option value="2024年度">2024年度</Option>
<Option value="2023年度">2023年度</Option>
</Select>
</div>
</Col>
</Row>
<div className={styles['search-actions']}>
<Button type="primary" icon={<SearchOutlined />} onClick={this.handleSearch}>
查询
</Button>
<Button icon={<ReloadOutlined />} onClick={this.handleReset}>
重置
</Button>
</div>
</Card>
{/* 人员信息 */}
<Card className={styles['employee-section']}>
<div className={styles['employee-info']}>
<Avatar size={64} icon={<UserOutlined />} className={styles['employee-avatar']} />
<div className={styles['employee-details']}>
<Row gutter={32}>
<Col span={6}>
<div className={styles['info-item']}>
<span className={styles['info-label']}>性别</span>
<span className={styles['info-value']}>{employeeInfo.gender}</span>
</div>
</Col>
<Col span={6}>
<div className={styles['info-item']}>
<span className={styles['info-label']}>年龄</span>
<span className={styles['info-value']}>{employeeInfo.age}</span>
</div>
</Col>
<Col span={6}>
<div className={styles['info-item']}>
<span className={styles['info-label']}>部门</span>
<span className={styles['info-value']}>{employeeInfo.department}</span>
</div>
</Col>
<Col span={6}>
<div className={styles['info-item']}>
<span className={styles['info-label']}>岗位</span>
<span className={styles['info-value']}>{employeeInfo.position}</span>
</div>
</Col>
</Row>
</div>
<div className={styles['plan-info']}>
<div className={styles['info-item']}>
<span className={styles['info-label']}>绩效计划名称</span>
<span className={styles['info-value']}>{employeeInfo.planName}</span>
</div>
</div>
</div>
</Card>
{/* 绩效公式 */}
<Card className={styles['formula-section']}>
<h3 className={styles['section-title']}>绩效公式</h3>
<div className={styles['formula-content']}>
总分 = 代码量 × 0.1 + 文档字数 × 0.01 + 培训次数 × 3 + 项目金额 × 0.01 + 项目比重 × 0.1 + 工作时长 × 0.01 + 执行力 × 0.1 + 对公司认同度 × 0.1
</div>
</Card>
{/* 绩效总分 */}
<Card className={styles['score-section']}>
<Row justify="space-between" align="middle">
<Col>
<div className={styles['score-info']}>
<span className={styles['score-label']}>绩效总分</span>
<span className={styles['score-value']}>{performanceData.totalScore}</span>
</div>
</Col>
<Col>
<div className={styles['status-info']}>
<span className={styles['status-label']}>审批状态</span>
<span className={styles['status-value']}>{performanceData.status}</span>
</div>
</Col>
</Row>
</Card>
{/* 客观指标 */}
<Card className={styles['objective-section']}>
<h3 className={styles['section-title']}>客观指标</h3>
<Row gutter={[32, 16]}>
<Col xs={24} sm={12} md={8}>
<div className={styles['metric-item']}>
<span className={styles['metric-label']}>代码量</span>
<span className={styles['metric-value']}>{performanceData.objective.codeLines} </span>
</div>
</Col>
<Col xs={24} sm={12} md={8}>
<div className={styles['metric-item']}>
<span className={styles['metric-label']}>文档字数</span>
<span className={styles['metric-value']}>{performanceData.objective.docWords} </span>
</div>
</Col>
<Col xs={24} sm={12} md={8}>
<div className={styles['metric-item']}>
<span className={styles['metric-label']}>培训次数</span>
<span className={styles['metric-value']}>{performanceData.objective.trainings} </span>
</div>
</Col>
<Col xs={24} sm={12} md={8}>
<div className={styles['metric-item']}>
<span className={styles['metric-label']}>项目金额</span>
<span className={styles['metric-value']}>{performanceData.objective.projectAmount}</span>
</div>
</Col>
<Col xs={24} sm={12} md={8}>
<div className={styles['metric-item']}>
<span className={styles['metric-label']}>项目比重</span>
<span className={styles['metric-value']}>{performanceData.objective.projectRatio}</span>
</div>
</Col>
<Col xs={24} sm={12} md={8}>
<div className={styles['metric-item']}>
<span className={styles['metric-label']}>工作时长</span>
<span className={styles['metric-value']}>{performanceData.objective.workHours} 小时</span>
</div>
</Col>
</Row>
</Card>
{/* 主观指标 */}
<Row gutter={16} className={styles['subjective-section']}>
{/* 执行力 */}
<Col xs={24} md={12}>
<Card className={styles['subjective-card']}>
<h3 className={styles['section-title']}>执行力</h3>
<div className={styles['rating-section']}>
<span className={styles['rating-label']}>评分</span>
<Rate
allowHalf
value={performanceData.subjective.execution.score}
onChange={(value) => this.handleSubjectiveChange('execution', 'score', value)}
/>
<span className={styles['rating-value']}>{performanceData.subjective.execution.score}</span>
</div>
<div className={styles['comment-section']}>
<label className={styles['comment-label']}>评价</label>
<TextArea
rows={4}
placeholder="请输入评价内容..."
value={performanceData.subjective.execution.comment}
onChange={(e) => this.handleSubjectiveChange('execution', 'comment', e.target.value)}
/>
</div>
</Card>
</Col>
{/* 对公司认同度 */}
<Col xs={24} md={12}>
<Card className={styles['subjective-card']}>
<h3 className={styles['section-title']}>对公司认同度</h3>
<div className={styles['rating-section']}>
<span className={styles['rating-label']}>评分</span>
<Rate
allowHalf
value={performanceData.subjective.loyalty.score}
onChange={(value) => this.handleSubjectiveChange('loyalty', 'score', value)}
/>
<span className={styles['rating-value']}>{performanceData.subjective.loyalty.score}</span>
</div>
<div className={styles['comment-section']}>
<label className={styles['comment-label']}>评价</label>
<TextArea
rows={4}
placeholder="请输入评价内容..."
value={performanceData.subjective.loyalty.comment}
onChange={(e) => this.handleSubjectiveChange('loyalty', 'comment', e.target.value)}
/>
</div>
</Card>
</Col>
</Row>
{/* 操作按钮 */}
<div className={styles['action-section']}>
<Button type="primary" icon={<SaveOutlined />} onClick={this.handleSave}>
保存评价
</Button>
<Button icon={<RollbackOutlined />} onClick={this.handleBack}>
返回列表
</Button>
</div>
</div>
);
}
}
export default PerformanceAssess;