"""离职(软删除)后,历史单据仍应展示人员姓名,而不是人员 id。""" from __future__ import annotations import unittest from datetime import datetime from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from app.crud.production_task import _enrich_assignee_names from app.crud.production_task_step_assignee import enrich_step_completed_by_names from app.crud.qc_inspection_batch import _assignee_names from app.models.base import Base from app.models.models import SysUser def _user(user_id: str, nick_name: str, *, deleted: bool = False) -> SysUser: now = datetime(2026, 7, 1, 10, 0, 0) return SysUser( id=user_id, user_no="u-" + user_id[:6], nick_name=nick_name, email="", phone_no="", password="", status="0" if deleted else "1", tenant_no="zkxw", create_dept_id="", create_time=now, update_time=now, del_flag=1 if deleted else 0, ) class TestDepartedUserDisplayName(unittest.TestCase): def setUp(self): self.engine = create_engine("sqlite:///:memory:") Base.metadata.create_all(self.engine, tables=[SysUser.__table__]) Session = sessionmaker(bind=self.engine, autoflush=False, autocommit=False) self.db = Session() self.db.add_all( [ _user("GONEID0001", "张倩文", deleted=True), _user("STAYID0001", "侯以婷"), ] ) self.db.commit() def tearDown(self): self.db.close() def test_qc_batch_assignee_names_keep_departed_nick(self): text = _assignee_names(self.db, ["GONEID0001", "STAYID0001"]) self.assertEqual(text, "张倩文、侯以婷") def test_qc_batch_assignee_unknown_id_stays_id(self): self.assertEqual(_assignee_names(self.db, ["NO_SUCH_USER"]), "NO_SUCH_USER") def test_production_current_assignee_keeps_departed_nick(self): items = [{"currentAssigneeUserId": "GONEID0001"}] _enrich_assignee_names(self.db, items) self.assertEqual(items[0]["currentAssigneeUserName"], "张倩文") def test_step_completed_by_keeps_departed_nick(self): steps = [{"completedBy": "GONEID0001"}] enrich_step_completed_by_names(self.db, steps) self.assertIn("张倩文", steps[0]["completedByName"]) self.assertNotIn("GONEID0001", steps[0]["completedByName"])