<think>我们将创建一个更完整的加班费计算程序,允许用户输入加班小时数、加班类型(平日、周末、节假日)和计算基数(小时工资)。功能:1.输入:加班小时数、加班类型、小时工资基数2.计算:根据加班类型乘以相应的倍数(平日1.5,周末2,节假日3)3.输出:显示计算的加班费4.扩展:支持多段输入,并可以保存记录我们将使用Python编写,并考虑使用命令行交互界面。后续可以扩展为GUI或Web应用。代码结构:1.定义加班类型与倍数的映射2.获取用户输入(可以多段输入,直到用户选择退出)3.计算每一段的加班费4.显示每一段的结果和总结果5.保存记录到文件注意:输入验证(例如负数、非数字等)以下是代码实现:</think>### 加班费计算软件实现方案
下面是一个完整的加班费计算软件实现,支持输入加班小时数、加班类型和计算基数(小时工资)。该程序使用Python编写,具有命令行界面、输入验证和结果导出功能。
```python
import csv
from datetime import datetime
import os
# 加班类型配置(可扩展)
OVERTIME_TYPES = {
"1": {"name": "平日加班", "multiplier": 1.5},
"2": {"name": "周末加班", "multiplier": 2.0},
"3": {"name": "法定节假日", "multiplier": 3.0},
"4": {"name": "深夜加班", "multiplier": 1.8} # 示例扩展类型
}
def validate_input(value, value_type="float", min_value=0):
"""通用输入验证函数"""
try:
if value_type == "float":
num = float(value)
if num < min_value:
raise ValueError(f"不能小于{min_value}")
return num
elif value_type == "int":
num = int(value)
if num < min_value:
raise ValueError(f"不能小于{min_value}")
return num
elif value_type == "choice":
if value not in OVERTIME_TYPES:
raise ValueError("无效的加班类型")
return value
except ValueError as e:
print(f"输入错误: {e}")
return None
def calculate_overtime_pay(base_wage, hours, multiplier):
"""计算加班费"""
return base_wage * hours * multiplier
def save_record(records):
"""保存加班记录到CSV文件"""
filename = "overtime_records.csv"
file_exists = os.path.isfile(filename)
with open(filename, 'a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
# 如果文件不存在,写入表头
if not file_exists:
writer.writerow(["日期", "基数(时薪)", "加班类型", "小时数", "倍数", "加班费", "计算时间"])
# 写入记录
for record in records:
writer.writerow([
record['date'],
record['base_wage'],
OVERTIME_TYPES[record['ot_type']]['name'],
record['hours'],
record['multiplier'],
record['pay'],
record['calc_time']
])
print(f"\n记录已保存到 {filename}")
def display_summary(records):
"""显示计算结果汇总"""
total_pay = sum(record['pay'] for record in records)
print("\n===== 计算结果汇总 =====")
print(f"记录条目数: {len(records)}")
print(f"总加班费: {total_pay:.2f}元")
# 按加班类型分类统计
type_summary = {}
for record in records:
type_name = OVERTIME_TYPES[record['ot_type']]['name']
type_summary.setdefault(type_name, {"hours": 0, "pay": 0})
type_summary[type_name]["hours"] += record['hours']
type_summary[type_name]["pay"] += record['pay']
print("\n===== 按类型统计 =====")
for type_name, data in type_summary.items():
print(f"{type_name}: {data['hours']}小时, {data['pay']:.2f}元")
def main():
"""主程序"""
records = []
print("===== 加班费计算软件 =====")
print("支持以下加班类型:")
for code, data in OVERTIME_TYPES.items():
print(f" {code}: {data['name']} ({data['multiplier']}倍)")
while True:
try:
print("\n=== 输入加班信息 (输入q退出) ===")
# 获取日期
date_str = input("加班日期(YYYY-MM-DD, 默认今天): ").strip()
if date_str.lower() == 'q':
break
date = datetime.now().date() if not date_str else datetime.strptime(date_str, '%Y-%m-%d').date()
# 获取基数(小时工资)
base_wage = None
while base_wage is None:
wage_input = input("小时工资基数(元/小时): ").strip()
if wage_input.lower() == 'q':
break
base_wage = validate_input(wage_input, "float", 0.01)
# 获取加班类型
ot_type = None
while ot_type is None:
type_input = input("加班类型(输入代码): ").strip()
if type_input.lower() == 'q':
break
ot_type = validate_input(type_input, "choice")
# 获取加班小时数
hours = None
while hours is None:
hours_input = input("加班小时数: ").strip()
if hours_input.lower() == 'q':
break
hours = validate_input(hours_input, "float", 0.01)
# 计算加班费
multiplier = OVERTIME_TYPES[ot_type]['multiplier']
pay = calculate_overtime_pay(base_wage, hours, multiplier)
calc_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 存储记录
record = {
'date': date.strftime('%Y-%m-%d'),
'base_wage': base_wage,
'ot_type': ot_type,
'hours': hours,
'multiplier': multiplier,
'pay': pay,
'calc_time': calc_time
}
records.append(record)
# 显示当前结果
print(f"\n本次加班费: {pay:.2f}元")
print(f"计算详情: {base_wage}元 × {hours}小时 × {multiplier}倍")
except KeyboardInterrupt:
print("\n操作已取消")
break
except Exception as e:
print(f"发生错误: {e}")
# 显示汇总并保存结果
if records:
display_summary(records)
save_record(records)
else:
print("未输入有效数据,程序退出")
if __name__ == "__main__":
main()
```
### 代码详解
#### 1. 加班类型配置系统
```python
OVERTIME_TYPES = {
"1": {"name": "平日加班", "multiplier": 1.5},
"2": {"name": "周末加班", "multiplier": 2.0},
"3": {"name": "法定节假日", "multiplier": 3.0},
"4": {"name": "深夜加班", "multiplier": 1.8}
}
```
- 使用字典存储加班类型配置,便于扩展
- 每个类型包含名称和倍数,支持灵活添加新类型
#### 2. 输入验证函数
```python
def validate_input(value, value_type="float", min_value=0):
# 验证逻辑...
```
- 支持多种数据类型验证(浮点数、整数、选项)
- 检查最小值限制
- 提供清晰的错误反馈
#### 3. 核心计算逻辑
```python
def calculate_overtime_pay(base_wage, hours, multiplier):
return base_wage * hours * multiplier
```
- 简洁的计算公式:基数 × 小时数 × 倍数
- 可扩展为更复杂的计算规则(如分段计算)
#### 4. 数据持久化
```python
def save_record(records):
# 保存到CSV文件...
```
- 使用CSV格式存储记录
- 自动检测文件是否存在并添加表头
- 支持UTF-8编码,确保中文兼容
#### 5. 用户界面设计
```python
def main():
# 主循环...
```
- 清晰的命令行交互界面
- 支持连续输入多条记录
- 输入过程中可随时退出(输入q)
- 提供实时计算结果反馈
### 使用示例
```
===== 加班费计算软件 =====
支持以下加班类型:
1: 平日加班 (1.5倍)
2: 周末加班 (2.0倍)
3: 法定节假日 (3.0倍)
4: 深夜加班 (1.8倍)
=== 输入加班信息 (输入q退出) ===
加班日期(YYYY-MM-DD, 默认今天): 2023-08-15
小时工资基数(元/小时): 50
加班类型(输入代码): 1
加班小时数: 3
本次加班费: 225.00元
计算详情: 50.0元 × 3.0小时 × 1.5倍
=== 输入加班信息 (输入q退出) ===
加班日期(YYYY-MM-DD, 默认今天): 2023-08-19
小时工资基数(元/小时): 50
加班类型(输入代码): 2
加班小时数: 8
本次加班费: 800.00元
计算详情: 50.0元 × 8.0小时 × 2.0倍
=== 输入加班信息 (输入q退出) ===
加班日期(YYYY-MM-DD, 默认今天): q
===== 计算结果汇总 =====
记录条目数: 2
总加班费: 1025.00元
===== 按类型统计 =====
平日加班: 3.0小时, 225.00元
周末加班: 8.0小时, 800.00元
记录已保存到 overtime_records.csv
```
### 功能扩展建议
1. **图形用户界面(GUI)**
- 使用PyQt或Tkinter创建桌面应用
- 添加日历控件选择日期
- 实现表格显示历史记录
2. **规则自定义系统**
- 从配置文件加载加班规则
- 支持不同地区/公司的特殊计算规则
- 添加自定义加班类型功能
3. **高级计算功能**
- 支持分段加班计算(不同时间段不同倍数)
- 添加最低工资标准验证
- 实现加班费税收计算
4. **数据导入导出**
- 支持Excel格式导入导出
- 添加数据库存储功能
- 实现PDF报告生成