信息架构/菜单框架大重构-20260109

This commit is contained in:
Cheng Zhou
2026-01-09 11:19:04 +08:00
parent ba3cf95b8a
commit 9021c7fe2b
188 changed files with 7632 additions and 11658 deletions
+4 -1
View File
@@ -1,4 +1,4 @@
import { apiGet, apiPost, apiPatch } from "./axios";
import { apiDelete, apiGet, apiPatch, apiPost } from "./axios";
import type { ApiListResponse } from "../types/api";
export const fetchAes = (studyId: string, params?: Record<string, any>) =>
@@ -9,3 +9,6 @@ export const createAe = (studyId: string, payload: Record<string, any>) =>
export const updateAe = (studyId: string, aeId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/aes/${aeId}`, payload);
export const deleteAe = (studyId: string, aeId: string) =>
apiDelete(`/api/v1/studies/${studyId}/aes/${aeId}`);
-14
View File
@@ -1,14 +0,0 @@
import { apiGet, apiPost, apiDelete } from "./axios";
export const fetchComments = (studyId: string, entityType: string, entityId: string) =>
apiGet(`/api/v1/studies/${studyId}/${entityType}/${entityId}/comments`);
export const createComment = (
studyId: string,
entityType: string,
entityId: string,
payload: Record<string, any>
) => apiPost(`/api/v1/studies/${studyId}/${entityType}/${entityId}/comments`, payload);
export const deleteComment = (studyId: string, entityType: string, entityId: string, commentId: string) =>
apiDelete(`/api/v1/studies/${studyId}/${entityType}/${entityId}/comments/${commentId}`);
-3
View File
@@ -9,6 +9,3 @@ export const fetchFinanceSummary = (studyId: string) =>
export const fetchOverdueAesCount = (studyId: string) =>
apiGet<ApiListResponse<any>>(`/api/v1/studies/${studyId}/aes/`, { params: { overdue: true, limit: 1 } });
export const fetchOverdueQueriesCount = (studyId: string) =>
apiGet<ApiListResponse<any>>(`/api/v1/studies/${studyId}/data-queries/`, { params: { overdue: true, limit: 1 } });
-11
View File
@@ -1,11 +0,0 @@
import { apiGet, apiPost, apiPatch } from "./axios";
import type { ApiListResponse } from "../types/api";
export const fetchDataQueries = (studyId: string, params?: Record<string, any>) =>
apiGet<ApiListResponse<any>>(`/api/v1/studies/${studyId}/data-queries/`, { params });
export const createDataQuery = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/data-queries/`, payload);
export const updateDataQuery = (studyId: string, queryId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/data-queries/${queryId}`, payload);
+16
View File
@@ -0,0 +1,16 @@
import { apiDelete, apiGet, apiPatch, apiPost } from "./axios";
export const listDrugShipments = (studyId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/drug/shipments`, { params });
export const getDrugShipment = (studyId: string, shipmentId: string) =>
apiGet(`/api/v1/studies/${studyId}/drug/shipments/${shipmentId}`);
export const createDrugShipment = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/drug/shipments`, payload);
export const updateDrugShipment = (studyId: string, shipmentId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/drug/shipments/${shipmentId}`, payload);
export const deleteDrugShipment = (studyId: string, shipmentId: string) =>
apiDelete(`/api/v1/studies/${studyId}/drug/shipments/${shipmentId}`);
-64
View File
@@ -1,64 +0,0 @@
import { apiGet, apiPatch, apiPost } from "./axios";
import type { AxiosResponse } from "axios";
import type { ApiListResponse } from "../types/api";
export interface FinanceItem {
id: string;
study_id: string;
site_id?: string | null;
subject_id?: string | null;
visit_id?: string | null;
category: string;
title: string;
description?: string | null;
currency: string;
amount: number | string;
occur_date: string;
status: string;
submitted_at?: string | null;
approved_at?: string | null;
rejected_at?: string | null;
paid_at?: string | null;
approver_id?: string | null;
payer_id?: string | null;
reject_reason?: string | null;
created_by: string;
created_at: string;
updated_at?: string | null;
}
export interface FinanceSummary {
total_amount: number | string;
approved_amount: number | string;
paid_amount: number | string;
submitted_amount?: number | string;
count_total: number;
count_paid: number;
}
export const fetchFinanceItems = (
studyId: string,
params?: Record<string, any>
): Promise<AxiosResponse<ApiListResponse<FinanceItem>>> =>
apiGet(`/api/v1/studies/${studyId}/finance/items/`, { params });
export const fetchFinanceItem = (studyId: string, itemId: string) =>
apiGet<FinanceItem>(`/api/v1/studies/${studyId}/finance/items/${itemId}`);
export const createFinanceItem = (studyId: string, payload: Record<string, any>) =>
apiPost<FinanceItem>(`/api/v1/studies/${studyId}/finance/items`, payload);
export const updateFinanceItem = (studyId: string, itemId: string, payload: Record<string, any>) =>
apiPatch<FinanceItem>(`/api/v1/studies/${studyId}/finance/items/${itemId}`, payload);
export const changeFinanceStatus = (
studyId: string,
itemId: string,
payload: { status: string; reject_reason?: string }
) => apiPost<FinanceItem>(`/api/v1/studies/${studyId}/finance/items/${itemId}/status`, payload);
export const fetchFinanceSummary = (studyId: string, params?: Record<string, any>) =>
apiGet<FinanceSummary | ApiListResponse<FinanceSummary>>(
`/api/v1/studies/${studyId}/finance/summary`,
{ params }
);
+16
View File
@@ -0,0 +1,16 @@
import { apiDelete, apiGet, apiPatch, apiPost } from "./axios";
export const listFinanceContracts = (studyId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/finance/contracts`, { params });
export const getFinanceContract = (studyId: string, contractId: string) =>
apiGet(`/api/v1/studies/${studyId}/finance/contracts/${contractId}`);
export const createFinanceContract = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/finance/contracts`, payload);
export const updateFinanceContract = (studyId: string, contractId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/finance/contracts/${contractId}`, payload);
export const deleteFinanceContract = (studyId: string, contractId: string) =>
apiDelete(`/api/v1/studies/${studyId}/finance/contracts/${contractId}`);
+16
View File
@@ -0,0 +1,16 @@
import { apiDelete, apiGet, apiPatch, apiPost } from "./axios";
export const listFinanceSpecials = (studyId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/finance/specials`, { params });
export const getFinanceSpecial = (studyId: string, specialId: string) =>
apiGet(`/api/v1/studies/${studyId}/finance/specials/${specialId}`);
export const createFinanceSpecial = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/finance/specials`, payload);
export const updateFinanceSpecial = (studyId: string, specialId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/finance/specials/${specialId}`, payload);
export const deleteFinanceSpecial = (studyId: string, specialId: string) =>
apiDelete(`/api/v1/studies/${studyId}/finance/specials/${specialId}`);
-34
View File
@@ -1,34 +0,0 @@
import { apiGet, apiPatch, apiPost } from "./axios";
import type { AxiosResponse } from "axios";
import type { ApiListResponse } from "../types/api";
export interface ImpBatch {
id: string;
study_id: string;
product_id: string;
batch_no: string;
expiry_date?: string | null;
manufacture_date?: string | null;
status: string;
created_at: string;
updated_at: string;
}
export const fetchImpBatches = (
studyId: string,
params?: Record<string, any>
): Promise<AxiosResponse<ApiListResponse<ImpBatch>>> =>
apiGet(`/api/v1/studies/${studyId}/imp/batches/`, { params });
export const createImpBatch = (
studyId: string,
payload: Record<string, any>
): Promise<AxiosResponse<ImpBatch>> =>
apiPost(`/api/v1/studies/${studyId}/imp/batches/`, payload);
export const updateImpBatch = (
studyId: string,
batchId: string,
payload: Record<string, any>
): Promise<AxiosResponse<ImpBatch>> =>
apiPatch(`/api/v1/studies/${studyId}/imp/batches/${batchId}`, payload);
-16
View File
@@ -1,16 +0,0 @@
import { apiGet } from "./axios";
import type { AxiosResponse } from "axios";
import type { ApiListResponse } from "../types/api";
export interface ImpInventoryRow {
site_id: string;
batch_id: string;
quantity_on_hand: number;
updated_at: string;
}
export const fetchImpInventory = (
studyId: string,
params?: Record<string, any>
): Promise<AxiosResponse<ApiListResponse<ImpInventoryRow>>> =>
apiGet(`/api/v1/studies/${studyId}/imp/inventory/`, { params });
-34
View File
@@ -1,34 +0,0 @@
import { apiGet, apiPatch, apiPost } from "./axios";
import type { AxiosResponse } from "axios";
import type { ApiListResponse } from "../types/api";
export interface ImpProduct {
id: string;
study_id: string;
name: string;
form?: string | null;
strength?: string | null;
unit: string;
description?: string | null;
is_active: boolean;
created_at: string;
updated_at: string;
}
export const fetchImpProducts = (
studyId: string
): Promise<AxiosResponse<ApiListResponse<ImpProduct>>> =>
apiGet(`/api/v1/studies/${studyId}/imp/products/`);
export const createImpProduct = (
studyId: string,
payload: Record<string, any>
): Promise<AxiosResponse<ImpProduct>> =>
apiPost(`/api/v1/studies/${studyId}/imp/products/`, payload);
export const updateImpProduct = (
studyId: string,
productId: string,
payload: Record<string, any>
): Promise<AxiosResponse<ImpProduct>> =>
apiPatch(`/api/v1/studies/${studyId}/imp/products/${productId}`, payload);
-30
View File
@@ -1,30 +0,0 @@
import { apiGet, apiPost } from "./axios";
import type { AxiosResponse } from "axios";
import type { ApiListResponse } from "../types/api";
export interface ImpTransaction {
id: string;
study_id: string;
site_id: string;
batch_id: string;
subject_id?: string | null;
tx_type: string;
quantity: number;
tx_date: string;
reference?: string | null;
notes?: string | null;
created_by: string;
created_at: string;
}
export const fetchImpTransactions = (
studyId: string,
params?: Record<string, any>
): Promise<AxiosResponse<ApiListResponse<ImpTransaction>>> =>
apiGet(`/api/v1/studies/${studyId}/imp/transactions/`, { params });
export const createImpTransaction = (
studyId: string,
payload: Record<string, any>
): Promise<AxiosResponse<ImpTransaction>> =>
apiPost(`/api/v1/studies/${studyId}/imp/transactions/`, payload);
-11
View File
@@ -1,11 +0,0 @@
import { apiGet, apiPost, apiPatch } from "./axios";
import type { ApiListResponse } from "../types/api";
export const fetchIssues = (studyId: string, params?: Record<string, any>) =>
apiGet<ApiListResponse<any>>(`/api/v1/studies/${studyId}/issues/`, { params });
export const createIssue = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/issues/`, payload);
export const updateIssue = (studyId: string, issueId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/issues/${issueId}`, payload);
+16
View File
@@ -0,0 +1,16 @@
import { apiDelete, apiGet, apiPatch, apiPost } from "./axios";
export const listKnowledgeNotes = (studyId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/knowledge/notes`, { params });
export const getKnowledgeNote = (studyId: string, noteId: string) =>
apiGet(`/api/v1/studies/${studyId}/knowledge/notes/${noteId}`);
export const createKnowledgeNote = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/knowledge/notes`, payload);
export const updateKnowledgeNote = (studyId: string, noteId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/knowledge/notes/${noteId}`, payload);
export const deleteKnowledgeNote = (studyId: string, noteId: string) =>
apiDelete(`/api/v1/studies/${studyId}/knowledge/notes/${noteId}`);
-14
View File
@@ -1,14 +0,0 @@
import { apiGet, apiPost, apiPatch, apiDelete } from "./axios";
import type { ApiListResponse } from "../types/api";
export const fetchMilestones = (studyId: string) =>
apiGet<ApiListResponse<any>>(`/api/v1/studies/${studyId}/milestones/`);
export const createMilestone = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/milestones/`, payload);
export const updateMilestone = (studyId: string, milestoneId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/milestones/${milestoneId}`, payload);
export const deleteMilestone = (studyId: string, milestoneId: string) =>
apiDelete(`/api/v1/studies/${studyId}/milestones/${milestoneId}`);
+61
View File
@@ -0,0 +1,61 @@
import { apiDelete, apiGet, apiPatch, apiPost } from "./axios";
export const listFeasibility = (studyId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/startup/feasibility`, { params });
export const getFeasibility = (studyId: string, id: string) =>
apiGet(`/api/v1/studies/${studyId}/startup/feasibility/${id}`);
export const createFeasibility = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/startup/feasibility`, payload);
export const updateFeasibility = (studyId: string, id: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/startup/feasibility/${id}`, payload);
export const deleteFeasibility = (studyId: string, id: string) =>
apiDelete(`/api/v1/studies/${studyId}/startup/feasibility/${id}`);
export const listEthics = (studyId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/startup/ethics`, { params });
export const getEthics = (studyId: string, id: string) =>
apiGet(`/api/v1/studies/${studyId}/startup/ethics/${id}`);
export const createEthics = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/startup/ethics`, payload);
export const updateEthics = (studyId: string, id: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/startup/ethics/${id}`, payload);
export const deleteEthics = (studyId: string, id: string) =>
apiDelete(`/api/v1/studies/${studyId}/startup/ethics/${id}`);
export const listKickoffs = (studyId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/startup/kickoff`, { params });
export const getKickoff = (studyId: string, id: string) =>
apiGet(`/api/v1/studies/${studyId}/startup/kickoff/${id}`);
export const createKickoff = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/startup/kickoff`, payload);
export const updateKickoff = (studyId: string, id: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/startup/kickoff/${id}`, payload);
export const deleteKickoff = (studyId: string, id: string) =>
apiDelete(`/api/v1/studies/${studyId}/startup/kickoff/${id}`);
export const listTrainingAuthorizations = (studyId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/startup/training-authorizations`, { params });
export const getTrainingAuthorization = (studyId: string, id: string) =>
apiGet(`/api/v1/studies/${studyId}/startup/training-authorizations/${id}`);
export const createTrainingAuthorization = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/startup/training-authorizations`, payload);
export const updateTrainingAuthorization = (studyId: string, id: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/startup/training-authorizations/${id}`, payload);
export const deleteTrainingAuthorization = (studyId: string, id: string) =>
apiDelete(`/api/v1/studies/${studyId}/startup/training-authorizations/${id}`);
+20
View File
@@ -0,0 +1,20 @@
import { apiDelete, apiGet, apiPatch, apiPost } from "./axios";
export const listSubjectHistories = (studyId: string, subjectId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/subjects/${subjectId}/histories`, { params });
export const getSubjectHistory = (studyId: string, subjectId: string, historyId: string) =>
apiGet(`/api/v1/studies/${studyId}/subjects/${subjectId}/histories/${historyId}`);
export const createSubjectHistory = (studyId: string, subjectId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/subjects/${subjectId}/histories`, payload);
export const updateSubjectHistory = (
studyId: string,
subjectId: string,
historyId: string,
payload: Record<string, any>
) => apiPatch(`/api/v1/studies/${studyId}/subjects/${subjectId}/histories/${historyId}`, payload);
export const deleteSubjectHistory = (studyId: string, subjectId: string, historyId: string) =>
apiDelete(`/api/v1/studies/${studyId}/subjects/${subjectId}/histories/${historyId}`);
+7 -1
View File
@@ -1,4 +1,4 @@
import { apiGet, apiPost, apiPatch } from "./axios";
import { apiDelete, apiGet, apiPatch, apiPost } from "./axios";
import type { ApiListResponse } from "../types/api";
export const fetchSubjects = (studyId: string, params?: Record<string, any>) =>
@@ -7,5 +7,11 @@ export const fetchSubjects = (studyId: string, params?: Record<string, any>) =>
export const createSubject = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/subjects/`, payload);
export const getSubject = (studyId: string, subjectId: string) =>
apiGet(`/api/v1/studies/${studyId}/subjects/${subjectId}`);
export const updateSubject = (studyId: string, subjectId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/subjects/${subjectId}`, payload);
export const deleteSubject = (studyId: string, subjectId: string) =>
apiDelete(`/api/v1/studies/${studyId}/subjects/${subjectId}`);
-10
View File
@@ -1,10 +0,0 @@
import { apiGet, apiPost } from "./axios";
export const fetchVerifications = (studyId: string, params?: Record<string, any>) =>
apiGet(`/api/v1/studies/${studyId}/verifications/`, { params });
export const upsertVerification = (studyId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/verifications/`, payload);
export const fetchVerification = (studyId: string, subjectId: string, level: string) =>
apiGet(`/api/v1/studies/${studyId}/verifications/subjects/${subjectId}/${level}`);
+7 -1
View File
@@ -1,7 +1,13 @@
import { apiGet, apiPatch } from "./axios";
import { apiDelete, apiGet, apiPatch, apiPost } from "./axios";
export const fetchVisits = (studyId: string, subjectId: string) =>
apiGet(`/api/v1/studies/${studyId}/subjects/${subjectId}/visits/`);
export const createVisit = (studyId: string, subjectId: string, payload: Record<string, any>) =>
apiPost(`/api/v1/studies/${studyId}/subjects/${subjectId}/visits/`, payload);
export const updateVisit = (studyId: string, subjectId: string, visitId: string, payload: Record<string, any>) =>
apiPatch(`/api/v1/studies/${studyId}/subjects/${subjectId}/visits/${visitId}`, payload);
export const deleteVisit = (studyId: string, subjectId: string, visitId: string) =>
apiDelete(`/api/v1/studies/${studyId}/subjects/${subjectId}/visits/${visitId}`);