From 713766541073306a3ce95c5e3ab21bbb0993b14b Mon Sep 17 00:00:00 2001 From: Cheng Zhou Date: Thu, 18 Dec 2025 22:09:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=89=8D=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98=EF=BC=88?= =?UTF-8?q?=E5=8F=97=E8=AF=95=E8=80=85=E3=80=81=E4=B8=AD=E5=BF=83=E3=80=81?= =?UTF-8?q?=E8=B4=9F=E8=B4=A3=E4=BA=BA=E3=80=81=E6=97=A5=E6=9C=9F=E7=AD=89?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/v1/attachments.py | 27 +++++- backend/app/api/v1/members.py | 31 ++++++- backend/app/api/v1/milestones.py | 78 +++++++++++++++- backend/app/api/v1/tasks.py | 39 +++++++- backend/app/crud/milestone.py | 1 + backend/app/crud/site.py | 8 ++ backend/app/crud/user.py | 8 ++ backend/app/models/milestone.py | 1 + backend/app/schemas/attachment.py | 11 ++- backend/app/schemas/member.py | 5 ++ backend/app/schemas/milestone.py | 13 +++ backend/app/schemas/task.py | 3 + backend/app/schemas/user.py | 8 ++ .../7c381eef-241c-434a-be64-bc9f5a7ab42f.xlsx | Bin 0 -> 13178 bytes frontend/src/components/CommentList.vue | 32 ++++++- frontend/src/components/FaqList.vue | 5 +- frontend/src/components/MilestoneForm.vue | 36 ++++---- frontend/src/components/SubjectForm.vue | 6 +- frontend/src/components/TaskForm.vue | 20 ++++- frontend/src/components/VerificationTable.vue | 20 ++++- .../components/attachments/AttachmentList.vue | 38 ++++---- frontend/src/utils/display/index.ts | 45 ++++++++++ frontend/src/views/AeDetail.vue | 29 +++++- frontend/src/views/Finance.vue | 17 +++- frontend/src/views/FinanceDetail.vue | 60 +++++++++++-- frontend/src/views/ImpInventory.vue | 64 +++++++++++-- frontend/src/views/ImpTransactions.vue | 85 ++++++++++++++++-- frontend/src/views/MilestoneDetail.vue | 45 ++++++---- frontend/src/views/Milestones.vue | 39 ++++---- frontend/src/views/SubjectDetail.vue | 21 ++++- frontend/src/views/Tasks.vue | 65 +++++++++----- frontend/src/views/Verification.vue | 50 ++++++++++- frontend/src/views/admin/AuditLogs.vue | 10 ++- pg_data/base/16384/16399 | Bin 8192 -> 8192 bytes pg_data/base/16384/16433 | Bin 8192 -> 8192 bytes pg_data/base/16384/16445 | Bin 8192 -> 8192 bytes pg_data/base/16384/16483 | Bin 8192 -> 8192 bytes pg_data/base/16384/16508 | Bin 8192 -> 8192 bytes pg_data/base/16384/16520 | Bin 8192 -> 8192 bytes pg_data/base/16384/16531 | Bin 16384 -> 16384 bytes pg_data/base/16384/16541 | Bin 16384 -> 16384 bytes pg_data/base/16384/16595 | Bin 16384 -> 16384 bytes pg_data/base/16384/16596 | Bin 16384 -> 16384 bytes pg_data/base/16384/16597 | Bin 16384 -> 16384 bytes pg_data/global/pg_control | Bin 8192 -> 8192 bytes pg_data/pg_subtrans/0000 | Bin 8192 -> 8192 bytes pg_data/pg_wal/000000010000000000000001 | Bin 16777216 -> 16777216 bytes pg_data/pg_xact/0000 | Bin 8192 -> 8192 bytes 48 files changed, 764 insertions(+), 156 deletions(-) create mode 100644 backend/app/uploads/study_44444444-4444-4444-4444-444444444444/ethics_node_d9e8057a-8c9c-4b9c-a94a-dbc91301c13c/7c381eef-241c-434a-be64-bc9f5a7ab42f.xlsx create mode 100644 frontend/src/utils/display/index.ts diff --git a/backend/app/api/v1/attachments.py b/backend/app/api/v1/attachments.py index 6cbdb00a..0c90bfc7 100644 --- a/backend/app/api/v1/attachments.py +++ b/backend/app/api/v1/attachments.py @@ -15,6 +15,7 @@ from app.crud import user as user_crud from app.crud import member as member_crud from app.core.security import decode_token from app.schemas.attachment import AttachmentRead +from app.schemas.user import UserDisplay router = APIRouter() global_router = APIRouter() @@ -74,7 +75,14 @@ async def upload_attachment( operator_id=current_user.id, operator_role=current_user.role, ) - return attachment + return AttachmentRead( + id=attachment.id, + filename=attachment.filename, + file_size=attachment.file_size, + uploaded_by=UserDisplay.model_validate(current_user) if current_user else None, + uploaded_by_id=attachment.uploaded_by, + uploaded_at=attachment.uploaded_at, + ) @router.get( @@ -90,7 +98,22 @@ async def list_attachments( ) -> list[AttachmentRead]: await _ensure_study_exists(db, study_id) attachments = await attachment_crud.list_attachments(db, study_id, entity_type, entity_id) - return list(attachments) + user_ids = {a.uploaded_by for a in attachments if a.uploaded_by} + users_map = await user_crud.get_users_by_ids(db, user_ids) + result: list[AttachmentRead] = [] + for a in attachments: + user = users_map.get(a.uploaded_by) + result.append( + AttachmentRead( + id=a.id, + filename=a.filename, + file_size=a.file_size, + uploaded_by=UserDisplay.model_validate(user) if user else None, + uploaded_by_id=a.uploaded_by, + uploaded_at=a.uploaded_at, + ) + ) + return result @router.get( diff --git a/backend/app/api/v1/members.py b/backend/app/api/v1/members.py index 31e1e3f1..720c4561 100644 --- a/backend/app/api/v1/members.py +++ b/backend/app/api/v1/members.py @@ -6,7 +6,9 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.core.deps import get_db_session, require_study_member, require_study_roles from app.crud import member as member_crud from app.crud import study as study_crud -from app.schemas.member import StudyMemberCreate, StudyMemberRead, StudyMemberUpdate +from app.crud import user as user_crud +from app.schemas.member import StudyMemberCreate, StudyMemberRead, StudyMemberReadWithUser, StudyMemberUpdate +from app.schemas.user import UserDisplay router = APIRouter() @@ -39,7 +41,7 @@ async def add_member( @router.get( "/", - response_model=list[StudyMemberRead], + response_model=list[StudyMemberReadWithUser], dependencies=[Depends(require_study_member())], ) async def list_members( @@ -47,10 +49,31 @@ async def list_members( skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db_session), -) -> list[StudyMemberRead]: +) -> list[StudyMemberReadWithUser]: await _ensure_study_exists(db, study_id) members = await member_crud.list_members(db, study_id, skip=skip, limit=limit) - return list(members) + user_ids = {m.user_id for m in members} + users_map = await user_crud.get_users_by_ids(db, user_ids) + result: list[StudyMemberReadWithUser] = [] + for m in members: + # 仅返回项目内启用的成员 + 账号启用的用户 + if not m.is_active: + continue + user = users_map.get(m.user_id) + if not user or not user.is_active: + continue + result.append( + StudyMemberReadWithUser( + id=m.id, + study_id=m.study_id, + user_id=m.user_id, + role_in_study=m.role_in_study, + is_active=m.is_active, + added_at=m.added_at, + user=UserDisplay.model_validate(user) if user else None, + ) + ) + return result @router.patch( diff --git a/backend/app/api/v1/milestones.py b/backend/app/api/v1/milestones.py index ba6ffb60..a69860b8 100644 --- a/backend/app/api/v1/milestones.py +++ b/backend/app/api/v1/milestones.py @@ -7,7 +7,11 @@ from app.core.deps import get_current_user, get_db_session, require_study_member from app.crud import audit as audit_crud from app.crud import milestone as milestone_crud from app.crud import study as study_crud +from app.crud import user as user_crud +from app.crud import site as site_crud from app.schemas.milestone import MilestoneCreate, MilestoneRead, MilestoneUpdate +from app.schemas.user import UserDisplay +from app.schemas.milestone import SiteDisplay router = APIRouter() @@ -33,6 +37,12 @@ async def create_milestone( ) -> MilestoneRead: await _ensure_study_exists(db, study_id) milestone = await milestone_crud.create(db, study_id, milestone_in) + owner = None + site = None + if milestone.owner_id: + owner = await user_crud.get_by_id(db, milestone.owner_id) + if milestone.site_id: + site = await site_crud.get_site(db, milestone.site_id) await audit_crud.log_action( db, study_id=study_id, @@ -43,7 +53,22 @@ async def create_milestone( operator_id=current_user.id, operator_role=current_user.role, ) - return milestone + return MilestoneRead( + id=milestone.id, + study_id=milestone.study_id, + type=milestone.type, + name=milestone.name, + planned_date=milestone.planned_date, + actual_date=milestone.actual_date, + status=milestone.status, + owner_id=milestone.owner_id, + site_id=milestone.site_id, + owner=UserDisplay.model_validate(owner) if owner else None, + site=SiteDisplay.model_validate(site) if site else None, + notes=milestone.notes, + created_at=milestone.created_at, + updated_at=milestone.updated_at, + ) @router.get( @@ -57,7 +82,33 @@ async def list_milestones( ) -> list[MilestoneRead]: await _ensure_study_exists(db, study_id) milestones = await milestone_crud.list_milestones(db, study_id) - return list(milestones) + owner_ids = {m.owner_id for m in milestones if m.owner_id} + site_ids = {m.site_id for m in milestones if m.site_id} + users_map = await user_crud.get_users_by_ids(db, owner_ids) + sites_map = await site_crud.get_sites_by_ids(db, site_ids) + result: list[MilestoneRead] = [] + for m in milestones: + owner = users_map.get(m.owner_id) + site = sites_map.get(m.site_id) + result.append( + MilestoneRead( + id=m.id, + study_id=m.study_id, + type=m.type, + name=m.name, + planned_date=m.planned_date, + actual_date=m.actual_date, + status=m.status, + owner_id=m.owner_id, + site_id=m.site_id, + owner=UserDisplay.model_validate(owner) if owner else None, + site=SiteDisplay.model_validate(site) if site else None, + notes=m.notes, + created_at=m.created_at, + updated_at=m.updated_at, + ) + ) + return result @router.patch( @@ -78,6 +129,12 @@ async def update_milestone( raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Milestone not found") old_status = milestone.status updated = await milestone_crud.update(db, milestone, milestone_in) + owner = None + site = None + if updated.owner_id: + owner = await user_crud.get_by_id(db, updated.owner_id) + if updated.site_id: + site = await site_crud.get_site(db, updated.site_id) detail = None if milestone_in.status and milestone_in.status != old_status: detail = f"milestone {milestone_id} status {old_status} -> {milestone_in.status}" @@ -91,4 +148,19 @@ async def update_milestone( operator_id=current_user.id, operator_role=current_user.role, ) - return updated + return MilestoneRead( + id=updated.id, + study_id=updated.study_id, + type=updated.type, + name=updated.name, + planned_date=updated.planned_date, + actual_date=updated.actual_date, + status=updated.status, + owner_id=updated.owner_id, + site_id=updated.site_id, + owner=UserDisplay.model_validate(owner) if owner else None, + site=SiteDisplay.model_validate(site) if site else None, + notes=updated.notes, + created_at=updated.created_at, + updated_at=updated.updated_at, + ) diff --git a/backend/app/api/v1/tasks.py b/backend/app/api/v1/tasks.py index 5cead312..4d922285 100644 --- a/backend/app/api/v1/tasks.py +++ b/backend/app/api/v1/tasks.py @@ -8,7 +8,9 @@ from app.crud import audit as audit_crud from app.crud import milestone as milestone_crud from app.crud import study as study_crud from app.crud import task as task_crud +from app.crud import user as user_crud from app.schemas.task import TaskCreate, TaskRead, TaskUpdate +from app.schemas.user import UserDisplay router = APIRouter() @@ -47,6 +49,9 @@ async def create_task( await _ensure_study_exists(db, study_id) await _validate_milestone(db, study_id, task_in.milestone_id) task = await task_crud.create(db, study_id, task_in, created_by=current_user.id) + assignee = None + if task.assignee_id: + assignee = await user_crud.get_by_id(db, task.assignee_id) await audit_crud.log_action( db, study_id=study_id, @@ -57,7 +62,7 @@ async def create_task( operator_id=current_user.id, operator_role=current_user.role, ) - return task + return _to_task_read(task, assignee) @router.get( @@ -74,7 +79,13 @@ async def list_tasks( ) -> list[TaskRead]: await _ensure_study_exists(db, study_id) tasks = await task_crud.list_tasks(db, study_id, milestone_id=milestone_id, assignee_id=assignee_id, status=status) - return list(tasks) + assignee_ids = {t.assignee_id for t in tasks if t.assignee_id} + users_map = await user_crud.get_users_by_ids(db, assignee_ids) + result: list[TaskRead] = [] + for t in tasks: + user = users_map.get(t.assignee_id) + result.append(_to_task_read(t, user)) + return result @router.patch( @@ -98,6 +109,9 @@ async def update_task( old_status = task.status updated = await task_crud.update(db, task, task_in) + assignee = None + if updated.assignee_id: + assignee = await user_crud.get_by_id(db, updated.assignee_id) detail = None if task_in.status and task_in.status != old_status: detail = f"task {task_id} status {old_status} -> {task_in.status}" @@ -111,4 +125,23 @@ async def update_task( operator_id=current_user.id, operator_role=current_user.role, ) - return updated + return _to_task_read(updated, assignee) + + +def _to_task_read(task, assignee) -> TaskRead: + return TaskRead( + id=task.id, + study_id=task.study_id, + milestone_id=task.milestone_id, + title=task.title, + description=task.description, + assignee_id=task.assignee_id, + assignee=UserDisplay.model_validate(assignee) if assignee else None, + priority=task.priority, + due_date=task.due_date, + status=task.status, + completed_at=task.completed_at, + created_by=task.created_by, + created_at=task.created_at, + updated_at=task.updated_at, + ) diff --git a/backend/app/crud/milestone.py b/backend/app/crud/milestone.py index 3cec213d..0ee1b593 100644 --- a/backend/app/crud/milestone.py +++ b/backend/app/crud/milestone.py @@ -17,6 +17,7 @@ async def create(db: AsyncSession, study_id: uuid.UUID, milestone_in: MilestoneC actual_date=None, status=milestone_in.status or "NOT_STARTED", owner_id=milestone_in.owner_id, + site_id=milestone_in.site_id, notes=milestone_in.notes, ) db.add(milestone) diff --git a/backend/app/crud/site.py b/backend/app/crud/site.py index 69b79ed4..db892324 100644 --- a/backend/app/crud/site.py +++ b/backend/app/crud/site.py @@ -46,3 +46,11 @@ async def list_by_study(db: AsyncSession, study_id: uuid.UUID, skip: int = 0, li select(Site).where(Site.study_id == study_id).offset(skip).limit(limit) ) return result.scalars().all() + + +async def get_sites_by_ids(db: AsyncSession, ids: set[uuid.UUID]) -> dict[uuid.UUID, Site]: + if not ids: + return {} + result = await db.execute(select(Site).where(Site.id.in_(ids))) + sites = result.scalars().all() + return {s.id: s for s in sites} diff --git a/backend/app/crud/user.py b/backend/app/crud/user.py index 4d2397b5..1acdbd67 100644 --- a/backend/app/crud/user.py +++ b/backend/app/crud/user.py @@ -73,6 +73,14 @@ async def ensure_admin_exists(db: AsyncSession, *, default_password: str = "admi await db.commit() +async def get_users_by_ids(db: AsyncSession, ids: set[uuid.UUID]) -> dict[uuid.UUID, User]: + if not ids: + return {} + result = await db.execute(select(User).where(User.id.in_(ids))) + users = result.scalars().all() + return {u.id: u for u in users} + + async def delete_user(db: AsyncSession, user: User) -> None: await db.execute(delete(StudyMember).where(StudyMember.user_id == user.id)) await db.delete(user) diff --git a/backend/app/models/milestone.py b/backend/app/models/milestone.py index ec8030f3..20d5f1f2 100644 --- a/backend/app/models/milestone.py +++ b/backend/app/models/milestone.py @@ -18,6 +18,7 @@ class Milestone(Base): planned_date: Mapped[date | None] = mapped_column(Date, nullable=True) actual_date: Mapped[date | None] = mapped_column(Date, nullable=True) status: Mapped[str] = mapped_column(String(20), nullable=False, default="NOT_STARTED") + site_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), ForeignKey("sites.id"), nullable=True) owner_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True) notes: Mapped[str | None] = mapped_column(Text, nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now()) diff --git a/backend/app/schemas/attachment.py b/backend/app/schemas/attachment.py index c531d5fb..a71e7f71 100644 --- a/backend/app/schemas/attachment.py +++ b/backend/app/schemas/attachment.py @@ -1,14 +1,17 @@ import uuid from datetime import datetime -from pydantic import BaseModel, ConfigDict +from pydantic import BaseModel, ConfigDict, Field + +from app.schemas.user import UserDisplay class AttachmentRead(BaseModel): id: uuid.UUID filename: str - file_size: int - uploaded_by: uuid.UUID + file_size: int = Field(alias="size") + uploaded_by: UserDisplay | None = None + uploaded_by_id: uuid.UUID | None = None uploaded_at: datetime - model_config = ConfigDict(from_attributes=True) + model_config = ConfigDict(from_attributes=True, populate_by_name=True) diff --git a/backend/app/schemas/member.py b/backend/app/schemas/member.py index 35654de1..37d94523 100644 --- a/backend/app/schemas/member.py +++ b/backend/app/schemas/member.py @@ -3,6 +3,7 @@ from datetime import datetime from typing import Literal, Optional from pydantic import BaseModel, ConfigDict, Field +from app.schemas.user import UserDisplay StudyRole = Literal["PM", "CRA", "PV", "IMP", "ADMIN"] @@ -27,3 +28,7 @@ class StudyMemberRead(BaseModel): added_at: datetime model_config = ConfigDict(from_attributes=True) + + +class StudyMemberReadWithUser(StudyMemberRead): + user: Optional[UserDisplay] = None diff --git a/backend/app/schemas/milestone.py b/backend/app/schemas/milestone.py index 8a711a7e..574d0f78 100644 --- a/backend/app/schemas/milestone.py +++ b/backend/app/schemas/milestone.py @@ -4,12 +4,21 @@ from typing import Optional from pydantic import BaseModel, ConfigDict, Field +from app.schemas.user import UserDisplay + + +class SiteDisplay(BaseModel): + id: uuid.UUID + name: Optional[str] = None + + model_config = ConfigDict(from_attributes=True) class MilestoneCreate(BaseModel): type: str name: Optional[str] = None planned_date: Optional[date] = None owner_id: Optional[uuid.UUID] = None + site_id: Optional[uuid.UUID] = None notes: Optional[str] = None status: str = Field(default="NOT_STARTED") @@ -20,6 +29,7 @@ class MilestoneUpdate(BaseModel): actual_date: Optional[date] = None status: Optional[str] = None owner_id: Optional[uuid.UUID] = None + site_id: Optional[uuid.UUID] = None notes: Optional[str] = None @@ -32,6 +42,9 @@ class MilestoneRead(BaseModel): actual_date: Optional[date] status: str owner_id: Optional[uuid.UUID] + site_id: Optional[uuid.UUID] = None + owner: Optional[UserDisplay] = None + site: Optional[SiteDisplay] = None notes: Optional[str] created_at: datetime updated_at: datetime diff --git a/backend/app/schemas/task.py b/backend/app/schemas/task.py index 6816fb9a..49000471 100644 --- a/backend/app/schemas/task.py +++ b/backend/app/schemas/task.py @@ -4,6 +4,8 @@ from typing import Optional from pydantic import BaseModel, ConfigDict +from app.schemas.user import UserDisplay + class TaskCreate(BaseModel): milestone_id: Optional[uuid.UUID] = None @@ -31,6 +33,7 @@ class TaskRead(BaseModel): title: str description: Optional[str] assignee_id: Optional[uuid.UUID] + assignee: Optional[UserDisplay] = None priority: str due_date: Optional[date] status: str diff --git a/backend/app/schemas/user.py b/backend/app/schemas/user.py index 10609bc1..93f95b23 100644 --- a/backend/app/schemas/user.py +++ b/backend/app/schemas/user.py @@ -7,6 +7,14 @@ from pydantic import BaseModel, ConfigDict, Field UserRole = Literal["PM", "CRA", "PV", "IMP", "ADMIN"] +class UserDisplay(BaseModel): + id: uuid.UUID + username: str + display_name: Optional[str] = None + + model_config = ConfigDict(from_attributes=True) + + class UserBase(BaseModel): username: str = Field(min_length=1) role: UserRole diff --git a/backend/app/uploads/study_44444444-4444-4444-4444-444444444444/ethics_node_d9e8057a-8c9c-4b9c-a94a-dbc91301c13c/7c381eef-241c-434a-be64-bc9f5a7ab42f.xlsx b/backend/app/uploads/study_44444444-4444-4444-4444-444444444444/ethics_node_d9e8057a-8c9c-4b9c-a94a-dbc91301c13c/7c381eef-241c-434a-be64-bc9f5a7ab42f.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..892884c374a011fc4d8787419504e577b0ed0497 GIT binary patch literal 13178 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 - +
- {{ c.created_by }} + {{ displayUser(c.created_by, { users: userMap, members: memberMap }) }}

{{ c.content }}

@@ -25,10 +25,12 @@ diff --git a/frontend/src/views/Milestones.vue b/frontend/src/views/Milestones.vue index 53adcd37..56a8cdbc 100644 --- a/frontend/src/views/Milestones.vue +++ b/frontend/src/views/Milestones.vue @@ -33,12 +33,12 @@ @@ -63,20 +63,18 @@ :milestone="editingMilestone" :sites="sites" :members="members" - :users="users" @success="loadMilestones" /> diff --git a/frontend/src/views/Verification.vue b/frontend/src/views/Verification.vue index 310d1736..dc6a8b2d 100644 --- a/frontend/src/views/Verification.vue +++ b/frontend/src/views/Verification.vue @@ -18,7 +18,14 @@ - + @@ -60,16 +67,21 @@ import { computed, onMounted, ref } from "vue"; import { ElMessage } from "element-plus"; import { fetchVerifications, upsertVerification } from "../api/verifications"; +import { fetchSubjects } from "../api/subjects"; +import { listMembers } from "../api/members"; import { useStudyStore } from "../store/study"; import { useAuthStore } from "../store/auth"; import VerificationTable from "../components/VerificationTable.vue"; import SiteSelect from "../components/selectors/SiteSelect.vue"; import SubjectSelect from "../components/selectors/SubjectSelect.vue"; +import { displayDate } from "../utils/display"; const study = useStudyStore(); const auth = useAuthStore(); const verifications = ref([]); +const subjects = ref([]); +const members = ref([]); const loading = ref(false); const submitting = ref(false); const showEdit = ref(false); @@ -144,10 +156,46 @@ const submitEdit = async () => { } }; +const loadSubjects = async () => { + if (!study.currentStudy) return; + try { + const { data } = await fetchSubjects(study.currentStudy.id, { limit: 1000 }); + subjects.value = data.items || data || []; + } catch { + subjects.value = []; + } +}; + +const loadMembers = async () => { + if (!study.currentStudy) return; + try { + const { data } = await listMembers(study.currentStudy.id, { limit: 500 }); + members.value = Array.isArray(data) ? data : data.items || []; + } catch { + members.value = []; + } +}; + +const subjectMap = computed(() => + subjects.value.reduce>((acc, cur) => { + if (cur?.id) acc[cur.id] = cur.subject_no || cur.id; + return acc; + }, {}) +); + +const verifierMap = computed(() => + members.value.reduce>((acc, cur) => { + const username = cur?.user?.display_name || cur?.user?.username || cur?.username; + if (cur?.user_id) acc[cur.user_id] = username || cur.user_id; + return acc; + }, {}) +); + onMounted(async () => { if (!auth.user && auth.token) { await auth.fetchMe().catch(() => {}); } + await Promise.all([loadSubjects(), loadMembers()]); load(); }); diff --git a/frontend/src/views/admin/AuditLogs.vue b/frontend/src/views/admin/AuditLogs.vue index 6bd278f9..dc4a3f7c 100644 --- a/frontend/src/views/admin/AuditLogs.vue +++ b/frontend/src/views/admin/AuditLogs.vue @@ -44,14 +44,19 @@ - + + + @@ -94,6 +99,7 @@ import { useAuthStore } from "../../store/auth"; import { roleDict, getDictLabel } from "../../dictionaries"; import { exportAuditCsv } from "../../audit/export/auditExportService"; import { logAudit } from "../../audit"; +import { displayDateTime } from "../../utils/display"; const study = useStudyStore(); const auth = useAuthStore(); diff --git a/pg_data/base/16384/16399 b/pg_data/base/16384/16399 index c132257086ea30ed3ff0f99ac04760ba7f00533a..4a3891524eaa00e512ae625f95b6f6b9081e37c0 100644 GIT binary patch literal 8192 zcmeI$2~-nz9tZG@pa>NT3KZ%!f`}9bb3)?LCME*}b5Ih{wJPM8XevT9p`hI=T0trz zprTL?v6dp`sZ`Gpl7} z!|Esr(wtv0nvIr1qy@xERZ?}FN-a{ysN%#CB1JgKvtEhEvT(Unr6MIb@jQIzhBRl9 zL@rhIc($!P{=A@b5W^qw`9ojv`0NAG_QJM`qSe!Cg>M~3coH{*F;SDKqY4(r=5?=& z6qbJd`Dd3W-1?CSlPW|CG5MfzWmwPExPTv`<%I}Xgh9jC5nK(INeC!CpU@d}6s2W{ z7&wLyToNq`Q-c_)nCWtI-9FIm0L#P=x;;nv1@BwHmiZkvF~8e1%WnCmhK;9_Gz+^xkKe6j@XnHMfQHTza*QynITw?%kuZ^F?O{ zg@pzd`Tpg3IX3b})Hb$(ykn5OzA&$UTbWy?QCd|f`y_V0dx^?M-ey5p-oIWJT`Y|a zc6a(@>d?PDFWU!c4pDMYx?MbDGsrs%$?F62daqViRF{+8wMlnYz7Y47tBt%X-yRcG za!1-wg8O(}ym>JHFVD+D;`+e6exK$vfxIJOUikNAjDvYS%T~KwzZf>HFvyiPtcCq5 zn)fM-#=I~EY2GnW5-{kfMXDJi)$|2;vPlmH5gQ2lM?>d5TMr!Ghy#a?#CO!+F7%de z%AZk?`m7UwP#_P^ zuq!}4;i0e*;1xObeutYa8cVVnmnan^7_%ixsUo~jJE-Xe>UrCN-xcwXg8nsUS|)wF zOSU2Nqpx;Mmv49cU;VE=vR|!~D0}=0(k7qLvSMBt@Vg-XkfD1OU!TZg%u%}%1D)(?#v{4@1;0L&l700 zEDphBv-kv;rwb(n1_P7OY3X%NNC+k1X$}3B4de0&`&WT`7~*~wy5GSo;tse7C#>82 zQ~10Qx5TKsw~iybgFYV@9&tD)bjsv0#p8Oo$0(9@UnHqGm0xCFP<2I9i8e6Cy`(4((is<+MZ6PcV@-| z4+HUdLQhp}WrMOV{LMAPr@3AT_#l0tJxBMRQ~}RDyWW|#=hXvx&fFfNJ^IZ`%cJn(cOp5f5LJ*pX#!)R{=Dxc-p7Hbscd%4P7&vnw8{ol3hOc=l_oR%=dTeH*drNr7j?3AkzymjiUM6myQ>tx$TsyQ(Gj3%APgkKpQOzn~XTd?qhcL-2J1`mv~%K4}D8 z4WZZS1S}4drDJh)y^G1dhnX4&-bN1X-h;S@K=)Hi3f~*?Qe@ed{gsnt-Jy22-3Fxj z!jbXU^<>Qb^&}h}gK%8}rCCDh=?9Go#>9p68?c=-_f56VgkMcA*Z{n{5$|B=HRi6( z=&F;-wtBz*)-rew{ST9WYgLRa7Io&--LwpZhw0B#|owOfqOLl7`l%c z$<01G4dmE~f@pIN9WzYjsYHf#DhUkVPR%wN{Yb{6C;suI6gk8 z$JuO2*8i@GpY9nGUTn=QYCUwY{q2L_9nR|9cA&jzSL=b=*4=fj>E*bdT9kzMtUCJX MuP#nga4_xr1xaC}0ssI2 delta 49 scmZp0XmAi<0D=R2D;Ys_0K*Hhi2@EA51wb)c;NsN?quHlLQH}a0Dj04D*ylh diff --git a/pg_data/base/16384/16433 b/pg_data/base/16384/16433 index b365fd7bc65fba0fbffba34cc633e39f8ed55a31..5886d2d25f97b8fcb62ea1c85aa44a3c9ab53594 100644 GIT binary patch delta 340 zcmZp0XmC(r00M#F)r=roh2exOg93|!8Vdu%i+Ki23G)OPPs}x7+^D!jwjLyi444_j z8kjW|lI1NRqBF9?CjRR2a+r7H{JGa^pTD`F0pVcJ5Z8D&S6BWgJ9a(mn8@ku7s<`g zcmkxGUzLGDG&t1B*E1x<)dgZ+ti%Fl%a=?Hf)G#-r3D3FDvj7>40bL5hiHVWQ6Fm>YBR0tns!-Jqb^8?cx)TGZ-B=Nc?*R1+jOH!pzb zIgV2>VlaGXJENTK<$vlA09QL|hz~|6EZDkj>A>-lVl3|MoMJ9+aZ2SA9tu!^0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3cwGl7BF@yh#I{EB~T!Pp*p9YhIW zn*F}(dY*=>%n` rn5=Wzk-Kr(QXTC_on_e>Ci_fw+8RDB)oH?*qgCH+q2_Tj#}S=3B&&i= delta 67 zcmZp0XmF5b0D>8hrZa+Q8HO413<@j?Aoh&;7d9Fmm)+>FjZuu786<)Lj0|iH44jkK H$p--d)JY5= diff --git a/pg_data/base/16384/16483 b/pg_data/base/16384/16483 index b62837ca5a2593903f24eca25656951744735a6e..cbf3a3d14df5bbe7b20d9bbde5c32552948b7a10 100644 GIT binary patch delta 24 ecmZp0XmDU>0D^?()f?IG$}(xPY0D=nsl^fab$}(MJ-uz5fiU|Nx^9L6I diff --git a/pg_data/base/16384/16508 b/pg_data/base/16384/16508 index 421f17335f52d8de92378ca082619ffda8ca2a88..cb8d8e2c4c5d63d86a0d2f4f9a610e154b9fa98c 100644 GIT binary patch delta 53 zcmZp0XmDU>0D>D0t2eUGm1UA=nY>K)ozP!qkRSvwGq5pCVw}88?jDmS%j7osDgbYo B4JrTt delta 53 zcmZp0XmDU>00Ia8l^faT$}$~ep1e%WetD?iOf=wv20G9Hdzhj0)A_re z@7n)j-ToKL+x99mF!1|&1_!&kFzg1h_XDx$v*`<-HugW=zK((6hw*(qy_ZZ3w}g(` zSpsPhH21JE@G>xSD(shlx~I!g>b6m}Q)^T6)U7XT_S&F1$L0Hrf7`b%bbm9c+a#ml z)@f$;Fay!x`;`(t zXNS|$zG*5^N8}ECL$}}Sm(F=bcaMGj=GGVT^}ghDx`i4^y5;BOwLF7xZVlM=e|ZA#lUWjDtkjZ-`{Sp(dLB0x1ytVKgV2{mf|g zFHp!T*jeiRqGxZR>n#C^U4-lhrUzlC#NyPP%)C_Ou$T0O*bAfC(ClSGvsc+I^|H-h z*NNQ<0l&6HRkjhf7k|88&#wT7JB$`*W?(?h3&4Efz{D!SfR_AcqT7p>{5!Cve^4F} Tb@ulS@No?Rr8<210G1yB>hB>f delta 68 zcmZp0XmF5W0D=wgrZa+Q8HNIR1_c%c5W8T$0^>$Ub(xI;y3AtY%pf5IU}WHBVB(zI HCSL^rou~>^ diff --git a/pg_data/base/16384/16531 b/pg_data/base/16384/16531 index 34e927d0f961f8222e138ccb3d10720f3cbbc28b..82afa4073a05ace0d24290fec14c365abb7adbfb 100644 GIT binary patch delta 839 zcmW;J3rJI86ae5WN~x$Vo#t}t%*WJ5yP1}RkDH=%%QdakAwGshCQ?p<6eBlfzF5A> z^0~Q^xy4ZDGbN`6R+?dknL0yVnvYTwD~ul0`MsCJIp;g)=ibW|i;cu$BdrNdRFR`G z!rTK{{ zsJCJ7D)cz?QIIFVD!{Z*dqO?ai2Gs@0Bg{Q0T&^JQ2&IihC}uceCYk57r>q=N}s*i^FY0va5F0Y$=7X_aBWdNOwNf|I97$X(C_6cVeibK!xt4AOB6 zgU>DGH1O-q7njm0?0c2#rUUrYMiX*p@Xachqb-&!x~$4iOqSEXAa??f$($`+KnJbU)0(o(PA`naw~P6aQTG%%N1BkvZ!oK}Z$o6L|qfD2=U z%fxnQqIBZMNoL7dEAqqO%`{bVpB3S8=fNLVlFheJ

m={Qm48r#WS%v0LP^&hc4H z1Ot1x@0a5N=ELD?RYZ-SIo8pF4jckcGp=T(PK7u==?!YCtlqFfZU?T3eLTqPXVn#1 z2a@z&!v)A~!6(1(OL^|k?aGT64xL(Vdx)G2?(1kN{Uqg#c6jI8d-0hXms-*u^jc0IeAu5dZ)H diff --git a/pg_data/base/16384/16541 b/pg_data/base/16384/16541 index e3b16e95a41b566f3c37f4ebefb19dde344d67d8..c07bc33d6ac2107317758205f81b548020669b5b 100644 GIT binary patch delta 66 zcmZo@U~Fh$+`ytBeL`b3BLfg9FdUHoAkU%zV&9l=z;Ix`!A8fW@*+$O5)3o4!zTXf U@p71VPR9P166 diff --git a/pg_data/base/16384/16595 b/pg_data/base/16384/16595 index cd5fbff9c6d29ed34d1fd9fd371f687fb6ae2d2a..b0a4e48d23cccaeed9c7dd5a553211a3d3c9e9fb 100644 GIT binary patch delta 50 zcmZo@U~Fh$+`ytB9ih3JkpT!47*5E4kY`ZfVWZ<(c@`!HfriN!>?v|f?%U%rtHy{pP diff --git a/pg_data/base/16384/16596 b/pg_data/base/16384/16596 index 1fdbb318fdaed8e266c41a84dfe193ca94de62f1..cb7f1b15fe53bddcddaaf8684adb00ec00bf7a6a 100644 GIT binary patch delta 51 zcmZo@U~Fh$+`ytB{XugzBLfg9FdUHoAkU%zV&9l=z;Ix`!A8fW@{CNA@7jw`zGJTf E0C&m{Z~y=R delta 45 vcmZo@U~Fh$+`ytBEpc)tBLfh~Fx-&;AkU%zV&9l=0Kyv`cgs({Wv>PR9QqBP diff --git a/pg_data/base/16384/16597 b/pg_data/base/16384/16597 index 4be1b03db1de9e4808b2f61b3fcc9ed463b9b965..ca908547a087507c8e533ff88364032efabc3166 100644 GIT binary patch delta 50 zcmZo@U~Fh$+`ytB-JrFakpT!47*5E4kY`ZfVWZ<(c@`!HfriN!> C)D6}E delta 45 vcmZo@U~Fh$+`ytB9dL0bBLfh~Fx-&;AkU%zV&9l=0Kyv`cgs({Wv>PRC9)0Q diff --git a/pg_data/global/pg_control b/pg_data/global/pg_control index c6079c60f7787767779536ca7cbdb4dc6e7b041e..ffab41c139091e339a74e2e1082b91bf48731a9e 100644 GIT binary patch delta 88 zcmZp0XmFSyp>>waC6fUNel)LU1kneeG>8MkAaO00iB4)lFx4Ot5CDo+En~T{W!lNj NhK%RsCOa_l0sso(5-tD$ delta 88 zcmZp0XmFSyp{4ZPIg#w6 Oz1fiQyxe35MqU8KmJuQV diff --git a/pg_data/pg_subtrans/0000 b/pg_data/pg_subtrans/0000 index 6d17cf9d15fb9f4a2358a2d079f3b8c755d005fa..76af23b1af1bab7a64c6c517b3cb1e7df389f100 100644 GIT binary patch delta 38 fcmZp0XmHq2A|NHh!T<(xP+9>>E3s^3EaC?MZ_)&g delta 11 ScmZp0XmHq2BCt`QhaUhMegqK! diff --git a/pg_data/pg_wal/000000010000000000000001 b/pg_data/pg_wal/000000010000000000000001 index 2be75570eaa157acf2016d7ac4b33d7e74d82895..9be87d3e1ed616d019dc2f994bcfc4ac364c089d 100644 GIT binary patch delta 671642 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 zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 SAqh!HLK2ej|CMm)kpBRjC9Y-w diff --git a/pg_data/pg_xact/0000 b/pg_data/pg_xact/0000 index 1ff89203fbc4e2a20ed631f4f3609e51eb4d60d1..68f9957b4a29ff2c9db01757f0d0d803ecf53891 100644 GIT binary patch delta 16 XcmZp0XmFVDdm<}8BkN{H#;