From 88aeb60d1146c9a04cc765f9261bdbe4eaddc060 Mon Sep 17 00:00:00 2001 From: jiangxucong Date: Fri, 12 Sep 2025 13:51:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=BA=E5=91=98=E7=AE=A1=E7=90=86=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/routes.js | 64 +- src/global.less | 2 +- src/pages/salarymanage_salarydetail/girl.png | Bin 0 -> 11225 bytes .../staffmanage_onboarding/OnBoarding.js | 838 ++++++++++++++++++ .../staffmanage_onboarding/OnBoarding.less | 366 ++++++++ .../OnBoardingApproval.js | 585 ++++++++++++ .../OnBoardingApproval.less | 375 ++++++++ .../OnBoardingRegister.js | 345 +++++++ .../OnBoardingRegister.less | 411 +++++++++ .../staffmanage_resignation/Resignation.js | 540 +++++++++++ .../staffmanage_resignation/Resignation.less | 408 +++++++++ src/pages/staffmanage_staffinfo/StaffInfo.js | 13 +- .../staffmanage_staffinfo/StaffInfo.less | 345 ++----- .../form/StaffInfoRenderSimpleForm.js | 156 ++-- src/pages/staffmanage_training/Training.js | 631 +++++++++++++ src/pages/staffmanage_training/Training.less | 525 +++++++++++ .../staffmanage_trainingplan/TrainingPlan.js | 599 +++++++++++++ .../TrainingPlan.less | 455 ++++++++++ 18 files changed, 6320 insertions(+), 338 deletions(-) create mode 100644 src/pages/salarymanage_salarydetail/girl.png create mode 100644 src/pages/staffmanage_onboarding/OnBoarding.js create mode 100644 src/pages/staffmanage_onboarding/OnBoarding.less create mode 100644 src/pages/staffmanage_onboardingapproval/OnBoardingApproval.js create mode 100644 src/pages/staffmanage_onboardingapproval/OnBoardingApproval.less create mode 100644 src/pages/staffmanage_onboardingregister/OnBoardingRegister.js create mode 100644 src/pages/staffmanage_onboardingregister/OnBoardingRegister.less create mode 100644 src/pages/staffmanage_resignation/Resignation.js create mode 100644 src/pages/staffmanage_resignation/Resignation.less create mode 100644 src/pages/staffmanage_training/Training.js create mode 100644 src/pages/staffmanage_training/Training.less create mode 100644 src/pages/staffmanage_trainingplan/TrainingPlan.js create mode 100644 src/pages/staffmanage_trainingplan/TrainingPlan.less diff --git a/config/routes.js b/config/routes.js index a1007da..f894a1c 100644 --- a/config/routes.js +++ b/config/routes.js @@ -31,6 +31,12 @@ export default [ name: 'staffstatistics', component: './multi-d-statistics/MultiDStatistics', }, + { + path: '/topnavbar00/multidstatistics/performance', + // icon: 'bank', + name: 'performance', + component: './performance/Performance', + }, ], }, // 人员管理 @@ -45,6 +51,42 @@ export default [ name: 'staffinfo', component: './staffmanage_staffinfo/StaffInfo', }, + { + path: '/topnavbar00/staffmanage/onboarding', + // icon: 'bank', + name: 'onboarding', + component: './staffmanage_onboarding/OnBoarding', + }, + { + path: '/topnavbar00/staffmanage/onboardingregister', + // icon: 'bank', + name: 'onboardingregister', + component: './staffmanage_onboardingregister/OnBoardingRegister', + }, + { + path: '/topnavbar00/staffmanage/onboardingapproval', + // icon: 'bank', + name: 'onboardingapproval', + component: './staffmanage_onboardingapproval/OnBoardingApproval', + }, + { + path: '/topnavbar00/staffmanage/resignation', + // icon: 'bank', + name: 'resignation', + component: './staffmanage_resignation/Resignation', + }, + { + path: '/topnavbar00/staffmanage/training', + // icon: 'bank', + name: 'training', + component: './staffmanage_training/Training', + }, + { + path: '/topnavbar00/staffmanage/trainingplan', + // icon: 'bank', + name: 'trainingplan', + component: './staffmanage_trainingplan/TrainingPlan', + }, { path: '/topnavbar00/staffmanage/staffresume', // icon: 'bank', @@ -63,7 +105,7 @@ export default [ name: 'staffresume', component: './staffmanage_staffresume/StaffResume', }, - { + { path: '/topnavbar00/staffmanage/particulars', // icon: 'bank', name: 'particulars', @@ -83,6 +125,12 @@ export default [ name: 'organchart', component: './organmanage_organchart/OrganChart', }, + { + path: '/topnavbar00/organmanage/reportrelation', + // icon: 'bank', + name: 'reportrelation', + component: './organmanage_reportrelation/ReportRelation', + }, { path: '/topnavbar00/organmanage/deptmaintain', // icon: 'bank', @@ -101,7 +149,13 @@ export default [ path: '/topnavbar00/attendancemanage/attendancedata', // icon: 'bank', name: 'attendancedata', - component: './attendancemanage_attendancedata/attendancemanageAttendancedata', + component: './attendancemanage_attendancedata/AttendancemanageAttendancedata', + }, + { + path: '/topnavbar00/attendancemanage/attendancedetails', + // icon: 'bank', + name: 'attendancedetails', + component: './attendancemanage_attendancedetails/Attendancedetails', }, ], }, @@ -149,6 +203,12 @@ export default [ name: 'salaryruleset', component: './salarymanage_salaryruleset/SalaryRuleset', }, + { + path: '/topnavbar00/salarymanage/salarydetail', + // icon: 'bank', + name: 'salarydetail', + component: './salarymanage_salarydetail/SalaryDetail', + }, ], }, //效率管理 diff --git a/src/global.less b/src/global.less index 3a71f32..6143476 100644 --- a/src/global.less +++ b/src/global.less @@ -31,7 +31,7 @@ } .ant-btn-primary { - background: rgba(36, 114, 214, 1); + // background: rgba(36, 114, 214, 1); } // top导航样式开始 diff --git a/src/pages/salarymanage_salarydetail/girl.png b/src/pages/salarymanage_salarydetail/girl.png new file mode 100644 index 0000000000000000000000000000000000000000..44ff8f57292cbaf670654f3a7a1247ef1fd9244e GIT binary patch literal 11225 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 literal 0 HcmV?d00001 diff --git a/src/pages/staffmanage_onboarding/OnBoarding.js b/src/pages/staffmanage_onboarding/OnBoarding.js new file mode 100644 index 0000000..48fd601 --- /dev/null +++ b/src/pages/staffmanage_onboarding/OnBoarding.js @@ -0,0 +1,838 @@ +import React, { PureComponent } from 'react'; +import { + Card, + Tree, + Input, + Button, + DatePicker, + Select, + Row, + Col, + Space, + Radio, + Checkbox, + InputNumber, + Avatar, + message, + Typography +} from 'antd'; +import { + SaveOutlined, + CloseOutlined, + PlusCircleOutlined, + DeleteOutlined, + ExpandOutlined, + UserOutlined, + TeamOutlined, + ApartmentOutlined, + SyncOutlined, + DollarOutlined, + SettingOutlined, + CalendarOutlined, + UsergroupAddOutlined, + UserSwitchOutlined, + StopOutlined, + CheckCircleOutlined, + CloseCircleOutlined, + ContactsOutlined, +} from '@ant-design/icons'; +import dayjs from 'dayjs'; +import styles from './OnBoarding.less'; + +const { Option } = Select; +const { TextArea } = Input; +const { Title } = Typography; +class OnBoarding extends PureComponent { + constructor(props) { + super(props); + this.state = { + selectedOrgKeys: ['0-0-4'], // 默认选中人事部 + expandedKeys: ['0-0', '0-0-0', '0-0-1', '0-0-2'], + // 入职计划表单数据 + onboardingForm: { + // 入职部门信息 + departmentName: '人力资源部', + departmentManager: '张明远', + currentStaff: '24/30', + + // 计划时段设置 + planStartDate: dayjs('2023-09-01'), + planEndDate: dayjs('2023-09-30'), + + // 可入职岗位设置 + availablePositions: [ + { id: 1, name: '人力资源专员', count: 3, checked: true }, + { id: 2, name: '薪酬福利专员', count: 2, checked: true }, + { id: 3, name: '培训发展专员', count: 1, checked: false }, + { id: 4, name: '招聘专员', count: 2, checked: false } + ], + + // 计划入职人数 + totalPlan: 5, + confirmedCount: 2, + remainingCount: 3, + + // 人员要求 + ageRange: '22-30岁', + gender: '不限', + education: '本科及以上', + workYears: '1-3年', + otherRequirements: '', + + // 黑名单 + blacklist: [ + { id: 1, name: '林晓梅', idCard: '310***19880512****', avatar: null }, + { id: 2, name: '王建国', idCard: '420***19900215****', avatar: null } + ], + + // 白名单 + whitelist: [ + { id: 1, name: '陈思思', recommender: '张明远', avatar: null } + ] + }, + organizationData: [ + { + title: '飞利信科技有限公司', + key: '0-0', + count: 356, + children: [ + { + title: '技术部', + key: '0-0-0', + count: 120, + children: [ + { title: '前端组', key: '0-0-0-0', count: 45 }, + { title: '后端组', key: '0-0-0-1', count: 52 }, + { title: '测试组', key: '0-0-0-2', count: 23 } + ], + }, + { + title: '产品部', + key: '0-0-1', + count: 68, + children: [ + { title: '产品设计组', key: '0-0-1-0', count: 28 }, + { title: '用户体验组', key: '0-0-1-1', count: 25 }, + { title: '产品运营组', key: '0-0-1-2', count: 15 } + ], + }, + { + title: '运营部', + key: '0-0-2', + count: 52, + children: [ + { title: '市场营销组', key: '0-0-2-0', count: 22 }, + { title: '客户服务组', key: '0-0-2-1', count: 18 }, + { title: '商务合作组', key: '0-0-2-2', count: 12 } + ], + }, + { + title: '财务部', + key: '0-0-3', + count: 32, + children: [ + { title: '会计组', key: '0-0-3-0', count: 18 }, + { title: '审计组', key: '0-0-3-1', count: 14 } + ], + }, + { + title: '人事部', + key: '0-0-4', + count: 84, + children: [ + { title: 'HR专员组', key: '0-0-4-0', count: 25 }, + { title: '招聘组', key: '0-0-4-1', count: 22 }, + { title: '培训组', key: '0-0-4-2', count: 18 }, + { title: '薪酬组', key: '0-0-4-3', count: 19 } + ], + }, + ], + }, + ] + }; + } + + // 获取处理后的树形数据 + getTreeData = () => { + const { organizationData } = this.state; + + const processNode = (node) => ({ + key: node.key, + title: ( + + {this.getNodeIcon(node.title)} + {node.title} + ({node.count}) + + ), + children: node.children ? node.children.map(processNode) : undefined + }); + + return organizationData.map(processNode); + }; + + // 获取节点图标 + getNodeIcon = (title) => { + if (title.includes('公司') || title.includes('集团')) return ; + if (title.includes('技术') || title.includes('开发') || title.includes('测试')) return ; + if (title.includes('产品') || title.includes('设计') || title.includes('体验')) return ; + if (title.includes('运营') || title.includes('市场') || title.includes('客户') || title.includes('商务')) return ; + if (title.includes('财务') || title.includes('会计') || title.includes('审计')) return ; + if (title.includes('人事') || title.includes('HR') || title.includes('招聘') || title.includes('培训') || title.includes('薪酬')) return ; + return ; + }; + + // 刷新树数据 + handleTreeRefresh = () => { + message.info('刷新组织架构数据'); + }; + + // 展开/收缩所有节点 + handleTreeToggle = () => { + const { expandedKeys, organizationData } = this.state; + if (expandedKeys.length > 0) { + this.setState({ expandedKeys: [] }); + } else { + const getAllKeys = (nodes) => { + let keys = []; + nodes.forEach(node => { + keys.push(node.key); + if (node.children) { + keys = keys.concat(getAllKeys(node.children)); + } + }); + return keys; + }; + this.setState({ expandedKeys: getAllKeys(organizationData) }); + } + }; + + // 组织树选择 + onTreeSelect = (selectedKeys, info) => { + console.log('选中节点:', selectedKeys, info); + this.setState({ selectedOrgKeys: selectedKeys }); + + if (selectedKeys.length > 0) { + const selectedKey = selectedKeys[0]; + const findNodeByKey = (nodes, key) => { + for (let node of nodes) { + if (node.key === key) { + return node; + } + if (node.children) { + const found = findNodeByKey(node.children, key); + if (found) return found; + } + } + return null; + }; + + const selectedNode = findNodeByKey(this.state.organizationData, selectedKey); + if (selectedNode) { + this.handleOnboardingFormChange('departmentName', selectedNode.title); + const departmentInfo = this.getDepartmentInfo(selectedNode.title); + this.setState(prevState => ({ + onboardingForm: { + ...prevState.onboardingForm, + ...departmentInfo + } + })); + } + } + }; + + // 获取部门信息 + getDepartmentInfo = (departmentName) => { + const departmentMap = { + '技术部': { + departmentManager: '李技术', + currentStaff: '115/120', + availablePositions: [ + { id: 1, name: '前端工程师', count: 2, checked: true }, + { id: 2, name: '后端工程师', count: 3, checked: true }, + { id: 3, name: '测试工程师', count: 1, checked: false } + ] + }, + '产品部': { + departmentManager: '王产品', + currentStaff: '65/68', + availablePositions: [ + { id: 1, name: '产品经理', count: 1, checked: true }, + { id: 2, name: '产品设计师', count: 2, checked: true } + ] + }, + '人事部': { + departmentManager: '张明远', + currentStaff: '24/30', + availablePositions: [ + { id: 1, name: '人力资源专员', count: 3, checked: true }, + { id: 2, name: '薪酬福利专员', count: 2, checked: true }, + { id: 3, name: '培训发展专员', count: 1, checked: false }, + { id: 4, name: '招聘专员', count: 2, checked: false } + ] + }, + '财务部': { + departmentManager: '赵财务', + currentStaff: '30/32', + availablePositions: [ + { id: 1, name: '会计', count: 1, checked: true }, + { id: 2, name: '出纳', count: 1, checked: false } + ] + }, + '运营部': { + departmentManager: '钱运营', + currentStaff: '48/52', + availablePositions: [ + { id: 1, name: '市场专员', count: 2, checked: true }, + { id: 2, name: '客服专员', count: 1, checked: true } + ] + } + }; + + return departmentMap[departmentName] || { + departmentManager: '未知', + currentStaff: '0/0', + availablePositions: [] + }; + }; + + // 树展开/收缩 + onTreeExpand = (expandedKeys) => { + this.setState({ expandedKeys }); + }; + + // 入职表单字段变化 + handleOnboardingFormChange = (field, value) => { + this.setState(prevState => ({ + onboardingForm: { + ...prevState.onboardingForm, + [field]: value + } + })); + }; + + // 岗位选择变化 + handlePositionChange = (id, checked) => { + const { onboardingForm } = this.state; + const newPositions = onboardingForm.availablePositions.map(pos => + pos.id === id ? { ...pos, checked } : pos + ); + this.setState({ + onboardingForm: { + ...onboardingForm, + availablePositions: newPositions + } + }); + }; + + // 添加新岗位 + addNewPosition = () => { + const { onboardingForm } = this.state; + const newPosition = { + id: Date.now(), + name: '新岗位', + count: 1, + checked: false + }; + this.setState({ + onboardingForm: { + ...onboardingForm, + availablePositions: [...onboardingForm.availablePositions, newPosition] + } + }); + message.success('新岗位添加成功'); + }; + + // 移除黑名单人员 + removeFromBlacklist = (id) => { + const { onboardingForm } = this.state; + const newBlacklist = onboardingForm.blacklist.filter(person => person.id !== id); + this.setState({ + onboardingForm: { + ...onboardingForm, + blacklist: newBlacklist + } + }); + message.success('已移除黑名单人员'); + }; + + // 移除白名单人员 + removeFromWhitelist = (id) => { + const { onboardingForm } = this.state; + const newWhitelist = onboardingForm.whitelist.filter(person => person.id !== id); + this.setState({ + onboardingForm: { + ...onboardingForm, + whitelist: newWhitelist + } + }); + message.success('已移除白名单人员'); + }; + + // 添加黑名单人员 + addToBlacklist = () => { + message.info('功能开发中,敬请期待'); + }; + + // 添加白名单人员 + addToWhitelist = () => { + message.info('功能开发中,敬请期待'); + }; + + // 保存设置 + handleSave = () => { + const { onboardingForm } = this.state; + + if (!onboardingForm.departmentName) { + message.error('请选择部门'); + return; + } + + if (!onboardingForm.planStartDate || !onboardingForm.planEndDate) { + message.error('请选择计划时段'); + return; + } + + if (onboardingForm.planStartDate.isAfter(onboardingForm.planEndDate)) { + message.error('开始日期不能晚于结束日期'); + return; + } + + if (onboardingForm.totalPlan <= 0) { + message.error('计划总人数必须大于0'); + return; + } + + console.log('保存入职计划设置:', onboardingForm); + message.success('入职计划设置保存成功'); + }; + + // 取消操作 + handleCancel = () => { + message.info('已取消操作'); + }; + + render() { + const { selectedOrgKeys, expandedKeys, onboardingForm } = this.state; + + return ( +
+
+ + + {/* 左侧组织架构树 - 保持不变 */} + + +
+ + 组织架构 +
+ +
+ } + className={styles.treeCard} + > +
+ +
+ + + + {/* 右侧入职计划设置 - 替换为HTML内容 */} + + + {/* 头部标题 */} +
+ + 入职计划设置 + + + + + +
+ + {/* 表单内容区 */} +
+ {/* 入职部门信息 */} + + + 入职部门信息 + + } + size="small" + className={styles.formCard} + > + + +
+ +
+ {onboardingForm.departmentName} +
+
+ + +
+ +
+ {onboardingForm.departmentManager} +
+
+ + +
+ +
+ {onboardingForm.currentStaff} +
+
+ +
+
+ + {/* 计划时段设置 */} + + + 计划时段设置 + + } + size="small" + className={styles.formCard} + > + + +
+ + this.handleOnboardingFormChange('planStartDate', date)} + placeholder="选择开始日期" + /> +
+ + +
+ + this.handleOnboardingFormChange('planEndDate', date)} + placeholder="选择结束日期" + /> +
+ +
+
+ + {/* 可入职岗位设置 */} + + + 可入职岗位设置 + + } + size="small" + className={styles.formCard} + > +
+ {onboardingForm.availablePositions.map(position => ( +
+ this.handlePositionChange(position.id, e.target.checked)} + > + {position.name} ({position.count}人) + +
+ ))} + +
+
+ + {/* 计划入职人数 */} + + + 计划入职人数 + + } + size="small" + className={styles.formCard} + > + + +
+ + this.handleOnboardingFormChange('totalPlan', value)} + placeholder="请输入计划总人数" + /> +
+ + +
+ + +
+ + +
+ + +
+ +
+
+ + {/* 人员要求 */} + + + 人员要求 + + } + size="small" + className={styles.formCard} + > +
+
+ + this.handleOnboardingFormChange('ageRange', e.target.value)} + > + 22-30岁 + 30-35岁 + 不限 + +
+ +
+ + this.handleOnboardingFormChange('gender', e.target.value)} + > + + + 不限 + +
+ + + +
+ + +
+ + +
+ + +
+ +
+ +
+ +