抽屉化物资与启动授权流程

1、将药物发货新建和编辑从独立页面迁移到抽屉,详情页支持权限控制和停用中心只读状态。

2、补充药物发货状态字段校验,统一 PENDING、IN_TRANSIT、SIGNED、EXCEPTION 状态及演示数据。

3、为物资设备增加详情页和编辑抽屉,复用通用附件上传并按项目权限控制操作入口。

4、将启动会和培训授权编辑迁移到抽屉,详情页按中心过滤培训记录并移除旧独立编辑路由。
This commit is contained in:
Cheng Zhou
2026-06-04 11:08:43 +08:00
parent 720c98765f
commit 6a2e43f829
31 changed files with 3773 additions and 1009 deletions
+13 -51
View File
@@ -23,10 +23,11 @@ import ProfileSettings from "../views/ProfileSettings.vue";
import ProjectOverview from "../views/ia/ProjectOverview.vue";
import ProjectMilestones from "../views/ia/ProjectMilestones.vue";
import FeeContracts from "../views/fees/ContractFees.vue";
import FeeContractForm from "../views/fees/ContractFeeForm.vue";
import FeeContractDetail from "../views/fees/ContractFeeDetail.vue";
import DrugShipments from "../views/ia/DrugShipments.vue";
import ShipmentDetail from "../views/drug/ShipmentDetail.vue";
import MaterialEquipment from "../views/ia/MaterialEquipment.vue";
import MaterialEquipmentDetail from "../views/materials/MaterialEquipmentDetail.vue";
import FileVersionManagement from "../views/ia/FileVersionManagement.vue";
import DocumentList from "../views/documents/DocumentList.vue";
import DocumentDetail from "../views/documents/DocumentDetail.vue";
@@ -41,15 +42,12 @@ import KnowledgeMedicalConsult from "../views/ia/KnowledgeMedicalConsult.vue";
import Precautions from "../views/ia/Precautions.vue";
import KnowledgeSupportFiles from "../views/ia/KnowledgeSupportFiles.vue";
import KnowledgeInstructionFiles from "../views/ia/KnowledgeInstructionFiles.vue";
import ShipmentForm from "../views/drug/ShipmentForm.vue";
import ShipmentDetail from "../views/drug/ShipmentDetail.vue";
import FeasibilityForm from "../views/startup/FeasibilityForm.vue";
import FeasibilityDetail from "../views/startup/FeasibilityDetail.vue";
import EthicsForm from "../views/startup/EthicsForm.vue";
import EthicsDetail from "../views/startup/EthicsDetail.vue";
import KickoffForm from "../views/startup/KickoffForm.vue";
import KickoffDetail from "../views/startup/KickoffDetail.vue";
import TrainingForm from "../views/startup/TrainingForm.vue";
import TrainingDetail from "../views/startup/TrainingDetail.vue";
import PrecautionForm from "../views/knowledge/PrecautionForm.vue";
import PrecautionDetail from "../views/knowledge/PrecautionDetail.vue";
@@ -109,42 +107,18 @@ const routes: RouteRecordRaw[] = [
component: FeeContracts,
meta: { title: TEXT.menu.feeContracts, requiresStudy: true },
},
{
path: "fees/contracts/new",
name: "FeeContractNew",
component: FeeContractForm,
meta: { title: TEXT.common.actions.add + TEXT.menu.feeContracts, requiresStudy: true },
},
{
path: "fees/contracts/:contractId",
name: "FeeContractDetail",
component: FeeContractDetail,
meta: { title: TEXT.modules.feeContracts.detailTitle, requiresStudy: true },
},
{
path: "fees/contracts/:contractId/edit",
name: "FeeContractEdit",
component: FeeContractForm,
meta: { title: TEXT.common.actions.edit + TEXT.menu.feeContracts, requiresStudy: true },
},
{
path: "drug/shipments",
name: "DrugShipments",
component: DrugShipments,
meta: { title: TEXT.menu.drugShipments, requiresStudy: true },
},
{
path: "materials/equipment",
name: "MaterialEquipment",
component: MaterialEquipment,
meta: { title: TEXT.menu.materialEquipment, requiresStudy: true },
},
{
path: "drug/shipments/new",
name: "DrugShipmentNew",
component: ShipmentForm,
meta: { title: TEXT.common.actions.add + TEXT.menu.drugShipments, requiresStudy: true },
},
{
path: "drug/shipments/:shipmentId",
name: "DrugShipmentDetail",
@@ -152,10 +126,16 @@ const routes: RouteRecordRaw[] = [
meta: { title: TEXT.modules.drugShipments.detailTitle, requiresStudy: true },
},
{
path: "drug/shipments/:shipmentId/edit",
name: "DrugShipmentEdit",
component: ShipmentForm,
meta: { title: TEXT.common.actions.edit + TEXT.menu.drugShipments, requiresStudy: true },
path: "materials/equipment",
name: "MaterialEquipment",
component: MaterialEquipment,
meta: { title: TEXT.menu.materialEquipment, requiresStudy: true },
},
{
path: "materials/equipment/:equipmentId",
name: "MaterialEquipmentDetail",
component: MaterialEquipmentDetail,
meta: { title: TEXT.modules.materialEquipment.detailTitle, requiresStudy: true },
},
{
path: "file-versions",
@@ -235,30 +215,12 @@ const routes: RouteRecordRaw[] = [
component: KickoffDetail,
meta: { title: TEXT.modules.startupMeetingAuth.kickoffDetailTitle, requiresStudy: true },
},
{
path: "startup/kickoff/:meetingId/edit",
name: "StartupKickoffEdit",
component: KickoffForm,
meta: { title: TEXT.common.actions.edit + TEXT.modules.startupMeetingAuth.kickoffTab, requiresStudy: true },
},
{
path: "startup/training/new",
name: "StartupTrainingNew",
component: TrainingForm,
meta: { title: TEXT.common.actions.add + TEXT.common.fields.person, requiresStudy: true },
},
{
path: "startup/training/:recordId",
name: "StartupTrainingDetail",
component: TrainingDetail,
meta: { title: TEXT.modules.startupMeetingAuth.trainingDetailTitle, requiresStudy: true },
},
{
path: "startup/training/:recordId/edit",
name: "StartupTrainingEdit",
component: TrainingForm,
meta: { title: TEXT.common.actions.edit + TEXT.modules.startupMeetingAuth.trainingTab, requiresStudy: true },
},
{
path: "subjects",
name: "SubjectManagement",
@@ -447,7 +409,7 @@ const router = createRouter({
const ADMIN_PROJECT_OPERATION_KEYS: Record<string, Record<"read" | "write", string>> = {
audit_export: { read: "audit_logs:read", write: "audit_logs:export" },
project_members: { read: "project_members:list", write: "project_members:update" },
project_members: { read: "project_members:read", write: "project_members:update" },
sites: { read: "sites:read", write: "sites:update" },
};