Compare commits

...

3 Commits

Author SHA1 Message Date
f87b4186bb feat: 添加根据职位和级别计算津贴的函数
新增allowance函数用于根据职位、级别和时间查询对应的津贴规则
当规则不存在时会记录警告日志并返回0
2025-06-13 16:04:11 +08:00
87c4c09a2d fix: 添加缺失的职位和职级工资规则日志警告
在role_salary和level_salary函数中添加当时间参数对应的工资规则不存在时的日志警告,提高调试时的可追溯性
2025-06-13 16:02:52 +08:00
b10d9be95f refactor: 优化数据结构并添加工龄计算功能
重构all_history数据结构以存储更多变动前后信息
新增calculate_seniority函数用于计算员工工龄
移除重复的datetime导入并合并os导入
2025-06-13 15:51:13 +08:00

26
main.py
View File

@ -3,8 +3,7 @@ from openpyxl.utils import get_column_letter
from openpyxl import load_workbook
from datetime import datetime
from dateutil.relativedelta import relativedelta
import logging
from datetime import datetime
import logging, os
# 配置日志记录
logging.basicConfig(filename='log.txt', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
@ -68,6 +67,9 @@ def split_level(level:str):
except:
raise Exception(f"职级[{level}]格式错误")
def calculate_seniority(row, year):
return year - row["参加工作时间"].year + row["工龄调增"] - row["工龄调减"] + 1
# 读取信息
def read_base_data(): # 读取员工数据
@ -196,6 +198,7 @@ def role_salary(role:str, time):
logging.error("空职级")
else:
logging.warning(f"职位[{role}]在[{time}]时不存在工资规则")
logging.warning(f"时间[{time}]时不存在职位工资规则")
return 0
def level_salary(level:str, time):
@ -206,6 +209,7 @@ def level_salary(level:str, time):
return tmp["salary"]
except:
logging.warning(f"职级[{level}]在[{time}]时不存在工资规则")
logging.warning(f"时间[{time}]时不存在职级工资规则")
return 0
def role_limit(role:str):
@ -215,6 +219,17 @@ def role_limit(role:str):
logging.warning(f"职位[{role}]不存在职级上限规则")
return -1
def allowance(role:str, level:int, time):
for rule in Allowance:
if rule["start"] <= time <= rule["end"]:
try:
tmp = rule["rule"][rule["rule"]["level"] == f"{role}-{level}"].iloc[0]
return tmp["salary"]
except:
logging.warning(f"组合[{role}-{level}]在[{time}]时不存在工资规则")
logging.warning(f"时间[{time}]时不存在津贴规则")
raise 0
# 填充类辅助函数
def fill_basic_info(ws, row):# 填充基本信息
@ -297,7 +312,11 @@ def main():
load_rule()
# 创建一个空的DataFrame来存储所有历史记录
all_history = pd.DataFrame(columns=["身份证号码", "姓名", "时间", "职务", "职务工资", "级别档次", "级别工资", "工资合计", "变动原因", "晋升备注"])
all_history = pd.DataFrame(columns=[
"身份证号码", "姓名", "工龄","变动原因", "晋升备注",
"变动前时间", "变动前职务", "变动前级别档次", "变动前职务工资", "变动前级别工资", "变动前津贴工资",
"变动后时间", "变动后职务", "变动后级别档次", "变动后职务工资", "变动后级别工资", "变动后津贴工资",
"五年1级年份", "两年1档年份"])
for index, row in BaseData.iterrows():
try:
@ -321,7 +340,6 @@ def main():
else:
BaseData.at[index, "职务2"] = row["初始职务"]
BaseData.at[index, "日期2"] = row["入职时间"]
promote = promote.sort_values(by=["工资执行时间", "任职时间"]).reset_index(drop=True)
fill_prompt_info(ws, promote)# 填充晋升信息