feat: 增强员工管理与报销单全流程功能
- 新增员工Excel导入服务(employee_spreadsheet)及导入/导出API端点 - 员工服务增加批量创建、邮箱唯一校验、组织架构关联等能力 - 报销单提交补充身份回填、部门信息透传及预审结果展示优化 - 认证流程增加部门信息(departmentName)并在schema中同步扩展 - 用户Agent服务增加部门关联与报销单回填逻辑 - 前端员工管理页面全面重构,新增导入导出、搜索过滤、分页等功能 - 前端审批中心、审计、差旅报销等视图交互与样式优化 - 新增TableLoadingState共享组件及员工导入测试用例
This commit is contained in:
@@ -135,6 +135,112 @@ def test_enable_employee_restores_status_and_logs_change() -> None:
|
||||
assert any(item.action == "启用员工账号" for item in updated.history)
|
||||
|
||||
|
||||
def test_profile_repairs_do_not_run_on_every_list() -> None:
|
||||
with build_session() as db:
|
||||
service = EmployeeService(db)
|
||||
employee = service.list_employees()[0]
|
||||
|
||||
updated = service.update_employee(
|
||||
employee.id,
|
||||
EmployeeUpdate(position="测试岗位-不会被回滚"),
|
||||
)
|
||||
|
||||
listed = next(item for item in service.list_employees() if item.id == employee.id)
|
||||
assert updated.position == "测试岗位-不会被回滚"
|
||||
assert listed.position == "测试岗位-不会被回滚"
|
||||
|
||||
|
||||
def test_role_update_appends_recent_history() -> None:
|
||||
with build_session() as db:
|
||||
service = EmployeeService(db)
|
||||
employee = service.list_employees()[0]
|
||||
current_codes = list(employee.roleCodes)
|
||||
next_codes = ["finance", "user"] if "finance" not in current_codes else ["user"]
|
||||
|
||||
updated = service.update_employee(employee.id, EmployeeUpdate(role_codes=next_codes))
|
||||
|
||||
assert any("更新系统角色" in item.action for item in updated.history)
|
||||
|
||||
|
||||
def test_employee_change_logs_keep_only_latest_five() -> None:
|
||||
with build_session() as db:
|
||||
service = EmployeeService(db)
|
||||
employee = service.list_employees()[0]
|
||||
persisted = db.get(Employee, employee.id)
|
||||
assert persisted is not None
|
||||
|
||||
for index in range(7):
|
||||
service._append_change_log(
|
||||
persisted,
|
||||
action=f"测试变更-{index}",
|
||||
owner="单元测试",
|
||||
)
|
||||
|
||||
db.commit()
|
||||
service._trim_employee_change_logs(persisted.id)
|
||||
db.commit()
|
||||
hydrated = db.get(Employee, employee.id)
|
||||
assert hydrated is not None
|
||||
assert len(hydrated.change_logs) == 5
|
||||
assert hydrated.change_logs[0].action == "测试变更-6"
|
||||
|
||||
|
||||
def test_employee_meta_includes_organization_options() -> None:
|
||||
with build_session() as db:
|
||||
service = EmployeeService(db)
|
||||
meta = service.get_employee_meta()
|
||||
|
||||
assert meta.organizationOptions
|
||||
assert all(item.code and item.name for item in meta.organizationOptions)
|
||||
|
||||
|
||||
def test_update_employee_changes_organization() -> None:
|
||||
with build_session() as db:
|
||||
service = EmployeeService(db)
|
||||
employee = service.list_employees()[0]
|
||||
organizations = service.repository.list_organization_units()
|
||||
current_code = employee.organization.code if employee.organization else None
|
||||
target = next(unit for unit in organizations if unit.unit_code != current_code)
|
||||
|
||||
updated = service.update_employee(
|
||||
employee.id,
|
||||
EmployeeUpdate(organization_unit_code=target.unit_code),
|
||||
)
|
||||
|
||||
assert updated.organization is not None
|
||||
assert updated.organization.code == target.unit_code
|
||||
assert updated.department == target.name
|
||||
assert any("更新员工信息" in item.action for item in updated.history)
|
||||
|
||||
|
||||
def test_update_employee_rejects_unknown_organization() -> None:
|
||||
with build_session() as db:
|
||||
service = EmployeeService(db)
|
||||
employee = service.list_employees()[0]
|
||||
|
||||
with pytest.raises(ValueError, match="部门编码"):
|
||||
service.update_employee(
|
||||
employee.id,
|
||||
EmployeeUpdate(organization_unit_code="ORG-NOT-EXISTS"),
|
||||
)
|
||||
|
||||
|
||||
def test_update_employee_changes_manager() -> None:
|
||||
with build_session() as db:
|
||||
service = EmployeeService(db)
|
||||
employees = service.list_employees()
|
||||
employee = employees[0]
|
||||
manager = next(item for item in employees if item.id != employee.id)
|
||||
|
||||
updated = service.update_employee(
|
||||
employee.id,
|
||||
EmployeeUpdate(manager_employee_no=manager.employeeNo),
|
||||
)
|
||||
|
||||
assert updated.managerEmployeeNo == manager.employeeNo
|
||||
assert updated.manager == manager.name
|
||||
|
||||
|
||||
def test_update_employee_rejects_invalid_date_format() -> None:
|
||||
with build_session() as db:
|
||||
service = EmployeeService(db)
|
||||
|
||||
Reference in New Issue
Block a user